]> git.draconx.ca Git - upkg.git/commitdiff
libupkg: Simplify handling of format assertions.
authorNick Bowler <nbowler@draconx.ca>
Thu, 3 Mar 2011 01:07:31 +0000 (20:07 -0500)
committerNick Bowler <nbowler@draconx.ca>
Thu, 3 Mar 2011 01:25:33 +0000 (20:25 -0500)
src/libupkg.c

index 40b39136f4c3164f22732a73e33adba2b1fae65e..6b1cfb3f933c8e688c6cd61081b93252a2cc7239 100644 (file)
 
 #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;