Little fix after the last commit (mostly a git fail)
[eigenmath-fx.git] / symbol.cpp
blob1da89ede5c108b615423e5eb2e660893258f6b00
1 // The symbol table is a simple array of struct U.
3 #include "stdafx.h"
4 #include "defs.h"
6 // put symbol at index n
8 void
9 std_symbol(char *s, int n)
11 U *p;
12 p = symtab + n;
13 p->u.printname = s;
16 // symbol lookup, create symbol if need be
18 U *
19 usr_symbol(char *s)
21 int i;
22 U *p;
23 for (i = 0; i < NSYM; i++) {
24 if (symtab[i].u.printname == 0)
25 break;
26 if (strcmp(s, symtab[i].u.printname) == 0)
27 return symtab + i;
29 if (i == NSYM)
30 stop("symbol table overflow");
31 p = symtab + i;
32 p->u.printname = (char *)malloc(strlen(s)+1);
33 strcpy(p->u.printname,s);
34 return p;
37 // get the symbol's printname
39 char *
40 get_printname(U *p)
42 if (p->k != SYM)
43 stop("symbol error");
44 return p->u.printname;
47 // clears the arglist too
49 void
50 set_binding(U *p, U *q)
52 if (p->k != SYM)
53 stop("symbol error");
54 binding[p - symtab] = q;
55 arglist[p - symtab] = symbol(NIL);
58 U *
59 get_binding(U *p)
61 if (p->k != SYM)
62 stop("symbol error");
63 return binding[p - symtab];
66 void
67 set_binding_and_arglist(U *p, U *q, U *r)
69 if (p->k != SYM)
70 stop("symbol error");
71 binding[p - symtab] = q;
72 arglist[p - symtab] = r;
75 U *
76 get_arglist(U *p)
78 if (p->k != SYM)
79 stop("symbol error");
80 return arglist[p - symtab];
83 // get symbol's number from ptr
85 int
86 symnum(U *p)
88 if (p->k != SYM)
89 stop("symbol error");
90 return (int) (p - symtab);
93 // push indexed symbol
95 void
96 push_symbol(int k)
98 push(symtab + k);
101 void
102 clear_symbols(void)
104 int i;
105 for (i = 0; i < NSYM; i++) {
106 binding[i] = symtab + i;
107 arglist[i] = symbol(NIL);