00001 #include "def.h"
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 OP *
00012 primitive(name, arity, super, oplist, eval)
00013 char *name;
00014 short arity;
00015 OP *super;
00016 OP **oplist;
00017 short eval;
00018 {
00019 void op_put();
00020 OP *op_new();
00021
00022 OP *top = op_new(strlen(name));
00023 strcpy(top->pname, name);
00024 top->arity = arity;
00025 top->super = super;
00026 top->eval = eval;
00027 if (oplist) op_put(oplist, top);
00028 return top;
00029 }
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 NODE *init()
00040 {
00041
00042 OP *op_new();
00043 NODE *node_new();
00044 extern OP *name_op;
00045 extern OP *undeclared_prim;
00046 void primitive_init();
00047 void op_mem_free();
00048 extern NAME_NODE *global_names;
00049 extern int lineno, charno;
00050 extern int verbose;
00051
00052 register TERM_NODE *insex;
00053 OP *main_op;
00054 static char noname[] = "";
00055
00056 op_mem_free();
00057 primitive_init();
00058
00059 lineno = 1;
00060 charno = 0;
00061 verbose = FALSE;
00062
00063
00064 main_op = primitive("main", NULLARY, (OP *) NULL, &name_op, 0);
00065
00066
00067 global_names = (NAME_NODE *) node_new();
00068 global_names->op = undeclared_prim;
00069 global_names->next = (NAME_NODE *) NULL;
00070 global_names->parent = (NAME_NODE *) NULL;
00071 global_names->child = (NAME_NODE *) NULL;
00072 global_names->pval = noname;
00073 global_names->refs = 1;
00074 global_names->interest = 0;
00075
00076
00077 insex = (TERM_NODE *) node_new();
00078 insex->op = main_op;
00079 insex->label = global_names;
00080 global_names->refs++;
00081 insex->left = (NODE *) NULL;
00082 insex->right = (NODE *) NULL;
00083 return (NODE *) insex;
00084 }
00085
00086
00087
00088
00089
00090
00091
00092
00093 #define NUM_ST 50
00094 static SNODE *st_mem = NULL;
00095 static SNODE *all_st_mem = NULL;
00096
00097
00098
00099
00100
00101
00102
00103
00104 SNODE *
00105 st_get()
00106 {
00107 char *malloc();
00108 SNODE *temp;
00109
00110 if (!st_mem) {
00111 register int i;
00112 # ifdef DEBUG
00113 printf("allocating stack nodes\n");
00114 # endif
00115 st_mem = (SNODE *) malloc((sizeof (SNODE *)) + (NUM_ST * sizeof (SNODE)));
00116 if (!st_mem) error("out of memory");
00117
00118
00119
00120 *((SNODE **) st_mem) = all_st_mem;;
00121 all_st_mem = st_mem;
00122
00123 st_mem = (SNODE *) (((char *)st_mem) + sizeof(SNODE *));
00124
00125 for (i = 0; i < NUM_ST-1 ; i++)
00126 st_mem[i].next = &st_mem[i+1];
00127 st_mem[NUM_ST-1].next = NULL;
00128 }
00129
00130 temp = st_mem;
00131 st_mem = st_mem->next;
00132 return temp;
00133 }
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144 void
00145 st_free(p)
00146 SNODE *p;
00147 {
00148 p->next = st_mem;
00149 st_mem = p;
00150 }
00151
00152
00153
00154
00155
00156
00157
00158 void
00159 st_mem_free()
00160 {
00161 register SNODE *t;
00162 void free();
00163
00164 while(all_st_mem) {
00165 t = *((SNODE **) all_st_mem);
00166 free(all_st_mem);
00167 all_st_mem = t;
00168 }
00169 st_mem = (SNODE *) NULL;
00170 }
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188 char *
00189 char_copy(s)
00190 char *s;
00191 {
00192 char *t;
00193 int ss;
00194 char *calloc();
00195
00196 ss = strlen(s) + 1;
00197 t = (char *) calloc(ss, sizeof(char));
00198 if (!t) error("out of character string memory");
00199 strcpy(t, s);
00200 return(t);
00201 }
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211 void
00212 char_free(s)
00213 char *s;
00214 {
00215 void free();
00216
00217 free(s);
00218 }
00219
00220
00221
00222
00223
00224
00225
00226
00227 void
00228 error(s)
00229 char *s;
00230 {
00231 extern int lineno, charno;
00232 extern char *infilename;
00233 fflush(stdout);
00234 if (lineno) {
00235 if (charno == 0) fprintf(stderr, "file %s, line %d: ", infilename, lineno-1);
00236 else fprintf(stderr, "file %s, line %d, before position %d: ",
00237 infilename, lineno, charno);
00238 }
00239 fprintf(stderr, "%s\n", s);
00240 fflush(stderr);
00241 exit(1);
00242 }
00243
00244
00245 void fl() { fprintf(stderr, "\n"); fflush(stderr); }