int main(int argc, char **argv) { const char *fname = NULL; u32 id; dub_init(); if (argc < 2) usage(); fname = pparm_common_name("qexp"); load_qexp(fname, 0); if (!strcmp(argv[1], "print_all")) { print_all(); return 0; } else if(argc < 3) usage(); id = atoi(argv[2]); if (!strcmp(argv[1], "-id")) { const glist *exp = get_expansion(id); printf("ID: %d Expands to: ", id); if (exp) print_glist(exp); else printf("Nothing.\n"); } else if (!strcmp(argv[1], "-exp")) { reverse_lookup(id); } else printf("Unknown flag: %s\n", argv[1]); return 0; }
static char * expand_real (const char *str, GHashTable *extra_variables) { GString *result; const char *p; g_return_val_if_fail(str != NULL, NULL); result = g_string_new(NULL); for (p = str; *p != '\0';) { char c = *p; if (c == '$') { char *name; char *value; char *expanded_value; if (p[1] == '$') { g_string_append_c(result, '$'); p += 2; continue; } if (p[1] == '{') { char *end; p += 2; end = strchr(p, '}'); if (end == NULL) jb_error("unterminated variable reference"); if (end == p + 1) jb_error("empty variable reference"); name = g_strndup(p, end - p); p = end + 1; } else { const char *end; p++; end = p + 1; while (g_ascii_isalnum(*end) || *end == '-') end++; if (end == p) jb_error("empty variable reference"); name = g_strndup(p, end - p); p = end; } value = get_expansion(name, extra_variables); /* do not pass the extra variables to the recursive expansion */ expanded_value = expand_real(value, NULL); g_free(value); g_string_append(result, expanded_value); g_free(expanded_value); } else { g_string_append_c(result, c); p++; } } return g_string_free(result, FALSE); }