Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/3d/bio.c
1808 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1989-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* David Korn <[email protected]> *
19
* Eduardo Krell <[email protected]> *
20
* *
21
***********************************************************************/
22
#pragma prototyped
23
24
/*
25
* 3d buffer io
26
*/
27
28
#include "3d.h"
29
30
/*
31
* stripped down printf -- only { %c %[l[l]][dopux] %s }
32
*/
33
34
ssize_t
35
bvprintf(char** buf, char* end, register const char* format, va_list ap)
36
{
37
register int c;
38
register char* p;
39
register char* e;
40
int w;
41
int l;
42
int f;
43
int g;
44
int r;
45
long n;
46
unsigned long u;
47
ssize_t z;
48
#if _typ_int64_t
49
int64_t q;
50
uint64_t v;
51
#endif
52
char* s;
53
char* b;
54
char* x;
55
char num[32];
56
57
static char digits[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLNMOPQRSTUVWXYZ@_";
58
59
if (buf)
60
{
61
p = *buf;
62
e = end;
63
}
64
else e = (p = end) + SHRT_MAX;
65
for (;;)
66
{
67
switch (c = *format++)
68
{
69
case 0:
70
goto done;
71
case '%':
72
if (*format == '-')
73
{
74
format++;
75
l = 1;
76
}
77
else l = 0;
78
if (*format == '0')
79
{
80
format++;
81
f = l ? ' ' : '0';
82
}
83
else f = ' ';
84
if ((c = *format) == '*')
85
{
86
format++;
87
w = va_arg(ap, int);
88
}
89
else
90
{
91
w = 0;
92
while (c >= '0' && c <= '9')
93
{
94
w = w * 10 + c - '0';
95
c = *++format;
96
}
97
}
98
r = 0;
99
if (c == '.')
100
{
101
if ((c = *++format) == '*')
102
{
103
format++;
104
va_arg(ap, int);
105
}
106
else while (c >= '0' && c <= '9') c = *++format;
107
if (c == '.')
108
{
109
if ((c = *++format) == '*')
110
{
111
format++;
112
r = va_arg(ap, int);
113
}
114
else while (c >= '0' && c <= '9')
115
{
116
r = r * 10 + c - '0';
117
c = *++format;
118
}
119
}
120
}
121
if ((c = *format++) != 'l')
122
n = 0;
123
else if ((c = *format++) != 'l')
124
n = 1;
125
else
126
{
127
n = 2;
128
c = *format++;
129
}
130
g = 0;
131
b = num;
132
switch (c)
133
{
134
case 0:
135
break;
136
case 'c':
137
*b++ = va_arg(ap, int);
138
break;
139
case 'd':
140
switch (n)
141
{
142
case 0:
143
n = va_arg(ap, int);
144
break;
145
default:
146
#if _typ_int64_t
147
q = va_arg(ap, int64_t);
148
if (q < 0)
149
{
150
g = '-';
151
q = -q;
152
}
153
v = q;
154
goto dec_8;
155
case 1:
156
#endif
157
n = va_arg(ap, long);
158
break;
159
}
160
if (n < 0)
161
{
162
g = '-';
163
n = -n;
164
}
165
u = n;
166
goto dec;
167
case 'o':
168
switch (n)
169
{
170
case 0:
171
u = va_arg(ap, unsigned int);
172
break;
173
default:
174
#if _typ_int64_t
175
v = va_arg(ap, uint64_t);
176
goto oct_8;
177
case 1:
178
#endif
179
u = va_arg(ap, unsigned long);
180
break;
181
}
182
do *b++ = (u & 07) + '0'; while (u >>= 3);
183
break;
184
case 's':
185
s = va_arg(ap, char*);
186
if (!s) s = "(null)";
187
if (w)
188
{
189
n = w - strlen(s);
190
if (l)
191
{
192
while (w-- > 0)
193
{
194
if (p >= e) goto done;
195
if (!(*p = *s++)) break;
196
p++;
197
}
198
while (n-- > 0)
199
{
200
if (p >= e) goto done;
201
*p++ = f;
202
}
203
continue;
204
}
205
while (n-- > 0)
206
{
207
if (p >= e) goto done;
208
*p++ = f;
209
}
210
}
211
for (;;)
212
{
213
if (p >= e) goto done;
214
if (!(*p = *s++)) break;
215
p++;
216
}
217
continue;
218
case 'u':
219
switch (n)
220
{
221
case 0:
222
u = va_arg(ap, unsigned int);
223
break;
224
default:
225
#if _typ_int64_t
226
v = va_arg(ap, uint64_t);
227
goto dec_8;
228
case 1:
229
#endif
230
u = va_arg(ap, unsigned long);
231
break;
232
}
233
dec:
234
if (r <= 0 || r >= sizeof(digits)) r = 10;
235
do *b++ = digits[u % r]; while (u /= r);
236
break;
237
case 'p':
238
if (x = va_arg(ap, char*))
239
{
240
g = 'x';
241
w = 10;
242
f = '0';
243
l = 0;
244
}
245
#if _typ_int64_t
246
if (sizeof(char*) == sizeof(int64_t))
247
{
248
v = (uint64_t)x;
249
goto hex_8;
250
}
251
#endif
252
u = (unsigned long)x;
253
goto hex;
254
case 'x':
255
switch (n)
256
{
257
case 0:
258
u = va_arg(ap, unsigned int);
259
break;
260
default:
261
#if _typ_int64_t
262
v = va_arg(ap, uint64_t);
263
goto hex_8;
264
case 1:
265
#endif
266
u = va_arg(ap, unsigned long);
267
break;
268
}
269
hex:
270
do *b++ = ((n = (u & 0xf)) >= 0xa) ? n - 0xa + 'a' : n + '0'; while (u >>= 4);
271
break;
272
default:
273
if (p >= e) goto done;
274
*p++ = c;
275
continue;
276
#if _typ_int64_t
277
dec_8:
278
if (r <= 0 || r >= sizeof(digits)) r = 10;
279
do *b++ = digits[v % r]; while (v /= r);
280
break;
281
hex_8:
282
do *b++ = ((n = (v & 0xf)) >= 0xa) ? n - 0xa + 'a' : n + '0'; while (v >>= 4);
283
break;
284
oct_8:
285
do *b++ = (v & 07) + '0'; while (v >>= 3);
286
break;
287
#endif
288
}
289
if (w)
290
{
291
if (g == 'x') w -= 2;
292
else if (g) w -= 1;
293
n = w - (b - num);
294
if (!l)
295
{
296
if (g && f != ' ')
297
{
298
if (g == 'x')
299
{
300
if (p >= e) goto done;
301
*p++ = '0';
302
if (p >= e) goto done;
303
*p++ = 'x';
304
}
305
else if (p >= e) goto done;
306
else *p++ = g;
307
g = 0;
308
}
309
while (n-- > 0)
310
{
311
if (p >= e) goto done;
312
*p++ = f;
313
}
314
}
315
}
316
if (g == 'x')
317
{
318
if (p >= e) goto done;
319
*p++ = '0';
320
if (p >= e) goto done;
321
*p++ = 'x';
322
}
323
else if (g)
324
{
325
if (p >= e) goto done;
326
*p++ = g;
327
}
328
while (b > num)
329
{
330
if (p >= e) goto done;
331
*p++ = *--b;
332
}
333
if (w && l) while (n-- > 0)
334
{
335
if (p >= e) goto done;
336
*p++ = f;
337
}
338
continue;
339
default:
340
if (p >= e) goto done;
341
*p++ = c;
342
continue;
343
}
344
break;
345
}
346
done:
347
if (p < e) *p = 0;
348
if (buf)
349
{
350
z = p - *buf;
351
*buf = p;
352
}
353
else z = p - end;
354
return(z);
355
}
356
357
int
358
bprintf(char** buf, char* end, const char* format, ...)
359
{
360
va_list ap;
361
ssize_t n;
362
363
va_start(ap, format);
364
n = bvprintf(buf, end, format, ap);
365
va_end(ap);
366
return(n);
367
}
368
369
ssize_t
370
sfsprintf(char* buffer, size_t size, const char* format, ...)
371
{
372
va_list ap;
373
char** buf;
374
char* end;
375
int n;
376
377
va_start(ap, format);
378
if (size)
379
{
380
buf = &buffer;
381
end = buffer + size;
382
}
383
else
384
{
385
buf = 0;
386
end = buffer;
387
}
388
n = bvprintf(buf, end, format, ap);
389
va_end(ap);
390
return(n);
391
}
392
393