Changeset 3487

Show
Ignore:
Timestamp:
08/13/07 16:55:59 (1 year ago)
Author:
tg
Message:

add some more helpers for important tasks

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/common-nfo/tools/nfotiser/nfotiser.h

    r3471 r3487  
    6565void parser_free(struct parser_result *); 
    6666EXTERN char *parser_errpfx I__(NULL); 
     67struct parser_res *parser_new(parser_kwords, enum parser_kwtype, 
     68    char *, unsigned, char *); 
    6769/* pfile.c */ 
    6870struct parser_res *parse_lookupbyname(struct parser_result *, const char *); 
    6971struct parser_res *parse_lookup(struct parser_result *, struct parser_res *); 
    7072char *varnameck(const char *, const char *); 
     73char *parse_fmt(parser_kwords, enum parser_kwtype, char *, unsigned, int); 
    7174__END_DECLS 
    7275 
  • branches/common-nfo/tools/nfotiser/parser.c

    r3475 r3487  
    270270        if (kwp->kwprefix == NULL) 
    271271                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) 
    276273                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)); 
    280276        CIRCLEQ_INSERT_TAIL(res, entry, e); 
    281277        free(cp); 
     
    386382        va_end(args); 
    387383} 
     384 
     385struct parser_res * 
     386parser_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  
    252252{ 
    253253        struct parser_res *rv; 
    254         const struct parser_keywords *kw; 
    255         char *name, *tmp; 
     254        char *name; 
    256255 
    257256        if (head == NULL || sample == NULL) 
    258257                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) 
    260260                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         } 
    286261        rv = parse_lookupbyname(head, name); 
    287262        free(name); 
     
    315290{ 
    316291        struct parser_res *entry; 
    317         const struct parser_keywords *kw; 
    318292        char *iname, *ename, *cp; 
    319293        bool found = false; 
     
    327301 
    328302        CIRCLEQ_FOREACH(entry, head, e) { 
    329                 if ((kw = parser_getkwbynum(entry->keyword, kwords)) == NULL) 
    330                         continue; 
    331303                /* 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; 
    345307                /* upper-case, normalise */ 
    346308                ename = varnameck(__func__, cp = ename); 
     
    357319        return (found ? entry : NULL); 
    358320} 
     321 
     322char * 
     323parse_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}