/* kpathsea.c: creating and freeing library instances Copyright 2009 Taco Hoekwater. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, see . */ /* One big global struct, and a variable that points to it */ /* * The code freeing the strings used in this struct is enabled/disabled * by KPATHSEA_CAN_FREE. */ /* At the moment can not free */ #define KPATHSEA_CAN_FREE 0 #include kpathsea kpathsea_new (void) { kpathsea ret; ret = xcalloc(1, sizeof(kpathsea_instance)); return ret; } #if KPATHSEA_CAN_FREE #define string_free(a) if((a)!=NULL) free((char *)(a)) static void str_llist_free (str_llist_type p) { str_llist_type q; while (p!=NULL) { q = p->next; free (p->str); free (p); p = q; } } static void cache_free (cache_entry *the_cache, int cache_size) { int f ; for (f=0;fcnf_hash); hash_free (kpse->db); hash_free (kpse->alias_db); str_list_free(&kpse->db_dir_list); hash_free (kpse->link_table); cache_free (kpse->the_cache, kpse->cache_length); hash_free (kpse->map); string_free (kpse->map_path); string_free (kpse->elt); /*string_free (kpse->path);*/ if (kpse->log_file != (FILE *)NULL) fclose(kpse->log_file); string_free (kpse->invocation_name); string_free (kpse->invocation_short_name); string_free (kpse->program_name); string_free (kpse->fallback_font); string_free (kpse->fallback_resolutions_string); if(kpse->fallback_resolutions != NULL) free(kpse->fallback_resolutions); for (i = 0; i != kpse_last_format; ++i) { f = kpse->format_info[i]; /*string_free ((string)f.path);*/ string_free ((string)f.override_path); string_free ((string)f.client_path); /*string_free ((string)f.cnf_path);*/ } if (kpse->missfont != (FILE *)NULL) fclose(kpse->missfont); for (i = 0; i < (int)kpse->expansion_len; i++) { string_free (kpse->expansions[i].var); } free (kpse->expansions); if (kpse->saved_env!=NULL) { for (i = 0; i != kpse->saved_count; ++i) string_free (kpse->saved_env[i]); free (kpse->saved_env); } #if defined(WIN32) || defined(__MINGW32__) || defined(__CYGWIN__) if (kpse->suffixlist != NULL) { char **p; for p = kpse->suffixlist; *p; p++) free (*p); free (kpse->suffixlist); } #endif /* WIN32 || __MINGW32__ || __CYGWIN__ */ #endif /* KPATHSEA_CAN_FREE */ #if defined (KPSE_COMPAT_API) if (kpse==kpse_def) return; #endif free(kpse); } #if defined (KPSE_COMPAT_API) kpathsea_instance kpse_def_inst; kpathsea kpse_def = &kpse_def_inst; #endif /* KPSE_COMPAT_API */