Get rid of all the extra filename strdup()'s. (Bug #14).

svn path=/trunk/yasm/; revision=300
0.3
Peter Johnson 24 years ago
parent 7a6eaf8c03
commit dc1c3c70f5
  1. 8
      frontends/yasm/yasm.c
  2. 4
      libyasm/bytecode.c
  3. 6
      libyasm/errwarn.c
  4. 13
      libyasm/expr.c
  5. 27
      libyasm/linemgr.c
  6. 5
      libyasm/linemgr.h
  7. 4
      libyasm/symrec.c
  8. 13
      modules/arch/x86/expr.c
  9. 13
      modules/arch/x86/x86expr.c
  10. 13
      src/arch/x86/expr.c
  11. 13
      src/arch/x86/x86expr.c
  12. 4
      src/bytecode.c
  13. 6
      src/errwarn.c
  14. 13
      src/expr.c
  15. 27
      src/globals.c
  16. 5
      src/globals.h
  17. 27
      src/linemgr.c
  18. 5
      src/linemgr.h
  19. 8
      src/main.c
  20. 4
      src/symrec.c

@ -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;

@ -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;

@ -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);

@ -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 */
}

@ -27,9 +27,34 @@
#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;
}

@ -22,9 +22,12 @@
#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

@ -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;

@ -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 */
}

@ -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 */
}

@ -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 */
}

@ -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 */
}

@ -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;

@ -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);

@ -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 */
}

@ -27,9 +27,34 @@
#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;
}

@ -22,9 +22,12 @@
#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

@ -27,9 +27,34 @@
#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;
}

@ -22,9 +22,12 @@
#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

@ -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;

@ -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;

Loading…
Cancel
Save