1 /*ident "@(#)cfront:lib/stream/out.c 1.5" */
10 extern "C" unsigned int strlen(const char*);
14 const int cb_size = 1024;
15 const int fld_size = 256;
17 /* a circular formating buffer */
18 static char formbuf[cb_size]; // some slob for form overflow
19 static char* bfree=formbuf;
20 static char* max = &formbuf[cb_size-1];
22 char* chr(register int i, register int w) // note: chr(0) is ""
24 register char* buf = bfree;
26 if (w<=0 || fld_size<w) w = 1;
27 w++; // space for trailing 0
28 if (max < buf+w) buf = formbuf;
33 while (w--) *buf++ = ' ';
34 if (i<0 || 127<i) i = ' ';
40 char* str(const char* s, register int w)
42 register char* buf = bfree;
44 if (w<=0 || fld_size<w) w = ll;
46 w++; // space for traling 0
47 if (max < buf+w) buf = formbuf;
52 while (w--) *buf++ = ' ';
53 while (*s) *buf++ = *s++;
58 char* form(const char* format ...)
60 int* ap = (int*)((char*)&format+sizeof(char*)); // not completely general
61 register char* buf = bfree;
62 if (max < buf+fld_size) buf = formbuf;
64 int ll = sprintf(buf,format,ap[0],ap[1],ap[2],ap[3],ap[4],ap[5],ap[6],ap[7],ap[8],ap[9]); // too few words copied
65 if (0<ll && ll<cb_size) // length
67 else if (buf<(char*)ll && (char*)ll<buf+cb_size)// pointer to trailing 0
71 if (fld_size < ll) exit(10);
76 const char a10 = 'a'-10;
78 char* hex(long ii, int w)
80 int m = sizeof(long)*2; // maximum hex digits for a long
81 if (w<0 || fld_size<w) w = 0;
83 register char* buf = bfree;
84 if (max < buf+sz) buf = formbuf;
85 register char* p = buf+sz;
87 *p-- = 0; // trailing 0
88 register unsigned long i = ii;
93 *p-- = (h < 10) ? h+'0' : h+a10;
94 } while (--w && (i>>=4));
95 while (0<w--) *p-- = ' ';
100 *p-- = (h < 10) ? h+'0' : h+a10;
106 char* oct(long ii, int w)
108 int m = sizeof(long)*3; // maximum oct digits for a long
109 if (w<0 || fld_size<w) w = 0;
111 register char* buf = bfree;
112 if (max < buf+sz) buf = formbuf;
113 register char* p = buf+sz;
115 *p-- = 0; // trailing 0
116 register unsigned long i = ii;
122 } while (--w && (i>>=3));
123 while (0<w--) *p-- = ' ';
135 char* dec(long i, int w)
142 int m = sizeof(long)*3; // maximum dec digits for a long
143 if (w<0 || fld_size<w) w = 0;
145 register char* buf = bfree;
146 if (max < buf+sz) buf = formbuf;
147 register char* p = buf+sz;
149 *p-- = 0; // trailing 0
155 } while (--w && (i/=10));
160 while (0<w--) *p-- = ' ';
167 if (sign) *p-- = '-';