;****************************************************************************
; Filename: VPRINTF.ASM
; Author: Peter Andersson
; Version: 0.0
; Created: 1995.02.09
; Updated: -
;****************************************************************************
; Copyright Peter Andersson, 1994-1995.
; All rights reserved.
;****************************************************************************
; Function: ULONG @vprintf(PSZ dest,PSZ fmtstr,PVOID argv);
; Input: Eax,dest - pointer to the destination string
; Edx,source - pointer to the format string
; Ecx,argv - argument value pointer
; Output: Number of characters converted.
; Comment: @vprintf is used by most *printf formatter functions.
;****************************************************************************
Include STDDEF.INC
Codeseg
Extrn NullPointer:Byte
Proc vprintf ,3
Push Ebx,Edi,Esi,Eax
Mov Edi,Eax
Mov Esi,Edx
Mov Ebx,Ecx
Align 4
@@Next01: Cmp [NumberChars],0
Jnz @@InsertSpaces
@@spacesDone: Mov Al,[Esi]
Inc Esi
Cmp Al,"%"
Je @@Next02
Cmp Al,10
Je @@Next12
TestZ Al
Je @@Exit2 ; <- was bug bug bug bug
@@Next06: Mov [Edi],Al
Inc Edi
Jmp @@Next01
Align 4
@@Next12: Mov [Word Edi],0A0Dh ; CR + LF
Add Edi,2
Jmp @@Next01
Align 4
@@Exit2: Mov [Edi],Al
@@Exit: Mov Eax,Edi
Sub Eax,[Esp]
Pop +4,Esi,Edi,Ebx
Ret
Align 4
@@Next02: Mov Al,[Esi]
Inc Esi
TestZ Al
Jz @@Exit2
Cmp Al,"%"
Je @@Next06
Cmp Al,"d"
Je @@SDEC
Cmp Al,"i"
Je @@SDEC
Cmp Al,"u"
Je @@UDEC
Cmp Al,"c"
Je @@CHAR
Cmp Al,"s"
Je @@STR
Cmp Al,"x"
Je @@HEX
Cmp Al,"o"
Je @@OCT
Cmp Al,"b"
Je @@BIN
Cmp Al,"p"
Je @@PTR
Cmp Al,"l"
Je @@Next02
Cmp Al,"n"
Je @@SDECP
Lea Eax,[Esi-1] ; Get char size number
Call @atoi
Cmp [errno],-1
Je @@Next06
Mov Esi,Edx
Mov [NumberChars],Eax
Mov [Old_Dest],Edi
Mov Ecx,Eax
Mov Eax,Edi
Add Edi,Ecx
mov Dl,' '
call @memset
Jmp @@Next02
@@SDECP: Mov Eax,[Ebx]
Add Ebx,4
Mov Eax,[Eax]
Mov Edx,Edi
Mov Ecx,10
Call @ltoa
Mov Edi,Edx
Jmp @@Next01
Align 4
@@SDEC: Mov Eax,[Ebx]
Add Ebx,4
Mov Edx,Edi
Mov Ecx,10
Call @ltoa
Mov Edi,Edx
Jmp @@Next01
Align 4
@@UDEC: Mov Eax,[Ebx]
Add Ebx,4
Mov Edx,Edi
Mov Ecx,10
Call @ultoa
Mov Edi,Edx
Jmp @@Next01
Align 4
@@CHAR: Mov Al,[Ebx]
Add Ebx,4
Mov [Edi],Al
Inc Edi
Jmp @@Next01
Align 4
@@STR: Mov Edx,[Ebx]
Add Ebx,4
TestZ Edx
Mov Eax,Edi
Jz @@Next08
Call @stpcpy
Mov Edi,Eax
Jmp @@Next01
Align 4
@@Next08: Mov Edx,Offset NullPointer
Call @stpcpy
Mov Edi,Eax
Jmp @@Next01
Align 4
@@PTR: Mov [Dword Edi]," x0<"
Mov Eax,[Ebx]
Add Ebx,4
Lea Edx,[Edi+3]
Call @xtoa
Lea Edi,[Edx+1]
Mov [Byte Edx],">"
Jmp @@Next01
Align 4
@@HEX: Mov Eax,[Ebx]
Add Ebx,4
Mov Edx,Edi
Call @xtoa
Mov Edi,Edx
Jmp @@Next01
Align 4
@@OCT: Mov Eax,[Ebx]
Add Ebx,4
Mov Edx,Edi
Call @otoa
Mov Edi,Edx
Jmp @@Next01
Align 4
@@BIN: Mov Eax,[Ebx]
Add Ebx,4
Mov Edx,Edi
Call @btoa
Mov Edi,Edx
Jmp @@Next01
Align 4
NumberChars DD 0
Old_Dest DD ?
@@InsertSpaces:
Mov Eax,[NumberChars]
Mov Edx,Eax
Mov Ecx,[Old_Dest]
Add Eax,Ecx
Add Edx,Ecx
shl Eax,1
Sub Eax,Edi
Mov Edi,Edx
call @strcpy
mov [NumberChars],0
jmp @@spacesDone
Endp
End