The Imp maps nicely to C as long as the new C11 anonymous unions and structs are supported... - otherwise you have to name all the intermediate unions and structs (structs are necessary if there is more than one element in a union) $ DEF V_0074 ID=OBJINFO a=68 b=116 c=0 { START ( $ DEF S_1ffb ID=FLAGS a=17 b=3 c=0 $ DEF S_1ffa ID=TYPE a=17 b=3 c=0 ~A ALTBEG $ DEF S_1ff9 ID=LINK a=17 b=3 c=0 ~C ALT $ DEF S_1ff8 ID=XTYPE a=17 b=3 c=0 ~C ALT $ DEF S_1ff7 ID=SIZE a=17 b=3 c=0 ~C ALT $ DEF S_1ff6 ID=ACT a=17 b=3 c=0 ~B ALTEND $ DEF S_1ff5 ID=REG a=17 b=2 c=0 $ DEF S_1ff4 ID=MODE a=17 b=2 c=0 $ DEF S_1ff3 ID=VAL a=17 b=1 c=0 } FINISH ) %recordformat OBJINFO ( %c | typedef struct OBJINFO { %short FLAGS,TYPE, | short int FLAGS,TYPE; ( %c | union { %short LINK %or %c | short int LINK; %short XTYPE %or %c | short int XTYPE; %short SIZE %or %c | short int SIZE; %short ACT %c | short int ACT; ), | }; %byte REG,MODE, | unsigned char REG,MODE; %integer VAL %c | int VAL; ) | } OBJINFO; $ DEF V_0075 ID=IDENTINFO a=68 b=117 c=0 { START ( ~A ALTBEG $ DEF S_1ff2 ID=FLAGS a=17 b=3 c=0 $ DEF S_1ff1 ID=TYPE a=17 b=3 c=0 ~A ALTBEG $ DEF S_1ff0 ID=LINK a=17 b=3 c=0 ~C ALT $ DEF S_1fef ID=XTYPE a=17 b=3 c=0 ~C ALT $ DEF S_1fee ID=SIZE a=17 b=3 c=0 ~C ALT $ DEF S_1fed ID=ACT a=17 b=3 c=0 ~B ALTEND $ DEF S_1fec ID=REG a=17 b=2 c=0 $ DEF S_1feb ID=MODE a=17 b=2 c=0 $ DEF S_1fea ID=VAL a=17 b=1 c=0 ~C ALT $ DEF S_1fe9 ID=DETAILS a=65 b=116 c=0 ~B ALTEND ~A ALTBEG $ DEF S_1fe8 ID=TEXT a=17 b=3 c=0 $ DEF S_1fe7 ID=HLINK a=17 b=3 c=0 ~C ALT $ DEF S_1fe6 ID=X a=17 b=3 c=0 $ DEF S_1fe5 ID=Y a=17 b=3 c=0 ~B ALTEND } FINISH ) %recordformat IDENTINFO ( %c | typedef struct IDENTINFO { %c | union { %c | struct { ( %short FLAGS,TYPE, | short int FLAGS,TYPE; ( %c | union { %short LINK %or %c | short int LINK; %short XTYPE %or %c | short int XTYPE; %short SIZE %or %c | short int SIZE; %short ACT %c | short int ACT; ), | }; %byte REG,MODE, | unsigned char REG,MODE; %integer VAL %c | int VAL; %or %c | }; %record(objinfo) DETAILS %c | OBJINFO DETAILS; ), | }; %c | union { ( %c | struct { %short TEXT,HLINK %c | short int TEXT,HLINK; %or %c | }; %short X,Y %c | struct { ) %c | short int X,Y; ) | }; | }; | } IDENTINFO; | %begin | int main(int argc, char **argv) { %record (IDENTINFO) id | IDENTINFO id; | id_FLAGS = 1 | id.FLAGS = 1; id_LINK = 2 | id.LINK = 2; id_REG = 3 | id.REG = 3; id_VAL = 4 | id.VAL = 4; | id_DETAILS_FLAGS = 11 | id.DETAILS.FLAGS = 11; id_DETAILS_LINK = 12 | id.DETAILS.LINK = 12; id_DETAILS_REG = 13 | id.DETAILS.REG = 13; id_DETAILS_VAL = 14 | id.DETAILS.VAL = 14; | id_TEXT = 5 | id.TEXT = 5; id_X = 6 | id.X = 6; %endofprogram | return 0; | }