blob: f3295b2e2a89f465caa58e7e9a0cf67dc3f3d332 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
#include <u.h>
#include <libc.h>
int
printf(byte* fmt, ...)
{
va_list args;
va_start(args, fmt);
int nw, rem, peek, len;
byte* str;
while (*fmt) {
rem = INT_MAX - nw;
if (fmt[0] != '%' || fmt[1] == '%') {
if (fmt[0] == '%') fmt++;
for (peek = 1; fmt[peek] && fmt[peek] != '%'; peek++) {
;
}
if (rem < peek) return -1;
// TODO: Print here.
fmt += peek;
nw += peek;
continue;
}
str = fmt++;
switch (*fmt++) {
case 'c':
byte c = va_arg(args, int);
if (rem < 0) return -1;
// TODO: Print here
nw++;
break;
case 's':
str = va_arg(args, byte*);
len = strlen(str);
if (rem < len) return -1;
// TODO: Print here
nw += len;
break;
default:
fmt = str;
len = strlen(fmt);
if (rem < len) return -1;
// TODO: Print here
nw += len;
fmt += len;
break;
}
}
va_end(args);
return nw;
}
|