Index: /trunk/archive/pslib/src/Metadata/metadata.c
===================================================================
--- /trunk/archive/pslib/src/Metadata/metadata.c	(revision 706)
+++ /trunk/archive/pslib/src/Metadata/metadata.c	(revision 707)
@@ -303,5 +303,6 @@
 
 psMetadataItem *psMetadataGetNext(psMetadata *restrict ms,
-				  const char *restrict match)
+				  const char *restrict match,
+				  int which)
 {
     assert (ms != NULL);
@@ -314,5 +315,5 @@
 	    return meta;
 	} else {
-	    return psMetadataGetNext(ms, match);
+	    return psMetadataGetNext(ms, match, which);
 	}
     }
Index: /trunk/archive/pslib/src/Utils/Makefile
===================================================================
--- /trunk/archive/pslib/src/Utils/Makefile	(revision 706)
+++ /trunk/archive/pslib/src/Utils/Makefile	(revision 707)
@@ -5,6 +5,6 @@
 
 PSLIB_DIR = ../..
-
-OBJS = array.o dlist.o error.o hash.o logmsg.o memory.o misc.o trace.o
+# array.o 
+OBJS = dlist.o error.o hash.o logmsg.o memory.o misc.o trace.o vector.o
 
 .PHONY : all
Index: /trunk/archive/pslib/src/Utils/dlist.c
===================================================================
--- /trunk/archive/pslib/src/Utils/dlist.c	(revision 706)
+++ /trunk/archive/pslib/src/Utils/dlist.c	(revision 707)
@@ -307,5 +307,5 @@
  * Convert a psDlist to/from a psVoidPtrArray
  */
-psVoidPtrArray *psDlistToArray(psDlist *restrict dlist)
+psVector *psDlistToArray(psDlist *restrict dlist)
 {
     if (dlist == NULL) {
@@ -313,9 +313,9 @@
     }
     
-    psVoidPtrArray *restrict arr = psVoidPtrArrayAlloc(dlist->n);
+    psVector *restrict arr = psVectorAlloc(dlist->n, PS_TYPE_OTHER);
 
     psDlistElem *ptr = dlist->head;
     for (int i = 0, n = dlist->n; i < n; i++) {
-	arr->arr[i] = ptr->data;
+	arr->arr.arr_v[i] = ptr->data;
 
 	ptr->data = NULL;
@@ -328,15 +328,20 @@
 }
 
-psDlist *psArrayToDlist(psVoidPtrArray *arr)
+psDlist *psArrayToDlist(psVector *arr)
 {
     psDlist *list = psDlistAlloc(NULL);	// list of elements
 
+    assert (arr != NULL);
+    if (arr->n > 0) {
+       assert (arr->type.dimen == PS_DIMEN_VECTOR && arr->type.type == PS_TYPE_OTHER);
+    }
+    
     for (int i = 0, n = arr->n; i < n; i++) {
 	psDlistAppend(list,
-		      psMemDecrRefCounter(arr->arr[i])); // it's already Incr
-	arr->arr[i] = NULL;
-    }
-
-    psVoidPtrArrayFree(arr, NULL);
+		      psMemDecrRefCounter(arr->arr.arr_v[i])); // it\'s already Incr
+	arr->arr.arr_v[i] = NULL;
+    }
+
+    psVectorFree(arr, NULL);
 
     return list;
Index: /trunk/archive/pslib/src/Utils/error.c
===================================================================
--- /trunk/archive/pslib/src/Utils/error.c	(revision 706)
+++ /trunk/archive/pslib/src/Utils/error.c	(revision 707)
@@ -99,5 +99,5 @@
 	
 	va_start(ap, fmt);
-	p_psVLogMsg(name, PS_LOG_ERROR, fmt, ap);
+	p_psLogVMsg(name, PS_LOG_ERROR, fmt, ap);
 	va_end(ap);
     }
@@ -119,7 +119,7 @@
  * Return the last error; if there is none, return one with code "PS_ERR_NONE"
  */
-const psErr *psLastError(void)
-{
-    return psGetError(0);
+const psErr *psErrorLast(void)
+{
+    return psErrorGet(0);
 }
 
@@ -127,5 +127,5 @@
  * Return specified error (0: last error, 1: previous error, and so on)
  */
-const psErr *psGetError(int which)
+const psErr *psErrorGet(int which)
 {
     static psErr noError = { "", PS_ERR_NONE, "" };
@@ -169,5 +169,5 @@
 	}
 
-	errorStringList[errors[i].code] = errors[i].descrip;
+	errorStringList[errors[i].code] = (char *)errors[i].descrip;
     }
 }
@@ -210,5 +210,5 @@
     }
 
-    psVErrorStackPrint(fd, fmt, ap);
+    psErrorVStackPrint(fd, fmt, ap);
 
     if (fmt != NULL) {
@@ -217,5 +217,5 @@
 }
 
-void psVErrorStackPrint(FILE *fd,	// write to this file descriptor
+void psErrorVStackPrint(FILE *fd,	// write to this file descriptor
 			const char *fmt,// format for any header information; may be NULL
 			va_list ap)	// arguments for format
Index: /trunk/archive/pslib/src/Utils/logmsg.c
===================================================================
--- /trunk/archive/pslib/src/Utils/logmsg.c	(revision 706)
+++ /trunk/archive/pslib/src/Utils/logmsg.c	(revision 707)
@@ -20,5 +20,5 @@
  * Set the current log level and return old level
  */
-int psSetLogLevel(int level)		// new level
+int psLogSetLevel(int level)		// new level
 {
     int oldLevel = logLevel;
@@ -37,5 +37,5 @@
 /*****************************************************************************/
 
-int psSetLogDestination(int dest)	// new destination
+int psLogSetDestination(int dest)	// new destination
 {
     int old = logDest;
@@ -65,9 +65,9 @@
 static int log_time = 1, log_host = 1, log_level = 1, log_name = 1, log_msg = 1;
 
-void psSetLogFormat(const char *fmt)
+void psLogSetFormat(const char *fmt)
 {
     int nlog_time, nlog_host, nlog_level, nlog_name, nlog_msg; // new values of log_time etc.
 
-    nlog_host = nlog_level = nlog_msg = nlog_name = nlog_time = 0; // don't log anything
+    nlog_host = nlog_level = nlog_msg = nlog_name = nlog_time = 0; // don\'t log anything
     for (const char *ptr = fmt; *ptr != '\0'; ptr++) {
 	switch (*ptr) {
@@ -110,5 +110,5 @@
 #endif
 
-void p_psVLogMsg(const char *name, int level, const char *fmt, va_list ap)
+void p_psLogVMsg(const char *name, int level, const char *fmt, va_list ap)
 {
     static int first = 1;
@@ -159,5 +159,5 @@
 
     char head[HOST_NAME_MAX + 40];	// yes, this is long enough
-    char *head_ptr = head;		// where we've got to in head
+    char *head_ptr = head;		// where we\'ve got to in head
     time_t clock = time(NULL);
     struct tm *utc = gmtime(&clock);
@@ -224,5 +224,5 @@
     va_start(ap, fmt);
 
-    p_psVLogMsg(name, level, fmt, ap);
+    p_psLogVMsg(name, level, fmt, ap);
     va_end(ap);
 }
Index: /trunk/archive/pslib/src/Utils/misc.c
===================================================================
--- /trunk/archive/pslib/src/Utils/misc.c	(revision 706)
+++ /trunk/archive/pslib/src/Utils/misc.c	(revision 707)
@@ -29,5 +29,5 @@
 
     va_start(ap, fmt);
-    p_psVLogMsg(name, PS_LOG_ABORT, fmt, ap);
+    p_psLogVMsg(name, PS_LOG_ABORT, fmt, ap);
     va_end(ap);
     
Index: /trunk/archive/pslib/src/Utils/trace.c
===================================================================
--- /trunk/archive/pslib/src/Utils/trace.c	(revision 706)
+++ /trunk/archive/pslib/src/Utils/trace.c	(revision 707)
@@ -34,5 +34,5 @@
 #define NO_CACHE "\a"			// no name is cached
 
-#define UNKNOWN_LEVEL -9999		// we don't know this name's level
+#define UNKNOWN_LEVEL -9999		// we don\'t know this name\'s level
 
 static char cachedName[CACHE_NAME_LEN + 1] = NO_CACHE; // last name looked up
@@ -176,5 +176,5 @@
 /*****************************************************************************/
 
-int psSetTraceLevel(const char *comp,	// component of interest
+int psTraceSetLevel(const char *comp,	// component of interest
 		    int level)		// desired trace level
 {
@@ -201,5 +201,5 @@
  * Return a trace level given a name
  */
-static int doGetTraceLevel(const Component *comp, // end of component to search
+static int doTraceGetLevel(const Component *comp, // end of component to search
 			   const char *aname) // name to find
 {
@@ -215,10 +215,10 @@
     for (int i = 0; i < comp->n; i++) {
 	if (strcmp(comp->subcomp[i]->name, cpt0) == 0) { // a match
-	    if (rest == NULL) {		// we're there
+	    if (rest == NULL) {		// we\'re there
 		int level = comp->subcomp[i]->level;
 
 		return (level == UNKNOWN_LEVEL) ? comp->level : level;
 	    } else {
-		return doGetTraceLevel(comp->subcomp[i], rest);
+		return doTraceGetLevel(comp->subcomp[i], rest);
 	    }
 	}
@@ -230,5 +230,5 @@
 }
 
-int psGetTraceLevel(const char *name)	// component of interest
+int psTraceGetLevel(const char *name)	// component of interest
 {
     if (croot == NULL) {
@@ -240,5 +240,5 @@
     }
 
-    int level = doGetTraceLevel(croot, name);
+    int level = doTraceGetLevel(croot, name);
 
     strncpy(cachedName, name, CACHE_NAME_LEN);
@@ -252,5 +252,5 @@
  * Print a tree of trace levels
  */
-static void doPrintTraceLevels(const Component *comp, int depth)
+static void doTracePrintLevels(const Component *comp, int depth)
 {
     if (comp->name[0] == '\0') {
@@ -268,9 +268,9 @@
     
     for (int i = 0; i < comp->n; i++) {
-	doPrintTraceLevels(comp->subcomp[i], depth + 1);
-    }
-}
-
-void psPrintTraceLevels(void)
+       doTracePrintLevels(comp->subcomp[i], depth + 1);
+    }
+}
+
+void psTracePrintLevels(void)
 {
     if (croot == NULL) {
@@ -278,6 +278,23 @@
     }
 
-    doPrintTraceLevels(croot, 0);
-}
+    doTracePrintLevels(croot, 0);
+}
+
+/*****************************************************************************/
+/*
+ * Change where we're writing to; close previous file descriptor
+ * if it isn't stdout/stderr
+ */
+static FILE *traceFD = NULL;
+
+void psTraceSetDestination(FILE *fp)
+{
+   if (traceFD != stdout && traceFD != stderr) {
+      fclose(traceFD);
+   }
+
+   traceFD = fp;
+}
+
 
 /*****************************************************************************/
@@ -290,14 +307,18 @@
 	       ...)			// arguments
 {
-    if (level <= highest_level && psGetTraceLevel(comp) >= level) {
+    if (level <= highest_level && psTraceGetLevel(comp) >= level) {
+        if (traceFD == NULL) {		// not initialised, or fopen failed
+	   traceFD = stdout;
+	}
+
 	va_list ap;
 	va_start(ap, level);
 	for (int i = 0; i < level; i++) {
-	    putchar(' ');
+	    fputc(' ', traceFD);
 	}
 	char *fmt = va_arg(ap, char *);
-	vprintf(fmt, ap);
+	vfprintf(traceFD, fmt, ap);
 	if (strchr(fmt, '\n') == NULL) {
-	    printf("\n");
+	    fputc('\n', traceFD);
 	}
 	va_end(ap);
Index: /trunk/archive/pslib/src/Utils/tst_dlist.c
===================================================================
--- /trunk/archive/pslib/src/Utils/tst_dlist.c	(revision 706)
+++ /trunk/archive/pslib/src/Utils/tst_dlist.c	(revision 707)
@@ -35,9 +35,9 @@
      * Convert to an array
      */
-    psVoidPtrArray *arr = psDlistToArray(list);
-    list = NULL;			// it's been freed
+    psVector *arr = psDlistToArray(list);
+    list = NULL;			// it\'s been freed
 
     for (int i = 0; i < arr->n; i++) {
-	printf("%d ", ((X *)(arr->arr[i]))->i);
+	printf("%d ", ((X *)(arr->arr.arr_v[i]))->i);
     }
     printf("\n");
@@ -47,5 +47,5 @@
      */
     list = psArrayToDlist(arr);
-    arr = NULL;				// it's been freed
+    arr = NULL;				// it\'s been freed
 
     (void)psDlistGet(list, PS_DLIST_TAIL); // initialise iterator
@@ -55,5 +55,5 @@
     printf("\n");
 #endif
-    psVoidPtrArrayFree(arr, (void (*)(void *))xFree);
+    psVectorFree(arr, (void (*)(void *))xFree);
 #endif
 
Index: /trunk/archive/pslib/src/Utils/tst_error.c
===================================================================
--- /trunk/archive/pslib/src/Utils/tst_error.c	(revision 706)
+++ /trunk/archive/pslib/src/Utils/tst_error.c	(revision 707)
@@ -30,14 +30,14 @@
 int main(void)
 {
-    psSetTraceLevel("", 10);		// turn on all tracing
-    psSetLogDestination(PS_LOG_NONE);	// turn off error logging
+    psTraceSetLevel("", 10);		// turn on all tracing
+    psLogSetDestination(PS_LOG_NONE);	// turn off error logging
 
     if (toplevel() != 0) {
 	psErrorStackPrint(stdout, "Traceback:\n");
 
-	if (psLastError()->code == PS_ERR_UNKNOWN) {
+	if (psErrorLast()->code == PS_ERR_UNKNOWN) {
 	    fprintf(stderr, "Last error is of unknown type\n");
 	}
-	if (psGetError(2)->code == PS_ERR_IO) {
+	if (psErrorGet(2)->code == PS_ERR_IO) {
 	    fprintf(stderr, "Third oldest error is of type IO\n");
 	}
@@ -47,5 +47,5 @@
     psErrorStackPrint(stdout, "Traceback:\n");
 
-    if (psLastError()->code == PS_ERR_NONE) {
+    if (psErrorLast()->code == PS_ERR_NONE) {
 	fprintf(stderr, "No errors. Hurrah\n");
     }
Index: /trunk/archive/pslib/src/Utils/tst_hash.c
===================================================================
--- /trunk/archive/pslib/src/Utils/tst_hash.c	(revision 706)
+++ /trunk/archive/pslib/src/Utils/tst_hash.c	(revision 707)
@@ -29,5 +29,5 @@
 int main(void)
 {
-    psSetTraceLevel("utils.hash", 3);
+    psTraceSetLevel("utils.hash", 3);
     long memId0 = psMemGetId();
 
Index: /trunk/archive/pslib/src/Utils/tst_logmsg.c
===================================================================
--- /trunk/archive/pslib/src/Utils/tst_logmsg.c	(revision 706)
+++ /trunk/archive/pslib/src/Utils/tst_logmsg.c	(revision 707)
@@ -4,9 +4,9 @@
 int main(void)
 {
-    psSetTraceLevel("utils.logMsg", 1);
+    psTraceSetLevel("utils.logMsg", 1);
     
-    psSetLogDestination(PS_LOG_TO_STDERR);
-    psSetLogLevel(PS_LOG_INFO);
-    psSetLogFormat("NM");
+    psLogSetDestination(PS_LOG_TO_STDERR);
+    psLogSetLevel(PS_LOG_INFO);
+    psLogSetFormat("NM");
     
     psLogMsg("init", PS_LOG_INFO, "Hello World\n");
Index: /trunk/archive/pslib/src/Utils/tst_trace.c
===================================================================
--- /trunk/archive/pslib/src/Utils/tst_trace.c	(revision 706)
+++ /trunk/archive/pslib/src/Utils/tst_trace.c	(revision 707)
@@ -21,5 +21,5 @@
 int main(void)
 {
-    psSetLogFormat("NM");		// suppress some of the psLogMsg verbosity
+    psLogSetFormat("NM");		// suppress some of the psLogMsg verbosity
 
     (void)psMemAllocateCBSet(my_MemAllocateCB);
@@ -29,17 +29,17 @@
     
 #if 0
-    psSetTraceLevel("", 10);
+    psTraceSetLevel("", 10);
 #else
-    psSetTraceLevel("utils.dlist.add.head", 9);
-    psSetTraceLevel("utils.dlist.add", 3);
-    psSetTraceLevel("utils.dlist.remove", 4);
-    psSetTraceLevel("coadd", 2);
-    psSetTraceLevel("coadd.CR.remove.morphology", 5);
-    psSetTraceLevel("utils.hash", 2);
-    psSetTraceLevel("utils.dlist.add", 9);
-    psSetTraceLevel("utils", 1);
+    psTraceSetLevel("utils.dlist.add.head", 9);
+    psTraceSetLevel("utils.dlist.add", 3);
+    psTraceSetLevel("utils.dlist.remove", 4);
+    psTraceSetLevel("coadd", 2);
+    psTraceSetLevel("coadd.CR.remove.morphology", 5);
+    psTraceSetLevel("utils.hash", 2);
+    psTraceSetLevel("utils.dlist.add", 9);
+    psTraceSetLevel("utils", 1);
 #endif
     
-    psPrintTraceLevels();
+    psTracePrintLevels();
     printf("\n");
 
