]> diplodocus.org Git - nmh/blobdiff - sbr/fmt_compile.c
Partial work for mhl; still more stuff to do.
[nmh] / sbr / fmt_compile.c
index be0c04c1123d2cca7217f97ad20093630d3d9602..0ed2779ecd84cd990cd8f5608863c68342bc116a 100644 (file)
@@ -239,6 +239,7 @@ static struct ftable functable[] = {
 #define NEWCOMP(cm,name) do { \
        cm = ((struct comp *) calloc(1, sizeof (struct comp)));\
        cm->c_name = getcpy(name);\
+       cm->c_refcount++;\
        ncomp++;\
        i = CHASH(name);\
        cm->c_next = wantcomp[i];\
@@ -265,7 +266,7 @@ static struct ftable functable[] = {
 #define LS(type, str)          do { NEW(type,0,0); fp->f_text = (str); fp->f_flags |= FF_STRALLOC; } while (0)
 
 #define PUTCOMP(comp)          do { NEW(FT_COMP,0,0); ADDC(comp); } while (0)
-#define PUTLIT(str)            do { NEW(FT_LIT,0,0); fp->f_text = getcpy(str); } while (0)
+#define PUTLIT(str)            do { NEW(FT_LIT,0,0); fp->f_text = getcpy(str); fp->f_flags |= FF_STRALLOC; } while (0)
 #define PUTC(c)                        do { NEW(FT_CHAR,0,0); fp->f_char = (c); } while (0)
 
 static char *format_string;
@@ -372,7 +373,6 @@ fmt_compile(char *fstring, struct format **fmt, int reset_comptable)
     if (next_fp == NULL)
        adios (NULL, "unable to allocate format storage");
 
-    ncomp = 0;
     infunction = 0;
 
     cp = compile(format_string);
@@ -698,6 +698,37 @@ do_expr (char *sp, int preprocess)
  * There is no support for this in the format engine, so right now if
  * you try using it you will reach the FT_DONE and simply stop.  I'm leaving
  * this here in case someone wants to continue the work.
+ *
+ * Okay, got some more information on this from John L. Romine!  From an
+ * email he sent to the nmh-workers mailing list on December 2, 2010, he
+ * explains it thusly:
+ *
+ *    In this case (scan, formatsbr) it has to do with an extension to
+ *    the mh-format syntax to allow for looping.
+ *
+ *    The scan format is processed once for each message.  Those #ifdef
+ *    JLR changes allowed for the top part of the format file to be
+ *    processed once, then a second, looping part to be processed
+ *    once per message.  As I recall, there were new mh-format escape
+ *    sequences to delimit the loop.  This would have allowed for things
+ *    like per-format column headings in the scan output.
+ *
+ *    Since existing format files didn't include the scan listing
+ *    header (it was hard-coded in scan.c) it would not have been
+ *    backward-compatible.  All existing format files (including any
+ *    local ones) would have needed to be changed to include the format
+ *    codes for a header.  The practice at the time was not to introduce
+ *    incompatible changes in a minor release, and I never managed to
+ *    put out a newer major release.
+ *
+ * I can see how this would work, and I suspect part of the motivation was
+ * because the format compiler routines (at the time) couldn't really be
+ * called multiple times on the same message because the memory management
+ * was so lousy.  That's been reworked and things are now a lot cleaner,
+ * so I suspect if we're going to allow a format string to be used for the
+ * scan header it might be simpler to have a separate format string just
+ * for the header.  But I'll leave this code in for now just in case we
+ * decide that we want some kind of looping support.
  */
 static char *
 do_loop(char *sp)
@@ -820,6 +851,7 @@ fmt_free(struct format *fmt, int reset_comptable)
                free(fp->f_text);
            if (fp->f_flags & FF_COMPREF)
                free_component(fp->f_comp);
+           fp++;
        }
        free(fmt);
     }
@@ -862,6 +894,8 @@ free_comptable(void)
        }
        wantcomp[i] = 0;
     }
+
+    ncomp = 0;
 }
 
 /*