;%%%2 0 HASH Use hashes to retrieve APIs

API	macro	s
_&s     dd 0
	CHASH &s
endm


CHASH	macro s
	hash = 0
        irpc c, <s>
	hash = ((hash shl 7) and 0FFFFFFFFh) or (hash shr (32-7))
        hash = hash xor '&c'
        endm
        dd hash
endm


COMPARE	macro
LOCAL @@calc_hash
        pushad
	lodsd
	mov esi,[ebx]
        xor edx, edx
  @@calc_hash:
	rol edx, 7
        xor dl,[esi.ebp]
        inc esi
        cmp by [esi.ebp],0
        jne @@calc_hash
        sub eax,edx
	popad
endm


GONEXT	macro
	lodsd
endm


X_PUSH  macro r, x
        xor r, r
        _reg = 0
        _xsize = 0
        l = 0
        irpc c, <x>
        l = l + 1
        endm
        j = 0
        s = 0
        l0 = l
        if (l0 and 3) ne 0
        j = j shl 8 + "x"
        s = s + 8
        l0 = l0 + 1
        endif
        if (l0 and 3) ne 0
        j = j shl 8 + "y"
        s = s + 8
        l0 = l0 + 1
        endif
        if (l0 and 3) ne 0
        j = j shl 8 + "z"
        s = s + 8
        l0 = l0 + 1
        endif
        q = 0
        i = l - 1
        irpc c1, <x>
        t = 0
        irpc c, <x>
        k = "&c"
        if k eq "~"    			;zero
        k = 0
        endif
        if k eq "|"    			;space
        k = 32
        endif
        if k eq "ö"    			;cr
        k = 13
        endif
        if k eq "õ"    			;lf
        k = 10
        endif
        if t eq i
        j = j shl 8
        if k ne 0
        j = j + k
        endif
        s = s + 8
        if s eq 32
        _xsize = _xsize + 4
        if q eq 0
	sub r, _reg - j
        endif
        if (q eq 1) or (q eq 3)
        xor r, _reg xor j
        endif
        if q eq 2
        add r, j - _reg
        endif
        push r
        _reg = j
        q = q + 1
        if q eq 4
        q = 0
        endif
        s = 0
        j = 0
        endif
        exitm
        endif
        t = t + 1
        endm l irpc
        i = i - 1
        endm
        if s ne 0
        error
        endif
endm


X_POP   macro
        lea esp, [esp + _xsize]
endm
