90{
91 if (EXPECT_FALSE (!initialized))
92 return;
93
94 while (*format) {
95
96 if (EXPECT_TRUE (*format != '%')) {
97 putc (*format++);
98 continue;
99 }
100
101 unsigned flags = 0, width = 0, precs = 0, len = 0, mode = MODE_FLAGS;
102
103 for (uint64 u;;) {
104
105 switch (*++format) {
106
107 case '0'...'9':
108 switch (mode) {
109 case MODE_FLAGS:
110 if (*format == '0') {
111 flags |= FLAG_ZERO_PAD;
112 break;
113 }
114 mode = MODE_WIDTH;
115 FALLTHROUGH;
116 case MODE_WIDTH: width = width * 10 + *format - '0'; break;
117 case MODE_PRECS: precs = precs * 10 + *format - '0'; break;
118 }
119 continue;
120
121 case '.':
122 mode = MODE_PRECS;
123 continue;
124
125 case '#':
126 if (mode == MODE_FLAGS)
127 flags |= FLAG_ALT_FORM;
128 continue;
129
130 case 'l':
131 len++;
132 continue;
133
134 case 'c':
135 putc (va_arg (args, int));
136 break;
137
138 case 's':
139 print_str (va_arg (args, char *), width, precs ? precs : ~0u);
140 break;
141
142 case 'd':
143 switch (len) {
144 case 0: u = va_arg (args, int); break;
145 case 1: u = va_arg (args, long); break;
146 default: u = va_arg (args, long long); break;
147 }
148 print_number (u, 10, width, flags | FLAG_SIGNED);
149 break;
150
151 case 'u':
152 case 'x':
153 switch (len) {
154 case 0: u = va_arg (args, unsigned int); break;
155 case 1: u = va_arg (args, unsigned long); break;
156 default: u = va_arg (args, unsigned long long); break;
157 }
158 print_number (u, *format == 'x' ? 16 : 10, width, flags);
159 break;
160
161 case 'p':
162 print_number (reinterpret_cast<mword>(va_arg (args, void *)), 16, width, FLAG_ALT_FORM);
163 break;
164
165 case 0:
166 format--;
167 FALLTHROUGH;
168
169 default:
170 putc (*format);
171 break;
172 }
173
174 format++;
175
176 break;
177 }
178 }
179}