Index: trunk/psModules/src/astrom/pmConceptsWrite.c
===================================================================
--- trunk/psModules/src/astrom/pmConceptsWrite.c	(revision 6872)
+++ trunk/psModules/src/astrom/pmConceptsWrite.c	(revision 6888)
@@ -9,4 +9,5 @@
 #include "pmConceptsRead.h"
 #include "psAdditionals.h"
+#include "psMetadataItemCompare.h"
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -26,125 +27,75 @@
     }
 
-    // Check the more boring types
-    switch (compare->type) {
-    case PS_TYPE_S32:
+    // Special case: list
+    if (compare->type == PS_DATA_LIST) {
+        // "compare" contains a list of psMetadataItems
+        // "standard" likely contains just a string (but it might possibly be a list of strings)
+        psList *cList = compare->data.V; // The list from comparison item
+        psList *sList = NULL;         // The list from standard item
         switch (standard->type) {
-        case PS_TYPE_S32:
-            psTrace(__func__, 10, "Comparing %d and %d...\n", compare->data.S32, standard->data.S32);
-            return (compare->data.S32 == standard->data.S32) ? true : false;
-        case PS_TYPE_F32:
-            psTrace(__func__, 10, "Comparing %d and %d...\n", compare->data.S32, (int)standard->data.F32);
-            return (compare->data.S32 == (int)standard->data.F32) ? true : false;
-        case PS_TYPE_F64:
-            psTrace(__func__, 10, "Comparing %d and %d...\n", compare->data.S32, (int)standard->data.F64);
-            return (compare->data.S32 == (int)standard->data.F64) ? true : false;
+        case PS_DATA_STRING:
+            sList = psStringSplit(standard->data.V, " ;");
+            break;
+        case PS_DATA_LIST:
+            sList = psMemIncrRefCounter(standard->data.V);
+            break;
         default:
             return false;
         }
-    case PS_TYPE_F32:
-        switch (standard->type) {
-        case PS_TYPE_S32:
-            psTrace(__func__, 10, "Comparing %f and %f...\n", compare->data.F32, (float)standard->data.S32);
-            return (compare->data.F32 == (float)standard->data.S32) ? true : false;
-        case PS_TYPE_F32:
-            psTrace(__func__, 10, "Comparing %f and %f...\n", compare->data.F32, standard->data.F32);
-            return (compare->data.F32 == standard->data.F32) ? true : false;
-        case PS_TYPE_F64:
-            psTrace(__func__, 10, "Comparing %f and %f...\n", compare->data.F32, (float)standard->data.F64);
-            return (compare->data.F32 == (float)standard->data.F64) ? true : false;
-        default:
+        if (cList->n != sList->n) {
+            psFree(sList);
             return false;
         }
-    case PS_TYPE_F64:
-        switch (standard->type) {
-        case PS_TYPE_S32:
-            psTrace(__func__, 10, "Comparing %f and %f...\n", compare->data.F32, (double)standard->data.S32);
-            return (compare->data.F64 == (double)standard->data.S32) ? true : false;
-        case PS_TYPE_F32:
-            psTrace(__func__, 10, "Comparing %f and %f...\n", compare->data.F32, (double)standard->data.F32);
-            return (compare->data.F64 == (double)standard->data.F32) ? true : false;
-        case PS_TYPE_F64:
-            psTrace(__func__, 10, "Comparing %f and %f...\n", compare->data.F32, standard->data.F64);
-            return (compare->data.F64 == standard->data.F64) ? true : false;
-        default:
-            return false;
-        }
-        return (compare->data.F64 == standard->data.F64) ? true : false;
-    case PS_DATA_STRING:
-        if (standard->type != PS_DATA_STRING) {
-            return false;
-        }
-        psTrace(__func__, 10, "Comparing '%s' and '%s'\n", compare->data.V, standard->data.V);
-        return (strcasecmp(compare->data.V, standard->data.V) == 0) ? true : false;
-    case PS_DATA_LIST: {              // A list of strings
-            // "compare" contains a list of psMetadataItems
-            // "standard" likely contains just a string (but it might possibly be a list of strings)
-            psList *cList = compare->data.V; // The list from comparison item
-            psList *sList = NULL;         // The list from standard item
-            switch (standard->type) {
-            case PS_DATA_STRING:
-                sList = psStringSplit(standard->data.V, " ;");
-                break;
-            case PS_DATA_LIST:
-                sList = psMemIncrRefCounter(standard->data.V);
-                break;
-            default:
-                return false;
-            }
-            if (cList->n != sList->n) {
+        psVector *match = psVectorAlloc(cList->n, PS_TYPE_U8); // Array indicating which values match
+        match->n = cList->n;
+        psVectorInit(match, 0);
+        psListIterator *cIter = psListIteratorAlloc(cList, PS_LIST_HEAD, false); // compare iterator
+        psListIterator *sIter = psListIteratorAlloc(sList, PS_LIST_HEAD, false); // standard iterator
+        psMetadataItem *cItem = NULL; // Item from compare list
+        while ((cItem = psListGetAndIncrement(cIter))) {
+            if (cItem->type != PS_DATA_STRING) {
+                psLogMsg(__func__, PS_LOG_WARN, "psMetadataItem from list is of type %x instead of "
+                         "%x (PS_DATA_STRING) --- can't interpret.\n", cItem->type, PS_DATA_STRING);
+                psFree(cIter);
+                psFree(sIter);
+                psFree(match);
                 psFree(sList);
                 return false;
             }
-            psVector *match = psVectorAlloc(cList->n, PS_TYPE_U8); // Array indicating which values match
-            psVectorInit(match, 0);
-            psListIterator *cIter = psListIteratorAlloc(cList, PS_LIST_HEAD, false); // compare iterator
-            psListIterator *sIter = psListIteratorAlloc(sList, PS_LIST_HEAD, false); // standard iterator
-            psMetadataItem *cItem = NULL; // Item from compare list
-            while ((cItem = psListGetAndIncrement(cIter))) {
-                if (cItem->type != PS_DATA_STRING) {
-                    psLogMsg(__func__, PS_LOG_WARN, "psMetadataItem from list is of type %x instead of "
-                             "%x (PS_DATA_STRING) --- can't interpret.\n", cItem->type, PS_DATA_STRING);
-                    psFree(cIter);
-                    psFree(sIter);
-                    psFree(match);
-                    psFree(sList);
-                    return false;
-                }
-                psString cString = cItem->data.V; // String from compare list
-                psListIteratorSet(sIter, PS_LIST_HEAD);
-                int index = 0;            // Index for list
-                bool found = false;       // Found a match?
-                for (psString sString = NULL; (sString = psListGetAndIncrement(sIter)) && !found; index++) {
-                    if (strcasecmp(cString, sString) == 0) {
-                        match->data.U8[index]++;
-                        found = true;
-                    }
-                }
-                if (! found) {
-                    // Can give up immediately
-                    psFree(cIter);
-                    psFree(sIter);
-                    psFree(match);
-                    psFree(sList);
-                    return false;
-                }
-            }
-            // Make sure we got 100% matches in both directions
-            bool allMatch = true;         // Did all of them match?
-            for (int i = 0; i < match->n && allMatch; i++) {
-                if (!match->data.U8[i]) {
-                    allMatch = false;
-                }
-            }
-            psFree(cIter);
-            psFree(sIter);
-            psFree(sList);
-            psFree(match);
-            return allMatch;
-        }
-    default:
-        return false;
-    }
-    psAbort(__func__, "Should never get here.\n");
+            psString cString = cItem->data.V; // String from compare list
+            psListIteratorSet(sIter, PS_LIST_HEAD);
+            int index = 0;            // Index for list
+            bool found = false;       // Found a match?
+            for (psString sString = NULL; (sString = psListGetAndIncrement(sIter)) && !found; index++) {
+                if (strcasecmp(cString, sString) == 0) {
+                    match->data.U8[index]++;
+                    found = true;
+                }
+            }
+            if (! found) {
+                // Can give up immediately
+                psFree(cIter);
+                psFree(sIter);
+                psFree(match);
+                psFree(sList);
+                return false;
+            }
+        }
+        // Make sure we got 100% matches in both directions
+        bool allMatch = true;         // Did all of them match?
+        for (int i = 0; i < match->n && allMatch; i++) {
+            if (!match->data.U8[i]) {
+                allMatch = false;
+            }
+        }
+        psFree(cIter);
+        psFree(sIter);
+        psFree(sList);
+        psFree(match);
+        return allMatch;
+    }
+
+    return psMetadataItemCompare(compare, standard);
+
 }
 
