home *** CD-ROM | disk | FTP | other *** search
/ Groovy Bytes: Behind the Moon / groovybytes.iso / GROOVY / SND_TOOL / FUNK108A.ZIP / DOS32V30.ZIP / PAL / STRINGS / VPRINTF.ASM < prev    next >
Encoding:
Assembly Source File  |  1995-05-20  |  2.8 KB  |  156 lines

  1. ;****************************************************************************
  2. ; Filename: VPRINTF.ASM
  3. ;   Author: Peter Andersson
  4. ;  Version: 0.0
  5. ;  Created: 1995.02.09
  6. ;  Updated: -
  7. ;****************************************************************************
  8. ; Copyright Peter Andersson, 1994-1995.
  9. ; All rights reserved.
  10. ;****************************************************************************
  11. ; Function: ULONG @vprintf(PSZ dest,PSZ fmtstr,PVOID argv);
  12. ;    Input: Eax,dest - pointer to the destination string
  13. ;           Edx,source - pointer to the format string
  14. ;           Ecx,argv - argument value pointer
  15. ;   Output: Number of characters converted.
  16. ;  Comment: @vprintf is used by most *printf formatter functions.
  17. ;****************************************************************************
  18.  
  19.     Include    STDDEF.INC
  20.  
  21.     Codeseg
  22.  
  23. Extrn NullPointer:Byte
  24.  
  25. Proc    vprintf ,3
  26.         Push    Ebx,Edi,Esi,Eax
  27.         Mov    Edi,Eax
  28.         Mov    Esi,Edx
  29.         Mov    Ebx,Ecx
  30.     Align    4
  31. @@Next01:    Mov    Al,[Esi]
  32.         Inc    Esi
  33.         Cmp    Al,"%"
  34.         Je    @@Next02
  35.         Cmp    Al,10
  36.         Je    @@Next12
  37.         TestZ    Al
  38.         Je    @@Exit2             ; <- was bug bug bug bug
  39. @@Next06:    Mov    [Edi],Al
  40.         Inc    Edi
  41.         Jmp    @@Next01
  42.     Align    4
  43. @@Next12:    Mov    [Word Edi],0A0Dh    ; CR + LF
  44.         Add    Edi,2
  45.         Jmp    @@Next01
  46.     Align    4
  47. @@Exit2:    Mov    [Edi],Al
  48. @@Exit:        Mov    Eax,Edi
  49.         Sub    Eax,[Esp]
  50.         Pop    +4,Esi,Edi,Ebx
  51.         Ret
  52.     Align    4
  53. @@Next02:    Mov    Al,[Esi]
  54.         Inc    Esi
  55.         TestZ    Al
  56.         Jz    @@Exit2
  57.         Cmp    Al,"%"
  58.         Je    @@Next06
  59.         Cmp    Al,"d"
  60.         Je    @@SDEC
  61.         Cmp    Al,"i"
  62.         Je    @@SDEC
  63.         Cmp    Al,"u"
  64.         Je    @@UDEC
  65.         Cmp    Al,"c"
  66.         Je    @@CHAR
  67.         Cmp    Al,"s"
  68.         Je    @@STR
  69.         Cmp    Al,"x"
  70.         Je    @@HEX
  71.         Cmp    Al,"o"
  72.         Je    @@OCT
  73.         Cmp    Al,"b"
  74.         Je    @@BIN
  75.         Cmp    Al,"p"
  76.         Je    @@PTR
  77.         Cmp    Al,"n"
  78.         Jne    @@Next06
  79.         Mov    Eax,[Ebx]
  80.         Add    Ebx,4
  81.         Mov    Eax,[Eax]
  82.         Mov    Edx,Edi
  83.         Mov    Ecx,10
  84.         Call    @ltoa
  85.         Mov    Edi,Edx
  86.         Jmp    @@Next01
  87.     Align    4
  88. @@SDEC:        Mov    Eax,[Ebx]
  89.         Add    Ebx,4
  90.         Mov    Edx,Edi
  91.         Mov    Ecx,10
  92.         Call    @ltoa
  93.         Mov    Edi,Edx
  94.         Jmp    @@Next01
  95.     Align    4
  96. @@UDEC:        Mov    Eax,[Ebx]
  97.         Add    Ebx,4
  98.         Mov    Edx,Edi
  99.         Mov    Ecx,10
  100.         Call    @ultoa
  101.         Mov    Edi,Edx
  102.         Jmp    @@Next01
  103.     Align    4
  104. @@CHAR:        Mov    Al,[Ebx]
  105.         Add    Ebx,4
  106.         Mov    [Edi],Al
  107.         Inc    Edi
  108.         Jmp    @@Next01
  109.     Align    4
  110. @@STR:        Mov    Edx,[Ebx]
  111.         Add    Ebx,4
  112.         TestZ    Edx
  113.         Mov    Eax,Edi
  114.         Jz    @@Next08
  115.         Call    @stpcpy
  116.         Mov    Edi,Eax
  117.         Jmp    @@Next01
  118.     Align    4
  119. @@Next08:    Mov    Edx,Offset NullPointer
  120.         Call    @stpcpy
  121.         Mov    Edi,Eax
  122.         Jmp    @@Next01
  123.     Align    4
  124. @@PTR:        Mov    [Dword Edi]," x0<"
  125.         Mov    Eax,[Ebx]
  126.         Add    Ebx,4
  127.         Lea    Edx,[Edi+3]
  128.         Call    @xtoa
  129.         Lea    Edi,[Edx+1]
  130.         Mov    [Byte Edx],">"
  131.         Jmp    @@Next01
  132.     Align    4
  133. @@HEX:        Mov    Eax,[Ebx]
  134.         Add    Ebx,4
  135.         Mov    Edx,Edi
  136.         Call    @xtoa
  137.         Mov    Edi,Edx
  138.         Jmp    @@Next01
  139.     Align    4
  140. @@OCT:        Mov    Eax,[Ebx]
  141.         Add    Ebx,4
  142.         Mov    Edx,Edi
  143.         Call    @otoa
  144.         Mov    Edi,Edx
  145.         Jmp    @@Next01
  146.     Align    4
  147. @@BIN:        Mov    Eax,[Ebx]
  148.         Add    Ebx,4
  149.         Mov    Edx,Edi
  150.         Call    @btoa
  151.         Mov    Edi,Edx
  152.         Jmp    @@Next01
  153. Endp
  154.  
  155.     End
  156.