|
|
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: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.