?? parserc.asm
字號:
.data?
wordbuff db 512 dup(?)
namebuff db 256 dup(?)
.code
SkipToEndOfComment proc
.while byte ptr [esi] && word ptr [esi]!='/*'
inc esi
.endw
ret
SkipToEndOfComment endp
SkipToEol proc
.while byte ptr [esi]!=VK_RETURN && byte ptr [esi]
inc esi
.endw
ret
SkipToEol endp
SkipSpace proc
@@:
.while byte ptr [esi]==VK_SPACE || byte ptr [esi]==VK_TAB
inc esi
.endw
.if word ptr [esi]=='*/'
invoke SkipToEndOfComment
jmp @b
.endif
.if byte ptr [esi]==';' || word ptr [esi]=='//'
invoke SkipToEol
.endif
ret
SkipSpace endp
SkipCRLF proc
@@:
.while byte ptr [esi]==VK_SPACE || byte ptr [esi]==VK_TAB || byte ptr [esi]==0Dh || byte ptr [esi]==0Ah
inc esi
.endw
.if byte ptr [esi]==';' || (byte ptr [esi]=='/' && byte ptr [esi+1]=='/')
invoke SkipToEol
jmp @b
.endif
ret
SkipCRLF endp
UnQuoteWord proc uses esi edi,lpWord:DWORD
mov esi,lpWord
mov edi,esi
.if byte ptr [esi]=='"'
inc esi
.endif
.while byte ptr [esi]
mov al,[esi]
inc esi
.if al!='"'
mov [edi],al
inc edi
.endif
.endw
mov dword ptr [edi],0
ret
UnQuoteWord endp
GetWord proc uses esi edi,lpWord:DWORD,lpLine:DWORD
mov esi,lpLine
mov edi,lpWord
invoke SkipCRLF
.if byte ptr [esi]=='"'
mov al,[esi]
mov [edi],al
inc esi
inc edi
xor eax,eax
.while byte ptr [esi] && al!='"'
mov al,[esi]
mov [edi],al
inc esi
inc edi
.endw
.else
.while byte ptr [esi] && byte ptr [esi]!=VK_SPACE && byte ptr [esi]!=VK_TAB && byte ptr [esi]!=0Dh && byte ptr [esi]!=0Ah && byte ptr [esi]!=',' && byte ptr [esi]!='|'
mov al,[esi]
mov [edi],al
inc esi
inc edi
.endw
.endif
mov byte ptr [edi],0
invoke SkipSpace
mov dl,[esi]
.if dl==',' || dl=='|'
inc esi
invoke SkipCRLF
.endif
mov eax,esi
sub eax,lpLine
ret
GetWord endp
IsBegin proc lpWord:DWORD
push ecx
push edx
invoke lstrcmpi,lpWord,offset szBEGIN
.if eax
invoke lstrcmpi,lpWord,offset szBEGINSHORT
.endif
pop edx
pop ecx
ret
IsBegin endp
IsEnd proc lpWord:DWORD
push ecx
push edx
invoke lstrcmpi,lpWord,offset szEND
.if eax
invoke lstrcmpi,lpWord,offset szENDSHORT
.endif
pop edx
pop ecx
ret
IsEnd endp
GetName proc lpProMem:DWORD,lpBuff:DWORD,lpName:DWORD,lpID:DWORD
mov eax,lpBuff
mov al,[eax]
.if (al>='0' && al<='9') || al=='-'
;ID
invoke ResEdDecToBin,lpBuff
mov edx,lpID
mov [edx],eax
mov edx,lpName
mov byte ptr [edx],0
.else
;Name
invoke lstrcpyn,lpName,lpBuff,32
;ID
invoke FindName,lpProMem,lpBuff
.if eax
mov [eax].NAMEMEM.delete,TRUE
mov eax,[eax].NAMEMEM.value
mov edx,lpID
mov [edx],eax
.endif
.endif
ret
GetName endp
ParseDefine proc uses esi,lpRCMem:DWORD,lpProMem:DWORD
mov esi,lpRCMem
invoke GetWord,offset namebuff,esi
add esi,eax
invoke GetWord,offset wordbuff,esi
add esi,eax
invoke AddName,lpProMem,offset namebuff,offset wordbuff
mov eax,esi
sub eax,lpRCMem
ret
ParseDefine endp
ParseFileName proc uses esi edi,lpRCMem:DWORD
LOCAL nend:BYTE
mov esi,lpRCMem
mov edi,offset wordbuff
call SkipSpace
xor ecx,ecx
.while TRUE
mov al,[esi+ecx]
.if al==VK_RETURN
xor al,al
.endif
mov [edi+ecx],al
inc ecx
.break .if !al
.endw
lea esi,[esi+ecx-1]
push esi
mov esi,offset wordbuff
mov edi,esi
mov al,[esi]
.if al=='"'
mov nend,al
inc esi
.elseif al=='<'
mov nend,'>'
inc esi
.else
mov nend,' '
.endif
.while byte ptr [esi]
mov al,[esi]
.if al==nend
xor al,al
.elseif al=='\'
.if byte ptr [esi+1]=='\'
inc esi
.endif
.elseif al=='/'
mov al,'\'
.endif
mov [edi],al
inc esi
inc edi
.endw
pop esi
mov eax,esi
sub eax,lpRCMem
ret
ParseFileName endp
ParseInclude proc uses esi edi,lpRCMem:DWORD,lpProMem:DWORD
mov esi,lpRCMem
invoke GetTypeMem,lpProMem,TPE_INCLUDE
mov eax,[eax].PROJECT.hmem
.if !eax
invoke AddTypeMem,lpProMem,64*1024,TPE_INCLUDE
.endif
mov edi,eax
.while [edi].INCLUDEMEM.szfile
lea edi,[edi+sizeof INCLUDEMEM]
.endw
invoke ParseFileName,esi
add esi,eax
invoke lstrcpy,addr [edi].INCLUDEMEM.szfile,offset wordbuff
mov eax,esi
sub eax,lpRCMem
ret
ParseInclude endp
ParseSkip proc uses ebx esi edi,lpRCMem:DWORD,lpProMem:DWORD
mov esi,lpRCMem
xor ebx,ebx
@@:
add esi,ebx
invoke GetWord,offset wordbuff,esi
mov ebx,eax
invoke lstrcmpi,offset wordbuff,offset szPRELOAD
or eax,eax
je @b
invoke lstrcmpi,offset wordbuff,offset szLOADONCALL
or eax,eax
je @b
invoke lstrcmpi,offset wordbuff,offset szFIXED
or eax,eax
je @b
invoke lstrcmpi,offset wordbuff,offset szMOVEABLE
or eax,eax
je @b
invoke lstrcmpi,offset wordbuff,offset szDISCARDABLE
or eax,eax
je @b
invoke lstrcmpi,offset wordbuff,offset szPURE
or eax,eax
je @b
invoke lstrcmpi,offset wordbuff,offset szIMPURE
or eax,eax
je @b
xor ebx,ebx
invoke GetWord,offset wordbuff,esi
add esi,eax
invoke lstrcmpi,offset wordbuff,offset szBEGIN
.if eax
invoke lstrcmpi,offset wordbuff,offset szBEGINSHORT
.endif
.if !eax
Nx:
inc ebx
@@:
invoke GetWord,offset wordbuff,esi
add esi,eax
invoke lstrcmpi,offset wordbuff,offset szEND
.if eax
invoke lstrcmpi,offset wordbuff,offset szENDSHORT
.endif
.if eax
invoke lstrcmpi,offset wordbuff,offset szBEGIN
.if eax
invoke lstrcmpi,offset wordbuff,offset szBEGINSHORT
.endif
.if !eax
jmp Nx
.endif
invoke SkipToEol
jmp @b
.endif
dec ebx
jne @b
.endif
mov eax,esi
sub eax,lpRCMem
ret
ParseSkip endp
ParseStringTable proc uses ebx esi edi,lpRCMem:DWORD,lpProMem:DWORD
mov esi,lpRCMem
invoke AddTypeMem,lpProMem,64*1024,TPE_STRING
mov edi,eax
xor ebx,ebx
@@:
add esi,ebx
invoke GetWord,offset wordbuff,esi
mov ebx,eax
invoke lstrcmpi,offset wordbuff,offset szPRELOAD
or eax,eax
je @b
invoke lstrcmpi,offset wordbuff,offset szLOADONCALL
or eax,eax
je @b
invoke lstrcmpi,offset wordbuff,offset szFIXED
or eax,eax
je @b
invoke lstrcmpi,offset wordbuff,offset szMOVEABLE
or eax,eax
je @b
invoke lstrcmpi,offset wordbuff,offset szDISCARDABLE
or eax,eax
je @b
invoke lstrcmpi,offset wordbuff,offset szPURE
or eax,eax
je @b
invoke lstrcmpi,offset wordbuff,offset szIMPURE
or eax,eax
je @b
@@:
invoke GetWord,offset wordbuff,esi
add esi,eax
invoke lstrcmpi,offset wordbuff,offset szBEGIN
.if eax
invoke lstrcmpi,offset wordbuff,offset szBEGINSHORT
.endif
.if !eax
@@:
invoke GetWord,offset wordbuff,esi
add esi,eax
invoke lstrcmpi,offset wordbuff,offset szEND
.if eax
invoke lstrcmpi,offset wordbuff,offset szENDSHORT
.endif
.if eax
invoke GetName,lpProMem,offset wordbuff,addr [edi].STRINGMEM.szname,addr [edi].STRINGMEM.value
invoke GetWord,offset wordbuff,esi
add esi,eax
invoke UnQuoteWord,offset wordbuff
invoke lstrcpy,addr [edi].STRINGMEM.szstring,offset wordbuff
add edi,sizeof STRINGMEM
jmp @b
.endif
.endif
mov eax,esi
sub eax,lpRCMem
ret
ParseStringTable endp
ParseResource proc uses esi edi,lpRCMem:DWORD,lpProMem:DWORD,nType:DWORD
mov esi,lpRCMem
invoke GetTypeMem,lpProMem,TPE_RESOURCE
mov eax,[eax].PROJECT.hmem
.if !eax
invoke AddTypeMem,lpProMem,64*1024,TPE_RESOURCE
.endif
mov edi,eax
.while [edi].RESOURCEMEM.szfile
lea edi,[edi+sizeof RESOURCEMEM]
.endw
mov eax,nType
mov [edi].RESOURCEMEM.ntype,eax
invoke GetName,lpProMem,offset namebuff,addr [edi].RESOURCEMEM.szname,addr [edi].RESOURCEMEM.value
xor ebx,ebx
@@:
add esi,ebx
invoke GetWord,offset wordbuff,esi
mov ebx,eax
invoke lstrcmpi,offset wordbuff,offset szPRELOAD
or eax,eax
je @b
invoke lstrcmpi,offset wordbuff,offset szLOADONCALL
or eax,eax
je @b
invoke lstrcmpi,offset wordbuff,offset szFIXED
or eax,eax
je @b
invoke lstrcmpi,offset wordbuff,offset szMOVEABLE
or eax,eax
je @b
invoke lstrcmpi,offset wordbuff,offset szDISCARDABLE
or eax,eax
je @b
invoke lstrcmpi,offset wordbuff,offset szPURE
or eax,eax
je @b
invoke lstrcmpi,offset wordbuff,offset szIMPURE
or eax,eax
je @b
invoke ParseFileName,esi
add esi,eax
invoke lstrcpy,addr [edi].RESOURCEMEM.szfile,offset wordbuff
mov eax,esi
sub eax,lpRCMem
ret
ParseResource endp
ConvertSize proc uses esi,lpMem:DWORD
LOCAL bux:DWORD
LOCAL buy:DWORD
LOCAL rect:RECT
mov esi,lpMem
mov dlgps,10
mov dlgfn,0
invoke CreateDialogIndirectParam,hInstance,offset dlgdata,hDEd,offset TestProc,0
invoke DestroyWindow,eax
push fntwt
pop dfntwt
push fntht
pop dfntht
mov eax,[esi].DLGHEAD.fontsize
mov dlgps,ax
pushad
lea esi,[esi].DLGHEAD.font
mov edi,offset dlgfn
xor eax,eax
mov ecx,32
@@:
lodsb
stosw
loop @b
popad
invoke CreateDialogIndirectParam,hInstance,offset dlgdata,hDEd,offset TestProc,0
invoke DestroyWindow,eax
invoke GetDialogBaseUnits
mov edx,eax
and eax,0FFFFh
mov bux,eax
shr edx,16
mov buy,edx
add esi,sizeof DLGHEAD
.while [esi].DIALOG.hwnd
mov rect.left,0
mov rect.top,0
mov rect.right,0
mov rect.bottom,0
.if ![esi].DIALOG.ntype
invoke AdjustWindowRectEx,addr rect,[esi].DIALOG.style,FALSE,[esi].DIALOG.exstyle
.endif
mov eax,[esi].DIALOG.x
call ConvX
.if fSnapToGrid
call SnapX
.endif
mov [esi].DIALOG.x,eax
mov eax,[esi].DIALOG.y
call ConvY
.if fSnapToGrid
call SnapY
.endif
mov [esi].DIALOG.y,eax
mov eax,[esi].DIALOG.ccx
call ConvX
.if fSnapToGrid
call SnapX
inc eax
.endif
add eax,rect.right
sub eax,rect.left
mov [esi].DIALOG.ccx,eax
mov eax,[esi].DIALOG.ccy
call ConvY
.if fSnapToGrid
call SnapY
inc eax
.endif
add eax,rect.bottom
sub eax,rect.top
mov [esi].DIALOG.ccy,eax
add esi,sizeof DIALOG
.endw
ret
ConvX:
cdq
mov ecx,fntwt
imul ecx
mov ecx,bux
imul ecx
mov ecx,dfntwt
idiv ecx
cdq
mov ecx,4
idiv ecx
retn
SnapX:
mov ecx,Gridcx
.if sdword ptr eax>0
add eax,ecx
dec eax
.else
sub eax,ecx
inc eax
.endif
cdq
idiv ecx
cdq
imul ecx
retn
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -