English Language flag
// Log In
// CVSweb
Project: FreeWRT
// Summary // Activity // Search // Tracker // Lists // News // SCM // Wiki

SCM Repository

ViewVC logotype

Diff of /branches/common-nfo/tools/nfotiser/pfile.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3486 by tg, Fri Aug 10 11:52:23 2007 UTC revision 3487 by tg, Mon Aug 13 14:55:59 2007 UTC
# Line 251  struct parser_res * Line 251  struct parser_res *
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);
# Line 314  struct parser_res * Line 289  struct parser_res *
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    
# Line 326  parse_lookupbyname(struct parser_result Line 300  parse_lookupbyname(struct parser_result
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);
# Line 356  parse_lookupbyname(struct parser_result Line 318  parse_lookupbyname(struct parser_result
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    }

Legend:
Removed from v.3486  
changed lines
  Added in v.3487

root@freewrt.org:443
ViewVC Help
Powered by ViewVC 1.1.20