Added DGEN to ISO and create file associatons.
[kolibrios.git] / programs / struct.inc
blob789dd17976cf773f19967ee18c0f02d9cc1ce621
1 \r
2 ; Macroinstructions for defining data structures\r
3 \r
4 macro struct name\r
5  { virtual at 0\r
6    fields@struct equ name\r
7    match child parent, name \{ fields@struct equ child,fields@\#parent \}\r
8    sub@struct equ\r
9    struc db [val] \{ \common define field@struct .,db,<val>\r
10                              fields@struct equ fields@struct,field@struct \}\r
11    struc dw [val] \{ \common define field@struct .,dw,<val>\r
12                              fields@struct equ fields@struct,field@struct \}\r
13    struc du [val] \{ \common define field@struct .,du,<val>\r
14                              fields@struct equ fields@struct,field@struct \}\r
15    struc dd [val] \{ \common define field@struct .,dd,<val>\r
16                              fields@struct equ fields@struct,field@struct \}\r
17    struc dp [val] \{ \common define field@struct .,dp,<val>\r
18                              fields@struct equ fields@struct,field@struct \}\r
19    struc dq [val] \{ \common define field@struct .,dq,<val>\r
20                              fields@struct equ fields@struct,field@struct \}\r
21    struc dt [val] \{ \common define field@struct .,dt,<val>\r
22                              fields@struct equ fields@struct,field@struct \}\r
23    struc rb count \{ define field@struct .,db,count dup (?)\r
24                      fields@struct equ fields@struct,field@struct \}\r
25    struc rw count \{ define field@struct .,dw,count dup (?)\r
26                      fields@struct equ fields@struct,field@struct \}\r
27    struc rd count \{ define field@struct .,dd,count dup (?)\r
28                      fields@struct equ fields@struct,field@struct \}\r
29    struc rp count \{ define field@struct .,dp,count dup (?)\r
30                      fields@struct equ fields@struct,field@struct \}\r
31    struc rq count \{ define field@struct .,dq,count dup (?)\r
32                      fields@struct equ fields@struct,field@struct \}\r
33    struc rt count \{ define field@struct .,dt,count dup (?)\r
34                      fields@struct equ fields@struct,field@struct \}\r
35    macro db [val] \{ \common \local anonymous\r
36                      define field@struct anonymous,db,<val>\r
37                      fields@struct equ fields@struct,field@struct \}\r
38    macro dw [val] \{ \common \local anonymous\r
39                      define field@struct anonymous,dw,<val>\r
40                      fields@struct equ fields@struct,field@struct \}\r
41    macro du [val] \{ \common \local anonymous\r
42                      define field@struct anonymous,du,<val>\r
43                      fields@struct equ fields@struct,field@struct \}\r
44    macro dd [val] \{ \common \local anonymous\r
45                      define field@struct anonymous,dd,<val>\r
46                      fields@struct equ fields@struct,field@struct \}\r
47    macro dp [val] \{ \common \local anonymous\r
48                      define field@struct anonymous,dp,<val>\r
49                      fields@struct equ fields@struct,field@struct \}\r
50    macro dq [val] \{ \common \local anonymous\r
51                      define field@struct anonymous,dq,<val>\r
52                      fields@struct equ fields@struct,field@struct \}\r
53    macro dt [val] \{ \common \local anonymous\r
54                      define field@struct anonymous,dt,<val>\r
55                      fields@struct equ fields@struct,field@struct \}\r
56    macro rb count \{ \local anonymous\r
57                      define field@struct anonymous,db,count dup (?)\r
58                      fields@struct equ fields@struct,field@struct \}\r
59    macro rw count \{ \local anonymous\r
60                      define field@struct anonymous,dw,count dup (?)\r
61                      fields@struct equ fields@struct,field@struct \}\r
62    macro rd count \{ \local anonymous\r
63                      define field@struct anonymous,dd,count dup (?)\r
64                      fields@struct equ fields@struct,field@struct \}\r
65    macro rp count \{ \local anonymous\r
66                      define field@struct anonymous,dp,count dup (?)\r
67                      fields@struct equ fields@struct,field@struct \}\r
68    macro rq count \{ \local anonymous\r
69                      define field@struct anonymous,dq,count dup (?)\r
70                      fields@struct equ fields@struct,field@struct \}\r
71    macro rt count \{ \local anonymous\r
72                      define field@struct anonymous,dt,count dup (?)\r
73                      fields@struct equ fields@struct,field@struct \}\r
74    macro union \{ fields@struct equ fields@struct,,union,<\r
75                   sub@struct equ union \}\r
76    macro struct \{ fields@struct equ fields@struct,,substruct,<\r
77                   sub@struct equ substruct \} }\r
79 macro ends\r
80  { match , sub@struct \{ restruc db,dw,du,dd,dp,dq,dt\r
81                          restruc rb,rw,rd,rp,rq,rt\r
82                          purge db,dw,du,dd,dp,dq,dt\r
83                          purge rb,rw,rd,rp,rq,rt\r
84                          purge union,struct\r
85                          match name tail,fields@struct, \\{ if $\r
86                                                             display 'Error: definition of ',\\`name,' contains illegal instructions.',0Dh,0Ah\r
87                                                             err\r
88                                                             end if \\}\r
89                          match name=,fields,fields@struct \\{ fields@struct equ\r
90                                                               make@struct name,fields\r
91                                                               define fields@\\#name fields \\}\r
92                          end virtual \}\r
93    match any, sub@struct \{ fields@struct equ fields@struct> \}\r
94    restore sub@struct }\r
96 macro make@struct name,[field,type,def]\r
97  { common\r
98     local define\r
99     define equ name\r
100    forward\r
101     local sub\r
102     match , field \{ make@substruct type,name,sub def\r
103                      define equ define,.,sub, \}\r
104     match any, field \{ define equ define,.#field,type,<def> \}\r
105    common\r
106     match fields, define \{ define@struct fields \} }\r
108 macro define@struct name,[field,type,def]\r
109  { common\r
110     virtual\r
111     db `name\r
112     load initial@struct byte from 0\r
113     if initial@struct = '.'\r
114     display 'Error: name of structure should not begin with a dot.',0Dh,0Ah\r
115     err\r
116     end if\r
117     end virtual\r
118     local list\r
119     list equ\r
120    forward\r
121     if ~ field eq .\r
122      name#field type def\r
123      sizeof.#name#field = $ - name#field\r
124     else\r
125      label name#.#type\r
126      rb sizeof.#type\r
127     end if\r
128     local value\r
129     match any, list \{ list equ list, \}\r
130     list equ list <value>\r
131    common\r
132     sizeof.#name = $\r
133     restruc name\r
134     match values, list \{\r
135     struc name value \\{ \\local \\..base\r
136     match any, fields@struct \\\{ fields@struct equ fields@struct,.,name,<values> \\\}\r
137     match , fields@struct \\\{ label \\..base\r
138    forward\r
139      match , value \\\\{ field type def \\\\}\r
140      match any, value \\\\{ field type value\r
141                             if ~ field eq .\r
142                              rb sizeof.#name#field - ($-field)\r
143                             end if \\\\}\r
144    common label . at \\..base \\\}\r
145    \\}\r
146     macro name value \\{\r
147     match any, fields@struct \\\{ \\\local anonymous\r
148                                   fields@struct equ fields@struct,anonymous,name,<values> \\\}\r
149     match , fields@struct \\\{\r
150    forward\r
151      match , value \\\\{ type def \\\\}\r
152      match any, value \\\\{ \\\\local ..field\r
153                            ..field = $\r
154                            type value\r
155                            if ~ field eq .\r
156                             rb sizeof.#name#field - ($-..field)\r
157                            end if \\\\}\r
158    common \\\} \\} \} }\r
160 macro enable@substruct\r
161  { macro make@substruct substruct,parent,name,[field,type,def]\r
162     \{ \common\r
163         \local define\r
164         define equ parent,name\r
165        \forward\r
166         \local sub\r
167         match , field \\{ match any, type \\\{ enable@substruct\r
168                                                make@substruct type,parent,sub def\r
169                                                purge make@substruct\r
170                                                define equ define,.,sub, \\\} \\}\r
171         match any, field \\{ define equ define,.\#field,type,<def> \\}\r
172        \common\r
173         match fields, define \\{ define@\#substruct fields \\} \} }\r
175 enable@substruct\r
177 macro define@union parent,name,[field,type,def]\r
178  { common\r
179     virtual at parent#.#name\r
180    forward\r
181     if ~ field eq .\r
182      virtual at parent#.#name\r
183       parent#field type def\r
184       sizeof.#parent#field = $ - parent#field\r
185      end virtual\r
186      if sizeof.#parent#field > $ - parent#.#name\r
187       rb sizeof.#parent#field - ($ - parent#.#name)\r
188      end if\r
189     else\r
190      virtual at parent#.#name\r
191       label parent#.#type\r
192       type def\r
193      end virtual\r
194      label name#.#type at parent#.#name\r
195      if sizeof.#type > $ - parent#.#name\r
196       rb sizeof.#type - ($ - parent#.#name)\r
197      end if\r
198     end if\r
199    common\r
200     sizeof.#name = $ - parent#.#name\r
201     end virtual\r
202     struc name [value] \{ \common\r
203     label .\#name\r
204     last@union equ\r
205    forward\r
206     match any, last@union \\{ virtual at .\#name\r
207                                field type def\r
208                               end virtual \\}\r
209     match , last@union \\{ match , value \\\{ field type def \\\}\r
210                            match any, value \\\{ field type value \\\} \\}\r
211     last@union equ field\r
212    common rb sizeof.#name - ($ - .\#name) \}\r
213     macro name [value] \{ \common \local ..anonymous\r
214                           ..anonymous name value \} }\r
216 macro define@substruct parent,name,[field,type,def]\r
217  { common\r
218     virtual at parent#.#name\r
219    forward\r
220     if ~ field eq .\r
221      parent#field type def\r
222      sizeof.#parent#field = $ - parent#field\r
223     else\r
224      label parent#.#type\r
225      rb sizeof.#type\r
226     end if\r
227    common\r
228     sizeof.#name = $ - parent#.#name\r
229     end virtual\r
230     struc name value \{\r
231     label .\#name\r
232    forward\r
233      match , value \\{ field type def \\}\r
234      match any, value \\{ field type value\r
235                           if ~ field eq .\r
236                            rb sizeof.#parent#field - ($-field)\r
237                           end if \\}\r
238    common \}\r
239     macro name value \{ \local ..anonymous\r
240                         ..anonymous name \} }\r