X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=sbr%2Ffmt_scan.c;h=ac4d23afdedd7a9ad496a861ccd04f23c27d9e07;hb=a59946091a8ee121ad89708efb0b719e0d1e179a;hp=51ba24cf86c0a75d132863e202702e9d9aba04f5;hpb=832f687b6c2afdb9dd09e0c5bbc249e1bf22f433;p=mmh diff --git a/sbr/fmt_scan.c b/sbr/fmt_scan.c index 51ba24c..ac4d23a 100644 --- a/sbr/fmt_scan.c +++ b/sbr/fmt_scan.c @@ -409,6 +409,25 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat) while ((c = *sp++) && cp < ep) *cp++ = c; break; + case FT_STRLITZ: { + size_t len = strlen (str); + + /* Don't want to emit part of an escape sequence. So if + there isn't enough room in the buffer for the entire + string, skip it completely. */ + if (cp - scanl + len + 1 < max) { + for (sp = str; *sp; *cp++ = *sp++) continue; + + /* This string doesn't count against the width. So + increase ep the same amount as cp, only if the + scan buffer will always be large enough. */ + if (ep - scanl + len + 1 < max) { + ep += len; + } + } + + break; + } case FT_STRFW: adios (NULL, "internal error (FT_STRFW)"); @@ -975,7 +994,23 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat) } fmt++; } -#ifndef JLR + + /* Emit any trailing sequences of zero display length. */ + while (fmt->f_type != FT_DONE) { + if (fmt->f_type == FT_LS_LIT) { + str = fmt->f_text; + } else if (fmt->f_type == FT_STRLITZ) { + /* Don't want to emit part of an escape sequence. So if + there isn't enough room in the buffer for the entire + string, skip it completely. Need room for null + terminator, and maybe trailing newline (added below). */ + if (cp - scanl + strlen (str) + 1 < max) { + for (sp = str; *sp; *cp++ = *sp++) continue; + } + } + fmt++; + } + finished:; if (cp > scanl && cp[-1] != '\n') { if (cp - scanl < (int) max - 1) { @@ -986,15 +1021,4 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat) } *cp = '\0'; return ((struct format *)0); -#else /* JLR */ - if (cp[-1] != '\n') - *cp++ = '\n'; - while (fmt->f_type != FT_DONE) - fmt++; - - finished:; - *cp = '\0'; - return (fmt->f_value ? ++fmt : (struct format *) 0); - -#endif /* JLR */ }