Factor trim format function out
[mmh] / sbr / fmt_new.c
index 7576ae4..c1386d4 100644 (file)
@@ -8,50 +8,67 @@
 
 #include <h/mh.h>
 #include <h/utils.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sysexits.h>
 
-#define QUOTE '\\'
-
-static char *formats = 0;
+static char *formats = NULL;
 
 /*
 ** static prototypes
 */
-static void normalize (char *);
+static void normalize(char *);
 
 
 /*
-** Get new format string
+** Copy first available format string, store in static memory and normalize it.
 */
-
 char *
-new_fs (char *form, char *format, char *default_fs)
+new_fs(char *form, char *def_form)
 {
        struct stat st;
-       register FILE *fp;
+       FILE *fp;
 
-       if (formats)
-               free (formats);
+       if (formats) {
+               mh_free0(&formats);
+       }
 
        if (form) {
-               if ((fp = fopen (etcpath (form), "r")) == NULL)
-                       adios (form, "unable to open format file");
-
-               if (fstat (fileno (fp), &st) == -1)
-                       adios (form, "unable to stat format file");
-
-               formats = mh_xmalloc ((size_t) st.st_size + 1);
-
-               if (read (fileno(fp), formats, (int) st.st_size) != st.st_size)
-                       adios (form, "error reading format file");
-
-               formats[st.st_size] = '\0';
-
-               fclose (fp);
-       } else {
-               formats = getcpy (format ? format : default_fs);
+               if (*form == '=') {
+                       formats = mh_xstrdup(form+1);
+               } else {
+                       if ((fp = fopen(etcpath(form), "r")) == NULL) {
+                               adios(EX_IOERR, form, "unable to open format file");
+                       }
+                       if (fstat(fileno(fp), &st) == -1) {
+                               adios(EX_IOERR, form, "unable to stat format file");
+                       }
+                       formats = mh_xcalloc(st.st_size + 1, sizeof(char));
+                       if (read(fileno(fp), formats, (int)st.st_size) != st.st_size) {
+                               adios(EX_IOERR, form, "error reading format file");
+                       }
+                       formats[st.st_size] = '\0';
+                       fclose(fp);
+               }
+       } else if (def_form) {
+               if (*def_form == '=') {
+                       formats = mh_xstrdup(def_form+1);
+               } else {
+                       if ((fp = fopen(etcpath(def_form), "r")) == NULL) {
+                               adios(EX_IOERR, def_form, "unable to open format file");
+                       }
+                       if (fstat(fileno(fp), &st) == -1) {
+                               adios(EX_IOERR, def_form, "unable to stat format file");
+                       }
+                       formats = mh_xcalloc(st.st_size + 1, sizeof(char));
+                       if (read(fileno(fp), formats, (int)st.st_size) != st.st_size) {
+                               adios(EX_IOERR, def_form, "error reading format file");
+                       }
+                       formats[st.st_size] = '\0';
+                       fclose(fp);
+               }
        }
-
-       normalize (formats);  /* expand escapes */
+       normalize(formats);  /* expand escapes */
 
        return formats;
 }
@@ -60,46 +77,41 @@ new_fs (char *form, char *format, char *default_fs)
 /*
 ** Expand escapes in format strings
 */
-
 static void
-normalize (char *cp)
+normalize(char *cp)
 {
        char *dp;
 
        for (dp = cp; *cp; cp++) {
-               if (*cp != QUOTE) {
+               if (*cp != '\\') {
                        *dp++ = *cp;
-               } else {
-                       switch (*++cp) {
-                               case 'b':
-                                       *dp++ = '\b';
-                                       break;
-
-                               case 'f':
-                                       *dp++ = '\f';
-                                       break;
-
-                               case 'n':
-                                       *dp++ = '\n';
-                                       break;
-
-                               case 'r':
-                                       *dp++ = '\r';
-                                       break;
-
-                               case 't':
-                                       *dp++ = '\t';
-                                       break;
-
-                               case '\n':
-                                       break;
+                       continue;
+               }
 
-                               case 0:
-                                       cp--;  /* fall */
-                               default:
-                                       *dp++ = *cp;
-                                       break;
-                       }
+               switch (*++cp) {
+               case 'b':
+                       *dp++ = '\b';
+                       break;
+               case 'f':
+                       *dp++ = '\f';
+                       break;
+               case 'n':
+                       *dp++ = '\n';
+                       break;
+               case 'r':
+                       *dp++ = '\r';
+                       break;
+               case 't':
+                       *dp++ = '\t';
+                       break;
+               case '\n':
+                       break;
+               case '\0':
+                       cp--;
+                       /* fall */
+               default:
+                       *dp++ = *cp;
+                       break;
                }
        }
        *dp = '\0';