123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- // The symbol table is a simple array of struct U.
- #include "stdafx.h"
- #include "defs.h"
- // put symbol at index n
- void
- std_symbol(char *s, int n)
- {
- U *p;
- p = symtab + n;
- p->u.printname = s;
- }
- // symbol lookup, create symbol if need be
- U *
- usr_symbol(char *s)
- {
- int i;
- U *p;
- for (i = 0; i < NSYM; i++) {
- if (symtab[i].u.printname == 0)
- break;
- if (strcmp(s, symtab[i].u.printname) == 0)
- return symtab + i;
- }
- if (i == NSYM)
- stop("symbol table overflow");
- p = symtab + i;
- p->u.printname = (char *)malloc(strlen(s)+1);
- strcpy(p->u.printname,s);
- return p;
- }
- // get the symbol's printname
- char *
- get_printname(U *p)
- {
- if (p->k != SYM)
- stop("symbol error");
- return p->u.printname;
- }
- // clears the arglist too
- void
- set_binding(U *p, U *q)
- {
- if (p->k != SYM)
- stop("symbol error");
- binding[p - symtab] = q;
- arglist[p - symtab] = symbol(NIL);
- }
- U *
- get_binding(U *p)
- {
- if (p->k != SYM)
- stop("symbol error");
- return binding[p - symtab];
- }
- void
- set_binding_and_arglist(U *p, U *q, U *r)
- {
- if (p->k != SYM)
- stop("symbol error");
- binding[p - symtab] = q;
- arglist[p - symtab] = r;
- }
- U *
- get_arglist(U *p)
- {
- if (p->k != SYM)
- stop("symbol error");
- return arglist[p - symtab];
- }
- // get symbol's number from ptr
- int
- symnum(U *p)
- {
- if (p->k != SYM)
- stop("symbol error");
- return (int) (p - symtab);
- }
- // push indexed symbol
- void
- push_symbol(int k)
- {
- push(symtab + k);
- }
- void
- clear_symbols(void)
- {
- int i;
- for (i = 0; i < NSYM; i++) {
- binding[i] = symtab + i;
- arglist[i] = symbol(NIL);
- }
- }
|