Get rid of all the extra filename strdup()'s. (Bug #14).
authorPeter Johnson <peter@tortall.net>
Mon, 29 Oct 2001 01:10:20 +0000 (01:10 -0000)
committerPeter Johnson <peter@tortall.net>
Mon, 29 Oct 2001 01:10:20 +0000 (01:10 -0000)
svn path=/trunk/yasm/; revision=300

20 files changed:
frontends/yasm/yasm.c
libyasm/bytecode.c
libyasm/errwarn.c
libyasm/expr.c
libyasm/linemgr.c
libyasm/linemgr.h
libyasm/symrec.c
modules/arch/x86/expr.c
modules/arch/x86/x86expr.c
src/arch/x86/expr.c
src/arch/x86/x86expr.c
src/bytecode.c
src/errwarn.c
src/expr.c
src/globals.c
src/globals.h
src/linemgr.c
src/linemgr.h
src/main.c
src/symrec.c

index 6a93e7bc84e446d132713aaaa4f796fe1e15d16c..b42d331b18cc335ad381c1cddd22e0e9afa0fc9a 100644 (file)
@@ -124,7 +124,7 @@ main(int argc, char *argv[])
     if (!files_open)
     {
        in = stdin;
-       in_filename = xstrdup("<STDIN>");
+       switch_filename("<STDIN>");
     }
 
     /* Get initial BITS setting from object format */
@@ -145,8 +145,7 @@ main(int argc, char *argv[])
     printf("Post-parser-finalization:\n");
     sections_print(sections);
 
-    if (in_filename)
-       free(in_filename);
+    filename_delete_all();
     return EXIT_SUCCESS;
 }
 
@@ -158,7 +157,6 @@ not_an_option_handler(char *param)
 {
     if (files_open > 0) {
        WarningNow("can open only one input file, only latest file will be processed");
-       free(in_filename);
        fclose(in);
     }
 
@@ -167,7 +165,7 @@ not_an_option_handler(char *param)
        ErrorNow(_("could not open file `%s'"), param);
        return 1;
     }
-    in_filename = xstrdup(param);
+    switch_filename(param);
 
     files_open++;
     return 0;
index 8f4d91edb477f49a04364657fa63153a24de84ae..498236ba4eb2bfb316b38f12aaedec8830566801 100644 (file)
@@ -175,7 +175,7 @@ struct bytecode {
                                   multiple copies), 0 if unknown */
 
     /* where it came from */
-    char *filename;
+    const char *filename;
     unsigned int lineno;
 
     /* other assembler state info */
@@ -426,7 +426,7 @@ bytecode_new_common(void)
     bc->multiple = (expr *)NULL;
     bc->len = 0;
 
-    bc->filename = xstrdup(in_filename);
+    bc->filename = in_filename;
     bc->lineno = line_number;
 
     bc->offset = 0;
index 74061c69bcd6ca0dbf137b232febd6638e8b66b3..4f008386f9fa0978313d5a7795268a942462adde 100644 (file)
@@ -76,7 +76,7 @@ typedef struct errwarn_s {
 
     enum { WE_ERROR, WE_WARNING } type;
 
-    char *filename;
+    const char *filename;
     unsigned long line;
     /* FIXME: This should not be a fixed size.  But we don't have vasprintf()
      * right now. */
@@ -177,7 +177,7 @@ Error(const char *fmt, ...)
        we = xmalloc(sizeof(errwarn));
 
        we->type = WE_ERROR;
-       we->filename = xstrdup(in_filename);
+       we->filename = in_filename;
        we->line = line_number;
     }
 
@@ -211,7 +211,7 @@ Warning(const char *fmt, ...)
     we = xmalloc(sizeof(errwarn));
 
     we->type = WE_WARNING;
-    we->filename = xstrdup(in_filename);
+    we->filename = in_filename;
     we->line = line_number;
     va_start(ap, fmt);
     vsprintf(we->msg, fmt, ap);
index a3c11d85cab4abf0233f3cad3582cae8de89cdae..33180b3ce1dabff17646da1c1821c70060f67e1d 100644 (file)
@@ -84,7 +84,7 @@ struct ExprItem {
  */
 struct expr {
     ExprOp op;
-    char *filename;
+    const char *filename;
     unsigned long line;
     int numterms;
     ExprItem terms[2];         /* structure may be extended to include more */
@@ -121,7 +121,7 @@ expr_new(ExprOp op, ExprItem *left, ExprItem *right)
        ptr->numterms++;
     }
 
-    ptr->filename = xstrdup(in_filename);
+    ptr->filename = in_filename;
     ptr->line = line_number;
 
     return ptr;
@@ -182,7 +182,7 @@ expr_xform_neg_item(expr *e, ExprItem *ei)
 
     /* Build -1*ei subexpression */
     sube->op = EXPR_MUL;
-    sube->filename = xstrdup(e->filename);
+    sube->filename = e->filename;
     sube->line = e->line;
     sube->numterms = 2;
     sube->terms[0].type = EXPR_INT;
@@ -243,7 +243,7 @@ expr_xform_neg_helper(expr *e)
             */
            ne = xmalloc(sizeof(expr));
            ne->op = EXPR_MUL;
-           ne->filename = xstrdup(e->filename);
+           ne->filename = e->filename;
            ne->line = e->line;
            ne->numterms = 2;
            ne->terms[0].type = EXPR_INT;
@@ -442,7 +442,6 @@ expr_level_op(expr *e, int fold_const, int simplify_ident)
               e->terms[i].data.expn->op == EXPR_IDENT) {
            expr *sube = e->terms[i].data.expn;
            e->terms[i] = sube->terms[0];
-           xfree(sube->filename);
            xfree(sube);
        }
 
@@ -558,7 +557,6 @@ expr_level_op(expr *e, int fold_const, int simplify_ident)
            /* delete subexpression, but *don't delete nodes* (as we've just
             * copied them!)
             */
-           xfree(sube->filename);
            xfree(sube);
        } else if (o != i) {
            /* copy operand if it changed places */
@@ -656,7 +654,7 @@ expr_copy_except(const expr *e, int except)
     n = xmalloc(sizeof(expr)+sizeof(ExprItem)*(e->numterms-2));
 
     n->op = e->op;
-    n->filename = xstrdup(e->filename);
+    n->filename = e->filename;
     n->line = e->line;
     n->numterms = e->numterms;
     for (i=0; i<e->numterms; i++) {
@@ -713,7 +711,6 @@ expr_delete_each(expr *e, void *d)
                break;  /* none of the other types needs to be deleted */
        }
     }
-    xfree(e->filename);
     xfree(e);  /* free ourselves */
     return 0;  /* don't stop recursion */
 }
index 4af39630c2b52fe7e16dc84b8f00f04bf62f06b1..8f516a8e61b3d339e63cd429518762fa70fe3d98 100644 (file)
 
 #include <stdio.h>
 
+#include "globals.h"
+
+#ifdef DMALLOC
+# include <dmalloc.h>
+#endif
+
 RCSID("$IdPath$");
 
-char *in_filename = (char *)NULL;
+const char *in_filename = (const char *)NULL;
 unsigned int line_number = 1;
 unsigned char mode_bits = 0;
 unsigned int asm_options = 0;
+
+static ternary_tree filename_table = (ternary_tree)NULL;
+
+void
+switch_filename(const char *filename)
+{
+    char *copy = xstrdup(filename);
+    in_filename = ternary_insert(&filename_table, filename, copy, 0);
+    if (in_filename != copy)
+       xfree(copy);
+}
+
+void
+filename_delete_all(void)
+{
+    in_filename = NULL;
+    ternary_cleanup(filename_table);
+    filename_table = NULL;
+}
index 373d1dd8c2fa10359ea34351fa7c1fda87f9a667..23376e131012b5b4151751a393b36daa0aa357c0 100644 (file)
 #ifndef YASM_GLOBALS_H
 #define YASM_GLOBALS_H
 
-extern char *in_filename;
+extern const char *in_filename;
 extern unsigned int line_number;
 extern unsigned char mode_bits;
 extern unsigned int asm_options;
 
+void switch_filename(const char *filename);
+void filename_delete_all(void);
+
 #endif
index 03e641aee2e37832e20cfb3b9962372a90a1b9ee..1426fc096dcb3d883f07e66ccbecd38601ef959b 100644 (file)
@@ -69,7 +69,7 @@ struct symrec {
     SymType type;
     SymStatus status;
     SymVisibility visibility;
-    char *filename;            /* file and line */
+    const char *filename;      /* file and line */
     unsigned long line;                /*  symbol was first declared or used on */
     union {
        expr *expn;             /* equ value */
@@ -107,7 +107,7 @@ symrec_get_or_new(const char *name, int in_table)
 
     rec->name = xstrdup(name);
     rec->type = SYM_UNKNOWN;
-    rec->filename = xstrdup(in_filename);
+    rec->filename = in_filename;
     rec->line = line_number;
     rec->visibility = SYM_LOCAL;
 
index a3c11d85cab4abf0233f3cad3582cae8de89cdae..33180b3ce1dabff17646da1c1821c70060f67e1d 100644 (file)
@@ -84,7 +84,7 @@ struct ExprItem {
  */
 struct expr {
     ExprOp op;
-    char *filename;
+    const char *filename;
     unsigned long line;
     int numterms;
     ExprItem terms[2];         /* structure may be extended to include more */
@@ -121,7 +121,7 @@ expr_new(ExprOp op, ExprItem *left, ExprItem *right)
        ptr->numterms++;
     }
 
-    ptr->filename = xstrdup(in_filename);
+    ptr->filename = in_filename;
     ptr->line = line_number;
 
     return ptr;
@@ -182,7 +182,7 @@ expr_xform_neg_item(expr *e, ExprItem *ei)
 
     /* Build -1*ei subexpression */
     sube->op = EXPR_MUL;
-    sube->filename = xstrdup(e->filename);
+    sube->filename = e->filename;
     sube->line = e->line;
     sube->numterms = 2;
     sube->terms[0].type = EXPR_INT;
@@ -243,7 +243,7 @@ expr_xform_neg_helper(expr *e)
             */
            ne = xmalloc(sizeof(expr));
            ne->op = EXPR_MUL;
-           ne->filename = xstrdup(e->filename);
+           ne->filename = e->filename;
            ne->line = e->line;
            ne->numterms = 2;
            ne->terms[0].type = EXPR_INT;
@@ -442,7 +442,6 @@ expr_level_op(expr *e, int fold_const, int simplify_ident)
               e->terms[i].data.expn->op == EXPR_IDENT) {
            expr *sube = e->terms[i].data.expn;
            e->terms[i] = sube->terms[0];
-           xfree(sube->filename);
            xfree(sube);
        }
 
@@ -558,7 +557,6 @@ expr_level_op(expr *e, int fold_const, int simplify_ident)
            /* delete subexpression, but *don't delete nodes* (as we've just
             * copied them!)
             */
-           xfree(sube->filename);
            xfree(sube);
        } else if (o != i) {
            /* copy operand if it changed places */
@@ -656,7 +654,7 @@ expr_copy_except(const expr *e, int except)
     n = xmalloc(sizeof(expr)+sizeof(ExprItem)*(e->numterms-2));
 
     n->op = e->op;
-    n->filename = xstrdup(e->filename);
+    n->filename = e->filename;
     n->line = e->line;
     n->numterms = e->numterms;
     for (i=0; i<e->numterms; i++) {
@@ -713,7 +711,6 @@ expr_delete_each(expr *e, void *d)
                break;  /* none of the other types needs to be deleted */
        }
     }
-    xfree(e->filename);
     xfree(e);  /* free ourselves */
     return 0;  /* don't stop recursion */
 }
index a3c11d85cab4abf0233f3cad3582cae8de89cdae..33180b3ce1dabff17646da1c1821c70060f67e1d 100644 (file)
@@ -84,7 +84,7 @@ struct ExprItem {
  */
 struct expr {
     ExprOp op;
-    char *filename;
+    const char *filename;
     unsigned long line;
     int numterms;
     ExprItem terms[2];         /* structure may be extended to include more */
@@ -121,7 +121,7 @@ expr_new(ExprOp op, ExprItem *left, ExprItem *right)
        ptr->numterms++;
     }
 
-    ptr->filename = xstrdup(in_filename);
+    ptr->filename = in_filename;
     ptr->line = line_number;
 
     return ptr;
@@ -182,7 +182,7 @@ expr_xform_neg_item(expr *e, ExprItem *ei)
 
     /* Build -1*ei subexpression */
     sube->op = EXPR_MUL;
-    sube->filename = xstrdup(e->filename);
+    sube->filename = e->filename;
     sube->line = e->line;
     sube->numterms = 2;
     sube->terms[0].type = EXPR_INT;
@@ -243,7 +243,7 @@ expr_xform_neg_helper(expr *e)
             */
            ne = xmalloc(sizeof(expr));
            ne->op = EXPR_MUL;
-           ne->filename = xstrdup(e->filename);
+           ne->filename = e->filename;
            ne->line = e->line;
            ne->numterms = 2;
            ne->terms[0].type = EXPR_INT;
@@ -442,7 +442,6 @@ expr_level_op(expr *e, int fold_const, int simplify_ident)
               e->terms[i].data.expn->op == EXPR_IDENT) {
            expr *sube = e->terms[i].data.expn;
            e->terms[i] = sube->terms[0];
-           xfree(sube->filename);
            xfree(sube);
        }
 
@@ -558,7 +557,6 @@ expr_level_op(expr *e, int fold_const, int simplify_ident)
            /* delete subexpression, but *don't delete nodes* (as we've just
             * copied them!)
             */
-           xfree(sube->filename);
            xfree(sube);
        } else if (o != i) {
            /* copy operand if it changed places */
@@ -656,7 +654,7 @@ expr_copy_except(const expr *e, int except)
     n = xmalloc(sizeof(expr)+sizeof(ExprItem)*(e->numterms-2));
 
     n->op = e->op;
-    n->filename = xstrdup(e->filename);
+    n->filename = e->filename;
     n->line = e->line;
     n->numterms = e->numterms;
     for (i=0; i<e->numterms; i++) {
@@ -713,7 +711,6 @@ expr_delete_each(expr *e, void *d)
                break;  /* none of the other types needs to be deleted */
        }
     }
-    xfree(e->filename);
     xfree(e);  /* free ourselves */
     return 0;  /* don't stop recursion */
 }
index a3c11d85cab4abf0233f3cad3582cae8de89cdae..33180b3ce1dabff17646da1c1821c70060f67e1d 100644 (file)
@@ -84,7 +84,7 @@ struct ExprItem {
  */
 struct expr {
     ExprOp op;
-    char *filename;
+    const char *filename;
     unsigned long line;
     int numterms;
     ExprItem terms[2];         /* structure may be extended to include more */
@@ -121,7 +121,7 @@ expr_new(ExprOp op, ExprItem *left, ExprItem *right)
        ptr->numterms++;
     }
 
-    ptr->filename = xstrdup(in_filename);
+    ptr->filename = in_filename;
     ptr->line = line_number;
 
     return ptr;
@@ -182,7 +182,7 @@ expr_xform_neg_item(expr *e, ExprItem *ei)
 
     /* Build -1*ei subexpression */
     sube->op = EXPR_MUL;
-    sube->filename = xstrdup(e->filename);
+    sube->filename = e->filename;
     sube->line = e->line;
     sube->numterms = 2;
     sube->terms[0].type = EXPR_INT;
@@ -243,7 +243,7 @@ expr_xform_neg_helper(expr *e)
             */
            ne = xmalloc(sizeof(expr));
            ne->op = EXPR_MUL;
-           ne->filename = xstrdup(e->filename);
+           ne->filename = e->filename;
            ne->line = e->line;
            ne->numterms = 2;
            ne->terms[0].type = EXPR_INT;
@@ -442,7 +442,6 @@ expr_level_op(expr *e, int fold_const, int simplify_ident)
               e->terms[i].data.expn->op == EXPR_IDENT) {
            expr *sube = e->terms[i].data.expn;
            e->terms[i] = sube->terms[0];
-           xfree(sube->filename);
            xfree(sube);
        }
 
@@ -558,7 +557,6 @@ expr_level_op(expr *e, int fold_const, int simplify_ident)
            /* delete subexpression, but *don't delete nodes* (as we've just
             * copied them!)
             */
-           xfree(sube->filename);
            xfree(sube);
        } else if (o != i) {
            /* copy operand if it changed places */
@@ -656,7 +654,7 @@ expr_copy_except(const expr *e, int except)
     n = xmalloc(sizeof(expr)+sizeof(ExprItem)*(e->numterms-2));
 
     n->op = e->op;
-    n->filename = xstrdup(e->filename);
+    n->filename = e->filename;
     n->line = e->line;
     n->numterms = e->numterms;
     for (i=0; i<e->numterms; i++) {
@@ -713,7 +711,6 @@ expr_delete_each(expr *e, void *d)
                break;  /* none of the other types needs to be deleted */
        }
     }
-    xfree(e->filename);
     xfree(e);  /* free ourselves */
     return 0;  /* don't stop recursion */
 }
index a3c11d85cab4abf0233f3cad3582cae8de89cdae..33180b3ce1dabff17646da1c1821c70060f67e1d 100644 (file)
@@ -84,7 +84,7 @@ struct ExprItem {
  */
 struct expr {
     ExprOp op;
-    char *filename;
+    const char *filename;
     unsigned long line;
     int numterms;
     ExprItem terms[2];         /* structure may be extended to include more */
@@ -121,7 +121,7 @@ expr_new(ExprOp op, ExprItem *left, ExprItem *right)
        ptr->numterms++;
     }
 
-    ptr->filename = xstrdup(in_filename);
+    ptr->filename = in_filename;
     ptr->line = line_number;
 
     return ptr;
@@ -182,7 +182,7 @@ expr_xform_neg_item(expr *e, ExprItem *ei)
 
     /* Build -1*ei subexpression */
     sube->op = EXPR_MUL;
-    sube->filename = xstrdup(e->filename);
+    sube->filename = e->filename;
     sube->line = e->line;
     sube->numterms = 2;
     sube->terms[0].type = EXPR_INT;
@@ -243,7 +243,7 @@ expr_xform_neg_helper(expr *e)
             */
            ne = xmalloc(sizeof(expr));
            ne->op = EXPR_MUL;
-           ne->filename = xstrdup(e->filename);
+           ne->filename = e->filename;
            ne->line = e->line;
            ne->numterms = 2;
            ne->terms[0].type = EXPR_INT;
@@ -442,7 +442,6 @@ expr_level_op(expr *e, int fold_const, int simplify_ident)
               e->terms[i].data.expn->op == EXPR_IDENT) {
            expr *sube = e->terms[i].data.expn;
            e->terms[i] = sube->terms[0];
-           xfree(sube->filename);
            xfree(sube);
        }
 
@@ -558,7 +557,6 @@ expr_level_op(expr *e, int fold_const, int simplify_ident)
            /* delete subexpression, but *don't delete nodes* (as we've just
             * copied them!)
             */
-           xfree(sube->filename);
            xfree(sube);
        } else if (o != i) {
            /* copy operand if it changed places */
@@ -656,7 +654,7 @@ expr_copy_except(const expr *e, int except)
     n = xmalloc(sizeof(expr)+sizeof(ExprItem)*(e->numterms-2));
 
     n->op = e->op;
-    n->filename = xstrdup(e->filename);
+    n->filename = e->filename;
     n->line = e->line;
     n->numterms = e->numterms;
     for (i=0; i<e->numterms; i++) {
@@ -713,7 +711,6 @@ expr_delete_each(expr *e, void *d)
                break;  /* none of the other types needs to be deleted */
        }
     }
-    xfree(e->filename);
     xfree(e);  /* free ourselves */
     return 0;  /* don't stop recursion */
 }
index 8f4d91edb477f49a04364657fa63153a24de84ae..498236ba4eb2bfb316b38f12aaedec8830566801 100644 (file)
@@ -175,7 +175,7 @@ struct bytecode {
                                   multiple copies), 0 if unknown */
 
     /* where it came from */
-    char *filename;
+    const char *filename;
     unsigned int lineno;
 
     /* other assembler state info */
@@ -426,7 +426,7 @@ bytecode_new_common(void)
     bc->multiple = (expr *)NULL;
     bc->len = 0;
 
-    bc->filename = xstrdup(in_filename);
+    bc->filename = in_filename;
     bc->lineno = line_number;
 
     bc->offset = 0;
index 74061c69bcd6ca0dbf137b232febd6638e8b66b3..4f008386f9fa0978313d5a7795268a942462adde 100644 (file)
@@ -76,7 +76,7 @@ typedef struct errwarn_s {
 
     enum { WE_ERROR, WE_WARNING } type;
 
-    char *filename;
+    const char *filename;
     unsigned long line;
     /* FIXME: This should not be a fixed size.  But we don't have vasprintf()
      * right now. */
@@ -177,7 +177,7 @@ Error(const char *fmt, ...)
        we = xmalloc(sizeof(errwarn));
 
        we->type = WE_ERROR;
-       we->filename = xstrdup(in_filename);
+       we->filename = in_filename;
        we->line = line_number;
     }
 
@@ -211,7 +211,7 @@ Warning(const char *fmt, ...)
     we = xmalloc(sizeof(errwarn));
 
     we->type = WE_WARNING;
-    we->filename = xstrdup(in_filename);
+    we->filename = in_filename;
     we->line = line_number;
     va_start(ap, fmt);
     vsprintf(we->msg, fmt, ap);
index a3c11d85cab4abf0233f3cad3582cae8de89cdae..33180b3ce1dabff17646da1c1821c70060f67e1d 100644 (file)
@@ -84,7 +84,7 @@ struct ExprItem {
  */
 struct expr {
     ExprOp op;
-    char *filename;
+    const char *filename;
     unsigned long line;
     int numterms;
     ExprItem terms[2];         /* structure may be extended to include more */
@@ -121,7 +121,7 @@ expr_new(ExprOp op, ExprItem *left, ExprItem *right)
        ptr->numterms++;
     }
 
-    ptr->filename = xstrdup(in_filename);
+    ptr->filename = in_filename;
     ptr->line = line_number;
 
     return ptr;
@@ -182,7 +182,7 @@ expr_xform_neg_item(expr *e, ExprItem *ei)
 
     /* Build -1*ei subexpression */
     sube->op = EXPR_MUL;
-    sube->filename = xstrdup(e->filename);
+    sube->filename = e->filename;
     sube->line = e->line;
     sube->numterms = 2;
     sube->terms[0].type = EXPR_INT;
@@ -243,7 +243,7 @@ expr_xform_neg_helper(expr *e)
             */
            ne = xmalloc(sizeof(expr));
            ne->op = EXPR_MUL;
-           ne->filename = xstrdup(e->filename);
+           ne->filename = e->filename;
            ne->line = e->line;
            ne->numterms = 2;
            ne->terms[0].type = EXPR_INT;
@@ -442,7 +442,6 @@ expr_level_op(expr *e, int fold_const, int simplify_ident)
               e->terms[i].data.expn->op == EXPR_IDENT) {
            expr *sube = e->terms[i].data.expn;
            e->terms[i] = sube->terms[0];
-           xfree(sube->filename);
            xfree(sube);
        }
 
@@ -558,7 +557,6 @@ expr_level_op(expr *e, int fold_const, int simplify_ident)
            /* delete subexpression, but *don't delete nodes* (as we've just
             * copied them!)
             */
-           xfree(sube->filename);
            xfree(sube);
        } else if (o != i) {
            /* copy operand if it changed places */
@@ -656,7 +654,7 @@ expr_copy_except(const expr *e, int except)
     n = xmalloc(sizeof(expr)+sizeof(ExprItem)*(e->numterms-2));
 
     n->op = e->op;
-    n->filename = xstrdup(e->filename);
+    n->filename = e->filename;
     n->line = e->line;
     n->numterms = e->numterms;
     for (i=0; i<e->numterms; i++) {
@@ -713,7 +711,6 @@ expr_delete_each(expr *e, void *d)
                break;  /* none of the other types needs to be deleted */
        }
     }
-    xfree(e->filename);
     xfree(e);  /* free ourselves */
     return 0;  /* don't stop recursion */
 }
index 4af39630c2b52fe7e16dc84b8f00f04bf62f06b1..8f516a8e61b3d339e63cd429518762fa70fe3d98 100644 (file)
 
 #include <stdio.h>
 
+#include "globals.h"
+
+#ifdef DMALLOC
+# include <dmalloc.h>
+#endif
+
 RCSID("$IdPath$");
 
-char *in_filename = (char *)NULL;
+const char *in_filename = (const char *)NULL;
 unsigned int line_number = 1;
 unsigned char mode_bits = 0;
 unsigned int asm_options = 0;
+
+static ternary_tree filename_table = (ternary_tree)NULL;
+
+void
+switch_filename(const char *filename)
+{
+    char *copy = xstrdup(filename);
+    in_filename = ternary_insert(&filename_table, filename, copy, 0);
+    if (in_filename != copy)
+       xfree(copy);
+}
+
+void
+filename_delete_all(void)
+{
+    in_filename = NULL;
+    ternary_cleanup(filename_table);
+    filename_table = NULL;
+}
index 373d1dd8c2fa10359ea34351fa7c1fda87f9a667..23376e131012b5b4151751a393b36daa0aa357c0 100644 (file)
 #ifndef YASM_GLOBALS_H
 #define YASM_GLOBALS_H
 
-extern char *in_filename;
+extern const char *in_filename;
 extern unsigned int line_number;
 extern unsigned char mode_bits;
 extern unsigned int asm_options;
 
+void switch_filename(const char *filename);
+void filename_delete_all(void);
+
 #endif
index 4af39630c2b52fe7e16dc84b8f00f04bf62f06b1..8f516a8e61b3d339e63cd429518762fa70fe3d98 100644 (file)
 
 #include <stdio.h>
 
+#include "globals.h"
+
+#ifdef DMALLOC
+# include <dmalloc.h>
+#endif
+
 RCSID("$IdPath$");
 
-char *in_filename = (char *)NULL;
+const char *in_filename = (const char *)NULL;
 unsigned int line_number = 1;
 unsigned char mode_bits = 0;
 unsigned int asm_options = 0;
+
+static ternary_tree filename_table = (ternary_tree)NULL;
+
+void
+switch_filename(const char *filename)
+{
+    char *copy = xstrdup(filename);
+    in_filename = ternary_insert(&filename_table, filename, copy, 0);
+    if (in_filename != copy)
+       xfree(copy);
+}
+
+void
+filename_delete_all(void)
+{
+    in_filename = NULL;
+    ternary_cleanup(filename_table);
+    filename_table = NULL;
+}
index 373d1dd8c2fa10359ea34351fa7c1fda87f9a667..23376e131012b5b4151751a393b36daa0aa357c0 100644 (file)
 #ifndef YASM_GLOBALS_H
 #define YASM_GLOBALS_H
 
-extern char *in_filename;
+extern const char *in_filename;
 extern unsigned int line_number;
 extern unsigned char mode_bits;
 extern unsigned int asm_options;
 
+void switch_filename(const char *filename);
+void filename_delete_all(void);
+
 #endif
index 6a93e7bc84e446d132713aaaa4f796fe1e15d16c..b42d331b18cc335ad381c1cddd22e0e9afa0fc9a 100644 (file)
@@ -124,7 +124,7 @@ main(int argc, char *argv[])
     if (!files_open)
     {
        in = stdin;
-       in_filename = xstrdup("<STDIN>");
+       switch_filename("<STDIN>");
     }
 
     /* Get initial BITS setting from object format */
@@ -145,8 +145,7 @@ main(int argc, char *argv[])
     printf("Post-parser-finalization:\n");
     sections_print(sections);
 
-    if (in_filename)
-       free(in_filename);
+    filename_delete_all();
     return EXIT_SUCCESS;
 }
 
@@ -158,7 +157,6 @@ not_an_option_handler(char *param)
 {
     if (files_open > 0) {
        WarningNow("can open only one input file, only latest file will be processed");
-       free(in_filename);
        fclose(in);
     }
 
@@ -167,7 +165,7 @@ not_an_option_handler(char *param)
        ErrorNow(_("could not open file `%s'"), param);
        return 1;
     }
-    in_filename = xstrdup(param);
+    switch_filename(param);
 
     files_open++;
     return 0;
index 03e641aee2e37832e20cfb3b9962372a90a1b9ee..1426fc096dcb3d883f07e66ccbecd38601ef959b 100644 (file)
@@ -69,7 +69,7 @@ struct symrec {
     SymType type;
     SymStatus status;
     SymVisibility visibility;
-    char *filename;            /* file and line */
+    const char *filename;      /* file and line */
     unsigned long line;                /*  symbol was first declared or used on */
     union {
        expr *expn;             /* equ value */
@@ -107,7 +107,7 @@ symrec_get_or_new(const char *name, int in_table)
 
     rec->name = xstrdup(name);
     rec->type = SYM_UNKNOWN;
-    rec->filename = xstrdup(in_filename);
+    rec->filename = in_filename;
     rec->line = line_number;
     rec->visibility = SYM_LOCAL;