4dc2fc8403a0dd281764c5b687d188b68b31c1f1
[AXE.git] / src / out.cpp
1 /*ident "@(#)cfront:lib/stream/out.c    1.5" */
2 /*
3     C++ stream i/o source
4
5     out.c
6 */
7  
8 #include <stdio.h>     
9 #include <stdlib.h>
10 extern "C" unsigned int strlen(const char*);
11 #include <stream.h>
12
13
14 const   int cb_size = 1024;
15 const   int fld_size = 256;
16
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];
21
22 char* chr(register int i, register int w)   // note: chr(0) is ""
23 {
24     register char* buf = bfree;
25
26     if (w<=0 || fld_size<w) w = 1;
27     w++;                // space for trailing 0
28     if (max < buf+w) buf = formbuf;
29     bfree = buf+w;
30     char * res = buf;
31
32     w -= 2;             // pad
33     while (w--) *buf++ = ' ';
34     if (i<0 || 127<i) i = ' ';
35     *buf++ = i;
36     *buf = 0;
37     return res;
38 }
39
40 char* str(const char* s, register int w)
41 {
42     register char* buf = bfree;
43     int ll = strlen(s);
44     if (w<=0 || fld_size<w) w = ll;
45     if (w < ll) ll = w;
46     w++;                // space for traling 0
47     if (max < buf+w) buf = formbuf;
48     bfree = buf+w;
49     char* res = buf;
50
51     w -= (ll+1);            // pad
52     while (w--) *buf++ = ' ';
53     while (*s) *buf++ = *s++;
54     *buf = 0;
55     return res;
56 }
57
58 char* form(const char* format ...)
59 {
60     int* ap = (int*)((char*)&format+sizeof(char*));    // not completely general
61     register char* buf = bfree;
62     if (max < buf+fld_size) buf = formbuf;
63
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
66         ;
67     else if (buf<(char*)ll && (char*)ll<buf+cb_size)// pointer to trailing 0
68         ll = (char*)ll - buf;
69     else
70         ll = strlen(buf);
71     if (fld_size < ll) exit(10);
72     bfree = buf+ll+1;
73     return buf;
74 }
75
76 const char a10 = 'a'-10;
77
78 char* hex(long ii, int w)
79 {
80     int m = sizeof(long)*2;     // maximum hex digits for a long
81     if (w<0 || fld_size<w) w = 0;
82     int sz = (w?w:m)+1;
83     register char* buf = bfree;
84     if (max < buf+sz) buf = formbuf;
85     register char* p = buf+sz;
86     bfree = p+1;
87     *p-- = 0;           // trailing 0
88     register unsigned long i = ii;
89
90     if (w) {
91         do {
92             int h = i&0xf;
93             *p-- = (h < 10) ? h+'0' : h+a10;
94         } while (--w && (i>>=4));
95         while (0<w--) *p-- = ' ';
96     }
97     else {
98         do {
99             int h = i&0xf;
100             *p-- = (h < 10) ? h+'0' : h+a10;
101         } while (i>>=4);
102     }
103     return p+1;
104 }
105
106 char* oct(long ii, int w)
107 {
108     int m = sizeof(long)*3;     // maximum oct digits for a long
109     if (w<0 || fld_size<w) w = 0;
110     int sz = (w?w:m)+1;
111     register char* buf = bfree;
112     if (max < buf+sz) buf = formbuf;
113     register char* p = buf+sz;
114     bfree = p+1;
115     *p-- = 0;           // trailing 0
116     register unsigned long i = ii;
117
118     if (w) {
119         do {
120             int h = i&07;
121             *p-- = h + '0';
122         } while (--w && (i>>=3));
123         while (0<w--) *p-- = ' ';
124     }
125     else {
126         do {
127             int h = i&07;
128             *p-- = h+'0';
129         } while (i>>=3);
130     }
131
132     return p+1;
133 }
134
135 char* dec(long i, int w)
136 {
137     int sign = 0;
138     if (i < 0) {
139         sign = 1;
140         i = -i;
141     }   
142     int m = sizeof(long)*3;     // maximum dec digits for a long
143     if (w<0 || fld_size<w) w = 0;
144     int sz = (w?w:m)+1;
145     register char* buf = bfree;
146     if (max < buf+sz) buf = formbuf;
147     register char* p = buf+sz;
148     bfree = p+1;
149     *p-- = 0;           // trailing 0
150
151     if (w) {
152         do {
153             int h = i%10;
154             *p-- = h + '0';
155         } while (--w && (i/=10));
156         if (sign && 0<w) {
157             w--;
158             *p-- = '-';
159         }
160         while (0<w--) *p-- = ' ';
161     }
162     else {
163         do {
164             int h = i%10;
165             *p-- = h + '0';
166         } while (i/=10);
167         if (sign) *p-- = '-';
168     }
169
170     return p+1;
171 }
172