00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "proj.h"
00034 #include "bad.h"
00035 #include "name.h"
00036 #include "lex.h"
00037 #include "malloc.h"
00038 #include "src.h"
00039 #include "where.h"
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 static ffename ffename_lookup_ (ffenameSpace ns, ffelexToken t, bool *found);
00062
00063
00064
00065
00066
00067
00068
00069 static ffename
00070 ffename_lookup_ (ffenameSpace ns, ffelexToken t, bool *found)
00071 {
00072 ffename n;
00073
00074 for (n = ns->first; n != (ffename) &ns->first; n = n->next)
00075 {
00076 if (ffelex_token_strcmp (t, n->t) == 0)
00077 {
00078 *found = TRUE;
00079 return n;
00080 }
00081 }
00082
00083 *found = FALSE;
00084 return n;
00085 }
00086
00087
00088
00089
00090
00091
00092
00093 ffename
00094 ffename_find (ffenameSpace ns, ffelexToken t)
00095 {
00096 ffename n;
00097 ffename newn;
00098 bool found;
00099
00100 assert (ns != NULL);
00101 assert ((t != NULL) && ((ffelex_token_type (t) == FFELEX_typeNAME)
00102 || (ffelex_token_type (t) == FFELEX_typeNAMES)));
00103
00104 n = ffename_lookup_ (ns, t, &found);
00105 if (found)
00106 return n;
00107
00108 newn = (ffename) malloc_new_ks (ns->pool, "FFENAME name", sizeof (*n));
00109 newn->next = n;
00110 newn->previous = n->previous;
00111 n->previous = newn;
00112 newn->previous->next = newn;
00113 newn->t = ffelex_token_use (t);
00114 newn->u.s = NULL;
00115
00116 return newn;
00117 }
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127 void
00128 ffename_kill (ffenameSpace ns, ffename n)
00129 {
00130 assert (ns != NULL);
00131 assert (n != NULL);
00132
00133 ffelex_token_kill (n->t);
00134 n->next->previous = n->previous;
00135 n->previous->next = n->next;
00136 malloc_kill_ks (ns->pool, n, sizeof (*n));
00137 }
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148 ffename
00149 ffename_lookup (ffenameSpace ns, ffelexToken t)
00150 {
00151 ffename n;
00152 bool found;
00153
00154 assert (ns != NULL);
00155 assert ((t != NULL) && ((ffelex_token_type (t) == FFELEX_typeNAME)
00156 || (ffelex_token_type (t) == FFELEX_typeNAMES)));
00157
00158 n = ffename_lookup_ (ns, t, &found);
00159
00160 return found ? n : NULL;
00161 }
00162
00163
00164
00165
00166
00167
00168
00169 void
00170 ffename_space_drive_global (ffenameSpace ns, ffeglobal (*fn) (ffeglobal))
00171 {
00172 ffename n;
00173
00174 if (ns == NULL)
00175 return;
00176
00177 for (n = ns->first; n != (ffename) &ns->first; n = n->next)
00178 {
00179 if (n->u.g != NULL)
00180 n->u.g = (*fn) (n->u.g);
00181 }
00182 }
00183
00184
00185
00186
00187
00188
00189
00190 void
00191 ffename_space_drive_symbol (ffenameSpace ns, ffesymbol (*fn) (ffesymbol))
00192 {
00193 ffename n;
00194
00195 if (ns == NULL)
00196 return;
00197
00198 for (n = ns->first; n != (ffename) &ns->first; n = n->next)
00199 {
00200 if (n->u.s != NULL)
00201 n->u.s = (*fn) (n->u.s);
00202 }
00203 }
00204
00205
00206
00207
00208
00209
00210
00211
00212 void
00213 ffename_space_kill (ffenameSpace ns)
00214 {
00215 assert (ns != NULL);
00216
00217 while (ns->first != (ffename) &ns->first)
00218 ffename_kill (ns, ns->first);
00219
00220 malloc_kill_ks (ns->pool, ns, sizeof (*ns));
00221 }
00222
00223
00224
00225
00226
00227
00228
00229
00230 ffenameSpace
00231 ffename_space_new (mallocPool pool)
00232 {
00233 ffenameSpace ns;
00234
00235 ns = (ffenameSpace) malloc_new_ks (pool, "FFENAME space",
00236 sizeof (*ns));
00237 ns->first = (ffename) &ns->first;
00238 ns->last = (ffename) &ns->first;
00239 ns->pool = pool;
00240
00241 return ns;
00242 }