diff options
Diffstat (limited to 'rdoff/symtab.c')
-rw-r--r-- | rdoff/symtab.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/rdoff/symtab.c b/rdoff/symtab.c new file mode 100644 index 0000000..c0ff3e5 --- /dev/null +++ b/rdoff/symtab.c @@ -0,0 +1,80 @@ +/* symtab.c Routines to maintain and manipulate a symbol table + * + * The Netwide Assembler is copyright (C) 1996 Simon Tatham and + * Julian Hall. All rights reserved. The software is + * redistributable under the licence given in the file "Licence" + * distributed in the NASM archive. + */ +#include <stdio.h> +#include <stdlib.h> + +#include "symtab.h" + +/* TODO: Implement a hash table, not this stupid implementation which + is too slow to be of practical use */ + +/* Private data types */ + +typedef struct tagSymtab { + symtabEnt ent; + struct tagSymtab * next; +} symtabList; + +typedef symtabList * _symtab; + +void *symtabNew(void) +{ + void *p = malloc(sizeof(_symtab)); + if (p == NULL) { + fprintf(stderr,"symtab: out of memory\n"); + exit(3); + } + *(_symtab *)p = NULL; + + return p; +} + +void symtabDone(void *symtab) +{ + /* DO SOMETHING HERE! */ +} + +void symtabInsert(void *symtab,symtabEnt *ent) +{ + symtabList *l = malloc(sizeof(symtabList)); + + if (l == NULL) { + fprintf(stderr,"symtab: out of memory\n"); + exit(3); + } + + l->ent = *ent; + l->next = *(_symtab *)symtab; + *(_symtab *)symtab = l; +} + +symtabEnt *symtabFind(void *symtab,char *name) +{ + symtabList *l = *(_symtab *)symtab; + + while (l) { + if (!strcmp(l->ent.name,name)) { + return &(l->ent); + } + l = l->next; + } + return NULL; +} + +void symtabDump(void *symtab,FILE *of) +{ + symtabList *l = *(_symtab *)symtab; + + while(l) { + fprintf(of,"%32s %s:%08lx (%ld)\n",l->ent.name, + l->ent.segment ? "data" : "code" , + l->ent.offset, l->ent.flags); + l = l->next; + } +} + |