/*
* hash table for deciding if a component is "interesting"
*/
-struct comp *wantcomp[128];
+static struct comp *wantcomp[128];
static struct format *formatvec; /* array to hold formats */
static struct format *next_fp; /* next free format slot */
#define LS(type, str) do { NEW(type,0,0); fp->f_text = (str); } 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 = (str); } while (0)
+#define PUTLIT(str) do { NEW(FT_LIT,0,0); fp->f_text = getcpy(str); } while (0)
#define PUTC(c) do { NEW(FT_CHAR,0,0); fp->f_char = (c); } while (0)
-char *format_string;
+static char *format_string;
static unsigned char *usr_fstring; /* for CERROR */
#define CERROR(str) compile_error (str, cp)
static char *do_expr (char *, int);
static char *do_loop(char *);
static char *do_if(char *);
+static void free_component(struct comp *);
+static void free_comptable(void);
/*
*/
int
-fmt_compile(char *fstring, struct format **fmt)
+fmt_compile(char *fstring, struct format **fmt, int reset_comptable)
{
register char *cp;
size_t i;
- if (format_string)
- free (format_string);
format_string = getcpy (fstring);
usr_fstring = fstring;
+ if (reset_comptable)
+ free_comptable();
+
/* init the component hash table. */
for (i = 0; i < sizeof(wantcomp)/sizeof(wantcomp[0]); i++)
wantcomp[i] = 0;
LV(FT_DONE, 0); /* really done */
*fmt = formatvec;
+ free(format_string);
return (ncomp);
}
return (cp);
}
+
+/*
+ * Free and reset our component hash table
+ */
+
+static void
+free_comptable(void)
+{
+ int i;
+ struct comp *cm, *cm2;
+
+ for (i = 0; i < sizeof(wantcomp)/sizeof(wantcomp[0]); i++) {
+ cm = wantcomp[i];
+ while (cm != NULL) {
+ cm2 = cm->c_next;
+ free_component(cm);
+ cm = cm2;
+ }
+ wantcomp[i] = 0;
+ }
+}
+
+/*
+ * Decrement the reference count of a component structure. If it reaches
+ * zero, free it
+ */
+
+static void
+free_component(struct comp *cm)
+{
+ if (--cm->c_refcount <= 0) {
+ free(cm);
+ }
+}