..Open = 0 ; When some procedure is not finished with 'endp' macro, ; "Unexpected end of file" error, occur without any info, where is error. ; in this case, comment followind 2 rows and uncomment next two. ; proc_used and endp_used are optimized versions of the macroses. ; proc_debug and endp_debug are debug versions. When you use debug ; versions, error message will show you where is missing 'endp'. ; ; Don't forget to recompile with *_used versions, to get optimised ; binary with all not used procedure excluded. macro RestoreEx [name] { macro rstr#name _% RESTORE name %_ macro rstr _% %_ rstr#name purge rstr,rstr#name } _% fix { %_ fix } restore fix RestoreEx proc fix proc_used endp fix endp_used ;proc fix proc_debug ;endp fix endp_debug macro proc_used name,[arg] { ; define procedure common proc_args fix arg ; if ~ used name ; if ~..ShowSkipped eq OFF ; display 1,'Procedure skiped: ',`name, $0d, $0a ; end if ; else if used name name: virtual at ebp+8 if ~ arg eq forward local ..arg ..arg dd ? arg equ ..arg common end if ..ret = $ - (ebp+8) end virtual local ..dynamic_data,..dynamic_size dynamic_data equ ..dynamic_data dynamic_size equ ..dynamic_size virtual at ebp - dynamic_size dynamic_data: } macro proc_debug name,[arg] { ; define procedure common proc_args fix arg if ..Open > 0 Error! Missing 'endp' before procedure `name end if ..Open = ..Open+1 name: virtual at ebp+8 if ~ arg eq forward local ..arg ..arg dd ? arg equ ..arg common end if ..ret = $ - (ebp+8) end virtual local ..dynamic_data,..dynamic_size dynamic_data equ ..dynamic_data dynamic_size equ ..dynamic_size virtual at ebp - dynamic_size dynamic_data: } macro begin { ; begin procedure instructions ; continue from "proc" macro. ; align 4 rb (4 - ($ - dynamic_data) and 11b) and 11b ; align the stack at dword. dynamic_size = $ - dynamic_data end virtual if (dynamic_size = 0) if ..ret <> 0 push ebp ; smaller is dynamic_size = 0 mov ebp, esp end if else enter dynamic_size, 0 end if } macro return { ; return from procedure ; continue from "enter" macro. if ..ret <> 0 leave ret ..ret else if dynamic_size <> 0 leave end if ret end if } macro endp_used { restore proc_args end if } macro endp_debug { restore proc_args ..Open = ..Open - 1 } macro _reversepusharg [arg] { reverse pushd arg } macro stdcall proc,[arg] { ; call procedure common if ~ arg eq _reversepusharg arg end if call proc } macro invoke proc,[arg] { ; invoke procedure (indirect) common stdcall [proc],arg } ;end of file