Annotation of doom/vsprintf.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.