1 2 /* 3 * Scaled down version of C Library printf and sprintf. 4 * Only %c %s %u %d (==%u) %o %D %O %x %X are recognized. 5 * 6 * Frank Pronk 7 * Copyright (c) 1983 8 */ 9 10 static char *lp; 11 12 char * 13 sprint (buf, fmt, x1) 14 char *buf, *fmt; 15 unsigned x1; 16 { 17 (void) doprint (buf, fmt, &x1); 18 } 19 20 fprint (fd, fmt, x1) 21 char *fmt; 22 unsigned x1; 23 { 24 register int n; 25 char line[128]; 26 27 n = doprint (line, fmt, &x1); 28 return (write (fd, line, n)); 29 } 30 31 print (fmt, x1) 32 char *fmt; 33 unsigned x1; 34 { 35 register int n; 36 char line[128]; 37 38 n = doprint (line, fmt, &x1); 39 return (write (1, line, n)); 40 } 41 42 static 43 doprint(buf, fmt, adx) 44 char *buf; 45 register char *fmt; 46 register unsigned *adx; 47 { 48 register c; 49 char *s; 50 51 lp = buf; 52 loop: 53 while((c = *fmt++) != '%') { 54 if(c == '\0') { 55 *lp = '\0'; 56 return (lp - buf); 57 } 58 putchar(c); 59 } 60 switch(c = *fmt++) { 61 case 'c': 62 putchar((char)*adx); 63 break; 64 65 case 'd': 66 case 'u': 67 case 'o': 68 case 'x': 69 itoa((unsigned long)*adx, c); 70 break; 71 72 case 's': 73 s = (char *)*adx; 74 while(c = *s++) 75 putchar(c); 76 break; 77 78 case 'D': 79 case 'O': 80 case 'X': 81 itoa(*(unsigned long *)adx, c); 82 adx += (sizeof(long) / sizeof(int)) - 1; 83 break; 84 85 default: 86 putchar(c); 87 } 88 adx++; 89 goto loop; 90 } 91 92 /* 93 * Print an unsigned integer in base base. 94 */ 95 itoa (n, base) 96 register unsigned long n; 97 register char base; 98 { 99 char prbuf[11]; 100 register int b; 101 register char *cp; 102 103 if (base == 'o' || base == 'O') 104 b = 8; 105 else if (base == 'x' || base == 'X') 106 b = 16; 107 else 108 b = 10; 109 if (b == 10 && (int)n < 0) { 110 putchar('-'); 111 n = (unsigned)(-(int)n); 112 } 113 cp = prbuf; 114 do { 115 *cp++ = "0123456789abcdef"[n%b]; 116 n /= b; 117 } while (n); 118 do 119 putchar(*--cp); 120 while (cp > prbuf); 121 } 122 123 static 124 putchar(c) 125 char c; 126 { 127 /* if(lp < &line[128])*/ 128 *lp++ = c; 129 } 130