79{
80 const char *p;
81 int ch;
84 int lflag, width, padc;
85
86 while (1) {
87 while ((ch = *(unsigned char *)fmt++) != '%') {
88 if (ch == '\0') return -1;
89 func(ch, handle);
90 }
91
92 width = -1;
93 lflag = 4;
94 padc = ' ';
95again:
96 switch (ch = *(unsigned char *)fmt++) {
97 case '-':
98 padc = '-';
99 goto again;
100 case '0':
101 padc = '0';
102 goto again;
103 case '1':
104 case '2':
105 case '3':
106 case '4':
107 case '5':
108 case '6':
109 case '7':
110 case '8':
111 case '9':
112 width = 0;
113 while (1) {
114 width = 10 * width + ch - '0';
115 ch = *fmt;
116 if (ch < '0' || ch > '9')
117 {
118 break;
119 }
120 fmt++;
121 if (ch == '\0')
122 {
123 fmt--;
124 goto again;
125 }
126 }
127 goto again;
128 case 'c':
129 func(
va_arg(ap,
int) & 0xff, handle);
130 break;
131 case 's': {
132 int spaces;
133
136 spaces = width -
strlen(p);
137
138 if (padc == ' ') {
139 while (spaces > 0)
140 {
141 func(' ', handle);
142 spaces--;
143 }
144 }
145
146 while (*p != '\0')
147 {
148 func(*p++, handle);
149 }
150
151 if (padc == '-') {
152 while (spaces > 0)
153 {
154 func(' ', handle);
155 spaces--;
156 }
157 }
158 break;
159 }
160 case 'd':
162 if (num < 0) {
163 func('-', handle);
164 unum = -num;
165 } else {
166 unum = num;
167 }
168 printnum(func, handle, unum, 10, width, padc);
169 break;
170 case 'u':
172 printnum(func, handle, unum, 10, width, padc);
173 break;
174 case 'o':
176 printnum(func, handle, unum, 8, width, padc);
177 break;
178 case 'p':
179 unum = (
unsigned long)
va_arg(ap,
void *);
180 printnum(func, handle, unum, 8, width, padc);
181 break;
182 case 'x':
184 printnum(func, handle, unum, 16, width, padc);
185 break;
186 case 'X':
188 printnum(func, handle, unum, -16, width, padc);
189 break;
190 case 'l':
191 lflag = 8;
192 goto again;
193 case '%':
194 default:
195 func(ch, handle);
196 break;
197 }
198 }
199 return 0;
200}
#define getuint(ap, lflag)
static void printnum(void(*func)(int, void *), void *handle, uint64_t num, int base, int width, int padc)
#define getint(ap, lflag)
size_t strlen(const char *str)