DOOM64-RE

DOOM 64 Reverse Engineering
Log | Files | Refs | README | LICENSE

vsprintf.c (2596B)


      1 
      2 
      3 int mystrlen(char *string) // 80001CE8
      4 {
      5   int rc = 0;
      6   if (string) while (*(string++)) rc++;
      7   else rc = -1;
      8   return rc;
      9 }
     10 
     11 int D_vsprintf(char *string, const char *format, int *argptr) // 80001D24
     12 {
     13   int len, i, div, uselong;
     14   int fieldsize;
     15   unsigned long num;
     16   long snum;
     17   char padchar;
     18   char *str;
     19   char *origstring = string;
     20 
     21   while (*format)
     22   {
     23     if (*format != '%') *(string++) = *(format++);
     24     else
     25     {
     26       format++;
     27 
     28       /* set field pad character to 0 if necessary */
     29       if (*format == '0')
     30       {
     31         padchar = '0';
     32         format++;
     33       }
     34       else padchar = ' ';
     35 
     36       /* get the fieldwidth if any */
     37       fieldsize = 0;
     38       while (*format >= '0' && *format <= '9')
     39 	fieldsize = fieldsize * 10 + *(format++) - '0';
     40 
     41       /* get rid of 'l' if present */
     42       if (*format == 'l')
     43       {
     44         uselong = 1;
     45         format++;
     46       } else uselong = 0;
     47 
     48       div = 10;
     49       if (*format == 'c')
     50       {
     51 	*(string++) = *argptr++;
     52 	format++;
     53       }
     54       else if (*format == 's')
     55       {
     56 	str = (char *)*argptr++;
     57 	len = mystrlen(str);
     58 	while (fieldsize-- > len) *(string++) = padchar; /* do field pad */
     59 	while (*str) *(string++) = *(str++); /* copy string */
     60 	format++;
     61       }
     62       else
     63       {
     64         if (*format == 'o') /* octal */
     65         {
     66           div = 8;
     67           if (uselong)
     68 	    num = *argptr++;
     69 	  else
     70 	    num = *argptr++;
     71 /*	  printf("o=0%o\n", num); */
     72         }
     73         else if (*format == 'x' || *format == 'X')  /* hex */
     74         {
     75           div = 16;
     76           if (uselong)
     77 	    num = *argptr++;
     78 	  else
     79 	    num = *argptr++;
     80 /*	  printf("x=%x\n", num); */
     81 	}
     82         else if (*format == 'i' || *format == 'd' || *format == 'u') /* decimal */
     83         {
     84           div = 10;
     85           if (uselong)
     86 	    snum = *argptr++;
     87 	  else
     88 	    snum = *argptr++;
     89 	  if (snum < 0 && *format != 'u') /* handle negative %i or %d */
     90 	  {
     91 	    *(string++) = '-';
     92 	    num = -snum;
     93 	    if (fieldsize) fieldsize--;
     94 	  } else num = snum;
     95 	}
     96 	else return -1; /* unrecognized format specifier */
     97 
     98 	/* print any decimal or hex integer */
     99 	len = 0;
    100 	while (num || fieldsize || !len)
    101 	{
    102 	  for (i=len ; i ; i--) string[i] = string[i-1]; /* shift right */
    103 	  if (len && fieldsize && !num) *string = padchar; /* pad out */
    104 	  else
    105 	  {
    106 	    /* put in a hex or decimal digit */
    107 	    *string = num % div;
    108 	    *string += *string > 9 ? 'A'-10 : '0';
    109 /*	    printf("d = %c\n", *string); */
    110 	    num /= div;
    111 	  }
    112 	  len++;
    113 	  if (fieldsize) fieldsize--;
    114 	}
    115 	string += len;
    116 	format++;
    117       }
    118     }
    119   }
    120   *string = 0;
    121 
    122   return origstring - string;
    123 }