From: Nick Bowler Date: Tue, 13 Jul 2010 23:14:27 +0000 (-0400) Subject: libupkg: Make upkg_export_find less useless. X-Git-Url: http://git.draconx.ca/gitweb/upkg.git/commitdiff_plain/07c7ad2a8ae59fd0159c52c27c263f034aa7746a libupkg: Make upkg_export_find less useless. Add a 'parent' parameter which should allow objects to be uniquely specified. --- diff --git a/src/libupkg.c b/src/libupkg.c index 6b1cfb3..b87c5dd 100644 --- a/src/libupkg.c +++ b/src/libupkg.c @@ -494,13 +494,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 *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->name, name) == 0) { return i; } } diff --git a/src/upkg.h b/src/upkg.h index c5da628..57477a5 100644 --- a/src/upkg.h +++ b/src/upkg.h @@ -98,7 +98,7 @@ 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); +long upkg_export_find(struct upkg *pkg, long parent, 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);