| | 234 | |
|---|
| | 235 | struct parser_res * |
|---|
| | 236 | parse_lookup(struct parser_result *head, struct parser_res *sample) |
|---|
| | 237 | { |
|---|
| | 238 | struct parser_res *rv; |
|---|
| | 239 | const struct parser_keywords *kw; |
|---|
| | 240 | char *name, *tmp; |
|---|
| | 241 | |
|---|
| | 242 | if (head == NULL || sample == NULL) |
|---|
| | 243 | return (NULL); |
|---|
| | 244 | if ((kw = parser_getkwbynum(sample->keyword, kwords)) == NULL) |
|---|
| | 245 | return (NULL); |
|---|
| | 246 | name = str_save(kw->kwprefix); |
|---|
| | 247 | switch (kw->kwtype) { |
|---|
| | 248 | case KWT_NORMAL: |
|---|
| | 249 | /* no additions */ |
|---|
| | 250 | break; |
|---|
| | 251 | case KWT_MULTI: |
|---|
| | 252 | name = str_add(name, "_"); |
|---|
| | 253 | name = str_add(name, sample->kw_multi); |
|---|
| | 254 | break; |
|---|
| | 255 | case KWT_ITERATED: |
|---|
| | 256 | name = str_add(name, "_"); |
|---|
| | 257 | name = str_add(name, tmp = xasprintf("%u", sample->kw_iter)); |
|---|
| | 258 | free(tmp); |
|---|
| | 259 | break; |
|---|
| | 260 | case KWT_MULTITER: |
|---|
| | 261 | case KWT_MULTITOP: |
|---|
| | 262 | name = str_add(name, "_"); |
|---|
| | 263 | name = str_add(name, tmp = xasprintf("%u", sample->kw_iter)); |
|---|
| | 264 | free(tmp); |
|---|
| | 265 | name = str_add(name, "_"); |
|---|
| | 266 | name = str_add(name, sample->kw_multi); |
|---|
| | 267 | break; |
|---|
| | 268 | default: |
|---|
| | 269 | abort(); |
|---|
| | 270 | } |
|---|
| | 271 | rv = parse_lookupbyname(head, name); |
|---|
| | 272 | free(name); |
|---|
| | 273 | return (rv); |
|---|
| | 274 | } |
|---|
| | 275 | |
|---|
| | 276 | char * |
|---|
| | 277 | varnameck(const char *func, const char *ivar) |
|---|
| | 278 | { |
|---|
| | 279 | char *ovar, *cp; |
|---|
| | 280 | |
|---|
| | 281 | /* make “ivar” upper-case and validate */ |
|---|
| | 282 | cp = ovar = str_save(ivar); |
|---|
| | 283 | if (*cp >= '0' && *cp <= '9') |
|---|
| | 284 | errx(1, "%s: variable name '%s' must not begin with a digit!", |
|---|
| | 285 | func, ivar); |
|---|
| | 286 | while (*cp) { |
|---|
| | 287 | if (*cp >= 'a' && *cp <= 'z') |
|---|
| | 288 | *cp = *cp - 0x20; |
|---|
| | 289 | else if ((*cp < 'A' || *cp > 'Z') && *cp != '_' && |
|---|
| | 290 | (*cp < '0' || *cp > '9')) |
|---|
| | 291 | errx(1, "%s: variable name '%s' contains invalid" |
|---|
| | 292 | " char %02X!", func, ivar, (uint8_t)(*cp)); |
|---|
| | 293 | ++cp; |
|---|
| | 294 | } |
|---|
| | 295 | return (ovar); |
|---|
| | 296 | } |
|---|
| | 297 | |
|---|
| | 298 | struct parser_res * |
|---|
| | 299 | parse_lookupbyname(struct parser_result *head, const char *name) |
|---|
| | 300 | { |
|---|
| | 301 | struct parser_res *entry; |
|---|
| | 302 | const struct parser_keywords *kw; |
|---|
| | 303 | char *iname, *ename, *cp; |
|---|
| | 304 | bool found = false; |
|---|
| | 305 | |
|---|
| | 306 | if (head == NULL || name == NULL || *name == '\0') |
|---|
| | 307 | return (NULL); |
|---|
| | 308 | |
|---|
| | 309 | iname = varnameck(__func__, name); |
|---|
| | 310 | |
|---|
| | 311 | CIRCLEQ_FOREACH(entry, head, e) { |
|---|
| | 312 | if ((kw = parser_getkwbynum(entry->keyword, kwords)) == NULL) |
|---|
| | 313 | continue; |
|---|
| | 314 | /* recreate varname */ |
|---|
| | 315 | ename = str_save(kw->kwprefix); |
|---|
| | 316 | if (entry->itype == KWT_ITERATED || |
|---|
| | 317 | entry->itype == KWT_MULTITER) { |
|---|
| | 318 | ename = str_add(ename, "_"); |
|---|
| | 319 | ename = str_add(ename, |
|---|
| | 320 | cp = xasprintf("%u", entry->kw_iter)); |
|---|
| | 321 | free(cp); |
|---|
| | 322 | } |
|---|
| | 323 | if (entry->itype == KWT_MULTI || |
|---|
| | 324 | entry->itype == KWT_MULTITER) { |
|---|
| | 325 | ename = str_add(ename, "_"); |
|---|
| | 326 | ename = str_add(ename, entry->kw_multi); |
|---|
| | 327 | } |
|---|
| | 328 | /* upper-case, normalise */ |
|---|
| | 329 | ename = varnameck(__func__, cp = ename); |
|---|
| | 330 | free(cp); |
|---|
| | 331 | if (!strcmp(iname, ename)) |
|---|
| | 332 | found = true; |
|---|
| | 333 | free(ename); |
|---|
| | 334 | if (found) |
|---|
| | 335 | break; |
|---|
| | 336 | } |
|---|
| | 337 | free(iname); |
|---|
| | 338 | return (found ? entry : NULL); |
|---|
| | 339 | } |
|---|