From 71adb9bfdbddaa51139bcc4ee9822aff816e8fce Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Fri, 24 Jul 2009 11:52:11 -0400 Subject: [PATCH] uobject: Clean up the module loader namespace. --- src/module.c | 11 +++++----- src/module.h | 51 ++++++++++++++++++++++++++++++++++++++++++++ src/uobject/module.h | 47 +++++++++++++++++----------------------- src/upkg.c | 6 +++--- 4 files changed, 79 insertions(+), 36 deletions(-) create mode 100644 src/module.h diff --git a/src/module.c b/src/module.c index b1067db..88a7f81 100644 --- a/src/module.c +++ b/src/module.c @@ -25,6 +25,7 @@ #include #include +#include "module.h" #include "avl.h" static unsigned initialized; @@ -94,7 +95,7 @@ static void upkg_module_class_init(UPkgModuleClass *class) modclass->unload = module_unload; } -UPkgModule *upkg_module_new(const char *name) +static UPkgModule *uobject_module_new(const char *name) { char *name2; @@ -125,7 +126,7 @@ static int modcmp(const void *a, const void *b, void *_data) return strcmp(ma->name, mb->name); } -int module_init(void) +int uobject_module_init(void) { if (!initialized) { package_tree = avl_create(modcmp, NULL, NULL); @@ -147,7 +148,7 @@ int module_init(void) return 0; } -int module_exit(void) +int uobject_module_exit(void) { if (--initialized) return 0; @@ -160,7 +161,7 @@ int module_exit(void) return 0; } -GType module_get_class(const char *package, const char *class) +GType uobject_module_get_class(const char *package, const char *class) { char buf[strlen(package) + strlen(class) + 1]; GTypeModule search = { .name = str_cpy_lower(buf, package) }; @@ -169,7 +170,7 @@ GType module_get_class(const char *package, const char *class) if (!mod) { void **p; - mod = G_TYPE_MODULE(upkg_module_new(package)); + mod = G_TYPE_MODULE(uobject_module_new(package)); if (!mod) { return 0; } diff --git a/src/module.h b/src/module.h new file mode 100644 index 0000000..d28dabb --- /dev/null +++ b/src/module.h @@ -0,0 +1,51 @@ +/* + * upkg: tool for manipulating Unreal Tournament packages. + * Copyright (C) 2009 Nick Bowler + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef MODULE_H_ +#define MODULE_H_ + +#include +#include + +#define UPKG_MODULE_TYPE (upkg_module_get_type()) +#define UPKG_MODULE(obj) \ + G_TYPE_CHECK_INSTANCE_CAST(obj, UPKG_MODULE_TYPE, UPkgModule) +#define UPKG_MODULE_CLASS(class) \ + G_TYPE_CHECK_CLASS_CAST(class, UPKG_MODULE_TYPE, UPkgModuleClass) +#define IS_UPKG_MODULE(obj) \ + G_TYPE_CHECK_INSTANCE_TYPE(obj, UPKG_MODULE_TYPE) +#define IS_UPKG_MODULE_CLASS(class) \ + G_TYPE_CHECK_CLASS_TYPE(class, UPKG_MODULE_TYPE, UPkgModuleClass) + +typedef struct UPkgModule UPkgModule; +typedef struct UPkgModuleClass UPkgModuleClass; + +struct UPkgModule { + GTypeModule parent; + + lt_dlhandle dl; +}; + +struct UPkgModuleClass { + GTypeModuleClass parent; +}; + +static UPkgModule *uobject_module_new(const char *name); + +#endif diff --git a/src/uobject/module.h b/src/uobject/module.h index 03fe0ec..2f5a211 100644 --- a/src/uobject/module.h +++ b/src/uobject/module.h @@ -21,36 +21,27 @@ #define UOBJECT_MODULE_H_ #include -#include -#define UPKG_MODULE_TYPE (upkg_module_get_type()) -#define UPKG_MODULE(obj) \ - G_TYPE_CHECK_INSTANCE_CAST(obj, UPKG_MODULE_TYPE, UPkgModule) -#define UPKG_MODULE_CLASS(class) \ - G_TYPE_CHECK_CLASS_CAST(class, UPKG_MODULE_TYPE, UPkgModuleClass) -#define IS_UPKG_MODULE(obj) \ - G_TYPE_CHECK_INSTANCE_TYPE(obj, UPKG_MODULE_TYPE) -#define IS_UPKG_MODULE_CLASS(class) \ - G_TYPE_CHECK_CLASS_TYPE(class, UPKG_MODULE_TYPE, UPkgModuleClass) - -typedef struct UPkgModule UPkgModule; -typedef struct UPkgModuleClass UPkgModuleClass; - -struct UPkgModule { - GTypeModule parent; - - lt_dlhandle dl; -}; - -struct UPkgModuleClass { - GTypeModuleClass parent; -}; - -UPkgModule *upkg_module_new(const char *name); +/* + * Initialize the UObject module system. Returns 0 on success, -1 otherwise. + * The module system can be safely initialized multiple times. + */ +int uobject_module_init(void); -int module_init(void); -int module_exit(void); +/* + * Shutdown the UObject module system. Returns 0 on success, -1 otherwise. + * The module system is only shut down when this function has been called as + * many times as uobject_module_init. + */ +int uobject_module_exit(void); -GType module_get_class(const char *package, const char *class); +/* + * Get a class handle from the UObject module system. This will load the + * appropriate shared object if necessary. The resulting handle can then be + * used to create instances of the class with g_object_new. + * + * Returns 0 on failure. + */ +GType uobject_module_get_class(const char *package, const char *class); #endif diff --git a/src/upkg.c b/src/upkg.c index 4e524ef..c8d2469 100644 --- a/src/upkg.c +++ b/src/upkg.c @@ -202,7 +202,7 @@ int package_export(struct upkg *pkg) return EXIT_FAILURE; } - type = module_get_class(package, class); + type = uobject_module_get_class(package, class); if (!type) continue; obj = g_object_new(type, NULL); @@ -253,7 +253,7 @@ int main(int argc, char **argv) return EXIT_FAILURE; } - if (module_init() != 0) + if (uobject_module_init() != 0) return EXIT_FAILURE; pkg = upkg_fopen(argv[optind]); @@ -272,6 +272,6 @@ int main(int argc, char **argv) } upkg_close(pkg); - module_exit(); + uobject_module_exit(); return rc; } -- 2.43.2