Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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