136 |
m4_symbol * |
m4_symbol * |
137 |
m4_lookup_symbol (const char *name, m4_symbol_lookup mode) |
m4_lookup_symbol (const char *name, m4_symbol_lookup mode) |
138 |
{ |
{ |
139 |
if (mode == M4_SYMBOL_IGNORE) |
m4_symbol **psymbol = (m4_symbol **) m4_hash_lookup (m4_symtab, name); |
|
return 0; |
|
140 |
|
|
141 |
{ |
switch (mode) |
142 |
m4_symbol **psymbol = (m4_symbol **) m4_hash_lookup (m4_symtab, name); |
{ |
143 |
|
case M4_SYMBOL_LOOKUP: |
144 |
switch (mode) |
/* If just searching, return status of search. */ |
145 |
|
return psymbol ? *psymbol : 0; |
146 |
|
|
147 |
|
case M4_SYMBOL_INSERT: |
148 |
|
/* Return the symbol, if the name was found in the table. |
149 |
|
Otherwise, just insert the name, and return the new symbol. */ |
150 |
|
if (psymbol) |
151 |
|
return *psymbol; |
152 |
|
/* NOBREAK */ |
153 |
|
|
154 |
|
case M4_SYMBOL_PUSHDEF: |
155 |
|
/* Insert a name in the symbol table. If there is already a symbol |
156 |
|
with the name, push the new value on top of the value stack for |
157 |
|
this symbol. */ |
158 |
{ |
{ |
159 |
case M4_SYMBOL_LOOKUP: |
m4_symbol *symbol = 0; |
160 |
/* If just searching, return status of search. */ |
m4_token_data *value = XCALLOC (m4_token_data, 1); |
161 |
return psymbol ? *psymbol : 0; |
|
|
|
|
|
case M4_SYMBOL_INSERT: |
|
|
/* Return the symbol, if the name was found in the table. |
|
|
Otherwise, just insert the name, and return the new symbol. */ |
|
162 |
if (psymbol) |
if (psymbol) |
163 |
return *psymbol; |
{ |
164 |
/* NOBREAK */ |
symbol = *psymbol; |
165 |
|
M4_TOKEN_DATA_NEXT (value)= M4_SYMBOL_DATA (symbol); |
166 |
|
} |
167 |
|
else |
168 |
|
symbol = XCALLOC (m4_symbol, 1); |
169 |
|
|
170 |
case M4_SYMBOL_PUSHDEF: |
M4_SYMBOL_DATA (symbol) = value; |
171 |
/* Insert a name in the symbol table. If there is already a symbol |
M4_SYMBOL_TYPE (symbol) = M4_TOKEN_VOID; |
|
with the name, push the new value on top of the value stack for |
|
|
this symbol. */ |
|
|
{ |
|
|
m4_symbol *symbol = 0; |
|
|
m4_token_data *value = XCALLOC (m4_token_data, 1); |
|
172 |
|
|
173 |
if (psymbol) |
if (!psymbol) |
174 |
{ |
m4_hash_insert (m4_symtab, xstrdup (name), symbol); |
|
symbol = *psymbol; |
|
|
M4_TOKEN_DATA_NEXT (value)= M4_SYMBOL_DATA (symbol); |
|
|
} |
|
|
else |
|
|
symbol = XCALLOC (m4_symbol, 1); |
|
|
|
|
|
M4_SYMBOL_DATA (symbol) = value; |
|
|
M4_SYMBOL_TYPE (symbol) = M4_TOKEN_VOID; |
|
175 |
|
|
176 |
if (!psymbol) |
return symbol; |
177 |
m4_hash_insert (m4_symtab, xstrdup (name), symbol); |
} |
178 |
|
|
179 |
return symbol; |
case M4_SYMBOL_POPDEF: |
180 |
|
/* Delete the first occurence of a symbol with NAME. */ |
181 |
|
if (psymbol) |
182 |
|
{ |
183 |
|
if (M4_SYMBOL_DATA_NEXT (*psymbol)) |
184 |
|
m4_symbol_popdef (*psymbol); |
185 |
|
else |
186 |
|
{ |
187 |
|
xfree (m4_hash_remove (m4_symtab, name)); |
188 |
|
m4_symbol_delete (*psymbol); |
189 |
|
} |
190 |
} |
} |
191 |
|
return 0; |
192 |
|
|
193 |
case M4_SYMBOL_POPDEF: |
case M4_SYMBOL_DELETE: |
194 |
/* Delete the first occurence of a symbol with NAME. */ |
/* Delete all occurences of symbols with NAME. */ |
195 |
if (psymbol) |
if (psymbol) |
196 |
{ |
{ |
197 |
if (M4_SYMBOL_DATA_NEXT (*psymbol)) |
xfree (m4_hash_remove (m4_symtab, name)); |
198 |
m4_symbol_popdef (*psymbol); |
m4_symbol_delete (*psymbol); |
199 |
else |
} |
200 |
{ |
else |
201 |
xfree (m4_hash_remove (m4_symtab, name)); |
M4ERROR ((warning_status, 0, |
|
m4_symbol_delete (*psymbol); |
|
|
} |
|
|
} |
|
|
return 0; |
|
|
|
|
|
case M4_SYMBOL_DELETE: |
|
|
/* Delete all occurences of symbols with NAME. */ |
|
|
if (psymbol) |
|
|
{ |
|
|
xfree (m4_hash_remove (m4_symtab, name)); |
|
|
m4_symbol_delete (*psymbol); |
|
|
} |
|
|
else |
|
|
M4ERROR ((warning_status, 0, |
|
202 |
_("INTERNAL ERROR: Attempt to delete non-existant symbol: %s"), |
_("INTERNAL ERROR: Attempt to delete non-existant symbol: %s"), |
203 |
name)); |
name)); |
204 |
return 0; |
return 0; |
205 |
} |
} |
|
} |
|
206 |
|
|
207 |
M4ERROR ((warning_status, 0, |
M4ERROR ((warning_status, 0, |
208 |
_("INTERNAL ERROR: Illegal mode to m4_symbol_lookup (%s, %d)"), |
_("INTERNAL ERROR: Illegal mode to m4_symbol_lookup (%s, %d)"), |