|
|
1.1 ! root 1: /* doprnt.c Tahoe version 1/20/83 */ ! 2: #include <stdio.h> ! 3: ! 4: #define STRMAX (BUFSIZ>>2) ! 5: #define RMAX (STRMAX-50) ! 6: ! 7: char *_punsign(), *_pfloat(), *_pscien(), *gcvt(); ! 8: _doprnt(formp, argp, file) ! 9: register char *formp; ! 10: int *argp; ! 11: FILE *file; ! 12: { ! 13: register char *p, *s; ! 14: register count, width, ndigit, decpt; ! 15: int n, base, max; ! 16: char c, rjust, zfill, ndfnd; ! 17: char string[STRMAX]; ! 18: ! 19: loop: ! 20: max = 0; ! 21: s = p = string; ! 22: while((c = *formp++) && c!='%') { ! 23: *p++ = c; ! 24: if (++max >= STRMAX-1) { ! 25: _strout(STRMAX, s, 0, file, 0); ! 26: p = string; ! 27: max = 0; ! 28: } ! 29: } ! 30: if((count = p-s) > 0) ! 31: _strout(count, s, 0, file, 0); ! 32: if(c == '\0') ! 33: return; ! 34: width = ndigit = rjust = ndfnd = 0; ! 35: zfill = ' '; ! 36: if(*formp == '-') { ! 37: rjust++; ! 38: formp++; ! 39: } ! 40: if(*formp == '0') ! 41: zfill = '0'; ! 42: if(*formp == '*') { ! 43: formp++; ! 44: width = *argp++; ! 45: } ! 46: else while('0'<=*formp && *formp<='9') ! 47: width = width*10+(*formp++)-'0'; ! 48: if(*formp == '.') { ! 49: if(*++formp == '*') { ! 50: formp++; ! 51: ndigit = *argp++; ! 52: ndfnd++; ! 53: } ! 54: else while('0'<=*formp && *formp<='9') { ! 55: ndigit = ndigit*10+(*formp++)-'0'; ! 56: ndfnd++; ! 57: } ! 58: } ! 59: p = string; ! 60: switch(c = *formp++) { ! 61: ! 62: case 'c': ! 63: zfill = ' '; ! 64: *p++ = (*argp++)&0377; ! 65: break; ! 66: ! 67: case 's': ! 68: s = (char *)*argp++; ! 69: if(s == NULL) ! 70: s = "(null)"; ! 71: p = s; ! 72: while(*p != '\0') { ! 73: p++; ! 74: if(--ndigit == 0) ! 75: break; ! 76: } ! 77: break; ! 78: ! 79: case 'l': ! 80: case 'L': ! 81: switch(*formp++) { ! 82: case 'd': ! 83: goto case_d; ! 84: case 'o': ! 85: goto case_o; ! 86: case 'x': ! 87: goto case_x; ! 88: case 'u': ! 89: goto case_u; ! 90: case 'f': ! 91: goto case_f; ! 92: default: ! 93: formp--; ! 94: goto xdef; ! 95: } ! 96: case_d: ! 97: case 'd': ! 98: case 'D': ! 99: n = *argp++; ! 100: if(n < 0) { ! 101: n = -n; ! 102: *p++ = '-'; ! 103: } ! 104: base = 10; ! 105: goto pun; ! 106: ! 107: case_u: ! 108: case 'u': ! 109: case 'U': ! 110: n = *argp++; ! 111: base = 10; ! 112: goto pun; ! 113: ! 114: case_o: ! 115: case 'o': ! 116: case 'O': ! 117: n = *argp++; ! 118: base = 8; ! 119: goto pun; ! 120: ! 121: case_x: ! 122: case 'x': ! 123: case 'X': ! 124: n = *argp++; ! 125: base = 16; ! 126: ! 127: pun: ! 128: if(n == 0) ! 129: *p++ = '0'; ! 130: else ! 131: p = _punsign(n, base, p); ! 132: break; ! 133: ! 134: case 'g': ! 135: p = gcvt(*((double *)argp), ndfnd?(ndigit>RMAX?RMAX:ndigit):6, p); ! 136: argp++; ! 137: argp++; ! 138: while(*p) ! 139: p++; ! 140: break; ! 141: ! 142: case_f: ! 143: case 'f': ! 144: p = _pfloat(*((double *)argp), ndfnd?(ndigit>RMAX?RMAX:ndigit):6, p); ! 145: argp++; ! 146: argp++; ! 147: break; ! 148: ! 149: case 'e': ! 150: p = _pscien(*((double *)argp), (ndfnd?(ndigit>RMAX?RMAX:ndigit):6)+1, p); ! 151: argp++; ! 152: argp++; ! 153: break; ! 154: ! 155: xdef: ! 156: default: ! 157: *p++ = c; ! 158: } ! 159: count = p-s; ! 160: if((width -= count) < 0) ! 161: width = 0; ! 162: if(rjust == 0) ! 163: width = -width; ! 164: _strout(count, s, width, file, zfill); ! 165: goto loop; ! 166: } ! 167: ! 168: char * ! 169: _punsign(n, base, p) ! 170: register unsigned n; ! 171: register base; ! 172: register char *p; ! 173: { ! 174: ! 175: if(n==0) ! 176: return(p); ! 177: p = _punsign(n/base, base, p); ! 178: *p = n%base+'0'; ! 179: if(*p > '9') ! 180: *p += 'A'-'0'-10; ! 181: return(++p); ! 182: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.