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 }