static void expand P3C(fn_type *, expansion, const_string, start, const_string, end) { string value; unsigned len = end - start + 1; string var = xmalloc (len + 1); strncpy (var, start, len); var[len] = 0; if (expanding_p (var)) { WARNING1 ("kpathsea: variable `%s' references itself (eventually)", var); } else { #if 1 /* The mktex.c replacement for shell scripts needs a more sophisticated lookup for variables */ value = getval(var); #else /* Check for an environment variable. */ value = getenv (var); #endif /* If no envvar, check the config files. */ if (!value) value = kpse_cnf_get (var); if (value) { expanding (var, true); value = mktex_var_expand (value); expanding (var, false); fn_grow (expansion, value, strlen (value)); free (value); } free (var); } }
static boolean expand (kpathsea kpse, fn_type *expansion, const_string start, const_string end) { boolean ret = false; const_string value; unsigned len = end - start + 1; string var = (string)xmalloc (len + 1); strncpy (var, start, len); var[len] = 0; if (expanding_p (kpse, var)) { WARNING1 ("kpathsea: variable `%s' references itself (eventually)", var); } else { string vtry = concat3 (var, "_", kpse->program_name); /* Check for an environment variable. */ value = getenv (vtry); free (vtry); if (!value || !*value) value = getenv (var); /* If no envvar, check the config files. */ if (!value || !*value) value = kpathsea_cnf_get (kpse, var); if (value) { string tmp; ret = true; expanding (kpse, var, true); tmp = kpathsea_expand (kpse, value); expanding (kpse, var, false); fn_grow (expansion, tmp, strlen (tmp)); free (tmp); } } free (var); return ret; }
string kpathsea_var_expand (kpathsea kpse, const_string src) { const_string s; string ret; fn_type expansion; expansion = fn_init (); /* Copy everything but variable constructs. */ for (s = src; *s; s++) { if (IS_VAR_START (*s)) { s++; /* Three cases: `$VAR', `${VAR}', `$<anything-else>'. */ if (IS_VAR_CHAR (*s)) { /* $V: collect name constituents, then expand. */ const_string var_end = s; do { var_end++; } while (IS_VAR_CHAR (*var_end)); var_end--; /* had to go one past */ if (!expand (kpse, &expansion, s, var_end)) { /* If no expansion, include the literal $x construct, so filenames containing dollar signs can be read. The first +1 is to get the full variable name, the other +1 is to get the dollar sign; we've moved past it. */ fn_grow (&expansion, s - 1, var_end - s + 1 + 1); } s = var_end; } else if (IS_VAR_BEGIN_DELIMITER (*s)) { /* ${: scan ahead for matching delimiter, then expand. */ const_string var_end = ++s; while (*var_end && !IS_VAR_END_DELIMITER (*var_end)) { #if defined(WIN32) if (kpathsea_IS_KANJI(kpse, var_end)) var_end++; #endif var_end++; } if (! *var_end) { WARNING1 ("kpathsea: %s: No matching } for ${", src); s = var_end - 1; /* will incr to null at top of loop */ } else { expand (kpse, &expansion, s, var_end - 1); s = var_end; /* will incr past } at top of loop*/ } } else { /* $<something-else>: warn, but preserve characters; again, so filenames containing dollar signs can be read. */ WARNING2 ("kpathsea: %s: Unrecognized variable construct `$%c'", src, *s); fn_grow (&expansion, s - 1, 2); /* moved past the $ */ } } else fn_1grow (&expansion, *s); } fn_1grow (&expansion, 0); ret = FN_STRING (expansion); return ret; }