]> git.draconx.ca Git - upkg.git/commitdiff
Merge branch 'uobject' of git://git.draconx.ca/upkg into uobject
authorNick Bowler <nbowler@draconx.ca>
Sat, 8 Aug 2009 16:59:39 +0000 (12:59 -0400)
committerNick Bowler <nbowler@draconx.ca>
Sat, 8 Aug 2009 16:59:39 +0000 (12:59 -0400)
18 files changed:
m4/glib.m4
src/Makefile.am
src/engine/Makefile.inc
src/engine/music.c
src/engine/texture.c
src/exportable.c
src/libupkg.c
src/loadable.c
src/module.c
src/package.c [new file with mode: 0644]
src/uobject.c
src/uobject/exportable.h
src/uobject/loadable.h
src/uobject/module.h
src/uobject/package.h [moved from src/module.h with 57% similarity]
src/uobject/uobject.h
src/upkg.c
src/upkg.h

index 30712898b6f15260f7ad352f1c61f71ca7e43020..9d90f6f301f79a8c4609eae4e9ff88237b6e8994 100644 (file)
@@ -43,6 +43,12 @@ g_type_init();
 ])
 ])
 
+ifelse([$1], [gthread], [dnl
+       m4_append([_GLIB_MAIN], [dnl
+g_thread_init(NULL);
+])
+])
+
 if test x"$PKG_CONFIG" != x; then
        AC_MSG_CHECKING([pkg-config database for $1-2.0])
        _PKG_CONFIG([lib$1_cflags], [cflags], [$1-2.0])
@@ -81,6 +87,7 @@ GLIB_LIBS=
 
 _GLIB_MODULE([glib], [glib])
 _GLIB_MODULE([gobject], [$2])
+_GLIB_MODULE([gthread], [$2])
 
 AC_LANG_PUSH([C])
 old_cflags=$CFLAGS
index 237e2c12364888e67cefa4ef2302e6b68c72eda5..33a25f92b84bf59b1dc65934008192a2791452a7 100644 (file)
@@ -1,4 +1,7 @@
+AM_CPPFLAGS = -DPKGLIBDIR=\"$(pkglibdir)\"
+
 lib_LTLIBRARIES = libuobject.la libupkg.la
+pkglib_LTLIBRARIES =
 
 include_HEADERS = upkg.h
 noinst_HEADERS  = pack.h avl.h
@@ -6,9 +9,11 @@ noinst_HEADERS  = pack.h avl.h
 include uobject/Makefile.inc
 include engine/Makefile.inc
 
-libuobject_la_SOURCES  = uobject.c module.c avl.c loadable.c exportable.c
-libuobject_la_CPPFLAGS = $(GLIB_CFLAGS) $(LTDLINCL)
+libuobject_la_SOURCES  = uobject.c module.c avl.c package.c \
+       loadable.c exportable.c
+libuobject_la_CPPFLAGS = $(AM_CPPFLAGS) $(GLIB_CFLAGS) $(LTDLINCL)
 libuobject_la_LIBADD   = $(LIBLTDL) $(GLIB_LIBS)
+libuobject_la_LDFLAGS  = -export-symbols-regex '^u_'
 
 libupkg_la_SOURCES = libupkg.c pack.c
 
index 774f7082da5da62f2c2cacb5f22a798e7c41970b..2b3a1dd343e9c45b165f278e3538d12a254a754b 100644 (file)
@@ -1,10 +1,10 @@
 noinst_HEADERS += engine/music.h engine/texture.h engine/music-module.h
 
-lib_LTLIBRARIES   += engine.la
-engine_la_SOURCES  = engine/music.c engine/texture.c engine/engine.c
-engine_la_CFLAGS   = $(GLIB_CFLAGS)
-engine_la_LIBADD   = $(GLIB_LIBS)
-engine_la_LDFLAGS  = -module -avoid-version -export-symbols-regex _LTX_
+pkglib_LTLIBRARIES += engine.la
+engine_la_SOURCES   = engine/music.c engine/texture.c engine/engine.c
+engine_la_CFLAGS    = $(GLIB_CFLAGS)
+engine_la_LIBADD    = $(GLIB_LIBS)
+engine_la_LDFLAGS   = -module -avoid-version -export-symbols-regex _LTX_
 
 if USE_DUMMYMOD
 engine_la_SOURCES += engine/music-dummymod.c
index 434d881fda70d1fe51f1efd2bd3989f05a4eadb6..565a6a0528b975c2441c3363785a18ff0d566dc9 100644 (file)
@@ -40,9 +40,9 @@ struct music_priv {
 static void exportable_init(UObjectExportable *);
 static void loadable_init(UObjectLoadable *);
 
-G_DEFINE_DYNAMIC_TYPE_EXTENDED(EngineMusic, engine_music, UOBJECT_TYPE, 0,
-       G_IMPLEMENT_INTERFACE(UOBJECT_TYPE_EXPORTABLE, exportable_init)
-       G_IMPLEMENT_INTERFACE(UOBJECT_TYPE_LOADABLE, loadable_init)
+G_DEFINE_DYNAMIC_TYPE_EXTENDED(EngineMusic, engine_music, U_OBJECT_TYPE, 0,
+       G_IMPLEMENT_INTERFACE(U_OBJECT_TYPE_EXPORTABLE, exportable_init)
+       G_IMPLEMENT_INTERFACE(U_OBJECT_TYPE_LOADABLE, loadable_init)
 );
 
 static int load(GObject *o)
@@ -129,7 +129,7 @@ static int deserialize(UObject *o, struct upkg_file *f)
        unsigned char buf[32];
        long size;
 
-       UOBJECT_CLASS(engine_music_parent_class)->deserialize(o, f);
+       U_OBJECT_CLASS(engine_music_parent_class)->deserialize(o, f);
 
        buflen = upkg_export_read(f, buf, sizeof buf);
 
@@ -183,7 +183,7 @@ static void engine_music_finalize(GObject *o)
 
 static void engine_music_class_init(EngineMusicClass *class)
 {
-       UObjectClass *uo = UOBJECT_CLASS(class);
+       UObjectClass *uo = U_OBJECT_CLASS(class);
        GObjectClass *go = G_OBJECT_CLASS(class);
        g_type_class_add_private(class, sizeof (struct music_priv));
 
index 209409b2f9ecbe09513cde05c7b0a7b795e153f9..9cd6571bbae872ed89bfe333f9ca7fd4229831de 100644 (file)
@@ -49,14 +49,14 @@ void exportable_init(UObjectExportable *e)
 {
 }
 
-G_DEFINE_DYNAMIC_TYPE(EngineTexture, engine_texture, UOBJECT_TYPE);
+G_DEFINE_DYNAMIC_TYPE(EngineTexture, engine_texture, U_OBJECT_TYPE);
 
 static int deserialize(UObject *o, struct upkg_file *f)
 {
        struct texture_priv *priv = TEXTURE_GET_PRIV(o);
        EngineTexture *t = ENGINE_TEXTURE(o);
 
-       UOBJECT_CLASS(engine_texture_parent_class)->deserialize(o, f);
+       U_OBJECT_CLASS(engine_texture_parent_class)->deserialize(o, f);
 
        printf("Texture size: %ux%u\n", t->usize, t->vsize);
 
@@ -109,7 +109,7 @@ static void engine_texture_init(EngineTexture *t)
 
 static void engine_texture_class_init(EngineTextureClass *class)
 {
-       UObjectClass *uo = UOBJECT_CLASS(class);
+       UObjectClass *uo = U_OBJECT_CLASS(class);
        GObjectClass *go = G_OBJECT_CLASS(class);
 
        g_type_class_add_private(class, sizeof (struct texture_priv));
index 5553014b3d86cc1222c6c064439edba41028bdeb..8bda8506324711dfc949eca218a5cc059a8d3ab1 100644 (file)
@@ -21,7 +21,7 @@
 #include <glib-object.h>
 #include <uobject/exportable.h>
 
-GType uobject_exportable_get_type(void)
+GType u_object_exportable_get_type(void)
 {
        static GType type = 0;
        if (type == 0) {
@@ -37,14 +37,14 @@ GType uobject_exportable_get_type(void)
        return type;
 }
 
-int uobject_export(GObject *obj, FILE *f)
+int u_object_export(GObject *obj, FILE *f)
 {
-       g_return_val_if_fail(UOBJECT_IS_EXPORTABLE(obj), -1);
-       return UOBJECT_EXPORTABLE_GET_INTERFACE(obj)->export(obj, f);
+       g_return_val_if_fail(U_OBJECT_IS_EXPORTABLE(obj), -1);
+       return U_OBJECT_EXPORTABLE_GET_INTERFACE(obj)->export(obj, f);
 }
 
-int uobject_export_name(GObject *obj, char *buf, size_t n)
+int u_object_export_name(GObject *obj, char *buf, size_t n)
 {
-       g_return_val_if_fail(UOBJECT_IS_EXPORTABLE(obj), -1);
-       return UOBJECT_EXPORTABLE_GET_INTERFACE(obj)->export_name(obj, buf, n);
+       g_return_val_if_fail(U_OBJECT_IS_EXPORTABLE(obj), -1);
+       return U_OBJECT_EXPORTABLE_GET_INTERFACE(obj)->export_name(obj, buf, n);
 }
index 3f07095b4f29c2847e995e6d4bb8a012185992af..45fda93c8cd7399d9ec5e67555242881bf22b799 100644 (file)
@@ -171,7 +171,7 @@ static int pkg_init_names(struct upkg *pkg)
                /* Read some data into buffer. */
                if (!feof(pkg->priv->f)) {
                        rc = fread(buf+nbuf, 1, sizeof buf-nbuf, pkg->priv->f);
-                       if (rc == 0)
+                       if (rc == 0 && nbuf == 0)
                                goto err;
                        nbuf += rc;
                }
@@ -236,7 +236,7 @@ static int pkg_init_exports(struct upkg *pkg)
                /* Read some data into buffer. */
                if (!feof(pkg->priv->f)) {
                        rc = fread(buf+nbuf, 1, sizeof buf-nbuf, pkg->priv->f);
-                       if (rc == 0)
+                       if (rc == 0 && nbuf == 0)
                                goto err;
                        nbuf += rc;
                }
@@ -306,7 +306,7 @@ static int pkg_init_imports(struct upkg *pkg)
                /* Read some data into buffer. */
                if (!feof(pkg->priv->f)) {
                        rc = fread(buf+nbuf, 1, sizeof buf-nbuf, pkg->priv->f);
-                       if (rc == 0)
+                       if (rc == 0 && nbuf == 0)
                                goto err;
                        nbuf += rc;
                }
@@ -436,6 +436,13 @@ long upkg_export_find(struct upkg *pkg, const char *name)
        return -1;
 }
 
+unsigned long upkg_export_flags(struct upkg *pkg, unsigned long idx)
+{
+       if (idx < pkg->export_count)
+               return pkg->priv->exports[idx].flags;
+       return 0;
+}
+
 const char *upkg_export_name(struct upkg *pkg, unsigned long idx)
 {
        if (idx < pkg->export_count)
index a7c18201ba0d297fdaf2fd71013bf2a54591ad29..c4970ec65178219570e1c620ae24e8a3244ef18a 100644 (file)
@@ -21,7 +21,7 @@
 #include <glib-object.h>
 #include <uobject/loadable.h>
 
-GType uobject_loadable_get_type(void)
+GType u_object_loadable_get_type(void)
 {
        static GType type = 0;
        if (type == 0) {
@@ -37,14 +37,14 @@ GType uobject_loadable_get_type(void)
        return type;
 }
 
-int uobject_load(GObject *obj)
+int u_object_load(GObject *obj)
 {
-       g_return_val_if_fail(UOBJECT_IS_LOADABLE(obj), -1);
-       return UOBJECT_LOADABLE_GET_INTERFACE(obj)->load(obj);
+       g_return_val_if_fail(U_OBJECT_IS_LOADABLE(obj), -1);
+       return U_OBJECT_LOADABLE_GET_INTERFACE(obj)->load(obj);
 }
 
-void uobject_unload(GObject *obj)
+void u_object_unload(GObject *obj)
 {
-       g_return_if_fail(UOBJECT_IS_LOADABLE(obj));
-       UOBJECT_LOADABLE_GET_INTERFACE(obj)->unload(obj);
+       g_return_if_fail(U_OBJECT_IS_LOADABLE(obj));
+       U_OBJECT_LOADABLE_GET_INTERFACE(obj)->unload(obj);
 }
index 88a7f81b00137b81a57ed2f7030673e32e7bb03f..2eeffc07e30857944e5efe81d08ebbe6b947d10f 100644 (file)
@@ -25,7 +25,7 @@
 #include <ltdl.h>
 
 #include <uobject/module.h>
-#include "module.h"
+#include <uobject/package.h>
 #include "avl.h"
 
 static unsigned initialized;
@@ -42,82 +42,6 @@ static char *str_cpy_lower(char *dst, const char *src)
        return dst;
 }
 
-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())) {
-               if (prefix) fprintf(stderr, "%s: ", prefix);
-               puts(err);
-       }
-}
-
-static gboolean module_load(GTypeModule *m)
-{
-       UPkgModule *mod = UPKG_MODULE(m);
-       int (*init_func)(GTypeModule *);
-
-       mod->dl = lt_dlopenext(G_TYPE_MODULE(m)->name);
-       if (!mod->dl) {
-               dl_print_errors(G_TYPE_MODULE(m)->name);
-               return FALSE;
-       }
-
-       init_func = lt_dlsym(mod->dl, "init");
-       if (!init_func || init_func(m) != 0) {
-               dl_print_errors(__func__);
-               lt_dlclose(mod->dl);
-               return FALSE;
-       }
-
-       return TRUE;
-}
-
-static void module_unload(GTypeModule *m)
-{
-       UPkgModule *mod = UPKG_MODULE(m);
-
-       if (lt_dlclose(mod->dl) != 0) {
-               dl_print_errors(__func__);
-       }
-}
-
-static void upkg_module_init(UPkgModule *mod)
-{
-}
-
-static void upkg_module_class_init(UPkgModuleClass *class)
-{
-       GTypeModuleClass *modclass = G_TYPE_MODULE_CLASS(class);
-
-       modclass->load   = module_load;
-       modclass->unload = module_unload;
-}
-
-static UPkgModule *uobject_module_new(const char *name)
-{
-       char *name2;
-
-       if (!name) {
-               return NULL;
-       }
-
-       name2 = malloc(strlen(name)+1);
-       if (!name2) {
-               return NULL;
-       }
-
-       UPkgModule *mod = g_object_new(UPKG_MODULE_TYPE, NULL);
-       if (!mod) {
-               free(name2);
-               return NULL;
-       }
-
-       G_TYPE_MODULE(mod)->name = str_cpy_lower(name2, name);
-       return mod;
-}
-
 static int modcmp(const void *a, const void *b, void *_data)
 {
        const GTypeModule *ma = a;
@@ -126,7 +50,7 @@ static int modcmp(const void *a, const void *b, void *_data)
        return strcmp(ma->name, mb->name);
 }
 
-int uobject_module_init(void)
+int u_object_module_init(void)
 {
        if (!initialized) {
                package_tree = avl_create(modcmp, NULL, NULL);
@@ -135,12 +59,6 @@ int uobject_module_init(void)
                        return -1;
                }
 
-               if (lt_dlinit() != 0) {
-                       avl_destroy(package_tree, NULL);
-                       dl_print_errors(__func__);
-                       return -1;
-               }
-
                g_type_init();
        }
 
@@ -148,20 +66,17 @@ int uobject_module_init(void)
        return 0;
 }
 
-int uobject_module_exit(void)
+int u_object_module_exit(void)
 {
        if (--initialized)
                return 0;
 
-       if (lt_dlexit() != 0) {
-               dl_print_errors(__func__);
-               return -1;
-       }
+       avl_destroy(package_tree, NULL);
 
        return 0;
 }
 
-GType uobject_module_get_class(const char *package, const char *class)
+GType u_object_module_get_class(const char *package, const char *class)
 {
        char buf[strlen(package) + strlen(class) + 1];
        GTypeModule search = { .name = str_cpy_lower(buf, package) };
@@ -170,7 +85,7 @@ GType uobject_module_get_class(const char *package, const char *class)
        if (!mod) {
                void **p;
 
-               mod = G_TYPE_MODULE(uobject_module_new(package));
+               mod = u_pkg_new(package);
                if (!mod) {
                        return 0;
                }
diff --git a/src/package.c b/src/package.c
new file mode 100644 (file)
index 0000000..1de6096
--- /dev/null
@@ -0,0 +1,133 @@
+/*
+ *  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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include <glib-object.h>
+#include <ltdl.h>
+
+#include <uobject/package.h>
+
+#define U_PKG_GET_PRIV(o) \
+       G_TYPE_INSTANCE_GET_PRIVATE(o, U_PKG_TYPE, struct upkg_priv)
+
+struct upkg_priv {
+       lt_dlhandle native;
+};
+
+G_DEFINE_TYPE(UPkg, u_pkg, G_TYPE_TYPE_MODULE);
+
+static char *str_cpy_lower(char *dst, const char *src)
+{
+       size_t i;
+
+       for (i = 0; src[i]; i++)
+               dst[i] = tolower(src[i]);
+       dst[i] = 0;
+
+       return dst;
+}
+
+static void dl_print_errors(const char *prefix)
+{
+       const char *err;
+       while ((err = lt_dlerror())) {
+               if (prefix) fprintf(stderr, "%s: ", prefix);
+               fprintf(stderr, "%s\n", err);
+       }
+}
+
+static gboolean u_pkg_load(GTypeModule *m)
+{
+       struct upkg_priv *priv = U_PKG_GET_PRIV(m);
+       int (*init_func)(GTypeModule *);
+
+       priv->native = lt_dlopenext(m->name);
+       if (!priv->native) {
+               dl_print_errors(m->name);
+               return FALSE;
+       }
+
+       init_func = lt_dlsym(priv->native, "init");
+       if (!init_func || init_func(m) != 0) {
+               dl_print_errors(__func__);
+               lt_dlclose(priv->native);
+               return FALSE;
+       }
+
+       return TRUE;
+}
+
+static void u_pkg_unload(GTypeModule *m)
+{
+       struct upkg_priv *priv = U_PKG_GET_PRIV(m);
+       void (*exit_func)(GTypeModule *);
+
+       if (priv->native) {
+               exit_func = lt_dlsym(priv->native, "exit");
+               if (exit_func) {
+                       exit_func(m);
+               }
+
+               if (lt_dlclose(priv->native) != 0) {
+                       dl_print_errors(__func__);
+               }
+       }
+}
+
+static void u_pkg_init(UPkg *pkg)
+{
+
+}
+
+static void u_pkg_class_init(UPkgClass *class)
+{
+       g_type_class_add_private(class, sizeof (struct upkg_priv));
+
+       GTypeModuleClass *modclass = G_TYPE_MODULE_CLASS(class);
+
+       if (lt_dlinit() != 0 || lt_dlsetsearchpath(PKGLIBDIR) != 0) {
+               dl_print_errors(__func__);
+       }
+
+       modclass->load   = u_pkg_load;
+       modclass->unload = u_pkg_unload;
+}
+
+GTypeModule *u_pkg_new(const char *name)
+{
+       g_return_val_if_fail(name != NULL, NULL);
+
+       char *pkgname = malloc(strlen(name)+1);
+       if (!pkgname) {
+               return NULL;
+       }
+
+       GTypeModule *mod = g_object_new(U_PKG_TYPE, NULL);
+       if (!mod) {
+               free(pkgname);
+               return NULL;
+       }
+
+       mod->name = str_cpy_lower(pkgname, name);
+       return mod;
+}
index e271a678bb83f2f3b44ab568f4d6a041805f50d2..64e7c4c396c8474cff1913b72bb939a61c5d8ccd 100644 (file)
@@ -27,8 +27,8 @@
 #include "upkg.h"
 #include "pack.h"
 
-#define UOBJECT_GET_PRIV(o) \
-       G_TYPE_INSTANCE_GET_PRIVATE(o, UOBJECT_TYPE, struct uobject_priv)
+#define U_OBJECT_GET_PRIV(o) \
+       G_TYPE_INSTANCE_GET_PRIVATE(o, U_OBJECT_TYPE, struct u_object_priv)
 
 enum {
        PROPERTY_BYTE = 1,
@@ -48,12 +48,7 @@ enum {
        PROPERTY_FIXEDARRAY,
 };
 
-struct uobject_property {
-       const char *name;
-       GValue val;
-};
-
-struct uobject_priv {
+struct u_object_priv {
        struct upkg_file *f;
        size_t base, len;
 
@@ -61,7 +56,7 @@ struct uobject_priv {
        unsigned long nbuf;
 };
 
-G_DEFINE_TYPE(UObject, uobject, G_TYPE_OBJECT);
+G_DEFINE_TYPE(UObject, u_object, G_TYPE_OBJECT);
 
 static unsigned long
 get_real_size(unsigned long *real, unsigned size, unsigned char *buf, size_t n)
@@ -95,7 +90,7 @@ get_real_size(unsigned long *real, unsigned size, unsigned char *buf, size_t n)
 static unsigned long
 decode_property(UObject *o, const char *name, struct upkg_file *f, unsigned long len)
 {
-       struct uobject_priv *priv = UOBJECT_GET_PRIV(o);
+       struct u_object_priv *priv = U_OBJECT_GET_PRIV(o);
        unsigned long real_size, rc;
        int type, size, top;
        GValue val = {0};
@@ -149,7 +144,7 @@ decode_property(UObject *o, const char *name, struct upkg_file *f, unsigned long
 /* Deserialize properties from an Unreal package. */
 static int deserialize(UObject *o, struct upkg_file *f)
 {
-       struct uobject_priv *priv = UOBJECT_GET_PRIV(o);
+       struct u_object_priv *priv = U_OBJECT_GET_PRIV(o);
        unsigned long rc, tot_len = 0;
 
        while (1) {
@@ -162,7 +157,7 @@ static int deserialize(UObject *o, struct upkg_file *f)
                        void  *buf = priv->buf + priv->nbuf;
                        size_t amt = sizeof priv->buf - priv->nbuf;
                        rc = upkg_export_read(f, buf, amt);
-                       if (rc == 0)
+                       if (rc == 0 && priv->nbuf == 0)
                                return -1;
                        priv->nbuf += rc;
                }
@@ -181,7 +176,7 @@ static int deserialize(UObject *o, struct upkg_file *f)
                        break;
                }
 
-               rc = decode_property(UOBJECT(o), name, f, len);
+               rc = decode_property(U_OBJECT(o), name, f, len);
                if (rc == 0)
                        return -1;
                len = rc;
@@ -196,10 +191,10 @@ static int deserialize(UObject *o, struct upkg_file *f)
        return 0;
 }
 
-int uobject_deserialize(GObject *obj, struct upkg *pkg, unsigned long idx)
+int u_object_deserialize(GObject *obj, struct upkg *pkg, unsigned long idx)
 {
-       g_return_val_if_fail(IS_UOBJECT(obj), -1);
-       UObject *uo = UOBJECT(obj);
+       g_return_val_if_fail(IS_U_OBJECT(obj), -1);
+       UObject *uo = U_OBJECT(obj);
        struct upkg_file *f;
        int rc;
 
@@ -209,7 +204,7 @@ int uobject_deserialize(GObject *obj, struct upkg *pkg, unsigned long idx)
                return -1;
        }
 
-       rc = UOBJECT_GET_CLASS(obj)->deserialize(uo, f);
+       rc = U_OBJECT_GET_CLASS(obj)->deserialize(uo, f);
        if (rc != 0) {
                upkg_export_close(f);
        } else {
@@ -221,29 +216,29 @@ int uobject_deserialize(GObject *obj, struct upkg *pkg, unsigned long idx)
        return rc;
 }
 
-static void uobject_init(UObject *o)
+static void u_object_init(UObject *o)
 {
        o->pkg      = NULL;
        o->pkg_file = NULL;
        o->pkg_idx  = 0;
 }
 
-static void uobject_finalize(GObject *o)
+static void u_object_finalize(GObject *o)
 {
-       UObject *uo = UOBJECT(o);
+       UObject *uo = U_OBJECT(o);
 
        if (uo->pkg_file) {
                upkg_export_close(uo->pkg_file);
        }
 
-       G_OBJECT_CLASS(uobject_parent_class)->finalize(o);
+       G_OBJECT_CLASS(u_object_parent_class)->finalize(o);
 }
 
-static void uobject_class_init(UObjectClass *class)
+static void u_object_class_init(UObjectClass *class)
 {
-       g_type_class_add_private(class, sizeof (struct uobject_priv));
+       g_type_class_add_private(class, sizeof (struct u_object_priv));
        GObjectClass *go = G_OBJECT_CLASS(class);
 
        class->deserialize = deserialize;
-       go->finalize       = uobject_finalize;
+       go->finalize       = u_object_finalize;
 }
index 6aa58b37a4b222ad71478c2355a1b71b384ab16d..e241f1ec63c2b43c44f60c34bd3ca46a580ed2ce 100644 (file)
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-#ifndef UOBJECT_EXPORTABLE_H_
-#define UOBJECT_EXPORTABLE_H_
+#ifndef U_OBJECT_EXPORTABLE_H_
+#define U_OBJECT_EXPORTABLE_H_
 
 #include <stdio.h>
 #include <glib-object.h>
 
-#define UOBJECT_TYPE_EXPORTABLE (uobject_exportable_get_type())
-#define UOBJECT_EXPORTABLE(obj) G_TYPE_CHECK_INSTANCE_CAST(obj, \
-       UOBJECT_TYPE_EXPORTABLE, UObjectExportable)
-#define UOBJECT_IS_EXPORTABLE(obj) G_TYPE_CHECK_INSTANCE_TYPE(obj, \
-       UOBJECT_TYPE_EXPORTABLE)
-#define UOBJECT_EXPORTABLE_GET_INTERFACE(inst) G_TYPE_INSTANCE_GET_INTERFACE \
-       (inst, UOBJECT_TYPE_EXPORTABLE, UObjectExportable)
+#define U_OBJECT_TYPE_EXPORTABLE (u_object_exportable_get_type())
+#define U_OBJECT_EXPORTABLE(obj) G_TYPE_CHECK_INSTANCE_CAST(obj, \
+       U_OBJECT_TYPE_EXPORTABLE, UObjectExportable)
+#define U_OBJECT_IS_EXPORTABLE(obj) G_TYPE_CHECK_INSTANCE_TYPE(obj, \
+       U_OBJECT_TYPE_EXPORTABLE)
+#define U_OBJECT_EXPORTABLE_GET_INTERFACE(inst) G_TYPE_INSTANCE_GET_INTERFACE \
+       (inst, U_OBJECT_TYPE_EXPORTABLE, UObjectExportable)
 
 typedef struct UObjectExportable UObjectExportable;
 
@@ -44,13 +44,13 @@ struct UObjectExportable {
        int (*export_name)(GObject *obj, char *buf, size_t n);
 };
 
-GType uobject_exportable_get_type(void);
+GType u_object_exportable_get_type(void);
 
 /*
  * Export the object by writing it to the given FILE handle, which must have
  * been opened for writing in binary mode.
  */
-int uobject_export(GObject *obj, FILE *f);
+int u_object_export(GObject *obj, FILE *f);
 
 /*
  * Get the suggested output filename.  Not more than n-1 characters of the
@@ -59,6 +59,6 @@ int uobject_export(GObject *obj, FILE *f);
  * not bounded.  It is valid to call this function with a NULL buffer and a 0
  * size in order to determine how large the buffer needs to be.
  */
-int uobject_export_name(GObject *obj, char *buf, size_t n);
+int u_object_export_name(GObject *obj, char *buf, size_t n);
 
 #endif
index ff5fd6342da46fda7656516df3833253d39797b4..8d458841adf860636ca07b3472b9992654187447 100644 (file)
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-#ifndef UOBJECT_LOADABLE_H_
-#define UOBJECT_LOADABLE_H_
+#ifndef U_OBJECT_LOADABLE_H_
+#define U_OBJECT_LOADABLE_H_
 
 #include <stdio.h>
 #include <glib-object.h>
 
-#define UOBJECT_TYPE_LOADABLE (uobject_loadable_get_type())
-#define UOBJECT_LOADABLE(obj) G_TYPE_CHECK_INSTANCE_CAST(obj, \
-       UOBJECT_TYPE_LOADABLE, UObjectLoadable)
-#define UOBJECT_IS_LOADABLE(obj) G_TYPE_CHECK_INSTANCE_TYPE(obj, \
-       UOBJECT_TYPE_LOADABLE)
-#define UOBJECT_LOADABLE_GET_INTERFACE(inst) G_TYPE_INSTANCE_GET_INTERFACE \
-       (inst, UOBJECT_TYPE_LOADABLE, UObjectLoadable)
+#define U_OBJECT_TYPE_LOADABLE (u_object_loadable_get_type())
+#define U_OBJECT_LOADABLE(obj) G_TYPE_CHECK_INSTANCE_CAST(obj, \
+       U_OBJECT_TYPE_LOADABLE, UObjectLoadable)
+#define U_OBJECT_IS_LOADABLE(obj) G_TYPE_CHECK_INSTANCE_TYPE(obj, \
+       U_OBJECT_TYPE_LOADABLE)
+#define U_OBJECT_LOADABLE_GET_INTERFACE(inst) G_TYPE_INSTANCE_GET_INTERFACE \
+       (inst, U_OBJECT_TYPE_LOADABLE, UObjectLoadable)
 
 typedef struct UObjectLoadable UObjectLoadable;
 
@@ -46,9 +46,9 @@ struct UObjectLoadable {
        void (*unload)(GObject *obj);
 };
 
-GType uobject_loadable_get_type(void);
+GType u_object_loadable_get_type(void);
 
-int uobject_load(GObject *obj);
-void uobject_unload(GObject *obj);
+int u_object_load(GObject *obj);
+void u_object_unload(GObject *obj);
 
 #endif
index 2f5a211b867dc49a9e037dc5bf82f7db703543b8..97d9e2b57879d3acb11c93f10b2a4209ae78a2db 100644 (file)
@@ -17,8 +17,8 @@
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-#ifndef UOBJECT_MODULE_H_
-#define UOBJECT_MODULE_H_
+#ifndef U_OBJECT_MODULE_H_
+#define U_OBJECT_MODULE_H_
 
 #include <glib-object.h>
 
  * 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 u_object_module_init(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.
+ * many times as u_object_module_init.
  */
-int uobject_module_exit(void);
+int u_object_module_exit(void);
 
 /*
  * Get a class handle from the UObject module system.  This will load the
@@ -42,6 +42,6 @@ int uobject_module_exit(void);
  *
  * Returns 0 on failure.
  */
-GType uobject_module_get_class(const char *package, const char *class);
+GType u_object_module_get_class(const char *package, const char *class);
 
 #endif
similarity index 57%
rename from src/module.h
rename to src/uobject/package.h
index d28dabb0e5c716bc3251cc503e3ed91127dcfadf..f5d20d5472dfff309947b8c96d7251568799290f 100644 (file)
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-#ifndef MODULE_H_
-#define MODULE_H_
+#ifndef U_OBJECT_PACKAGE_H_
+#define U_OBJECT_PACKAGE_H_
 
 #include <glib-object.h>
-#include <ltdl.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;
+#define U_PKG_TYPE (u_pkg_get_type())
+#define U_PKG(obj) \
+       G_TYPE_CHECK_INSTANCE_CAST(obj, U_PKG_TYPE, UPkg)
+#define U_PKG_CLASS(class) \
+       G_TYPE_CHECK_CLASS_CAST(class, U_PKG_TYPE, UPkgClass)
+#define IS_U_PKG(obj) \
+       G_TYPE_CHECK_INSTANCE_TYPE(obj, U_PKG_TYPE)
+#define IS_U_PKG_CLASS(class) \
+       G_TYPE_CHECK_CLASS_TYPE(class, U_PKG_TYPE, UPkgClass)
+#define U_PKG_GET_CLASS(obj) \
+       G_TYPE_INSTANCE_GET_CLASS(obj, U_PKG_TYPE, UPkgClass)
+
+typedef struct UPkg      UPkg;
+typedef struct UPkgClass UPkgClass;
+
+struct UPkg {
+       GTypeModule parent;
 };
 
-struct UPkgModuleClass {
+struct UPkgClass {
        GTypeModuleClass parent;
 };
 
-static UPkgModule *uobject_module_new(const char *name);
+GType u_pkg_get_type(void);
+GTypeModule *u_pkg_new(const char *name);
 
 #endif
index dfca528d10dff03095cc549fa32adc965a0564ef..98ec792494430f13d6def221a68d1faafcd7932a 100644 (file)
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-#ifndef UOBJECT_UOBJECT_H_
-#define UOBJECT_UOBJECT_H_
+#ifndef U_OBJECT_H_
+#define U_OBJECT_H_
 
 #include <glib-object.h>
 #include "upkg.h"
 
-#define UOBJECT_TYPE uobject_get_type()
-#define UOBJECT(obj) \
-       G_TYPE_CHECK_INSTANCE_CAST(obj, UOBJECT_TYPE, UObject)
-#define UOBJECT_CLASS(class) \
-       G_TYPE_CHECK_CLASS_CAST(class, UOBJECT_TYPE, UObjectClass)
-#define IS_UOBJECT(obj) \
-       G_TYPE_CHECK_INSTANCE_TYPE(obj, UOBJECT_TYPE)
-#define IS_UOBJECT_CLASS(class) \
-       G_TYPE_CHECK_CLASS_TYPE(class, UOBJECT_TYPE, UObjectClass)
-#define UOBJECT_GET_CLASS(obj) \
-       G_TYPE_INSTANCE_GET_CLASS(obj, UOBJECT_TYPE, UObjectClass)
+#define U_OBJECT_TYPE u_object_get_type()
+#define U_OBJECT(obj) \
+       G_TYPE_CHECK_INSTANCE_CAST(obj, U_OBJECT_TYPE, UObject)
+#define U_OBJECT_CLASS(class) \
+       G_TYPE_CHECK_CLASS_CAST(class, U_OBJECT_TYPE, UObjectClass)
+#define IS_U_OBJECT(obj) \
+       G_TYPE_CHECK_INSTANCE_TYPE(obj, U_OBJECT_TYPE)
+#define IS_U_OBJECT_CLASS(class) \
+       G_TYPE_CHECK_CLASS_TYPE(class, U_OBJECT_TYPE, UObjectClass)
+#define U_OBJECT_GET_CLASS(obj) \
+       G_TYPE_INSTANCE_GET_CLASS(obj, U_OBJECT_TYPE, UObjectClass)
 
 typedef struct UObject      UObject;
 typedef struct UObjectClass UObjectClass;
@@ -52,8 +52,8 @@ struct UObjectClass {
        int (*deserialize)(UObject *obj, struct upkg_file *f);
 };
 
-GType uobject_get_type(void);
+GType u_object_get_type(void);
 
-int uobject_deserialize(GObject *obj, struct upkg *pkg, unsigned long idx);
+int u_object_deserialize(GObject *obj, struct upkg *pkg, unsigned long idx);
 
 #endif
index e1a8a805f8bfbb83a37f112a66b102df04567030..8b1493e33846a390645144f4e0ab5ec74fabbbb8 100644 (file)
@@ -82,7 +82,7 @@ void print_help(void)
        }
 }
 
-void print_upkg_flags(const char *prefix, unsigned long flags)
+static void print_upkg_flags(const char *prefix, unsigned long flags)
 {
        if (flags & UPKG_FLAG_ALLOW_DOWNLOAD)
                printf("%sAllowDownload\n", prefix);
@@ -98,6 +98,70 @@ void print_upkg_flags(const char *prefix, unsigned long flags)
                printf("%sRequired\n", prefix);
 }
 
+static void print_upkg_object_flags(const char *prefix, unsigned long flags)
+{
+       if (flags & UPKG_OBJ_FLAG_TRANSACTIONAL)
+               printf("%sTransactional\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_UNREACHABLE)
+               printf("%sUnreachable\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_PUBLIC)
+               printf("%sPublic\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_TAG_IMPORT)
+               printf("%sImport\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_TAG_EXPORT)
+               printf("%sTagExport\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_SOURCE_MODIFIED)
+               printf("%sSourceModified\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_TAG_GARBAGE)
+               printf("%sTagGarbage\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_NEED_LOAD)
+               printf("%sNeedLoad\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_HIGHLIGHT_NAME)
+               printf("%sHighlightName\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_IN_SINGULAR_FUNC)
+               printf("%sInSingularFunc\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_SUPPRESSED)
+               printf("%sSuppressed\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_IN_END_STATE)
+               printf("%sInEndState\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_TRANSIENT)
+               printf("%sTransient\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_PRELOADING)
+               printf("%sPreloading\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_LOAD_FOR_CLIENT)
+               printf("%sLoadForClient\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_LOAD_FOR_SERVER)
+               printf("%sLoadForServer\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_LOAD_FOR_EDIT)
+               printf("%sLoadForEdit\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_STANDALONE)
+               printf("%sStandalone\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_NOT_FOR_CLIENT)
+               printf("%sNotForClient\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_NOT_FOR_SERVER)
+               printf("%sNotForServer\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_NOT_FOR_EDIT)
+               printf("%sNotForEdit\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_DESTROYED)
+               printf("%sDestroyed\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_NEED_POST_LOAD)
+               printf("%sNeedPostLoad\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_HAS_STACK)
+               printf("%sHasStack\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_NATIVE)
+               printf("%sNative\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_MARKED)
+               printf("%sMarked\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_ERROR_SHUTDOWN)
+               printf("%sErrorShutdown\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_DEBUG_POST_LOAD)
+               printf("%sDebugPostLoad\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_DEBUG_SERIALIZE)
+               printf("%sDebugSerialize\n", prefix);
+       if (flags & UPKG_OBJ_FLAG_DEBUG_DESTROY)
+               printf("%sDebugDestroy\n", prefix);
+}
+
 void print_guid(unsigned char guid[static 16])
 {
        for (unsigned i = 0; i < 16; i++) {
@@ -121,6 +185,8 @@ void print_upkg_exports(struct upkg *pkg)
                        continue;
 
                printf("%u - %s (%s.%s)\n", i+1, name, package, class);
+               printf("  Flags: %lx\n", upkg_export_flags(pkg, i));
+               print_upkg_object_flags("    ", upkg_export_flags(pkg, i));
        }
 }
 
@@ -133,7 +199,7 @@ int package_info(struct upkg *pkg)
 
        printf("Flags:   %lx\n", pkg->flags);
        if (verbose >= 1) {
-               print_upkg_flags("\t", pkg->flags);
+               print_upkg_flags("        ", pkg->flags);
        }
 
        if (verbose >= 1) {
@@ -157,15 +223,15 @@ static int export(struct upkg *pkg, GObject *obj, unsigned idx)
        char name[256];
        FILE *of;
 
-       if (uobject_deserialize(obj, pkg, idx) != 0) {
+       if (u_object_deserialize(obj, pkg, idx) != 0) {
                return -1;
        }
 
-       if (UOBJECT_IS_LOADABLE(obj) && uobject_load(obj) != 0) {
+       if (U_OBJECT_IS_LOADABLE(obj) && u_object_load(obj) != 0) {
                return -1;
        }
 
-       uobject_export_name(obj, name, sizeof name);
+       u_object_export_name(obj, name, sizeof name);
 
        printf("exporting %s to %s\n", upkg_export_name(pkg, idx), name);
        of = fopen(name, "wb");
@@ -174,15 +240,15 @@ static int export(struct upkg *pkg, GObject *obj, unsigned idx)
                return -1;
        }
 
-       uobject_export(obj, of);
+       u_object_export(obj, of);
 
        if (fclose(of) != 0) {
                perror(name);
                return -1;
        }
 
-       if (UOBJECT_IS_LOADABLE(obj)) {
-               uobject_unload(obj);
+       if (U_OBJECT_IS_LOADABLE(obj)) {
+               u_object_unload(obj);
        }
 
        return 0;
@@ -202,11 +268,11 @@ int package_export(struct upkg *pkg)
                        return EXIT_FAILURE;
                }
 
-               type = uobject_module_get_class(package, class);
+               type = u_object_module_get_class(package, class);
                if (!type) continue;
 
                obj = g_object_new(type, NULL);
-               if (UOBJECT_IS_EXPORTABLE(obj)) {
+               if (U_OBJECT_IS_EXPORTABLE(obj)) {
                        if (export(pkg, obj, i) != 0) {
                                rc = EXIT_FAILURE;
                        }
@@ -253,7 +319,7 @@ int main(int argc, char **argv)
                return EXIT_FAILURE;
        }
 
-       if (uobject_module_init() != 0)
+       if (u_object_module_init() != 0)
                return EXIT_FAILURE;
 
        pkg = upkg_fopen(argv[optind]);
@@ -272,6 +338,6 @@ int main(int argc, char **argv)
        }
 
        upkg_close(pkg);
-       uobject_module_exit();
+       u_object_module_exit();
        return rc;
 }
index 775f918c8087e8b128562b78aeec95991a2c9316..31615ff2b43ef2c84a4eca82b9fbf2184c76976b 100644 (file)
 #define UPKG_FLAG_INSECURE        0x0010
 #define UPKG_FLAG_REQUIRED        0x8000
 
-#define UPKG_OBJ_FLAG_TRANSACTIONAL   0x00000001
-#define UPKG_OBJ_FLAG_UNREACHABLE     0x00000002
-#define UPKG_OBJ_FLAG_PUBLIC          0x00000004
-#define UPKG_OBJ_FLAG_TAG_IMPORT      0x00000008
-#define UPKG_OBJ_FLAG_TAG_EXPORT      0x00000010
-#define UPKG_OBJ_FLAG_SOURCE_MODIFIED 0x00000020
-#define UPKG_OBJ_FLAG_TAG_GARBAGE     0x00000040
-#define UPKG_OBJ_FLAG_NEED_LOAD       0x00000200
-#define UPKG_OBJ_FLAG_HIGHLIGHT_NAME  0x00000400
+#define UPKG_OBJ_FLAG_TRANSACTIONAL    0x00000001
+#define UPKG_OBJ_FLAG_UNREACHABLE      0x00000002
+#define UPKG_OBJ_FLAG_PUBLIC           0x00000004
+#define UPKG_OBJ_FLAG_TAG_IMPORT       0x00000008
+#define UPKG_OBJ_FLAG_TAG_EXPORT       0x00000010
+#define UPKG_OBJ_FLAG_SOURCE_MODIFIED  0x00000020
+#define UPKG_OBJ_FLAG_TAG_GARBAGE      0x00000040
+#define UPKG_OBJ_FLAG_NEED_LOAD        0x00000200
+#define UPKG_OBJ_FLAG_HIGHLIGHT_NAME   0x00000400
+#define UPKG_OBJ_FLAG_IN_SINGULAR_FUNC 0x00000800
+#define UPKG_OBJ_FLAG_SUPPRESSED       0x00001000
+#define UPKG_OBJ_FLAG_IN_END_STATE     0x00002000
+#define UPKG_OBJ_FLAG_TRANSIENT        0x00004000
+#define UPKG_OBJ_FLAG_PRELOADING       0x00008000
+#define UPKG_OBJ_FLAG_LOAD_FOR_CLIENT  0x00010000
+#define UPKG_OBJ_FLAG_LOAD_FOR_SERVER  0x00020000
+#define UPKG_OBJ_FLAG_LOAD_FOR_EDIT    0x00040000
+#define UPKG_OBJ_FLAG_STANDALONE       0x00080000
+#define UPKG_OBJ_FLAG_NOT_FOR_CLIENT   0x00100000
+#define UPKG_OBJ_FLAG_NOT_FOR_SERVER   0x00200000
+#define UPKG_OBJ_FLAG_NOT_FOR_EDIT     0x00400000
+#define UPKG_OBJ_FLAG_DESTROYED        0x00800000
+#define UPKG_OBJ_FLAG_NEED_POST_LOAD   0x01000000
+#define UPKG_OBJ_FLAG_HAS_STACK        0x02000000
+#define UPKG_OBJ_FLAG_NATIVE           0x04000000
+#define UPKG_OBJ_FLAG_MARKED           0x08000000
+#define UPKG_OBJ_FLAG_ERROR_SHUTDOWN   0x10000000
+#define UPKG_OBJ_FLAG_DEBUG_POST_LOAD  0x20000000
+#define UPKG_OBJ_FLAG_DEBUG_SERIALIZE  0x40000000
+#define UPKG_OBJ_FLAG_DEBUG_DESTROY    0x80000000
 
 #define UPKG_HDR_MAGIC 0x9e2a83c1
 #define UPKG_HDR_SIZE  36
@@ -67,6 +88,8 @@ int upkg_close(struct upkg *pkg);
 const char *upkg_get_name(struct upkg *pkg, unsigned long idx);
 
 long   upkg_export_find(struct upkg *pkg, const char *name);
+
+unsigned long upkg_export_flags(struct upkg *pkg, unsigned long idx);
 const char *upkg_export_name(struct upkg *pkg, unsigned long idx);
 const char *upkg_export_class(struct upkg *pkg, unsigned long idx,
                               const char **package);