Index: /branches/eam_branches/ipp-20211108/ippTests/ippCheck/src/ippCheckKeys.c
===================================================================
--- /branches/eam_branches/ipp-20211108/ippTests/ippCheck/src/ippCheckKeys.c	(revision 41989)
+++ /branches/eam_branches/ipp-20211108/ippTests/ippCheck/src/ippCheckKeys.c	(revision 41990)
@@ -1,4 +1,6 @@
 // # include <ippCheckKeys.h>
 # include <pslib.h>
+
+bool PrintMismatchedKeys (psMetadata *list, psMetadata *v1, psMetadata *v2);
 
 int main(int argc, char **argv) {
@@ -40,6 +42,6 @@
     psMetadata *offstr  = psMetadataAlloc ();
     psMetadata *off100  = psMetadataAlloc ();
-    psMetadata *off10   = psMetadataAlloc ();
-    psMetadata *off1    = psMetadataAlloc ();
+    psMetadata *off010   = psMetadataAlloc ();
+    psMetadata *off001    = psMetadataAlloc ();
     psMetadata *offlow  = psMetadataAlloc ();
 
@@ -71,4 +73,26 @@
 	}
 
+# define SAVE_ITEM_TWO							\
+	if (fabs(ratio) > 1.0)    {					\
+	  psMetadataItem *newItem = psMetadataItemCopy(item_2);		\
+	  psMetadataAddItem (off100, newItem, PS_LIST_TAIL, PS_META_REPLACE); \
+	  continue;							\
+	}								\
+	if (fabs(ratio) > 0.1)    {					\
+	  psMetadataItem *newItem = psMetadataItemCopy(item_2);		\
+	  psMetadataAddItem (off010, newItem, PS_LIST_TAIL, PS_META_REPLACE); \
+	  continue;							\
+	}								\
+	if (fabs(ratio) > 0.01)    {					\
+	  psMetadataItem *newItem = psMetadataItemCopy(item_2);		\
+	  psMetadataAddItem (off001, newItem, PS_LIST_TAIL, PS_META_REPLACE); \
+	  continue;							\
+	}								\
+	if (fabs(ratio) <= 0.01)    {					\
+	  psMetadataItem *newItem = psMetadataItemCopy(item_2);		\
+	  psMetadataAddItem (offlow, newItem, PS_LIST_TAIL, PS_META_REPLACE); \
+	  continue;							\
+	}
+
 	switch (item_1->type) {
 	  case PS_DATA_BOOL:
@@ -84,52 +108,22 @@
 		// fprintf (stdout, "key %s value mismatch: %d vs %d\n", item_1->name, item_1->data.S32, item_2->data.S32);
 		int delta = (item_1->data.S32 - item_2->data.S32);
-		float fdelta = delta / (float) item_1->data.S32;
-		if (fabs(fdelta) > 1.0)    {
-		    psMetadataItem *newItem = psMetadataItemCopy(item_2); // Copied item
-		    psMetadataAddItem (off100, newItem, PS_LIST_TAIL, PS_META_REPLACE);
-		    continue;
-		}
-		if (fabs(fdelta) > 0.1)    {
-		    psMetadataItem *newItem = psMetadataItemCopy(item_2); // Copied item
-		    psMetadataAddItem (off10, newItem, PS_LIST_TAIL, PS_META_REPLACE);
-		    continue;
-		}
-		if (fabs(fdelta) > 0.01)    {
-		    psMetadataItem *newItem = psMetadataItemCopy(item_2); // Copied item
-		    psMetadataAddItem (off1, newItem, PS_LIST_TAIL, PS_META_REPLACE);
-		    continue;
-		}
-		if (fabs(fdelta) <= 0.01)    {
-		    psMetadataItem *newItem = psMetadataItemCopy(item_2); // Copied item
-		    psMetadataAddItem (offlow, newItem, PS_LIST_TAIL, PS_META_REPLACE);
-		    continue;
-		}
-	    }
-	    break;
-
+		float ratio = delta / (float) item_1->data.S32;
+		SAVE_ITEM_TWO;
+	    }
+	    break;
+
+	  case PS_DATA_S64:
+	    if (item_1->data.S64 != item_2->data.S64) {
+		long int delta = (item_1->data.S64 - item_2->data.S64);
+		float ratio = delta / (float) item_1->data.S64;
+		SAVE_ITEM_TWO;
+	    }
+	    break;
+		
 	  case PS_DATA_F64:
 	    if (item_1->data.F64 != item_2->data.F64) {
 		double delta = (item_1->data.F64 - item_2->data.F64);
-		double fdelta = delta / (float) item_1->data.F64;
-		if (fabs(fdelta) > 1.0)    {
-		    psMetadataItem *newItem = psMetadataItemCopy(item_2); // Copied item
-		    psMetadataAddItem (off100, newItem, PS_LIST_TAIL, PS_META_REPLACE);
-		    continue;
-		}
-		if (fabs(fdelta) > 0.1)    {
-		    psMetadataItem *newItem = psMetadataItemCopy(item_2); // Copied item
-		    psMetadataAddItem (off10, newItem, PS_LIST_TAIL, PS_META_REPLACE);
-		    continue;
-		}
-		if (fabs(fdelta) > 0.01)    {
-		    psMetadataItem *newItem = psMetadataItemCopy(item_2); // Copied item
-		    psMetadataAddItem (off1, newItem, PS_LIST_TAIL, PS_META_REPLACE);
-		    continue;
-		}
-		if (fabs(fdelta) <= 0.01)    {
-		    psMetadataItem *newItem = psMetadataItemCopy(item_2); // Copied item
-		    psMetadataAddItem (offlow, newItem, PS_LIST_TAIL, PS_META_REPLACE);
-		    continue;
-		}
+		double ratio = delta / (float) item_1->data.F64;
+		SAVE_ITEM_TWO;
 	    }
 	    break;
@@ -151,29 +145,94 @@
     }
 
-    fprintf (stdout, "Keys missing from file 2:\n");
+    fprintf (stdout, "\n --- Keys missing from file 2 ---\n");
     psMetadataPrint (0, missing, 1);
 
-    fprintf (stdout, "Keys with inconsistent types:\n");
+    fprintf (stdout, "\n --- Keys with inconsistent types ---\n");
     psMetadataPrint (0, badtype, 1);
 
-    fprintf (stdout, "Keys with mismatched strings:\n");
-    psMetadataPrint (0, offstr, 1);
-
-    fprintf (stdout, "Keys with mismatched boolean values:\n");
-    psMetadataPrint (0, badbool, 1);
-
-    fprintf (stdout, "Keys with inconsistent by 100%% or more:\n");
-    psMetadataPrint (0, off100, 1);
-
-    fprintf (stdout, "Keys with inconsistent by 10 - 100%% or more:\n");
-    psMetadataPrint (0, off10, 1);
-
-    fprintf (stdout, "Keys with inconsistent by 1 - 10%% or more:\n");
-    psMetadataPrint (0, off1, 1);
-
-    fprintf (stdout, "Keys with inconsistent by < 1%%:\n");
-    psMetadataPrint (0, offlow, 1);
+    fprintf (stdout, "\n --- Keys with mismatched strings ---\n");
+    PrintMismatchedKeys (offstr, head_1, head_2);
+
+    fprintf (stdout, "\n --- Keys with mismatched boolean values ---\n");
+    PrintMismatchedKeys (badbool, head_1, head_2);
+
+    fprintf (stdout, "\n --- Keys inconsistent by 100%% or more ---\n");
+    PrintMismatchedKeys (off100, head_1, head_2);
+
+    fprintf (stdout, "\n --- Keys inconsistent by 10 - 100%% or more ---\n");
+    PrintMismatchedKeys (off010, head_1, head_2);
+
+    fprintf (stdout, "\n --- Keys inconsistent by 1 - 10%% or more ---\n");
+    PrintMismatchedKeys (off001, head_1, head_2);
+
+    fprintf (stdout, "\n --- Keys inconsistent by < 1%% ---\n");
+    PrintMismatchedKeys (offlow, head_1, head_2);
 
     exit (0);
+}
+
+// we only need to support 4 types: BOOL, STRING, S32, S64, F64:
+bool PrintMismatchedKeys (psMetadata *list, psMetadata *v1, psMetadata *v2) {
+
+    // compare keywords
+    psMetadataIterator *iter = psMetadataIteratorAlloc (list, PS_LIST_HEAD, NULL);
+    psMetadataItem *item = NULL;
+    while ((item = psMetadataGetAndIncrement (iter)) != NULL) {
+
+        psMetadataItem *i1 = psMetadataLookup(v1, item->name);
+	psAssert (i1, "is this possible?");
+
+        psMetadataItem *i2 = psMetadataLookup(v2, item->name);
+	psAssert (i2, "is this possible?");
+
+	int longName = (strlen(item->name) > 8);
+
+	switch (i1->type) {
+	  case PS_DATA_BOOL:
+	    if (longName) {
+	      fprintf (stdout, " %32s : %12c vs %12c\n", item->name, (i1->data.B ? 'T' : 'F'), (i2->data.B ? 'T' : 'F'));
+	    } else {
+	      fprintf (stdout, " %8s : %12c vs %12c\n", item->name, (i1->data.B ? 'T' : 'F'), (i2->data.B ? 'T' : 'F'));
+	    }
+	    break;
+	  case PS_DATA_S32: {
+	    int delta = i1->data.S32 - i2->data.S32;
+	    float ratio = delta / (float) i1->data.S32;
+	    if (longName) {
+	      fprintf (stdout, " %32s : %12d vs %12d : %12.5g\n", item->name, i1->data.S32, i2->data.S32, ratio);
+	    } else {
+	      fprintf (stdout, " %8s : %12d vs %12d : %12.5g\n", item->name, i1->data.S32, i2->data.S32, ratio);
+	    }
+	    break; }
+	  case PS_DATA_S64: {
+	    int delta = i1->data.S64 - i2->data.S64;
+	    float ratio = delta / (float) i1->data.S64;
+	    if (longName) {
+	      fprintf (stdout, " %32s : %12ld vs %12ld : %12.5g\n", item->name, i1->data.S64, i2->data.S64, ratio);
+	    } else {
+	      fprintf (stdout, " %8s : %12ld vs %12ld : %12.5g\n", item->name, i1->data.S64, i2->data.S64, ratio);
+	    }
+	    break; }
+	  case PS_DATA_F64: {
+	    double delta = i1->data.F64 - i2->data.F64;
+	    double ratio = delta / (double) i1->data.F64;
+	    if (longName) {
+	      fprintf (stdout, " %32s : %12.5g vs %12.5g : %12.5g\n", item->name, i1->data.F64, i2->data.F64, ratio);
+	    } else {
+	      fprintf (stdout, " %8s : %12.5g vs %12.5g : %12.5g\n", item->name, i1->data.F64, i2->data.F64, ratio);
+	    }
+	    break; }
+	  case PS_DATA_STRING:
+	    if (longName) {
+	      fprintf (stdout, " %32s : %60s vs %60s\n", item->name, i1->data.str, i2->data.str); 
+	    } else {
+	      fprintf (stdout, " %8s : %60s vs %60s\n", item->name, i1->data.str, i2->data.str); 
+	    }
+	    break;
+	  default:
+	    psAbort ("impossible!");
+	}
+    }  
+    return true;
 }
 
