Subversion Repositories Kolibri OS

Rev

Rev 1164 | Blame | Last modification | View Log | Download | RSS feed

  1. ; Macroinstructions for defining data structures
  2.  
  3. macro struct name
  4.  { fields@struct equ name
  5.    match child parent, name \{ fields@struct equ child,fields@\#parent \}
  6.    sub@struct equ
  7.    struc db [val] \{ \common fields@struct equ fields@struct,.,db,<val> \}
  8.    struc dw [val] \{ \common fields@struct equ fields@struct,.,dw,<val> \}
  9.    struc du [val] \{ \common fields@struct equ fields@struct,.,du,<val> \}
  10.    struc dd [val] \{ \common fields@struct equ fields@struct,.,dd,<val> \}
  11.    struc dp [val] \{ \common fields@struct equ fields@struct,.,dp,<val> \}
  12.    struc dq [val] \{ \common fields@struct equ fields@struct,.,dq,<val> \}
  13.    struc dt [val] \{ \common fields@struct equ fields@struct,.,dt,<val> \}
  14.    struc rb count \{ fields@struct equ fields@struct,.,db,count dup (?) \}
  15.    struc rw count \{ fields@struct equ fields@struct,.,dw,count dup (?) \}
  16.    struc rd count \{ fields@struct equ fields@struct,.,dd,count dup (?) \}
  17.    struc rp count \{ fields@struct equ fields@struct,.,dp,count dup (?) \}
  18.    struc rq count \{ fields@struct equ fields@struct,.,dq,count dup (?) \}
  19.    struc rt count \{ fields@struct equ fields@struct,.,dt,count dup (?) \}
  20.    macro db [val] \{ \common \local anonymous
  21.                      fields@struct equ fields@struct,anonymous,db,<val> \}
  22.    macro dw [val] \{ \common \local anonymous
  23.                      fields@struct equ fields@struct,anonymous,dw,<val> \}
  24.    macro du [val] \{ \common \local anonymous
  25.                      fields@struct equ fields@struct,anonymous,du,<val> \}
  26.    macro dd [val] \{ \common \local anonymous
  27.                      fields@struct equ fields@struct,anonymous,dd,<val> \}
  28.    macro dp [val] \{ \common \local anonymous
  29.                      fields@struct equ fields@struct,anonymous,dp,<val> \}
  30.    macro dq [val] \{ \common \local anonymous
  31.                      fields@struct equ fields@struct,anonymous,dq,<val> \}
  32.    macro dt [val] \{ \common \local anonymous
  33.                      fields@struct equ fields@struct,anonymous,dt,<val> \}
  34.    macro rb count \{ \local anonymous
  35.                      fields@struct equ fields@struct,anonymous,db,count dup (?) \}
  36.    macro rw count \{ \local anonymous
  37.                      fields@struct equ fields@struct,anonymous,dw,count dup (?) \}
  38.    macro rd count \{ \local anonymous
  39.                      fields@struct equ fields@struct,anonymous,dd,count dup (?) \}
  40.    macro rp count \{ \local anonymous
  41.                      fields@struct equ fields@struct,anonymous,dp,count dup (?) \}
  42.    macro rq count \{ \local anonymous
  43.                      fields@struct equ fields@struct,anonymous,dq,count dup (?) \}
  44.    macro rt count \{ \local anonymous
  45.                      fields@struct equ fields@struct,anonymous,dt,count dup (?) \}
  46.    macro union \{ fields@struct equ fields@struct,,union,<
  47.                   sub@struct equ union \}
  48.    macro struct \{ fields@struct equ fields@struct,,substruct,<
  49.                   sub@struct equ substruct \}
  50.    virtual at 0 }
  51.  
  52. macro ends
  53.  { match , sub@struct \{ restruc db,dw,du,dd,dp,dq,dt
  54.                          restruc rb,rw,rd,rp,rq,rt
  55.                          purge db,dw,du,dd,dp,dq,dt
  56.                          purge rb,rw,rd,rp,rq,rt
  57.                          purge union,struct
  58.                          match name=,fields,fields@struct \\{ fields@struct equ
  59.                                                               make@struct name,fields
  60.                                                               fields@\\#name equ fields \\}
  61.                          end virtual \}
  62.    match any, sub@struct \{ fields@struct equ fields@struct> \}
  63.    restore sub@struct }
  64.  
  65. macro make@struct name,[field,type,def]
  66.  { common
  67.     if $
  68.      display 'Error: definition of ',`name,' contains illegal instructions.',0Dh,0Ah
  69.      err
  70.     end if
  71.     local define
  72.     define equ name
  73.    forward
  74.     local sub
  75.     match , field \{ make@substruct type,name,sub def
  76.                      define equ define,.,sub, \}
  77.     match any, field \{ define equ define,.#field,type,<def> \}
  78.    common
  79.     match fields, define \{ define@struct fields \} }
  80.  
  81. macro define@struct name,[field,type,def]
  82.  { common
  83.     local list
  84.     list equ
  85.    forward
  86.     if ~ field eq .
  87.      name#field type def
  88.      sizeof.#name#field = $ - name#field
  89.     else
  90.      rb sizeof.#type
  91.     end if
  92.     local value
  93.     match any, list \{ list equ list, \}
  94.     list equ list <value>
  95.    common
  96.     sizeof.#name = $
  97.     restruc name
  98.     match values, list \{
  99.     struc name value \\{
  100.     match any, fields@struct \\\{ fields@struct equ fields@struct,.,name,<values> \\\}
  101.     match , fields@struct \\\{ label .
  102.    forward
  103.      match , value \\\\{ field type def \\\\}
  104.      match any, value \\\\{ field type value
  105.                            if ~ field eq .
  106.                             rb sizeof.#name#field - ($-field)
  107.                            end if \\\\}
  108.    common \\\} \\} \} }
  109.  
  110. macro enable@substruct
  111.  { macro make@substruct substruct,parent,name,[field,type,def]
  112.     \{ \common
  113.         \local define
  114.         define equ parent,name
  115.        \forward
  116.         \local sub
  117.         match , field \\{ match any, type \\\{ enable@substruct
  118.                                                make@substruct type,name,sub def
  119.                                                purge make@substruct
  120.                                                define equ define,.,sub, \\\} \\}
  121.         match any, field \\{ define equ define,.\#field,type,<def> \\}
  122.        \common
  123.         match fields, define \\{ define@\#substruct fields \\} \} }
  124.  
  125. enable@substruct
  126.  
  127. macro define@union parent,name,[field,type,def]
  128.  { common
  129.     virtual at 0
  130.    forward
  131.     if ~ field eq .
  132.      virtual at 0
  133.       parent#field type def
  134.       sizeof.#parent#field = $ - parent#field
  135.      end virtual
  136.      if sizeof.#parent#field > $
  137.       rb sizeof.#parent#field - $
  138.      end if
  139.     else if sizeof.#type > $
  140.      rb sizeof.#type - $
  141.     end if
  142.    common
  143.     sizeof.#name = $
  144.     end virtual
  145.     struc name [value] \{ \common
  146.     label .\#name
  147.     last@union equ
  148.    forward
  149.     match any, last@union \\{ virtual at .\#name
  150.                                field type def
  151.                               end virtual \\}
  152.     match , last@union \\{ match , value \\\{ field type def \\\}
  153.                            match any, value \\\{ field type value \\\} \\}
  154.     last@union equ field
  155.    common rb sizeof.#name - ($ - .\#name) \} }
  156.  
  157. macro define@substruct parent,name,[field,type,def]
  158.  { common
  159.     virtual at 0
  160.    forward
  161.     if ~ field eq .
  162.      parent#field type def
  163.      sizeof.#parent#field = $ - parent#field
  164.     else
  165.      rb sizeof.#type
  166.     end if
  167.     local value
  168.    common
  169.     sizeof.#name = $
  170.     end virtual
  171.     struc name value \{
  172.     label .\#name
  173.    forward
  174.      match , value \\{ field type def \\}
  175.      match any, value \\{ field type value
  176.                           if ~ field eq .
  177.                            rb sizeof.#parent#field - ($-field)
  178.                           end if \\}
  179.    common \} }
  180.  
  181.