/** * lt_ext_modules_load: * * Load all of the modules on the system, including the internal accessor. * This has to be invoked before processing something with #lt_extension_t. * or lt_db_initialize() does. */ void lt_ext_modules_load(void) { #ifdef ENABLE_GMODULE const gchar *env = g_getenv("LANGTAG_EXT_MODULE_PATH"); gchar **path_list; gint i; gsize suffix_len = strlen(G_MODULE_SUFFIX) + 1; if (__lt_ext_module_initialized) return; if (!env) { path_list = g_strsplit( #ifdef GNOME_ENABLE_DEBUG BUILDDIR G_DIR_SEPARATOR_S "liblangtag" G_DIR_SEPARATOR_S "extensions" G_SEARCHPATH_SEPARATOR_S BUILDDIR G_DIR_SEPARATOR_S "liblangtag" G_DIR_SEPARATOR_S "extensions" G_DIR_SEPARATOR_S ".libs" G_SEARCHPATH_SEPARATOR_S #endif LANGTAG_EXT_MODULE_PATH, G_SEARCHPATH_SEPARATOR_S, -1); } else { path_list = g_strsplit(env, G_SEARCHPATH_SEPARATOR_S, -1); } for (i = 0; path_list[i] != NULL; i++) { DIR *dir; dir = opendir(path_list[i]); if (dir) { struct dirent dent, *dresult; gsize len; while (1) { if (readdir_r(dir, &dent, &dresult) || dresult == NULL) break; len = strlen(dent.d_name); if (len > suffix_len && g_strcmp0(&dent.d_name[len - suffix_len], "." G_MODULE_SUFFIX) == 0) { lt_ext_module_new(dent.d_name); } } closedir(dir); } } g_strfreev(path_list); #endif /* ENABLE_GMODULE */ __lt_ext_default_handler = lt_ext_module_new_with_data("default", &__default_funcs); lt_mem_add_weak_pointer(&__lt_ext_default_handler->parent, (gpointer *)&__lt_ext_default_handler); __lt_ext_modules[LT_MAX_EXT_MODULES - 2] = lt_ext_module_new_with_data("empty", &__empty_and_wildcard_funcs); lt_mem_add_weak_pointer(&__lt_ext_modules[LT_MAX_EXT_MODULES - 2]->parent, (gpointer *)&__lt_ext_modules[LT_MAX_EXT_MODULES - 2]); __lt_ext_modules[LT_MAX_EXT_MODULES - 1] = lt_ext_module_new_with_data("wildcard", &__empty_and_wildcard_funcs); lt_mem_add_weak_pointer(&__lt_ext_modules[LT_MAX_EXT_MODULES - 1]->parent, (gpointer *)&__lt_ext_modules[LT_MAX_EXT_MODULES - 1]); __lt_ext_module_initialized = TRUE; }
/** * lt_ext_modules_load: * * Load all of the modules on the system, including the internal accessor. * This has to be invoked before processing something with #lt_extension_t. * or lt_db_initialize() does. */ void lt_ext_modules_load(void) { #if ENABLE_MODULE const char *env = getenv("LANGTAG_EXT_MODULE_PATH"); char *path_list, *s, *p, *path; size_t suffix_len = strlen(LT_MODULE_SUFFIX) + 1; if (__lt_ext_module_initialized) return; if (!env) { path_list = strdup( #ifdef GNOME_ENABLE_DEBUG BUILDDIR LT_DIR_SEPARATOR_S "extensions" LT_SEARCHPATH_SEPARATOR_S BUILDDIR LT_DIR_SEPARATOR_S "extensions" LT_DIR_SEPARATOR_S ".libs" LT_SEARCHPATH_SEPARATOR_S #endif LANGTAG_EXT_MODULE_PATH); } else { path_list = strdup(env); } s = path_list; do { DIR *dir; if (!s) break; p = strchr(s, LT_SEARCHPATH_SEPARATOR); if (s == p) { s++; continue; } path = s; if (p) { *p = 0; p++; } s = p; dir = opendir(path); if (dir) { struct dirent dent, *dresult; size_t len; while (1) { if (readdir_r(dir, &dent, &dresult) || dresult == NULL) break; len = strlen(dent.d_name); if (len > suffix_len && lt_strcmp0(&dent.d_name[len - suffix_len], "." LT_MODULE_SUFFIX) == 0) { lt_ext_module_new(dent.d_name); } } closedir(dir); } } while (1); free(path_list); #else /* !ENABLE_MODULE */ const lt_ext_module_funcs_t *f; int c; #define REGISTER(_ext_) \ f = LT_MODULE_SYMBOL_ (lt_module_ext_##_ext_, get_funcs) (); \ c = lt_ext_module_singleton_char_to_int(f->get_singleton()); \ __lt_ext_modules[c] = lt_ext_module_new_with_data(#_ext_, f); \ lt_mem_add_weak_pointer(&__lt_ext_modules[c]->parent, \ (lt_pointer_t *)&__lt_ext_modules[c]); REGISTER (t); REGISTER (u); #undef REGISTER #endif /* ENABLE_MODULE */ __lt_ext_default_handler = lt_ext_module_new_with_data("default", &__default_funcs); lt_mem_add_weak_pointer(&__lt_ext_default_handler->parent, (lt_pointer_t *)&__lt_ext_default_handler); __lt_ext_modules[LT_MAX_EXT_MODULES - 2] = lt_ext_module_new_with_data("empty", &__empty_and_wildcard_funcs); lt_mem_add_weak_pointer(&__lt_ext_modules[LT_MAX_EXT_MODULES - 2]->parent, (lt_pointer_t *)&__lt_ext_modules[LT_MAX_EXT_MODULES - 2]); __lt_ext_modules[LT_MAX_EXT_MODULES - 1] = lt_ext_module_new_with_data("wildcard", &__empty_and_wildcard_funcs); lt_mem_add_weak_pointer(&__lt_ext_modules[LT_MAX_EXT_MODULES - 1]->parent, (lt_pointer_t *)&__lt_ext_modules[LT_MAX_EXT_MODULES - 1]); __lt_ext_module_initialized = TRUE; }