⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parserc.asm

📁 汇编资源编辑器
💻 ASM
📖 第 1 页 / 共 4 页
字号:
.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 + -