Factor trim format function out
authormarkus schnalke <meillo@marmaro.de>
Tue, 6 Sep 2016 18:10:28 +0000 (20:10 +0200)
committermarkus schnalke <meillo@marmaro.de>
Tue, 6 Sep 2016 18:10:28 +0000 (20:10 +0200)
Also clarify that it trims both, leading and trailing whitespace.

(Note that it is a special trim function. We cannot simply replace
it with sbr/trim.c. Nonetheless, its readability is somehow bad.)

h/fmt_compile.h
man/mh-format.man5
sbr/fmt_scan.c

index f034c6c..21e21e2 100644 (file)
@@ -22,7 +22,7 @@
 #define FT_LS_CFIND      15    /* set "str" to context_find(text)      */
 #define FT_LS_DECODECOMP 16    /* set "str" to decoded component text  */
 #define FT_LS_DECODE     17    /* decode "str" as RFC-2047 header      */
-#define FT_LS_TRIM       18    /* trim trailing white space from "str" */
+#define FT_LS_TRIM       18    /* trim white space from "str"          */
 #define FT_LV_COMP       19    /* set "value" to comp (as dec. num)    */
 #define FT_LV_COMPFLAG   20    /* set "value" to comp flag word        */
 #define FT_LV_LIT        21    /* set "value" to literal num           */
index 703e633..3935872 100644 (file)
@@ -292,7 +292,7 @@ decode      expr    string  decode \fIstr\fR as RFC-2047 (MIME-encoded)
                        component and print it
 unquote        expr    string  remove RFC-2822 quotes from \fIstr\fR
 unmailto       expr    string  remove `mailto:' and < > from \fIstr\fR
-trim   expr            trim trailing white-space from \fIstr\fR
+trim   expr            trim white-space from \fIstr\fR
 putstr expr            print \fIstr\fR
 putstrf        expr            print \fIstr\fR in a fixed width
 putnum expr            print \fInum\fR
index 9ad7b8a..37bf16a 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);
 
 
 /*
@@ -259,6 +260,39 @@ 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];
+
+       strncpy(buffer, str, sizeof(buffer));
+       buffer[sizeof(buffer)-1] = '\0';
+       str = buffer;
+       while (isspace(*str)) {
+               str++;
+       }
+       ljust = 0;
+       if ((i = 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;
+       }
+       return str;
+}
+
 struct format *
 fmt_scan(struct format *format, char *scanl, int width, int *dat)
 {
@@ -462,27 +496,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;