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 3470 by tg, Thu Aug 9 15:50:43 2007 UTC revision 3471 by tg, Thu Aug 9 16:28:02 2007 UTC
# Line 185  do_varexpand(struct parser_result *head) Line 185  do_varexpand(struct parser_result *head)
185                                  break;                                  break;
186                  if (!ch)                  if (!ch)
187                          continue;                          continue;
188                  /* cp points to a dollar sign, copy head */                  /* cp points past a dollar sign, copy head */
189                  dp = str_nsave(entry->value, cp - entry->value);                  dp = str_nsave(entry->value, cp - entry->value - 1);
190                  /* read variable name */                  /* read variable name */
191                  if (*++cp != '{' /*}*/)                  if (*++cp != '{' /*}*/)
192                          goto copy_rest;                          goto copy_rest;
# Line 207  do_varexpand(struct parser_result *head) Line 207  do_varexpand(struct parser_result *head)
207                              entry->value, cp);                              entry->value, cp);
208   copy_rest:   copy_rest:
209                  dp = str_add(dp, cp);                  dp = str_add(dp, cp);
210                    D(2, "do_varexpand: '%s' -> '%s'\n", entry->value, dp);
211                  free(entry->value);                  free(entry->value);
212                  entry->value = dp;                  entry->value = dp;
213                  /* string was modified, so reloop */                  /* string was modified, so reloop */
# Line 230  do_varexpand(struct parser_result *head) Line 231  do_varexpand(struct parser_result *head)
231                  entry->value = dp;                  entry->value = dp;
232          }          }
233  }  }
234    
235    struct parser_res *
236    parse_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    
276    char *
277    varnameck(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    
298    struct parser_res *
299    parse_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    }

Legend:
Removed from v.3470  
changed lines
  Added in v.3471

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