/*
* macros to format data
*/
+#define PUTDF(cp, num, wid, fill)\
+ if (cp + wid < ep) {\
+ if ((i = (num)) < 0)\
+ i = -(num);\
+ if ((c = (wid)) < 0)\
+ c = -c;\
+ sp = cp + c;\
+ do {\
+ *--sp = (i % 10) + '0';\
+ i /= 10;\
+ } while (i > 0 && sp > cp);\
+ if (i > 0)\
+ *sp = '?';\
+ else if ((num) < 0 && sp > cp)\
+ *--sp = '-';\
+ while (sp > cp)\
+ *--sp = fill;\
+ cp += c;\
+ }
#ifdef LOCALE
#define PUTSF(cp, str, wid, fill) {\
sp++;\
}\
while ((c = (unsigned char) *sp++) && --i >= 0 && cp < ep)\
- if (isgraph(c)) \
+ if (!iscntrl(c) && !isspace(c)) \
*cp++ = c;\
else {\
while ((c = (unsigned char) *sp) && (iscntrl(c) || isspace(c)))\
while ((c = (unsigned char) *sp) && (iscntrl(c) || isspace(c)))\
sp++;\
while((c = (unsigned char) *sp++) && cp < ep)\
- if (isgraph(c)) \
+ if (!iscntrl(c) && !isspace(c)) \
*cp++ = c;\
else {\
while ((c = (unsigned char) *sp) && (iscntrl(c) || isspace(c)))\
if (n >= 0) cp += n;
break;
case FT_NUMF:
- n = snprintf(cp, ep - cp, "%d", value);
- if (n >= 0) {
- cp += n;
- } else n = 0;
- c = abs(fmt->f_width) - n;
- for (; (c > 0) && (cp < ep); c--) *cp++ = fmt->f_fill;
+ PUTDF (cp, value, fmt->f_width, fmt->f_fill);
break;
case FT_CHAR:
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;
char *xp;
strncpy(buffer, str, sizeof(buffer));
+ buffer[sizeof(buffer)-1] = '\0';
str = buffer;
while (isspace(*str))
str++;
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++;
}
}
}
+ 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: