| 163 | } |
| 164 | |
| 165 | int printf(const char *const fmt, ...) |
| 166 | { |
| 167 | const int BUF_LEN = 32; |
| 168 | |
| 169 | char buffer[BUF_LEN + 1]; |
| 170 | char number[33]; |
| 171 | |
| 172 | int idx, counter; |
| 173 | va_list ap; |
| 174 | |
| 175 | va_start(ap, fmt); |
| 176 | idx = 0; |
| 177 | counter = 0; |
| 178 | |
| 179 | for (int i = 0; fmt[i]; ++i) |
| 180 | { |
| 181 | if (fmt[i] != '%') |
| 182 | { |
| 183 | counter += printf_add_to_buffer(buffer, fmt[i], idx, BUF_LEN); |
| 184 | } |
| 185 | else |
| 186 | { |
| 187 | i++; |
| 188 | if (fmt[i] == '\0') |
| 189 | { |
| 190 | break; |
| 191 | } |
| 192 | |
| 193 | switch (fmt[i]) |
| 194 | { |
| 195 | case '%': |
| 196 | counter += printf_add_to_buffer(buffer, fmt[i], idx, BUF_LEN); |
| 197 | break; |
| 198 | |
| 199 | case 'c': |
| 200 | counter += printf_add_to_buffer(buffer, va_arg(ap, char), idx, BUF_LEN); |
| 201 | break; |
| 202 | |
| 203 | case 's': |
| 204 | buffer[idx] = '\0'; |
| 205 | idx = 0; |
| 206 | counter += stdio.print(buffer); |
| 207 | counter += stdio.print(va_arg(ap, const char *)); |
| 208 | break; |
| 209 | |
| 210 | case 'd': |
| 211 | case 'x': |
| 212 | int temp = va_arg(ap, int); |
| 213 | |
| 214 | if (temp < 0 && fmt[i] == 'd') |
| 215 | { |
| 216 | counter += printf_add_to_buffer(buffer, '-', idx, BUF_LEN); |
| 217 | temp = -temp; |
| 218 | } |
| 219 | |
| 220 | itos(number, temp, (fmt[i] == 'd' ? 10 : 16)); |
| 221 | |
| 222 | for (int j = 0; number[j]; ++j) |
no test coverage detected