# HG changeset patch
# User lost@l-w.ca
# Date 1296279304 25200
# Node ID bc96cd02fbf4fb729a4547bce5a3f10f1746fbf3
# Parent 9ac1c97d01dba1d35346d64291b46c6d63e00467
Added basic symbol table structure
diff -r 9ac1c97d01db -r bc96cd02fbf4 lwbasic/rules.make
--- a/lwbasic/rules.make Fri Jan 28 22:34:49 2011 -0700
+++ b/lwbasic/rules.make Fri Jan 28 22:35:04 2011 -0700
@@ -1,7 +1,7 @@
dirname := $(dir $(lastword $(MAKEFILE_LIST)))
lwbasic_dir := $(dirname)
-lwbasic_lsrcs := main.c input.c compiler.c lexer.c emit.c
+lwbasic_lsrcs := main.c input.c compiler.c lexer.c emit.c symtab.c
lwbasic_srcs := $(addprefix $(dirname),$(lwbasic_lsrcs))
lwbasic_objs := $(lwbasic_srcs:.c=.o)
diff -r 9ac1c97d01db -r bc96cd02fbf4 lwbasic/symtab.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lwbasic/symtab.c Fri Jan 28 22:35:04 2011 -0700
@@ -0,0 +1,80 @@
+/*
+symtab.c
+
+Copyright © 2011 William Astle
+
+This file is part of LWTOOLS.
+
+LWTOOLS is free software: you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation, either version 3 of the License, or (at your option) any later
+version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+more details.
+
+You should have received a copy of the GNU General Public License along with
+this program. If not, see .
+*/
+
+/*
+Symbol table handling
+*/
+
+#include
+#include
+
+#include
+#include
+
+#define __symtab_c_seen__
+#include "symtab.h"
+
+symtab_t *symtab_init(void)
+{
+ symtab_t *st;
+
+ st = lw_alloc(sizeof(symtab_t));
+ st -> head = NULL;
+ return st;
+}
+
+void symtab_destroy(symtab_t *st)
+{
+ symtab_entry_t *se;
+
+ while (st -> head)
+ {
+ se = st -> head;
+ st -> head = se -> next;
+ lw_free(se -> name);
+ lw_free(se);
+ }
+ lw_free(st);
+}
+
+symtab_entry_t *symtab_find(symtab_t *st, char *name)
+{
+ symtab_entry_t *se;
+
+ for (se = st -> head; se; se = se -> next)
+ {
+ if (strcmp(se -> name, name) == 0)
+ return se;
+ }
+ return NULL;
+}
+
+void symtab_register(symtab_t *st, char *name, int addr, int symtype)
+{
+ symtab_entry_t *se;
+
+ se = lw_alloc(sizeof(symtab_entry_t));
+ se -> name = lw_strdup(name);
+ se -> addr = addr;
+ se -> symtype = symtype;
+ se -> next = st -> head;
+ st -> head = se;
+}
diff -r 9ac1c97d01db -r bc96cd02fbf4 lwbasic/symtab.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lwbasic/symtab.h Fri Jan 28 22:35:04 2011 -0700
@@ -0,0 +1,61 @@
+/*
+symtab.h
+
+Copyright © 2011 William Astle
+
+This file is part of LWTOOLS.
+
+LWTOOLS is free software: you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation, either version 3 of the License, or (at your option) any later
+version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+more details.
+
+You should have received a copy of the GNU General Public License along with
+this program. If not, see .
+*/
+
+/*
+Symbol table handling
+*/
+
+#ifndef __symtab_h_seen__
+#define __symtab_h_seen__
+
+#ifndef __symtab_c_seen__
+#define __E extern
+#else
+#define __E
+#endif
+
+/*
+the meaning of "addr" and "symtype" is defined by the particular context
+in which the symbol table is used
+*/
+typedef struct symtab_entry_s symtab_entry_t;
+struct symtab_entry_s
+{
+ char *name; /* name of the symbol */
+ int addr; /* address of symbol */
+ int symtype; /* type of symbol */
+
+ symtab_entry_t *next; /* next in the list */
+};
+
+typedef struct symtab_s
+{
+ symtab_entry_t *head;
+} symtab_t;
+
+__E symtab_t *symtab_init(void);
+__E void symtab_destroy(symtab_t *st);
+__E symtab_entry_t *symtab_find(symtab_t *st, char *name);
+__E void symtab_register(symtab_t *st, char *name, int addr, int symtype);
+
+#undef __E
+
+#endif /* __symtab_h_seen__ */