X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/fa377c31ac72f5c8253ae96f28185e510c26a720..4a56a28ac439137ba2b71fcb5952b4e4abd1e2fc:/sbr/fmt_scan.c?ds=inline diff --git a/sbr/fmt_scan.c b/sbr/fmt_scan.c index 9377b393..c75db3ec 100644 --- a/sbr/fmt_scan.c +++ b/sbr/fmt_scan.c @@ -14,6 +14,7 @@ #include #include #include +#include "unquote.h" #ifdef HAVE_SYS_TIME_H # include @@ -117,6 +118,7 @@ void cptrimmed(charstring_t dest, char *str, int wid, char fill, size_t max) { int remaining; /* remaining output width available */ int rjust; + struct charstring *trimmed; size_t end; /* number of input bytes remaining in str */ #ifdef MULTIBYTE_SUPPORT int char_len; /* bytes in current character */ @@ -135,6 +137,8 @@ cptrimmed(charstring_t dest, char *str, int wid, char fill, size_t max) { } if (remaining > (int) max) { remaining = max; } + trimmed = rjust ? charstring_create(remaining) : dest; + if ((sp = str)) { #ifdef MULTIBYTE_SUPPORT if (mbtowc(NULL, NULL, 0)) {} /* reset shift state */ @@ -180,7 +184,7 @@ cptrimmed(charstring_t dest, char *str, int wid, char fill, size_t max) { sp++; #endif if (!prevCtrl) { - charstring_push_back (dest, ' '); + charstring_push_back (trimmed, ' '); remaining--; } @@ -191,39 +195,26 @@ cptrimmed(charstring_t dest, char *str, int wid, char fill, size_t max) { #ifdef MULTIBYTE_SUPPORT if (w >= 0 && remaining >= w) { - charstring_push_back_chars (dest, altstr ? altstr : sp, + charstring_push_back_chars (trimmed, altstr ? altstr : sp, char_len, w); remaining -= w; altstr = NULL; } sp += char_len; #else - charstring_push_back (dest, *sp++); + charstring_push_back (trimmed, *sp++); remaining--; #endif } } - if (rjust) { - if (remaining > 0) { - /* copy string to the right */ - charstring_t copy = charstring_copy (dest); - - /* add padding at the beginning */ - charstring_clear (dest); - for (; remaining > 0; --remaining) { - charstring_push_back (dest, fill); - } - - charstring_append (dest, copy); + while (remaining-- > 0) { + charstring_push_back(dest, fill); + } - charstring_free (copy); - } - } else { - /* pad remaining space */ - while (remaining-- > 0) { - charstring_push_back (dest, fill); - } + if (rjust) { + charstring_append(dest, trimmed); + charstring_free(trimmed); } } @@ -480,7 +471,7 @@ fmt_scan (struct format *format, charstring_t scanlp, int width, int *dat, int num = value; unsigned int wid; - for (wid = num <= 0 ? 1 : 0; num; ++wid, num /= 10) {} + for (wid = num <= 0; num; ++wid, num /= 10) {} cpnumber (scanlp, value, wid, ' ', max - charstring_chars (scanlp)); break;