Example #1
0
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);
}