|
|
1.1 root 1: mkdir fio libc
2: echo fio/fioprint.c 1>&2
3: sed 's/^-//' >fio/fioprint.c <<'!'
4: -#define FIO_IMP
5: -#include <varargs.h>
6: -#include <fio.h>
7:
8: -/* VARARGS 2 */
9: -Fprint(f, fmt, va_alist)
10: int f;
11: char *fmt;
12: va_dcl
13: -{
14: - char buf[FIOBSIZE], *out;
15: - register long n;
16: - va_list ap;
17: - extern char *doprint();
18:
19: - va_start(ap);
20: - out = doprint(buf, fmt, &ap);
21: - va_end(ap);
22: - n = out-buf;
23: - if(Fwrite(f, buf, n) != n)
24: - return(-1);
25: - else
26: - return((int)n);
27: -}
28: !
29: echo libc/doprint.c 1>&2
30: sed 's/^-//' >libc/doprint.c <<'!'
31: -#include <varargs.h>
32:
33: -#define SIZE 1024
34: -#define FUNSIGN 4
35: -#define FSHORT 2
36: -#define FLONG 1
37: -#define PTR sizeof (char *)
38: -#define SHORT sizeof (int)
39: -#define INT sizeof (int)
40: -#define LONG sizeof (long)
41: -#define FLOAT sizeof (double)
42: -#define FDIGIT 30
43: -#define FDEFLT 8
44: -#define IDIGIT 40
45: -#define MAXCONV 30
46:
47: static char *out, *eout;
48: static convcount = { 13 };
49:
50: static noconv();
51: static cconv(), dconv(), hconv(), lconv();
52: static oconv(), sconv(), uconv(), xconv();
53:
54: static econv(), fconv(), gconv(), percent();
55: int printcol;
56: static
57: int (*fmtconv[MAXCONV])() =
58: -{
59: - noconv,
60: - cconv, dconv, hconv, lconv,
61: - oconv, sconv, uconv, xconv,
62: - econv, fconv, gconv, percent,
63: -};
64: static
65: char fmtindex[128] =
66: -{
67: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
68: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
69: - 0, 0, 0, 0, 0,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
70: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
71: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
72: - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
73: - 0, 0, 0, 1, 2, 9,10,11, 3, 0, 0, 0, 4, 0, 0, 5,
74: - 0, 0, 0, 6, 0, 7, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
75: -};
76:
77: fmtinstall(c, f)
78: char c;
79: int (*f)();
80: -{
81:
82: - c &= 0177;
83: - if(fmtindex[c] == 0) {
84: - if(convcount >= MAXCONV)
85: - return 1;
86: - fmtindex[c] = convcount++;
87: - }
88: - fmtconv[fmtindex[c]] = f;
89: - return 0;
90: -}
91:
92: char*
93: donprint(s, es, fmt, argpp)
94: char *s, *es;
95: register char *fmt;
96: va_list *argpp;
97: -{
98: - register int f1, f2, f3, sf1, c;
99: - char *sout, *seout;
100:
101: - sout = out;
102: - seout = eout;
103: - out = s;
104: - eout = es-1;
105: loop:
106: - c = *fmt++;
107: - if(c != '%') {
108: - if(c == 0) {
109: - *out = 0;
110: - s = out;
111: - out = sout;
112: - eout = seout;
113: - return s;
114: - }
115: - if(out < eout)
116: - *out++ = c;
117: - printcol++;
118: - if(c == '\n')
119: - printcol = 0; else
120: - if(c == '\t')
121: - printcol = (printcol+7) & ~7;
122: - goto loop;
123: - }
124: - f1 = 0;
125: - f2 = -1;
126: - f3 = 0;
127: - c = *fmt++;
128: - sf1 = 0;
129: - if(c == '-') {
130: - sf1 = 1;
131: - c = *fmt++;
132: - }
133: - while(c >= '0' && c <= '9') {
134: - f1 = f1*10 + c-'0';
135: - c = *fmt++;
136: - }
137: - if(sf1)
138: - f1 = -f1;
139: - if(c != '.')
140: - goto l1;
141: - c = *fmt++;
142: - while(c >= '0' && c <= '9') {
143: - if(f2 < 0)
144: - f2 = 0;
145: - f2 = f2*10 + c-'0';
146: - c = *fmt++;
147: - }
148: l1:
149: - if(c == 0)
150: - fmt--;
151: - /* NB: first arg is now a (va_list *) */
152: - c = (*fmtconv[fmtindex[c&0177]])(argpp, f1, f2, f3);
153: - if(c < 0) {
154: - f3 |= -c;
155: - c = *fmt++;
156: - goto l1;
157: - }
158: -#ifdef notdef
159: - argp += c; /* increment is now done in called routine by va_arg() */
160: -#endif
161: - goto loop;
162: -}
163:
164: numbconv(o, f1, f2, f3, b)
165: va_list *o;
166: -{
167: - char s[IDIGIT];
168: - register long v;
169: - register int i, f, n, r;
170:
171: - switch(f3 & (FLONG|FSHORT|FUNSIGN)) {
172: - case FLONG:
173: - v = va_arg(*o, long);
174: - r = LONG;
175: - break;
176:
177: - case FUNSIGN|FLONG:
178: - v = va_arg(*o, unsigned long);
179: - r = LONG;
180: - break;
181:
182: - /* NB: a (unsigned) short argument is promoted to an (unsigned) int arg. */
183: - case FSHORT:
184: - v = (short)va_arg(*o, int);
185: - r = SHORT;
186: - break;
187:
188: - case FUNSIGN|FSHORT:
189: - v = (unsigned short)va_arg(*o, unsigned);
190: - r = SHORT;
191: - break;
192:
193: - default:
194: - v = va_arg(*o, int);
195: - r = INT;
196: - break;
197:
198: - case FUNSIGN:
199: - v = va_arg(*o, unsigned);
200: - r = INT;
201: - break;
202: - }
203: - f = 0;
204: - if(!(f3 & FUNSIGN) && v < 0) {
205: - v = -v;
206: - f = 1;
207: - }
208: - s[IDIGIT-1] = 0;
209: - for(i = IDIGIT-2; i >= 1; i--) {
210: - n = (unsigned long)v % b;
211: - n += '0';
212: - if(n > '9')
213: - n += 'a' - ('9'+1);
214: - s[i] = n;
215: - v = (unsigned long)v / b;
216: - if(f2 >= 0 && i >= IDIGIT-f2)
217: - continue;
218: - if(v <= 0)
219: - break;
220: - }
221: - if(f)
222: - s[--i] = '-';
223: - strconv(s+i, f1, -1);
224: - return r;
225: -}
226:
227: char*
228: doprint(s, fmt, argp)
229: char *s, *fmt;
230: va_list *argp;
231: -{
232:
233: - return donprint(s, s+SIZE, fmt, argp);
234: -}
235:
236: -/*
237: - if you change this, change chconv
238: -*/
239:
240: strconv(o, f1, f2)
241: char *o;
242: -{
243: - register int n, c;
244: - register char *s;
245:
246: - n = 0;
247: - for(s = o; *s++;)
248: - n++;
249: - if(f1 >= 0)
250: - while(n < f1) {
251: - if(out < eout)
252: - *out++ = ' ';
253: - printcol++;
254: - n++;
255: - }
256: - for(s=o; c = *s++;)
257: - if(f2 != 0) {
258: - if(out < eout)
259: - *out++ = c;
260: - printcol++;
261: - if(c == '\n')
262: - printcol = 0; else
263: - if(c == '\t')
264: - printcol = (printcol+7) & ~7;
265: - f2--;
266: - }
267: - if(f1 < 0) {
268: - f1 = -f1;
269: - while(n < f1) {
270: - if(out < eout)
271: - *out++ = ' ';
272: - printcol++;
273: - n++;
274: - }
275: - }
276: -}
277:
278: chconv(o, f1)
279: char o;
280: -{
281: - register int n;
282:
283: - n = 1;
284: - if(f1 >= 0)
285: - while(n < f1) {
286: - if(out < eout)
287: - *out++ = ' ';
288: - printcol++;
289: - n++;
290: - }
291: - if(out < eout)
292: - *out++ = o;
293: - printcol++;
294: - if(o == '\n')
295: - printcol = 0; else
296: - if(o == '\t')
297: - printcol = (printcol+7) & ~7;
298: - if(f1 < 0) {
299: - f1 = -f1;
300: - while(n < f1) {
301: - if(out < eout)
302: - *out++ = ' ';
303: - printcol++;
304: - n++;
305: - }
306: - }
307: -}
308:
309: -/* ARGSUSED */
310: static
311: noconv(o, f1, f2, f3)
312: char *o;
313: -{
314:
315: - strconv("***", 0, -1);
316: - return 0;
317: -}
318:
319: -/* ARGSUSED */
320: static
321: cconv(o, f1, f2, f3)
322: va_list *o;
323: -{
324: - chconv((char)va_arg(*o, int), f1);
325: - return INT;
326: -}
327:
328: static
329: dconv(o, f1, f2, f3)
330: va_list *o;
331: -{
332: - int r;
333:
334: - r = numbconv(o, f1, f2, f3, 10);
335: - return r;
336: -}
337:
338: -/* ARGSUSED */
339: static
340: hconv(o, f1, f2, f3)
341: -{
342: - return -FSHORT;
343: -}
344:
345: -/* ARGSUSED */
346: static
347: lconv(o, f1, f2, f3)
348: -{
349:
350: - return -FLONG;
351: -}
352:
353: static
354: oconv(o, f1, f2, f3)
355: va_list *o;
356: -{
357: - int r;
358:
359: - r = numbconv(o, f1, f2, f3, 8);
360: - return r;
361: -}
362:
363: -/* ARGSUSED */
364: static
365: sconv(o, f1, f2, f3)
366: va_list *o;
367: -{
368:
369: - strconv(va_arg(*o, char *), f1, f2);
370: - return PTR;
371: -}
372:
373: -/* ARGSUSED */
374: static
375: uconv(o, f1, f2, f3)
376: -{
377: - return -FUNSIGN;
378: -}
379:
380: static
381: xconv(o, f1, f2, f3)
382: va_list *o;
383: -{
384: - int r;
385:
386: - r = numbconv(o, f1, f2, f3, 16);
387: - return r;
388: -}
389:
390: double pow10(), frexp();
391: -/* ARGSUSED */
392: fltconv(f, f1, f2, f3, c)
393: register double f;
394: -{
395: - char s1[FDIGIT+10], s2[FDIGIT+10];
396: - register double g;
397: - register int d, i, n, s;
398: - double h;
399: - int e;
400: - int c1, c2, c3;
401:
402: - s = 0;
403: - if(f < 0) {
404: - f = -f;
405: - s++;
406: - }
407:
408: loop:
409: - e = 0;
410: - g = 0;
411: - if(f != 0) {
412: - g = frexp(f, &e);
413: - e = e * .30103;
414: - d = e/2;
415: - h = f * pow10(-d); /* 10**-e in 2 parts */
416: - g = h * pow10(d-e);
417: - while(g < 1) {
418: - e--;
419: - g = h * pow10(d-e);
420: - }
421: - while(g >= 10) {
422: - e++;
423: - g = h * pow10(d-e);
424: - }
425: - }
426: - if(f2 < 0)
427: - f2 = FDEFLT;
428: - if(c == 'g' && f2 > 0)
429: - f2--;
430: - if(f2 > FDIGIT)
431: - f2 = FDIGIT;
432: - /*
433: - * n is number of digits to convert
434: - * 1 before, f2 after, 1 extra for rounding
435: - */
436: - n = f2 + 2;
437: - if(c == 'f') {
438: - /*
439: - * e+1 before, f2 after, 1 extra
440: - */
441: - n += e;
442: - if(n <= 0) {
443: - n = 1;
444: - g = 0;
445: - }
446: - }
447: - if(n >= FDIGIT+2) {
448: - if(c == 'e')
449: - f2 = -1;
450: - c = 'e';
451: - goto loop;
452: - }
453: - /*
454: - * convert n digits
455: - */
456: - for(i=0; i<n; i++) {
457: - d = g;
458: - if(d > g)
459: - d--;
460: - g -= d;
461: - s1[i+1] = d + '0';
462: - g *= 10;
463: - }
464: - /*
465: - * round by adding .5 into extra digit
466: - */
467: - d = 5;
468: - for(i=n-1; i>=0; i--) {
469: - s1[i+1] += d;
470: - d = 0;
471: - if(s1[i+1] > '9') {
472: - s1[i+1] -= 10;
473: - d++;
474: - }
475: - }
476: - i = 1;
477: - if(d) {
478: - s1[0] = '1';
479: - e++;
480: - i = 0;
481: - }
482: - /*
483: - * copy into final place
484: - * c1 digits of leading '0'
485: - * c2 digits from conversion
486: - * c3 digits after '.'
487: - */
488: - d = 0;
489: - if(s)
490: - s2[d++] = '-';
491: - c1 = 0;
492: - c2 = f2 + 1;
493: - c3 = f2;
494: - if(c == 'g')
495: - if(e >= -5 && e <= f2) {
496: - c1 = -e - 1;
497: - c3 = c1;
498: - if(c1 < 0)
499: - c1 = 0;
500: - c3 = f2 - e;
501: - c = 'h';
502: - }
503: - if(c == 'f') {
504: - c1 = -e;
505: - if(c1 < 0)
506: - c1 = 0;
507: - if(c1 > f2)
508: - c1 = c2;
509: - c2 += e;
510: - if(c2 < 0)
511: - c2 = 0;
512: - }
513: - while(c1 > 0) {
514: - if(c1+c2 == c3)
515: - s2[d++] = '.';
516: - s2[d++] = '0';
517: - c1--;
518: - }
519: - while(c2 > 0) {
520: - if(c1+c2 == c3)
521: - s2[d++] = '.';
522: - s2[d++] = s1[i++];
523: - c2--;
524: - }
525: - /*
526: - * strip trailing '0' on g conv
527: - */
528: - if(c == 'g' || c == 'h') {
529: - for(n=d-1; n>=0; n--)
530: - if(s2[n] != '0')
531: - break;
532: - for(i=n; i>=0; i--)
533: - if(s2[i] == '.') {
534: - d = n;
535: - if(i != n)
536: - d++;
537: - break;
538: - }
539: - }
540: - if(c == 'e' || c == 'g') {
541: - s2[d++] = 'e';
542: - s2[d++] = '+';
543: - c1 = e;
544: - if(c1 < 0) {
545: - s2[d-1] = '-';
546: - c1 = -c1;
547: - }
548: - if(c1 >= 100) {
549: - s2[d++] = c1/100 + '0';
550: - c1 %= 100;
551: - }
552: - s2[d++] = c1/10 + '0';
553: - s2[d++] = c1%10 + '0';
554: - }
555: - s2[d] = 0;
556: - strconv(s2, f1, -1);
557: - return FLOAT;
558: -}
559:
560: static
561: econv(o, f1, f2, f3)
562: va_list *o;
563: -{
564:
565: - return fltconv(va_arg(*o, double), f1, f2, f3, 'e');
566: -}
567:
568: static
569: fconv(o, f1, f2, f3)
570: va_list *o;
571: -{
572:
573: - return fltconv(va_arg(*o, double), f1, f2, f3, 'f');
574: -}
575:
576: static
577: gconv(o, f1, f2, f3)
578: va_list *o;
579: -{
580:
581: - return fltconv(va_arg(*o, double), f1, f2, f3, 'g');
582: -}
583:
584: static
585: percent()
586: -{
587:
588: - if(out < eout)
589: - *out++ = '%';
590: - return 0;
591: -}
592: !
593: echo libc/print.c 1>&2
594: sed 's/^-//' >libc/print.c <<'!'
595: -#include <varargs.h>
596:
597: -#define SIZE 1024
598: extern int printcol;
599:
600: char *doprint();
601:
602: -/* VARARGS 1 */
603: print(fmt, va_alist)
604: char *fmt;
605: va_dcl
606: -{
607: - char buf[SIZE], *out;
608: - va_list ap;
609:
610: - va_start(ap);
611: - out = doprint(buf, fmt, &ap);
612: - va_end(ap);
613: - return write(1, buf, (int)(out-buf));
614: -}
615:
616: -/* VARARGS 2 */
617: fprint(fd, fmt, va_alist)
618: char *fmt;
619: va_dcl
620: -{
621: - char buf[SIZE], *out;
622: - va_list ap;
623:
624: - va_start(ap);
625: - out = doprint(buf, fmt, &ap);
626: - va_end(ap);
627: - return write(fd, buf, (int)(out-buf));
628: -}
629:
630: -/* VARARGS 2 */
631: sprint(buf, fmt, va_alist)
632: char *buf;
633: char *fmt;
634: va_dcl
635: -{
636: - char *out;
637: - int scol;
638: - va_list ap;
639:
640: - scol = printcol;
641: - va_start(ap);
642: - out = doprint(buf, fmt, &ap);
643: - va_end(ap);
644: - printcol = scol;
645: - return out-buf;
646: -}
647: !
648:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.