%imacro stripparens 2.nolist
%defstr %%param %2
%rep 16
 %substr %%opening %%param 1
 %ifidn %%opening, '('
  %substr %%param %%param 2,-1
 %endif
%endrep
%rep 16
 %strlen %%length %%param
 %substr %%closing %%param %%length
 %ifidn %%closing, ')'
  %substr %%param %%param 1,-2
 %endif
%endrep
%deftok %%token %%param
%1 %%token
%endmacro

%imacro db 1-*.nolist
 %rep %0
  %define %%param %1
  %define %%multi
  %defstr %%string %%param
  %strlen %%stringlength %%string
  %assign %%index 1
  %rep %%stringlength
   %substr %%checkblank %%string %%index
   %ifidni %%checkblank, '"'
   %elifidni %%checkblank, "'"
   %else
    %deftok %%checkblank %%checkblank
    %ifempty %%checkblank
     %substr %%dup %%string %%index + 1,4
     %deftok %%dup %%dup
     %assign %%isdup 0
     %ifidni %%dup, dup
      %assign %%isdup 1
     %elifidni %%dup, dup(
      %assign %%isdup 1
     %endif
     %if %%isdup
      %substr %%multi %%string 1, %%index - 1
      %deftok %%multi %%multi
      %substr %%string %%string %%index + 5, -1
      %deftok %%token %%string
      %undef %%param
      stripparens %define %%param, %%token
      %assign %%length 1
      %ifstr %%param
       %strlen %%length %%param
      %endif
      %rep %%length * %%multi
	db ?
      %endrep
      %exitrep
     %endif
    %endif
   %endif
   %assign %%index %%index + 1
  %endrep
  %ifempty %%multi
   %assign %%length 1
   %ifstr %%param
    %strlen %%length %%param
   %endif
   %rep %%length
	db ?
   %endrep
  %endif
  %rotate 1
 %endrep
%endmacro

%imacro dw 1-*.nolist
 %rep %0
  %define %%param %1
  %define %%multi
  %defstr %%string %%param
  %strlen %%stringlength %%string
  %assign %%index 1
  %rep %%stringlength
   %substr %%checkblank %%string %%index
   %ifidni %%checkblank, '"'
   %elifidni %%checkblank, "'"
   %else
    %deftok %%checkblank %%checkblank
    %ifempty %%checkblank
     %substr %%dup %%string %%index + 1,4
     %deftok %%dup %%dup
     %assign %%isdup 0
     %ifidni %%dup, dup
      %assign %%isdup 1
     %elifidni %%dup, dup(
      %assign %%isdup 1
     %endif
     %if %%isdup
      %substr %%multi %%string 1, %%index - 1
      %deftok %%multi %%multi
      %substr %%string %%string %%index + 5, -1
      %deftok %%token %%string
      %undef %%param
      stripparens %define %%param, %%token
      %assign %%length 1
      %ifstr %%param
       %strlen %%length %%param
       %assign %%length (%%length + 1) / 2
      %endif
      %rep %%length * %%multi
	dw ?
      %endrep
      %exitrep
     %endif
    %endif
   %endif
   %assign %%index %%index + 1
  %endrep
  %ifempty %%multi
   %assign %%length 1
   %ifstr %%param
    %strlen %%length %%param
    %assign %%length (%%length + 1) / 2
   %endif
   %rep %%length
	dw ?
   %endrep
  %endif
  %rotate 1
 %endrep
%endmacro

%imacro dd 1-*.nolist
 %rep %0
  %define %%param %1
  %define %%multi
  %defstr %%string %%param
  %strlen %%stringlength %%string
  %assign %%index 1
  %rep %%stringlength
   %substr %%checkblank %%string %%index
   %ifidni %%checkblank, '"'
   %elifidni %%checkblank, "'"
   %else
    %deftok %%checkblank %%checkblank
    %ifempty %%checkblank
     %substr %%dup %%string %%index + 1,4
     %deftok %%dup %%dup
     %assign %%isdup 0
     %ifidni %%dup, dup
      %assign %%isdup 1
     %elifidni %%dup, dup(
      %assign %%isdup 1
     %endif
     %if %%isdup
      %substr %%multi %%string 1, %%index - 1
      %deftok %%multi %%multi
      %substr %%string %%string %%index + 5, -1
      %deftok %%token %%string
      %undef %%param
      stripparens %define %%param, %%token
      %assign %%length 1
      %ifstr %%param
       %strlen %%length %%param
       %assign %%length (%%length + 3) / 4
      %endif
      %rep %%length * %%multi
	dd ?
      %endrep
      %exitrep
     %endif
    %endif
   %endif
   %assign %%index %%index + 1
  %endrep
  %ifempty %%multi
   %assign %%length 1
   %ifstr %%param
    %strlen %%length %%param
    %assign %%length (%%length + 3) / 4
   %endif
   %rep %%length
	dd ?
   %endrep
  %endif
  %rotate 1
 %endrep
%endmacro

%unimacro align 1-2+.nolist nop
%unimacro alignb 1-2+.nolist

%imacro align 1-2+.nolist
        sectalign %1
        resb (((%1) - (($-$$) % (%1))) % (%1))
%endmacro

%imacro alignb 1-2+.nolist
        sectalign %1
        resb (((%1) - (($-$$) % (%1))) % (%1))
%endmacro

%unimacro istruc 1.nolist
%unimacro at 1-2+.nolist
%unimacro iend 0.nolist

%imacro istruc 1.nolist
    %push
        %define %$strucname %1
        %$strucstart:
%endmacro

%imacro at 1-2+.nolist
    %defstr %$member %1
    %substr %$member1 %$member 1
    %ifidn %$member1, '.'
        resb (%$strucname%1-%$strucname)-($-%$strucstart)
    %else
        resb (%1-%$strucname)-($-%$strucstart)
    %endif
    %2
%endmacro

%imacro iend 0.nolist
        resb %{$strucname}_size-($-%$strucstart)
    %pop
%endmacro
