|
@@ -840,6 +840,55 @@ struct symbol *sym_find(const char *name)
|
|
|
return symbol;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Expand symbol's names embedded in the string given in argument. Symbols'
|
|
|
+ * name to be expanded shall be prefixed by a '$'. Unknown symbol expands to
|
|
|
+ * the empty string.
|
|
|
+ */
|
|
|
+const char *sym_expand_string_value(const char *in)
|
|
|
+{
|
|
|
+ const char *src;
|
|
|
+ char *res;
|
|
|
+ size_t reslen;
|
|
|
+
|
|
|
+ reslen = strlen(in) + 1;
|
|
|
+ res = malloc(reslen);
|
|
|
+ res[0] = '\0';
|
|
|
+
|
|
|
+ while ((src = strchr(in, '$'))) {
|
|
|
+ char *p, name[SYMBOL_MAXLENGTH];
|
|
|
+ const char *symval = "";
|
|
|
+ struct symbol *sym;
|
|
|
+ size_t newlen;
|
|
|
+
|
|
|
+ strncat(res, in, src - in);
|
|
|
+ src++;
|
|
|
+
|
|
|
+ p = name;
|
|
|
+ while (isalnum(*src) || *src == '_')
|
|
|
+ *p++ = *src++;
|
|
|
+ *p = '\0';
|
|
|
+
|
|
|
+ sym = sym_find(name);
|
|
|
+ if (sym != NULL) {
|
|
|
+ sym_calc_value(sym);
|
|
|
+ symval = sym_get_string_value(sym);
|
|
|
+ }
|
|
|
+
|
|
|
+ newlen = strlen(res) + strlen(symval) + strlen(src);
|
|
|
+ if (newlen > reslen) {
|
|
|
+ reslen = newlen;
|
|
|
+ realloc(res, reslen);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcat(res, symval);
|
|
|
+ in = src;
|
|
|
+ }
|
|
|
+ strcat(res, in);
|
|
|
+
|
|
|
+ return res;
|
|
|
+}
|
|
|
+
|
|
|
struct symbol **sym_re_search(const char *pattern)
|
|
|
{
|
|
|
struct symbol *sym, **sym_arr = NULL;
|