X-Git-Url: https://git.draconx.ca/gitweb/upkg.git/blobdiff_plain/7904dbe4fcbe956ee4bf785df97d714a397defc1..c49355663c73c1775c179ec6360d09ce0978bb97:/src/libupkg.c diff --git a/src/libupkg.c b/src/libupkg.c index 6b1cfb3..e861bcb 100644 --- a/src/libupkg.c +++ b/src/libupkg.c @@ -43,11 +43,10 @@ struct upkg_name { char *name; }; -struct upkg_export { - const char *name; +struct upkg_export_priv { + struct upkg_export pub; long package, class, super; - unsigned long flags; unsigned long size, offset; }; @@ -63,9 +62,9 @@ struct upkg_private { struct upkg_file *last_file; - struct upkg_name *names; - struct upkg_export *exports; - struct upkg_import *imports; + struct upkg_name *names; + struct upkg_export_priv *exports; + struct upkg_import *imports; unsigned long name_offset, export_offset, import_offset; unsigned char guid[16]; @@ -284,7 +283,7 @@ static int pkg_init_exports(struct upkg *pkg) return -1; while (index < pkg->export_count) { - struct upkg_export *export = &pkg->priv->exports[index]; + struct upkg_export_priv *export = &pkg->priv->exports[index]; long tmp; /* Read some data into buffer. */ @@ -310,11 +309,11 @@ static int pkg_init_exports(struct upkg *pkg) rc = upkg_decode_index(&tmp, buf+len, nbuf-len); if (rc == 0 || tmp < 0 || tmp >= pkg->name_count) goto err; - export->name = pkg->priv->names[tmp].name; + export->pub.name = pkg->priv->names[tmp].name; len += rc; if (nbuf-len < 4) goto err; - export->flags = unpack_32_le(buf+len); + export->pub.flags = unpack_32_le(buf+len); len += 4; rc = upkg_decode_index(&tmp, buf+len, nbuf-len); @@ -494,13 +493,17 @@ const char *upkg_get_name(struct upkg *pkg, unsigned long idx) return pkg->priv->names[idx].name; } -long upkg_export_find(struct upkg *pkg, const char *name) +long upkg_export_find(struct upkg *pkg, long parent, const char *name) { - /* This is wrong. - * Export names are not necessarily unique within a package. */ - for (unsigned i = 0; i < pkg->export_count; i++) { - struct upkg_export *export = &pkg->priv->exports[i]; - if (strcmp(export->name, name) == 0) { + /* This only makes sense if the assertion below is not violated. */ + long package = parent < 0 ? 0 : parent + 1; + + for (unsigned long i = 0; i < pkg->export_count; i++) { + struct upkg_export_priv *e = &pkg->priv->exports[i]; + + /* Assertion: an object's package is an export. */ + format_assert(e->package >= 0, continue); + if (e->package == package && strcmp(e->pub.name, name) == 0) { return i; } } @@ -508,24 +511,17 @@ 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) +const struct upkg_export *upkg_get_export(struct upkg *pkg, unsigned long idx) { if (idx < pkg->export_count) - return pkg->priv->exports[idx].name; + return &pkg->priv->exports[idx].pub; return NULL; } const char *upkg_export_class(struct upkg *pkg, unsigned long idx, const char **package) { - struct upkg_export *export; + struct upkg_export_priv *export; struct upkg_import *iclass, *ipackage; unsigned long pkg_idx; @@ -584,7 +580,7 @@ struct upkg_file *upkg_export_open(struct upkg *pkg, unsigned long idx) .pkg = pkg, .base = pkg->priv->exports[idx].offset, .len = pkg->priv->exports[idx].size, - .name = pkg->priv->exports[idx].name, + .name = pkg->priv->exports[idx].pub.name, }; return f;