X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=sbr%2Ffmt_scan.c;h=4921854610200f384f90c36160f926fa816aa637;hp=357484b0bd50f3ce2d3f05ded56cf9a8588b988f;hb=ebff0feca0d651c3d0c535a8147963f97807c17a;hpb=4c24408bdff496a631709326b0d07a4e12fa9277 diff --git a/sbr/fmt_scan.c b/sbr/fmt_scan.c index 357484b..4921854 100644 --- a/sbr/fmt_scan.c +++ b/sbr/fmt_scan.c @@ -108,40 +108,35 @@ match (char *str, char *sub) cp += c;\ } -#ifdef LOCALE -#define PUTSF(cp, str, wid, fill) {\ - ljust = 0;\ - if ((i = (wid)) < 0) {\ - i = -i;\ - ljust++;\ - }\ - if ((sp = (str))) {\ - if (ljust) {\ - c = strlen(sp);\ - if (c > i)\ - sp += c - i;\ - else {\ - while( --i >= c && cp < ep)\ - *cp++ = fill;\ - i++;\ - }\ - } else {\ - while ((c = (unsigned char) *sp) && (iscntrl(c) || isspace(c)))\ - sp++;\ - }\ - while ((c = (unsigned char) *sp++) && --i >= 0 && cp < ep)\ - if (!iscntrl(c) && !isspace(c)) \ - *cp++ = c;\ - else {\ - while ((c = (unsigned char) *sp) && (iscntrl(c) || isspace(c)))\ - sp++;\ - *cp++ = ' ';\ - }\ - }\ - if (!ljust)\ - while( --i >= 0 && cp < ep)\ - *cp++ = fill;\ - } +char * PUTSF(char *cp, char *str, unsigned int wid, char fill) { + + unsigned int i, j; + unsigned int char_len; + unsigned int term_len = 0; + wchar_t wide_char; + + for (i = 0 ; i < wid && i < strlen(str) && term_len < wid; ) { + char_len = mblen(str + i, strlen(str + i)); + if (char_len <= 0) { + continue; + } + mbtowc(&wide_char, str + i, strlen(str + i)); + term_len += wcwidth(wide_char); + + for (j = 0 ; j < char_len ; j++) { + *(cp + i) = *(str + i); + i++; + } + } + + if (term_len < wid) { + for (j = term_len ; j <= wid ; j++) { + *(cp + i++) = fill; + } + } + + return cp + i; +} #define PUTS(cp, str) {\ if ((sp = (str))) {\ @@ -158,59 +153,6 @@ match (char *str, char *sub) }\ } -#else /* LOCALE */ -#define PUTSF(cp, str, wid, fill) {\ - ljust = 0;\ - if ((i = (wid)) < 0) {\ - i = -i;\ - ljust++;\ - }\ - if (sp = (str)) {\ - if (ljust) {\ - c = strlen(sp);\ - if (c > i)\ - sp += c - i;\ - else {\ - while( --i >= c && cp < ep)\ - *cp++ = fill;\ - i++;\ - }\ - } else {\ - while ((c = *sp) && c <= 32)\ - sp++;\ - }\ - while ((c = *sp++) && --i >= 0 && cp < ep)\ - if (c > 32) \ - *cp++ = c;\ - else {\ - while ((c = *sp) && c <= 32)\ - sp++;\ - *cp++ = ' ';\ - }\ - }\ - if (!ljust)\ - while( --i >= 0 && cp < ep)\ - *cp++ = fill;\ - } - -#define PUTS(cp, str) {\ - if (sp = (str)) {\ - while ((c = *sp) && c <= 32)\ - sp++;\ - while( (c = *sp++) && cp < ep)\ - if ( c > 32 ) \ - *cp++ = c;\ - else {\ - while ( (c = *sp) && c <= 32 )\ - sp++;\ - *cp++ = ' ';\ - }\ - }\ - } - -#endif /* LOCALE */ - - static char *lmonth[] = { "January", "February","March", "April", "May", "June", "July", "August", "September","October", "November","December" }; @@ -293,7 +235,7 @@ fmt_scan (struct format *format, char *scanl, int width, int *dat) PUTS (cp, fmt->f_comp->c_text); break; case FT_COMPF: - PUTSF (cp, fmt->f_comp->c_text, fmt->f_width, fmt->f_fill); + cp = PUTSF(cp, fmt->f_comp->c_text, fmt->f_width, fmt->f_fill); break; case FT_LIT: @@ -319,7 +261,7 @@ fmt_scan (struct format *format, char *scanl, int width, int *dat) PUTS (cp, str); break; case FT_STRF: - PUTSF (cp, str, fmt->f_width, fmt->f_fill); + cp =PUTSF (cp, str, fmt->f_width, fmt->f_fill); break; case FT_STRFW: adios (NULL, "internal error (FT_STRFW)"); @@ -442,14 +384,14 @@ fmt_scan (struct format *format, char *scanl, int width, int *dat) break; case FT_LS_DECODECOMP: - if (decode_rfc2047(fmt->f_comp->c_text, buffer2)) + if (decode_rfc2047(fmt->f_comp->c_text, buffer2, sizeof(buffer2))) str = buffer2; else str = fmt->f_comp->c_text; break; case FT_LS_DECODE: - if (str && decode_rfc2047(str, buffer2)) + if (str && decode_rfc2047(str, buffer2, sizeof(buffer2))) str = buffer2; break; @@ -458,6 +400,7 @@ fmt_scan (struct format *format, char *scanl, int width, int *dat) char *xp; strncpy(buffer, str, sizeof(buffer)); + buffer[sizeof(buffer)-1] = '\0'; str = buffer; while (isspace(*str)) str++; @@ -646,6 +589,7 @@ fmt_scan (struct format *format, char *scanl, int width, int *dat) if ((str = mn->m_pers) == NULL) { if ((str = mn->m_note)) { strncpy (buffer, str, sizeof(buffer)); + buffer[sizeof(buffer)-1] = '\0'; str = buffer; if (*str == '(') str++; @@ -682,6 +626,40 @@ fmt_scan (struct format *format, char *scanl, int width, int *dat) } } } + break; + + + /* UNQUOTEs RFC-2822 quoted-string and quoted-pair */ + case FT_LS_UNQUOTE: + if (str) { + int m; + strncpy(buffer, str, sizeof(buffer)); + /* strncpy doesn't NUL-terminate if it fills the buffer */ + buffer[sizeof(buffer)-1] = '\0'; + str = buffer; + + /* we will parse from buffer to buffer2 */ + n = 0; /* n is the input position in str */ + m = 0; /* m is the ouput position in buffer2 */ + + while ( str[n] != '\0') { + switch ( str[n] ) { + case '\\': + n++; + if ( str[n] != '\0') + buffer2[m++] = str[n++]; + break; + case '"': + n++; + break; + default: + buffer2[m++] = str[n++]; + break; + } + } + buffer2[m] = '\0'; + str = buffer2; + } break; case FT_LOCALDATE: