Changeset 3471

Show
Ignore:
Timestamp:
08/09/07 18:28:02 (1 year ago)
Author:
tg
Message:

work on lookup stuff; next: unbreak varexpand...

Files:

Legend:

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

    r3470 r3471  
    1919 
    2020enum parser_kwtype { 
     21        KWT_INVALID, 
    2122        KWT_NORMAL, 
    2223        KWT_MULTI, 
     
    6465void parser_free(struct parser_result *); 
    6566EXTERN char *parser_errpfx I__(NULL); 
     67/* pfile.c */ 
    6668struct parser_res *parse_lookupbyname(struct parser_result *, const char *); 
    6769struct parser_res *parse_lookup(struct parser_result *, struct parser_res *); 
     70char *varnameck(const char *, const char *); 
    6871__END_DECLS 
    6972 
  • branches/common-nfo/tools/nfotiser/parser.c

    r3470 r3471  
    215215        entry_multi = NULL; 
    216216        entry_iter = 0; 
     217        entry_type = KWT_INVALID; 
    217218        for (kwp = kws; kwp->kwprefix != NULL; ++kwp) { 
    218219                char *np; 
     
    272273        bzero(entry, sizeof (struct parser_res)); 
    273274        entry->keyword = kwp->kwnum; 
    274         entry->itype = entry_type; 
     275        if ((entry->itype = entry_type) == KWT_INVALID) 
     276                syntaxerr("internal error: invalid entry type"); 
    275277        entry->kw_multi = entry_multi; 
    276278        entry->kw_iter = entry_iter; 
  • branches/common-nfo/tools/nfotiser/pfile.c

    r3469 r3471  
    186186                if (!ch) 
    187187                        continue; 
    188                 /* cp points to a dollar sign, copy head */ 
    189                 dp = str_nsave(entry->value, cp - entry->value); 
     188                /* cp points past a dollar sign, copy head */ 
     189                dp = str_nsave(entry->value, cp - entry->value - 1); 
    190190                /* read variable name */ 
    191191                if (*++cp != '{' /*}*/) 
     
    208208 copy_rest: 
    209209                dp = str_add(dp, cp); 
     210                D(2, "do_varexpand: '%s' -> '%s'\n", entry->value, dp); 
    210211                free(entry->value); 
    211212                entry->value = dp; 
     
    231232        } 
    232233} 
     234 
     235struct parser_res * 
     236parse_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 
     276char * 
     277varnameck(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 
     298struct parser_res * 
     299parse_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} 
  • branches/common-nfo/tools/sqlite/nfohelpr.h

    r3458 r3471  
    125125}) 
    126126 
     127#define xasprintf(fmt, ...) ({                          \ 
     128        char *xasprintf_ptr;                            \ 
     129                                                        \ 
     130        if (asprintf(&xasprintf_ptr, (fmt),             \ 
     131            ##__VA_ARGS__) < 0)                         \ 
     132                xasprintf_ptr = NULL;                   \ 
     133        if (xasprintf_ptr == NULL)                      \ 
     134                err(255, "cannot asprintf");            \ 
     135        (xasprintf_ptr);                                \ 
     136}) 
     137 
    127138#endif