From 7904dbe4fcbe956ee4bf785df97d714a397defc1 Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Wed, 2 Mar 2011 20:07:31 -0500 Subject: [PATCH] libupkg: Simplify handling of format assertions. --- src/libupkg.c | 43 +++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/src/libupkg.c b/src/libupkg.c index 40b3913..6b1cfb3 100644 --- a/src/libupkg.c +++ b/src/libupkg.c @@ -25,6 +25,19 @@ #define MIN(a, b) ((a) < (b) ? (a) : (b)) +/* + * Print a message and execute some statement(s) if the expression evaluates + * to zero. Intended to help verify that assumed constraints on the file + * format actually are not violated. + */ +#define format_assert(expr, body) do { \ + if (!(expr)) { \ + fprintf(stderr, "%s: %d: %s: format assertion failed: %s\n", \ + __FILE__, __LINE__, __func__, #expr); \ + body; \ + } \ +} while (0) + struct upkg_name { unsigned long flags; char *name; @@ -521,11 +534,8 @@ const char *upkg_export_class(struct upkg *pkg, unsigned long idx, export = &pkg->priv->exports[idx]; - /* ASSUMPTION: class references are always imports */ - if (export->class > 0) { - fprintf(stderr, "Assumption Violated: class not import\n"); - return NULL; - } + /* Assumption: class references are always imports. */ + format_assert(export->class <= 0, return NULL); /* Get the class. */ if (export->class == 0) { @@ -538,17 +548,12 @@ const char *upkg_export_class(struct upkg *pkg, unsigned long idx, return NULL; iclass = &pkg->priv->imports[pkg_idx]; - /* ASSUMPTION: Class references are always Core.Class */ - if (strcmp(iclass->class_name, "Class") || strcmp(iclass->class_package, "Core")) { - fprintf(stderr, "Assumption Violated: class not Core.Class\n"); - return NULL; - } + /* Assumption: class references are always Core.Class. */ + format_assert(!strcmp(iclass->class_package, "Core"), return NULL); + format_assert(!strcmp(iclass->class_name, "Class"), return NULL); - /* ASSUMPTION: Package references are always imports */ - if (iclass->package >= 0) { - fprintf(stderr, "Assumption Violated: package not import\n"); - return NULL; - } + /* Assumption: package references are always imports. */ + format_assert(iclass->package <= 0, return NULL); /* Get the package. */ pkg_idx = -(iclass->package + 1); @@ -556,11 +561,9 @@ const char *upkg_export_class(struct upkg *pkg, unsigned long idx, return NULL; ipackage = &pkg->priv->imports[pkg_idx]; - /* ASSUMPTION: Package references are always Core.Package */ - if (strcmp(ipackage->class_name, "Package") || strcmp(ipackage->class_package, "Core")) { - fprintf(stderr, "Assumption Violated: package not Core.Package\n"); - return NULL; - } + /* Assumption: package references are always Core.Package. */ + format_assert(!strcmp(ipackage->class_package, "Core"), return NULL); + format_assert(!strcmp(ipackage->class_name, "Package"), return NULL); if (package) *package = ipackage->object_name; return iclass->object_name; -- 2.43.0