|
19 | 19 | #include <sys/util.h> |
20 | 20 | #include <sys/cbprintf.h> |
21 | 21 |
|
| 22 | +/* newlib doesn't declare this function unless __POSIX_VISIBLE >= 200809. No |
| 23 | + * idea how to make that happen, so lets put it right here. |
| 24 | + */ |
| 25 | +size_t strnlen(const char *, size_t); |
| 26 | + |
22 | 27 | /* Provide typedefs used for signed and unsigned integral types |
23 | 28 | * capable of holding all convertable integral values. |
24 | 29 | */ |
@@ -342,8 +347,9 @@ static inline const char *extract_flags(struct conversion *conv, |
342 | 347 | static inline const char *extract_width(struct conversion *conv, |
343 | 348 | const char *sp) |
344 | 349 | { |
| 350 | + conv->width_present = true; |
| 351 | + |
345 | 352 | if (*sp == '*') { |
346 | | - conv->width_present = true; |
347 | 353 | conv->width_star = true; |
348 | 354 | return ++sp; |
349 | 355 | } |
@@ -375,27 +381,24 @@ static inline const char *extract_width(struct conversion *conv, |
375 | 381 | static inline const char *extract_prec(struct conversion *conv, |
376 | 382 | const char *sp) |
377 | 383 | { |
378 | | - if (*sp != '.') { |
| 384 | + conv->prec_present = (*sp == '.'); |
| 385 | + |
| 386 | + if (!conv->prec_present) { |
379 | 387 | return sp; |
380 | 388 | } |
381 | 389 | ++sp; |
382 | 390 |
|
383 | 391 | if (*sp == '*') { |
384 | | - conv->prec_present = true; |
385 | 392 | conv->prec_star = true; |
386 | 393 | return ++sp; |
387 | 394 | } |
388 | 395 |
|
389 | | - const char *wp = sp; |
390 | 396 | size_t prec = extract_decimal(&sp); |
391 | 397 |
|
392 | | - if (sp != wp) { |
393 | | - conv->prec_present = true; |
394 | | - conv->prec_value = prec; |
395 | | - if (prec != conv->prec_value) { |
396 | | - /* Lost precision data */ |
397 | | - conv->unsupported = true; |
398 | | - } |
| 398 | + conv->prec_value = prec; |
| 399 | + if (prec != conv->prec_value) { |
| 400 | + /* Lost precision data */ |
| 401 | + conv->unsupported = true; |
399 | 402 | } |
400 | 403 |
|
401 | 404 | return sp; |
@@ -1579,11 +1582,12 @@ int cbvprintf(cbprintf_cb out, void *ctx, const char *fp, va_list ap) |
1579 | 1582 | case 's': { |
1580 | 1583 | bps = (const char *)value->ptr; |
1581 | 1584 |
|
1582 | | - size_t len = strlen(bps); |
| 1585 | + size_t len; |
1583 | 1586 |
|
1584 | | - if ((precision >= 0) |
1585 | | - && ((size_t)precision < len)) { |
1586 | | - len = (size_t)precision; |
| 1587 | + if (precision >= 0) { |
| 1588 | + len = strnlen(bps, precision); |
| 1589 | + } else { |
| 1590 | + len = strlen(bps); |
1587 | 1591 | } |
1588 | 1592 |
|
1589 | 1593 | bpe = bps + len; |
|
0 commit comments