Whoops, with the new world order we need to make sure we allocate memory
[mmh] / sbr / fmt_compile.c
index 6583195..3a6202d 100644 (file)
@@ -264,7 +264,7 @@ static struct ftable functable[] = {
        } while (0)
 
 #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); fp->f_flags |= FF_STRALLOC; } while (0)
+#define LS(type, str)          do { NEW(type,0,0); fp->f_text = getcpy(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); fp->f_flags |= FF_STRALLOC; } while (0)
@@ -873,6 +873,53 @@ fmt_findcomp(char *component)
 }
 
 /*
+ * Like fmt_findcomp, but case-insensitive.
+ */
+
+struct comp *
+fmt_findcasecomp(char *component)
+{
+    struct comp *cm;
+
+    for (cm = wantcomp[CHASH(component)]; cm; cm = cm->c_next)
+       if (mh_strcasecmp(component, cm->c_name) == 0)
+           break;
+
+    return cm;
+}
+
+/*
+ * Add an entry to the component hash table
+ *
+ * Returns true if the component was added, 0 if it already existed.
+ *
+ */
+
+int
+fmt_addcompentry(char *component)
+{
+    struct comp *cm;
+    int i;
+
+    FINDCOMP(cm, component);
+
+    if (cm)
+       return 0;
+
+    NEWCOMP(cm, component);
+
+    /*
+     * ncomp is really meant for fmt_compile() and this function is
+     * meant to be used outside of it.  So decrement it just to be safe
+     * (internal callers should be using NEWCOMP()).
+     */
+
+    ncomp--;
+
+    return 1;
+}
+
+/*
  * Add a string to a component hash table entry.
  *
  * Note the special handling for components marked with CT_ADDR.  The comments
@@ -880,7 +927,7 @@ fmt_findcomp(char *component)
  */
 
 int
-fmt_addcomp(char *component, char *text)
+fmt_addcomptext(char *component, char *text)
 {
     int i, found = 0, bucket = CHASH(component);
     struct comp *cptr = wantcomp[bucket];