Use the same mh_hostname() function from test/common.h in mhsign(1)
[mmh] / sbr / fmt_scan.c
index 9ad7b8a..4d4d633 100644 (file)
@@ -36,6 +36,7 @@ struct mailname fmt_mnull;
 static int match(char *, char *);
 static char *get_x400_friendly(char *, char *, int);
 static int get_x400_comp(char *, char *, char *, int);
+static char *fmt_trim(char *, int);
 
 
 /*
@@ -187,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[] = {
@@ -259,6 +293,41 @@ get_x400_comp(char *mbox, char *key, char *buffer, int buffer_len)
        return 1;
 }
 
+static char *
+fmt_trim(char *str, int width)
+{
+       char *xp;
+       int ljust, i;
+       char buffer[BUFSIZ];
+       char *dst;
+
+       strncpy(buffer, str, sizeof(buffer));
+       dst = buffer;
+       dst[sizeof(buffer)-1] = '\0';
+       while (isspace(*dst)) {
+               dst++;
+       }
+       ljust = 0;
+       if ((i = width) < 0) {
+               i = -i;
+               ljust++;
+       }
+
+       if (!ljust && i > 0 && (int)strlen(dst) > i) {
+               dst[i] = '\0';
+       }
+       xp = dst;
+       xp += strlen(dst) - 1;
+       while (xp > dst && isspace(*xp)) {
+               *xp-- = '\0';
+       }
+       if (ljust && i > 0 && (int)strlen(dst) > i) {
+               dst += strlen(dst) - i;
+       }
+       strncpy(str, dst, strlen(str) + 1);
+       return str;
+}
+
 struct format *
 fmt_scan(struct format *format, char *scanl, int width, int *dat)
 {
@@ -462,27 +531,7 @@ fmt_scan(struct format *format, char *scanl, int width, int *dat)
 
                case FT_LS_TRIM:
                        if (str) {
-                               unsigned char *xp;
-
-                               strncpy(buffer, str, sizeof(buffer));
-                               buffer[sizeof(buffer)-1] = '\0';
-                               str = buffer;
-                               while (isspace(*str))
-                                               str++;
-                               ljust = 0;
-                               if ((i = fmt->f_width) < 0) {
-                                               i = -i;
-                                               ljust++;
-                               }
-
-                               if (!ljust && i > 0 && (int)strlen(str) > i)
-                                               str[i] = '\0';
-                               xp = str;
-                               xp += strlen(str) - 1;
-                               while (xp > str && isspace(*xp))
-                                               *xp-- = '\0';
-                               if (ljust && i > 0 && (int)strlen(str) > i)
-                                       str += strlen(str) - i;
+                               str = fmt_trim(str, fmt->f_width);
                        }
                        break;
 
@@ -868,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 */
-
 }