X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=sbr%2Ffmt_scan.c;h=4d4d6330c6441b17f5b48ecbd95d9ad99f38f046;hp=37bf16a19df19bacc4df2eb920449b977130fe27;hb=1642d62841486ade88ec2c48dd581e3249c98c94;hpb=18591f8e001ecedbee48a51c1d1f08ebaa1c15c8 diff --git a/sbr/fmt_scan.c b/sbr/fmt_scan.c index 37bf16a..4d4d633 100644 --- a/sbr/fmt_scan.c +++ b/sbr/fmt_scan.c @@ -188,26 +188,59 @@ cptrimmed(char **dest, char *str, unsigned int wid, char fill, size_t n) { static void cpstripped(char **start, char *end, char *str) { +#ifdef MULTIBYTE_SUPPORT + int char_len; /* bytes in current character */ + int nbytes; + wchar_t wide_char; +#else int c; +#endif char *s = str; if (!s) return; /* skip any initial control characters or spaces */ +#ifdef MULTIBYTE_SUPPORT + nbytes = end - *start + 1; + mbtowc(NULL, NULL, 0); /* reset shift state */ + while ((char_len = mbtowc(&wide_char, s, nbytes)) > 0 && (iswcntrl(wide_char) || iswspace(wide_char))) { + s += char_len; + nbytes -= char_len; + } +#else while ((c = (unsigned char) *s) && (iscntrl(c) || isspace(c))) s++; +#endif /* compact repeated control characters and spaces into a single space */ - while((c = (unsigned char) *s++) && *start < end) - if (!iscntrl(c) && !isspace(c)) +#ifdef MULTIBYTE_SUPPORT + while ((char_len = mbtowc(&wide_char, s, nbytes)) > 0 && *start < end) { + if (!iswcntrl(wide_char) && !iswspace(wide_char)) { + strncpy(*start, s, char_len); + s += char_len; + *start += char_len; + nbytes -= char_len; + } else { + while ((char_len = mbtowc(&wide_char, s, nbytes)) > 0 && (iswcntrl(wide_char) || iswspace(wide_char))) { + s += char_len; + nbytes -= char_len; + } + *(*start)++ = ' '; + } + } +#else + while((c = (unsigned char) *s++) && *start < end) { + if (!iscntrl(c) && !isspace(c)) { *(*start)++ = c; - else { + } else { while ((c = (unsigned char) *s) && (iscntrl(c) || isspace(c))) s++; *(*start)++ = ' '; } + } +#endif } static char *lmonth[] = { @@ -266,12 +299,13 @@ fmt_trim(char *str, int width) char *xp; int ljust, i; char buffer[BUFSIZ]; + char *dst; strncpy(buffer, str, sizeof(buffer)); - buffer[sizeof(buffer)-1] = '\0'; - str = buffer; - while (isspace(*str)) { - str++; + dst = buffer; + dst[sizeof(buffer)-1] = '\0'; + while (isspace(*dst)) { + dst++; } ljust = 0; if ((i = width) < 0) { @@ -279,17 +313,18 @@ fmt_trim(char *str, int width) ljust++; } - if (!ljust && i > 0 && (int)strlen(str) > i) { - str[i] = '\0'; + if (!ljust && i > 0 && (int)strlen(dst) > i) { + dst[i] = '\0'; } - xp = str; - xp += strlen(str) - 1; - while (xp > str && isspace(*xp)) { + xp = dst; + xp += strlen(dst) - 1; + while (xp > dst && isspace(*xp)) { *xp-- = '\0'; } - if (ljust && i > 0 && (int)strlen(str) > i) { - str += strlen(str) - i; + if (ljust && i > 0 && (int)strlen(dst) > i) { + dst += strlen(dst) - i; } + strncpy(str, dst, strlen(str) + 1); return str; } @@ -882,17 +917,4 @@ finished:; *cp++ = '\n'; *cp = '\0'; return ((struct format *)0); - -#ifdef JLR - /* I'll remove this as soon as I understand what it does. --meillo */ - 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 */ - }