changeset 29:bc96cd02fbf4

Added basic symbol table structure
author lost@l-w.ca
date Fri, 28 Jan 2011 22:35:04 -0700
parents 9ac1c97d01db
children bcd532a90e53
files lwbasic/rules.make lwbasic/symtab.c lwbasic/symtab.h
diffstat 3 files changed, 142 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- 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)
--- /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 <http://www.gnu.org/licenses/>.
+*/
+
+/*
+Symbol table handling
+*/
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <lw_alloc.h>
+#include <lw_string.h>
+
+#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;
+}
--- /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 <http://www.gnu.org/licenses/>.
+*/
+
+/*
+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__ */