X-Git-Url: https://git.draconx.ca/gitweb/upkg.git/blobdiff_plain/6bdc602565b6780cc4bc3115849271f01cd6628c..03eb9c441bba9f41d36cfd8f2cf1d43a5ee42252:/src/module.c diff --git a/src/module.c b/src/module.c index eae9dc7..eec80e7 100644 --- a/src/module.c +++ b/src/module.c @@ -1,3 +1,22 @@ +/* + * 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 + */ + #include #include #include @@ -5,9 +24,32 @@ #include #include -#include "module.h" +#include #include "avl.h" +#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 unsigned initialized; static struct avl_table *package_tree; @@ -27,7 +69,7 @@ G_DEFINE_TYPE(UPkgModule, upkg_module, G_TYPE_TYPE_MODULE); static void dl_print_errors(const char *prefix) { const char *err; - while (err = lt_dlerror()) { + while ((err = lt_dlerror())) { if (prefix) fprintf(stderr, "%s: ", prefix); puts(err); } @@ -40,7 +82,7 @@ static gboolean module_load(GTypeModule *m) mod->dl = lt_dlopenext(G_TYPE_MODULE(m)->name); if (!mod->dl) { - dl_print_errors(__func__); + dl_print_errors(G_TYPE_MODULE(m)->name); return FALSE; } @@ -75,7 +117,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; @@ -106,7 +148,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); @@ -128,7 +170,7 @@ int module_init(void) return 0; } -int module_exit(void) +int uobject_module_exit(void) { if (--initialized) return 0; @@ -137,9 +179,11 @@ int module_exit(void) dl_print_errors(__func__); return -1; } + + 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) }; @@ -148,7 +192,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; }