Metropoli BBS
VIEWER: vprintf.asm MODE: TEXT (ASCII)
;****************************************************************************
; 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
[ RETURN TO DIRECTORY ]