00001
00002
00003
00004
00005
00006
00007 #include "def.h"
00008
00009 NAME_NODE *global_names;
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 NODE *
00025 name_put(name, space, type)
00026 char *name;
00027 NAME_NODE *space;
00028 OP *type;
00029 {
00030 extern OP *undeclared_prim;
00031 char *char_copy();
00032 NODE *node_new();
00033
00034 register NAME_NODE *curr;
00035 register NAME_NODE *prev = NULL;
00036 register NAME_NODE *nn;
00037 register int val;
00038
00039 #ifdef DEBUG
00040 printf("insert new name: %s'%s\n", name, type->pname);
00041 #endif
00042
00043 if (!type) {
00044 fprintf(stderr, "name: %s\n", name);
00045 error("no type specified");
00046 }
00047
00048 if (!space) {
00049 fprintf(stderr, "name: %s\n", name);
00050 error("no name space specified");
00051 }
00052 curr = space->child;
00053
00054
00055 while(curr) {
00056 val = strcmp(curr->pval, name);
00057 if (val == 0) {
00058 curr->refs++;
00059 if (curr->op == undeclared_prim) curr->op = type;
00060 else if (type != undeclared_prim && curr->op != type) {
00061 fprintf(stderr, "name: %s, types: %s & %s\n",
00062 name, curr->op->pname, type->pname);
00063 error("name with two different types!");
00064 }
00065 return (NODE *) curr;
00066 }
00067 if (val > 0) break;
00068
00069 prev = curr;
00070 curr = curr->next;
00071 }
00072 nn = (NAME_NODE *) node_new();
00073 nn->next = curr;
00074 if (prev) prev->next = nn;
00075 else space->child = nn;
00076
00077 nn->op = type;
00078 nn->parent = space;
00079 nn->child = (NAME_NODE *) NULL;
00080 nn->pval = char_copy(name);
00081 nn->refs = 2;
00082
00083 nn->value = (NODE *) NULL;
00084 nn->interest = 0;
00085
00086 return((NODE *) nn);
00087 }
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100 NAME_NODE *
00101 name_copy(on)
00102 NAME_NODE *on;
00103 {
00104 on->refs++;
00105 return on;
00106 }
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117 void
00118 name_free(fn)
00119 NAME_NODE *fn;
00120 {
00121 void node_free();
00122 void expr_free();
00123 NAME_NODE *ch, *nch;
00124
00125 if (0 == --(fn->refs)) {
00126
00127 for (ch = fn->child; ch; ch = nch) {
00128 nch = ch->next;
00129 name_free(ch);
00130 }
00131 if (fn->value) expr_free(fn->value);
00132 node_free((NODE *) fn);
00133 }
00134 }
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146 NAME_NODE *
00147 name_space_insert(ins, space)
00148 NAME_NODE *ins;
00149 NAME_NODE *space;
00150 {
00151 NODE *node_new();
00152 NODE *expr_copy();
00153 extern OP *undeclared_prim;
00154 void name_print();
00155 register NAME_NODE *in, *sn;
00156 register NAME_NODE *pn = (NAME_NODE *) NULL;
00157 int cmpval;
00158
00159 if (!ins) return space;
00160 in = ins->child;
00161 if (!space) {
00162 space = (NAME_NODE *) node_new();
00163 space->op = ins->op;
00164 space->next = (NAME_NODE *) NULL;
00165 space->parent = (NAME_NODE *) NULL;
00166 space->child = (NAME_NODE *) NULL;
00167 space->pval = ins->pval;
00168
00169 space->value = (NODE *) NULL;
00170 space->refs = 1;
00171 space->interest = ins->interest;
00172 }
00173 sn = space->child;
00174
00175 while (in) {
00176 if (sn) cmpval = strcmp(sn->pval, in->pval);
00177 else cmpval = 1;
00178 if (cmpval < 0) {
00179 pn = sn;
00180 sn = sn->next;
00181 }
00182 else if (cmpval > 0) {
00183 if (in->op != undeclared_prim) {
00184 if (in->value->op->arity & OP_NAME)
00185 name_space_insert(in, in->value);
00186 }
00187 else {
00188 register NAME_NODE *tn = name_space_insert(in, (NAME_NODE *) NULL);
00189 tn->next = sn;
00190 tn->parent = space;
00191 in->value = (NODE *) tn;
00192 if (pn) pn->next = tn;
00193 else space->child = tn;
00194 pn = tn;
00195 }
00196 in = in->next;
00197 }
00198 else {
00199 if (in->op != undeclared_prim) {
00200 if (sn->value) {
00201 fprintf(stderr, "parameter: ");
00202 name_print(in);
00203 fprintf(stderr, ", bound variable: ");
00204 name_print(sn);
00205 fprintf(stderr, "\n");
00206 error("parameter has already been bound a value!");
00207 }
00208 sn->value = expr_copy(in->value);
00209 if (in->value->op->arity & OP_NAME)
00210 name_space_insert(in, in->value);
00211 }
00212 else {
00213 sn->child = name_space_insert(in, sn)->child;
00214 in->value = (NODE *) sn;
00215 pn = sn;
00216 }
00217 in = in->next;
00218 sn = sn->next;
00219 }
00220 }
00221 return space;
00222 }
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232 void
00233 qname_print(qn)
00234 NAME_NODE *qn;
00235 {
00236 if (qn->parent) {
00237 qname_print(qn->parent);
00238 if (qn->parent->pval) fprintf(stderr, ".");
00239 }
00240 if (qn->pval) fprintf(stderr, "%s", qn->pval);
00241 }
00242
00243 void
00244 name_print(fn)
00245 NAME_NODE *fn;
00246 {
00247 qname_print(fn);
00248 if (fn->op->pname[0]) fprintf(stderr, "'%s", fn->op->pname);
00249 }
00250
00251 name_space_print(ns)
00252 NAME_NODE *ns;
00253 {
00254 void expr_print();
00255 register NAME_NODE *nn = ns;
00256 while(nn) {
00257 if (nn->pval) fprintf(stderr, " %s", nn->pval);
00258 if (nn->op->pname[0]) fprintf(stderr, "'%s", nn->op->pname);
00259 if (nn->value) {
00260 fprintf(stderr, "=");
00261 expr_print(nn->value);
00262 }
00263 if (nn->child) {
00264 fprintf(stderr, "(");
00265 name_space_print(nn->child);
00266 fprintf(stderr, ")");
00267 }
00268 nn = nn->next;
00269 }
00270 }
00271
00272
00273
00274
00275
00276
00277
00278 int
00279 name_compare(n1, n2)
00280 NAME_NODE *n1, *n2;
00281 {
00282 if (n1 == n2) return 0;
00283
00284 if (n1 > n2) return 1;
00285 else return -1;
00286 }