Changeset 3487
- Timestamp:
- 08/13/07 16:55:59 (1 year ago)
- Files:
-
- branches/common-nfo/tools/nfotiser/nfotiser.h (modified) (1 diff)
- branches/common-nfo/tools/nfotiser/parser.c (modified) (2 diffs)
- branches/common-nfo/tools/nfotiser/pfile.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/common-nfo/tools/nfotiser/nfotiser.h
r3471 r3487 65 65 void parser_free(struct parser_result *); 66 66 EXTERN char *parser_errpfx I__(NULL); 67 struct parser_res *parser_new(parser_kwords, enum parser_kwtype, 68 char *, unsigned, char *); 67 69 /* pfile.c */ 68 70 struct parser_res *parse_lookupbyname(struct parser_result *, const char *); 69 71 struct parser_res *parse_lookup(struct parser_result *, struct parser_res *); 70 72 char *varnameck(const char *, const char *); 73 char *parse_fmt(parser_kwords, enum parser_kwtype, char *, unsigned, int); 71 74 __END_DECLS 72 75 branches/common-nfo/tools/nfotiser/parser.c
r3475 r3487 270 270 if (kwp->kwprefix == NULL) 271 271 errx(1, "unknown keyword '%s'", cp); 272 entry = xmalloc(sizeof (struct parser_res)); 273 bzero(entry, sizeof (struct parser_res)); 274 entry->keyword = kwp->kwnum; 275 if ((entry->itype = entry_type) == KWT_INVALID) 272 if (entry_type == KWT_INVALID) 276 273 syntaxerr("internal error: invalid entry type"); 277 entry->kw_multi = entry_multi; 278 entry->kw_iter = entry_iter; 279 entry->value = str_save(tp); 274 entry = parser_new(kwp->kwnum, entry_type, entry_multi, entry_iter, 275 str_save(tp)); 280 276 CIRCLEQ_INSERT_TAIL(res, entry, e); 281 277 free(cp); … … 386 382 va_end(args); 387 383 } 384 385 struct parser_res * 386 parser_new(parser_kwords entry_kw, enum parser_kwtype entry_type, 387 char *entry_multi, unsigned entry_iter, char *value) 388 { 389 struct parser_res *entry; 390 391 entry = xmalloc(sizeof (struct parser_res)); 392 bzero(entry, sizeof (struct parser_res)); 393 entry->keyword = entry_kw; 394 entry->itype = entry_type; 395 entry->kw_multi = entry_multi; 396 entry->kw_iter = entry_iter; 397 entry->value = value; 398 return (entry); 399 } branches/common-nfo/tools/nfotiser/pfile.c
r3476 r3487 252 252 { 253 253 struct parser_res *rv; 254 const struct parser_keywords *kw; 255 char *name, *tmp; 254 char *name; 256 255 257 256 if (head == NULL || sample == NULL) 258 257 return (NULL); 259 if ((kw = parser_getkwbynum(sample->keyword, kwords)) == NULL) 258 if ((name = parse_fmt(sample->keyword, sample->itype, 259 sample->kw_multi, sample->kw_iter, 0)) == NULL) 260 260 return (NULL); 261 name = str_save(kw->kwprefix);262 switch (kw->kwtype) {263 case KWT_NORMAL:264 /* no additions */265 break;266 case KWT_MULTI:267 name = str_add(name, "_");268 name = str_add(name, sample->kw_multi);269 break;270 case KWT_ITERATED:271 name = str_add(name, "_");272 name = str_add(name, tmp = xasprintf("%u", sample->kw_iter));273 free(tmp);274 break;275 case KWT_MULTITER:276 case KWT_MULTITOP:277 name = str_add(name, "_");278 name = str_add(name, tmp = xasprintf("%u", sample->kw_iter));279 free(tmp);280 name = str_add(name, "_");281 name = str_add(name, sample->kw_multi);282 break;283 default:284 abort();285 }286 261 rv = parse_lookupbyname(head, name); 287 262 free(name); … … 315 290 { 316 291 struct parser_res *entry; 317 const struct parser_keywords *kw;318 292 char *iname, *ename, *cp; 319 293 bool found = false; … … 327 301 328 302 CIRCLEQ_FOREACH(entry, head, e) { 329 if ((kw = parser_getkwbynum(entry->keyword, kwords)) == NULL)330 continue;331 303 /* recreate varname */ 332 ename = str_save(kw->kwprefix); 333 if (entry->itype == KWT_ITERATED || 334 entry->itype == KWT_MULTITER) { 335 ename = str_add(ename, "_"); 336 ename = str_add(ename, 337 cp = xasprintf("%u", entry->kw_iter)); 338 free(cp); 339 } 340 if (entry->itype == KWT_MULTI || 341 entry->itype == KWT_MULTITER) { 342 ename = str_add(ename, "_"); 343 ename = str_add(ename, entry->kw_multi); 344 } 304 if ((ename = parse_fmt(entry->keyword, entry->itype, 305 entry->kw_multi, entry->kw_iter, 0)) == NULL) 306 continue; 345 307 /* upper-case, normalise */ 346 308 ename = varnameck(__func__, cp = ename); … … 357 319 return (found ? entry : NULL); 358 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 }


