I should have made the program strip the leading zeros, but I have a little proggy that can do that...
include \masm32\include\masm32rt.inc
OpenFilex proto :dword
SaveFilex proto :dword
LoadFilex proto :dword
WriteFilex proto :dword, :dword, :dword
zStrLen proto :dword
.data
str1 dd 0
str2 dd 0
hWnd dd 0
hInstance dd 0
infile db 128 dup (0)
outfile db 128 dup (0)
inbuf dd 0
insize dd 0
.code
start:
invoke OpenFilex, addr infile
invoke LoadFilex, eax
mov inbuf, esi
mov insize, ecx
xor eax, eax
xor edx, edx
top1:
mov cl, byte ptr [esi+edx]
cmp cl, 0
jz done1
cmp cl, "0"
jnz writeit
iszero:
cmp byte ptr [esi+edx], "0"
jnz writeit
inc edx
jmp iszero
writeit:
mov cl, byte ptr [esi+edx]
cmp cl, 0Dh
jz crlf1
mov byte ptr [esi+eax], cl
inc eax
inc edx
cmp edx, insize
jge done1
jmp writeit
crlf1: ; special case, write two bytes
mov byte ptr [esi+eax], cl
inc eax
inc edx
cmp edx, insize
jge done1
mov cl, byte ptr [esi+edx]
mov byte ptr [esi+eax], cl
inc eax
inc edx
cmp edx, insize
jge done1
jmp top1
done1:
mov byte ptr [esi+eax], 0
invoke zStrLen, esi
push eax
push esi
invoke SaveFilex, addr outfile
pop esi
pop eax
invoke WriteFilex, addr outfile, esi, eax
invoke GlobalFree, inbuf
invoke ExitProcess, 0
OpenFilex proc FileBuffer:DWORD
LOCAL ofn:OPENFILENAME
.data
lpOpen db "Open File", 0
lpSave db "Save File", 0
lpFilter db "All Files", 0, "*.*", 0, 0
.code
mov eax, FileBuffer
mov BYTE PTR [eax], 0
push edi
mov ecx, sizeof OPENFILENAME
mov al, 0
lea edi, ofn
rep stosb
pop edi
mov ofn.lStructSize, sizeof OPENFILENAME
m2m ofn.hWndOwner, hWnd
m2m ofn.hInstance, hInstance
m2m ofn.lpstrFilter, offset lpFilter
m2m ofn.lpstrFile, FileBuffer
mov ofn.nMaxFile, 240h
m2m ofn.lpstrTitle, offset lpOpen
mov ofn.Flags, OFN_EXPLORER or OFN_FILEMUSTEXIST or OFN_LONGNAMES
invoke GetOpenFileName,ADDR ofn
mov eax, FileBuffer
ret
OpenFilex endp
SaveFilex proc FileBuffer:DWORD
LOCAL ofn:OPENFILENAME
mov eax, FileBuffer
mov BYTE PTR [eax], 0
push edi
mov ecx, sizeof OPENFILENAME
mov al, 0
lea edi, ofn
rep stosb
pop edi
mov ofn.lStructSize, sizeof OPENFILENAME
m2m ofn.hWndOwner, hWnd
m2m ofn.hInstance, hInstance
m2m ofn.lpstrFilter, offset lpFilter
m2m ofn.lpstrFile, FileBuffer
mov ofn.nMaxFile, 240h
m2m ofn.lpstrTitle, offset lpSave
mov ofn.Flags, OFN_EXPLORER or OFN_LONGNAMES or OFN_HIDEREADONLY or OFN_OVERWRITEPROMPT
invoke GetSaveFileName,ADDR ofn
mov eax, FileBuffer
ret
SaveFilex endp
LoadFilex proc lpName:DWORD
LOCAL hFile:DWORD, fl:DWORD, bRead:DWORD, hMem$:DWORD
invoke CreateFile,lpName,080000000h,1,NULL,3,NULL,NULL
cmp eax, -1
jne @F
fn MessageBox,NULL,lpName,"Couldn't read File!",MB_OK
xor eax, eax
ret
@@:
mov hFile, eax
invoke GetFileSize,hFile,NULL
mov fl, eax
invoke GlobalAlloc, GPTR, fl
mov hMem$, eax ; source file memory
invoke ReadFile,hFile,hMem$,fl,ADDR bRead,NULL
invoke CloseHandle,hFile
mov eax, 1
mov esi, hMem$
mov ecx, fl
ret
LoadFilex endp
WriteFilex proc lpName:DWORD,lpData:DWORD,fl:DWORD
LOCAL hOutput:DWORD
LOCAL bw :DWORD
invoke CreateFile,lpName,GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
cmp eax, -1
jne @F
fn MessageBox,NULL,lpName,"Couldn't Write File!",MB_OK
xor eax, eax
ret
@@:
mov hOutput, eax
invoke WriteFile,hOutput,lpData,fl,ADDR bw,NULL
invoke FlushFileBuffers,hOutput
invoke CloseHandle,hOutput
mov eax, 1
ret
WriteFilex endp
zStrLen proc src:dword
push esi
push ecx
mov esi, src
xor eax, eax
@@:
mov cl, [esi]
cmp cl, 0
jz @f
inc eax
inc esi
jmp @b
@@:
pop ecx
pop esi
ret
zStrLen endp
end start
The only caveat with this program, it strips the very first zero, which is in fact supposed to be part of the Fibonacci sequence. :(
I'll look at that when time permits.