Subversion Repositories Kolibri OS

Rev

Rev 9026 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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