/******************************************************************************* * * HEADER: bitfields.h * ******************************************************************************** * * DESCRIPTION: Bitfield layouting routines * ******************************************************************************** * * Copyright (c) 2002-2024 Marcus Holland-Moritz. All rights reserved. * This program is free software; you can redistribute it and/or modify * it under the same terms as Perl itself. * *******************************************************************************/ #ifndef _CTLIB_BITFIELDS_H #define _CTLIB_BITFIELDS_H /*===== GLOBAL INCLUDES ======================================================*/ /*===== LOCAL INCLUDES =======================================================*/ #include "ctlib/arch.h" #include "ctlib/cttype.h" #include "token/t_blproperty.h" /*===== DEFINES ==============================================================*/ #define BL_CLASS_FIXED \ const struct BLVtable *m; \ const struct BLClass *blc /*===== TYPEDEFS =============================================================*/ struct BLClass; enum BLError { BLE_NO_ERROR, BLE_INVALID_PROPERTY, BLE_BITFIELD_TOO_WIDE }; typedef signed long BLPropValInt; typedef struct _BLPropValue { enum BLPVType { BLPVT_INT, BLPVT_STR } type; union { BLPropValInt v_int; BLPropValStr v_str; } v; } BLPropValue; typedef struct _BLOption { BLProperty prop; enum BLPVType type; int nval; /* number of allowed values (0: all values allowed) */ const void *pval; /* pointer to list of allowed values */ } BLOption; typedef struct _BLPushParam { Struct *pStruct; Declarator *pDecl; unsigned type_size; unsigned type_align; } BLPushParam; typedef struct _BitfieldLayouter *BitfieldLayouter; struct BLVtable { BitfieldLayouter (*clone) (BitfieldLayouter); void (*init) (BitfieldLayouter); void (*reset) (BitfieldLayouter); void (*destroy) (BitfieldLayouter); enum BLError (*push) (BitfieldLayouter, const BLPushParam *); enum BLError (*finalize) (BitfieldLayouter); enum BLError (*get) (BitfieldLayouter, BLProperty, BLPropValue *); enum BLError (*set) (BitfieldLayouter, BLProperty, const BLPropValue *); const BLOption * (*options) (BitfieldLayouter, int *count); const char * (*class_name) (BitfieldLayouter); }; struct _BitfieldLayouter { BL_CLASS_FIXED; }; /*===== EXTERNAL VARIABLES ===================================================*/ /*===== FUNCTION PROTOTYPES ==================================================*/ #define bl_create CTlib_bl_create BitfieldLayouter bl_create(const char *class_name); #define bl_property CTlib_bl_property BLProperty bl_property(const char *property); #define bl_property_string CTlib_bl_property_string const char *bl_property_string(BLProperty property); #define bl_propval CTlib_bl_propval BLPropValStr bl_propval(const char *propval); #define bl_propval_string CTlib_bl_propval_string const char *bl_propval_string(BLPropValStr propval); #endif