const_string kpathsea_cnf_get (kpathsea kpse, const_string name) { string ctry; const_string ret, *ret_list; /* When we expand the compile-time value for DEFAULT_TEXMFCNF, we end up needing the value for TETEXDIR and other variables, so kpse_var_expand ends up calling us again. No good. Except this code is not sufficient, somehow the ls-R path needs to be computed when initializing the cnf path. Better to ensure that the compile-time path does not contain variable references. */ if (kpse->doing_cnf_init) return NULL; if (kpse->cnf_hash.size == 0) { /* Read configuration files and initialize databases. */ kpse->doing_cnf_init = true; read_all_cnf (kpse); kpse->doing_cnf_init = false; /* Since `kpse_init_db' recursively calls us, we must call it from outside a `kpse_path_element' loop (namely, the one in `read_all_cnf' above): `kpse_path_element' is not reentrant. */ kpathsea_init_db (kpse); } /* First look up NAME.`kpse->program_name', then NAME. */ assert (kpse->program_name); ctry = concat3 (name, ".", kpse->program_name); ret_list = hash_lookup (kpse->cnf_hash, ctry); free (ctry); if (ret_list) { ret = *ret_list; free (ret_list); } else { ret_list = hash_lookup (kpse->cnf_hash, name); if (ret_list) { ret = *ret_list; free (ret_list); } else { ret = NULL; } } return ret; }
string kpse_cnf_get P1C(const_string, name) { string ret, ctry; string *ret_list; static boolean doing_cnf_init = false; /* When we expand the compile-time value for DEFAULT_TEXMFCNF, we end up needing the value for TETEXDIR and other variables, so kpse_var_expand ends up calling us again. No good. */ if (doing_cnf_init) return NULL; if (cnf_hash.size == 0) { doing_cnf_init = true; read_all_cnf (); doing_cnf_init = false; /* Here's a pleasant kludge: Since `kpse_init_dbs' recursively calls us, we must call it from outside a `kpse_path_element' loop (namely, the one in `read_all_cnf' above): `kpse_path_element' is not reentrant. */ kpse_init_db (); } /* First look up NAME.`kpse_program_name', then NAME. */ assert (kpse_program_name); ctry = concat3 (name, ".", kpse_program_name); ret_list = hash_lookup (cnf_hash, ctry); free (ctry); if (ret_list) { ret = *ret_list; free (ret_list); } else { ret_list = hash_lookup (cnf_hash, name); if (ret_list) { ret = *ret_list; free (ret_list); } else { ret = NULL; } } return ret; }