Remove RCS keywords, since they no longer work after git migration.
[mmh] / sbr / fmt_compile.c
index 798f1f6..a180c56 100644 (file)
@@ -2,8 +2,6 @@
 /*
  * fmt_compile.c -- "compile" format strings for fmt_scan
  *
- * $Id$
- *
  * This code is Copyright (c) 2002, by the authors of nmh.  See the
  * COPYRIGHT file in the root directory of the nmh distribution for
  * complete copyright information.
@@ -53,6 +51,9 @@ extern struct mailname fmt_mnull;
 #define        TF_NOP     8        /* like expr but no result            */
 
 /* ftable->flags */
+/* NB that TFL_PUTS is also used to decide whether the test
+ * in a "%<(function)..." should be a string or numeric one.
+ */
 #define        TFL_PUTS   1        /* implicit putstr if top level */
 #define        TFL_PUTN   2        /* implicit putnum if top level */
 
@@ -155,35 +156,38 @@ static struct ftable functable[] = {
 };
 
 /* Add new component to the hash table */
-#define NEWCOMP(cm,name)\
+#define NEWCOMP(cm,name) do { \
        cm = ((struct comp *) calloc(1, sizeof (struct comp)));\
        cm->c_name = name;\
        ncomp++;\
        i = CHASH(name);\
        cm->c_next = wantcomp[i];\
-       wantcomp[i] = cm;
+       wantcomp[i] = cm; \
+       } while (0)
 
 #define NEWFMT (next_fp++)
-#define NEW(type,fill,wid)\
-       fp=NEWFMT; fp->f_type=(type); fp->f_fill=(fill); fp->f_width=(wid);
+#define NEW(type,fill,wid) do {\
+       fp=NEWFMT; fp->f_type=(type); fp->f_fill=(fill); fp->f_width=(wid); \
+       } while (0)
 
 /* Add (possibly new) component to the hash table */
-#define ADDC(name)\
+#define ADDC(name) do { \
        FINDCOMP(cm, name);\
        if (!cm) {\
            NEWCOMP(cm,name);\
        }\
-       fp->f_comp = cm;
+       fp->f_comp = cm; \
+       } while (0)
 
-#define LV(type, value)                NEW(type,0,0); fp->f_value = (value);
-#define LS(type, str)          NEW(type,0,0); fp->f_text = (str);
+#define LV(type, value)                do { NEW(type,0,0); fp->f_value = (value); } while (0)
+#define LS(type, str)          do { NEW(type,0,0); fp->f_text = (str); } while (0)
 
-#define PUTCOMP(comp)          NEW(FT_COMP,0,0); ADDC(comp);
-#define PUTLIT(str)            NEW(FT_LIT,0,0); fp->f_text = (str);
-#define PUTC(c)                        NEW(FT_CHAR,0,0); fp->f_char = (c);
+#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 = (str); } while (0)
+#define PUTC(c)                        do { NEW(FT_CHAR,0,0); fp->f_char = (c); } while (0)
 
 static char *format_string;
-static char *usr_fstring;      /* for CERROR */
+static unsigned char *usr_fstring;     /* for CERROR */
 
 #define CERROR(str) compile_error (str, cp)
 
@@ -610,7 +614,14 @@ do_if(char *sp)
                if (ftbl->f_type >= IF_FUNCS)
                    fp->f_type = ftbl->extra;
                else {
-                   LV (FT_IF_V_NE, 0);
+                   /* Put out a string test or a value test depending
+                    * on what this function's return type is.
+                    */
+                   if (ftbl->flags & TFL_PUTS) {
+                       LV (FT_IF_S, 0);
+                   } else {
+                       LV (FT_IF_V_NE, 0);
+                   }
                }
            }
            else {