if (!files_open)
{
in = stdin;
- in_filename = xstrdup("<STDIN>");
+ switch_filename("<STDIN>");
}
/* Get initial BITS setting from object format */
printf("Post-parser-finalization:\n");
sections_print(sections);
- if (in_filename)
- free(in_filename);
+ filename_delete_all();
return EXIT_SUCCESS;
}
{
if (files_open > 0) {
WarningNow("can open only one input file, only latest file will be processed");
- free(in_filename);
fclose(in);
}
ErrorNow(_("could not open file `%s'"), param);
return 1;
}
- in_filename = xstrdup(param);
+ switch_filename(param);
files_open++;
return 0;
multiple copies), 0 if unknown */
/* where it came from */
- char *filename;
+ const char *filename;
unsigned int lineno;
/* other assembler state info */
bc->multiple = (expr *)NULL;
bc->len = 0;
- bc->filename = xstrdup(in_filename);
+ bc->filename = in_filename;
bc->lineno = line_number;
bc->offset = 0;
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. */
we = xmalloc(sizeof(errwarn));
we->type = WE_ERROR;
- we->filename = xstrdup(in_filename);
+ we->filename = in_filename;
we->line = line_number;
}
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);
*/
struct expr {
ExprOp op;
- char *filename;
+ const char *filename;
unsigned long line;
int numterms;
ExprItem terms[2]; /* structure may be extended to include more */
ptr->numterms++;
}
- ptr->filename = xstrdup(in_filename);
+ ptr->filename = in_filename;
ptr->line = line_number;
return ptr;
/* 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;
*/
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;
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);
}
/* 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 */
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++) {
break; /* none of the other types needs to be deleted */
}
}
- xfree(e->filename);
xfree(e); /* free ourselves */
return 0; /* don't stop recursion */
}
#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;
+}
#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
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 */
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;
*/
struct expr {
ExprOp op;
- char *filename;
+ const char *filename;
unsigned long line;
int numterms;
ExprItem terms[2]; /* structure may be extended to include more */
ptr->numterms++;
}
- ptr->filename = xstrdup(in_filename);
+ ptr->filename = in_filename;
ptr->line = line_number;
return ptr;
/* 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;
*/
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;
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);
}
/* 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 */
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++) {
break; /* none of the other types needs to be deleted */
}
}
- xfree(e->filename);
xfree(e); /* free ourselves */
return 0; /* don't stop recursion */
}
*/
struct expr {
ExprOp op;
- char *filename;
+ const char *filename;
unsigned long line;
int numterms;
ExprItem terms[2]; /* structure may be extended to include more */
ptr->numterms++;
}
- ptr->filename = xstrdup(in_filename);
+ ptr->filename = in_filename;
ptr->line = line_number;
return ptr;
/* 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;
*/
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;
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);
}
/* 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 */
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++) {
break; /* none of the other types needs to be deleted */
}
}
- xfree(e->filename);
xfree(e); /* free ourselves */
return 0; /* don't stop recursion */
}
*/
struct expr {
ExprOp op;
- char *filename;
+ const char *filename;
unsigned long line;
int numterms;
ExprItem terms[2]; /* structure may be extended to include more */
ptr->numterms++;
}
- ptr->filename = xstrdup(in_filename);
+ ptr->filename = in_filename;
ptr->line = line_number;
return ptr;
/* 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;
*/
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;
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);
}
/* 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 */
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++) {
break; /* none of the other types needs to be deleted */
}
}
- xfree(e->filename);
xfree(e); /* free ourselves */
return 0; /* don't stop recursion */
}
*/
struct expr {
ExprOp op;
- char *filename;
+ const char *filename;
unsigned long line;
int numterms;
ExprItem terms[2]; /* structure may be extended to include more */
ptr->numterms++;
}
- ptr->filename = xstrdup(in_filename);
+ ptr->filename = in_filename;
ptr->line = line_number;
return ptr;
/* 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;
*/
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;
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);
}
/* 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 */
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++) {
break; /* none of the other types needs to be deleted */
}
}
- xfree(e->filename);
xfree(e); /* free ourselves */
return 0; /* don't stop recursion */
}
multiple copies), 0 if unknown */
/* where it came from */
- char *filename;
+ const char *filename;
unsigned int lineno;
/* other assembler state info */
bc->multiple = (expr *)NULL;
bc->len = 0;
- bc->filename = xstrdup(in_filename);
+ bc->filename = in_filename;
bc->lineno = line_number;
bc->offset = 0;
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. */
we = xmalloc(sizeof(errwarn));
we->type = WE_ERROR;
- we->filename = xstrdup(in_filename);
+ we->filename = in_filename;
we->line = line_number;
}
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);
*/
struct expr {
ExprOp op;
- char *filename;
+ const char *filename;
unsigned long line;
int numterms;
ExprItem terms[2]; /* structure may be extended to include more */
ptr->numterms++;
}
- ptr->filename = xstrdup(in_filename);
+ ptr->filename = in_filename;
ptr->line = line_number;
return ptr;
/* 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;
*/
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;
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);
}
/* 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 */
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++) {
break; /* none of the other types needs to be deleted */
}
}
- xfree(e->filename);
xfree(e); /* free ourselves */
return 0; /* don't stop recursion */
}
#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;
+}
#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
#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;
+}
#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
if (!files_open)
{
in = stdin;
- in_filename = xstrdup("<STDIN>");
+ switch_filename("<STDIN>");
}
/* Get initial BITS setting from object format */
printf("Post-parser-finalization:\n");
sections_print(sections);
- if (in_filename)
- free(in_filename);
+ filename_delete_all();
return EXIT_SUCCESS;
}
{
if (files_open > 0) {
WarningNow("can open only one input file, only latest file will be processed");
- free(in_filename);
fclose(in);
}
ErrorNow(_("could not open file `%s'"), param);
return 1;
}
- in_filename = xstrdup(param);
+ switch_filename(param);
files_open++;
return 0;
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 */
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;