| 251 |
parse_lookup(struct parser_result *head, struct parser_res *sample) |
parse_lookup(struct parser_result *head, struct parser_res *sample) |
| 252 |
{ |
{ |
| 253 |
struct parser_res *rv; |
struct parser_res *rv; |
| 254 |
const struct parser_keywords *kw; |
char *name; |
|
char *name, *tmp; |
|
| 255 |
|
|
| 256 |
if (head == NULL || sample == NULL) |
if (head == NULL || sample == NULL) |
| 257 |
return (NULL); |
return (NULL); |
| 258 |
if ((kw = parser_getkwbynum(sample->keyword, kwords)) == NULL) |
if ((name = parse_fmt(sample->keyword, sample->itype, |
| 259 |
|
sample->kw_multi, sample->kw_iter, 0)) == NULL) |
| 260 |
return (NULL); |
return (NULL); |
|
name = str_save(kw->kwprefix); |
|
|
switch (kw->kwtype) { |
|
|
case KWT_NORMAL: |
|
|
/* no additions */ |
|
|
break; |
|
|
case KWT_MULTI: |
|
|
name = str_add(name, "_"); |
|
|
name = str_add(name, sample->kw_multi); |
|
|
break; |
|
|
case KWT_ITERATED: |
|
|
name = str_add(name, "_"); |
|
|
name = str_add(name, tmp = xasprintf("%u", sample->kw_iter)); |
|
|
free(tmp); |
|
|
break; |
|
|
case KWT_MULTITER: |
|
|
case KWT_MULTITOP: |
|
|
name = str_add(name, "_"); |
|
|
name = str_add(name, tmp = xasprintf("%u", sample->kw_iter)); |
|
|
free(tmp); |
|
|
name = str_add(name, "_"); |
|
|
name = str_add(name, sample->kw_multi); |
|
|
break; |
|
|
default: |
|
|
abort(); |
|
|
} |
|
| 261 |
rv = parse_lookupbyname(head, name); |
rv = parse_lookupbyname(head, name); |
| 262 |
free(name); |
free(name); |
| 263 |
return (rv); |
return (rv); |
| 289 |
parse_lookupbyname(struct parser_result *head, const char *name) |
parse_lookupbyname(struct parser_result *head, const char *name) |
| 290 |
{ |
{ |
| 291 |
struct parser_res *entry; |
struct parser_res *entry; |
|
const struct parser_keywords *kw; |
|
| 292 |
char *iname, *ename, *cp; |
char *iname, *ename, *cp; |
| 293 |
bool found = false; |
bool found = false; |
| 294 |
|
|
| 300 |
D(2, "parse_lookupbyname: try '%s' (orig '%s')\n", iname, name); |
D(2, "parse_lookupbyname: try '%s' (orig '%s')\n", iname, name); |
| 301 |
|
|
| 302 |
CIRCLEQ_FOREACH(entry, head, e) { |
CIRCLEQ_FOREACH(entry, head, e) { |
|
if ((kw = parser_getkwbynum(entry->keyword, kwords)) == NULL) |
|
|
continue; |
|
| 303 |
/* recreate varname */ |
/* recreate varname */ |
| 304 |
ename = str_save(kw->kwprefix); |
if ((ename = parse_fmt(entry->keyword, entry->itype, |
| 305 |
if (entry->itype == KWT_ITERATED || |
entry->kw_multi, entry->kw_iter, 0)) == NULL) |
| 306 |
entry->itype == KWT_MULTITER) { |
continue; |
|
ename = str_add(ename, "_"); |
|
|
ename = str_add(ename, |
|
|
cp = xasprintf("%u", entry->kw_iter)); |
|
|
free(cp); |
|
|
} |
|
|
if (entry->itype == KWT_MULTI || |
|
|
entry->itype == KWT_MULTITER) { |
|
|
ename = str_add(ename, "_"); |
|
|
ename = str_add(ename, entry->kw_multi); |
|
|
} |
|
| 307 |
/* upper-case, normalise */ |
/* upper-case, normalise */ |
| 308 |
ename = varnameck(__func__, cp = ename); |
ename = varnameck(__func__, cp = ename); |
| 309 |
free(cp); |
free(cp); |
| 318 |
free(iname); |
free(iname); |
| 319 |
return (found ? entry : NULL); |
return (found ? entry : NULL); |
| 320 |
} |
} |
| 321 |
|
|
| 322 |
|
char * |
| 323 |
|
parse_fmt(parser_kwords kw, enum parser_kwtype kt, char *km, unsigned ki, int u) |
| 324 |
|
{ |
| 325 |
|
char buf[64], *res; |
| 326 |
|
const struct parser_keywords *kwp; |
| 327 |
|
|
| 328 |
|
if (kt == KWT_INVALID) |
| 329 |
|
return (NULL); |
| 330 |
|
if ((kwp = parser_getkwbynum(kw, kwords)) == NULL) { |
| 331 |
|
if (!u) |
| 332 |
|
return (NULL); |
| 333 |
|
snprintf(buf, sizeof (buf), "<unknown:%u>", (int)kw); |
| 334 |
|
res = str_save(buf); |
| 335 |
|
} else |
| 336 |
|
res = str_save(kwp->kwprefix); |
| 337 |
|
if (kt == KWT_NORMAL) |
| 338 |
|
return (res); |
| 339 |
|
if (kt == KWT_MULTITOP) |
| 340 |
|
kt = KWT_MULTITER; |
| 341 |
|
if (kt == KWT_ITERATED || kt == KWT_MULTITER) { |
| 342 |
|
snprintf(buf, sizeof (buf), "_%u", ki); |
| 343 |
|
res = str_add(res, buf); |
| 344 |
|
} |
| 345 |
|
if (kt == KWT_MULTI || kt == KWT_MULTITER) { |
| 346 |
|
buf[0] = '_'; |
| 347 |
|
strlcpy(buf + 1, km, sizeof (buf) - 1); |
| 348 |
|
res = str_add(res, buf); |
| 349 |
|
} |
| 350 |
|
if (kt == KWT_MULTI || kt == KWT_ITERATED || kt == KWT_MULTITER) |
| 351 |
|
return (res); |
| 352 |
|
/* invalid KWT */ |
| 353 |
|
free(res); |
| 354 |
|
return (NULL); |
| 355 |
|
} |