Index: trunk/psLib/src/imageops/psImagePixelExtract.c
===================================================================
--- trunk/psLib/src/imageops/psImagePixelExtract.c	(revision 5173)
+++ trunk/psLib/src/imageops/psImagePixelExtract.c	(revision 5174)
@@ -8,6 +8,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.6 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-07-12 19:33:49 $
+ *  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-09-29 01:15:38 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -22,4 +22,179 @@
 
 #include "psErrorText.h"
+
+
+#define FUNC_MACRO_VECTOR_STORE_ROW(TYPE) \
+static psVector *vectorStoreRow##TYPE(psVector *vec, const psImage *in, int row) \
+{ \
+    \
+    for (int i = 0; i < in->numCols; i++) \
+    { \
+        vec->data.TYPE[i] = in->data.TYPE[i][row]; \
+    } \
+    return vec; \
+} \
+
+FUNC_MACRO_VECTOR_STORE_ROW(S8)
+FUNC_MACRO_VECTOR_STORE_ROW(S16)
+FUNC_MACRO_VECTOR_STORE_ROW(S32)
+FUNC_MACRO_VECTOR_STORE_ROW(S64)
+FUNC_MACRO_VECTOR_STORE_ROW(U8)
+FUNC_MACRO_VECTOR_STORE_ROW(U16)
+FUNC_MACRO_VECTOR_STORE_ROW(U32)
+FUNC_MACRO_VECTOR_STORE_ROW(U64)
+FUNC_MACRO_VECTOR_STORE_ROW(F32)
+FUNC_MACRO_VECTOR_STORE_ROW(F64)
+FUNC_MACRO_VECTOR_STORE_ROW(C32)
+FUNC_MACRO_VECTOR_STORE_ROW(C64)
+
+psVector *psImageRow(psVector *out,
+                     const psImage *input,
+                     psU32 row)
+{
+    if (input == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true, PS_ERRORTEXT_psImage_IMAGE_NULL);
+        return NULL;
+    }
+    if (row >= input->numRows) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                "Specified row number is out of range for specified image.\n");
+        return NULL;
+    }
+    psVectorRecycle(out, input->numCols, input->type.type);
+
+    switch (input->type.type) {
+    case PS_TYPE_S8:
+        out = vectorStoreRowS8(out, input, row);
+        break;
+    case PS_TYPE_S16:
+        out = vectorStoreRowS16(out, input, row);
+        break;
+    case PS_TYPE_S32:
+        out = vectorStoreRowS32(out, input, row);
+        break;
+    case PS_TYPE_S64:
+        out = vectorStoreRowS64(out, input, row);
+        break;
+    case PS_TYPE_U8:
+        out = vectorStoreRowU8(out, input, row);
+        break;
+    case PS_TYPE_U16:
+        out = vectorStoreRowU16(out, input, row);
+        break;
+    case PS_TYPE_U32:
+        out = vectorStoreRowU32(out, input, row);
+        break;
+    case PS_TYPE_U64:
+        out = vectorStoreRowU64(out, input, row);
+        break;
+    case PS_TYPE_F32:
+        out = vectorStoreRowF32(out, input, row);
+        break;
+    case PS_TYPE_F64:
+        out = vectorStoreRowF64(out, input, row);
+        break;
+    case PS_TYPE_C32:
+        out = vectorStoreRowC32(out, input, row);
+        break;
+    case PS_TYPE_C64:
+        out = vectorStoreRowC64(out, input, row);
+        break;
+    default:
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                "Specified psImage has invalid type for this function.\n");
+        return NULL;
+    }
+
+    return out;
+}
+
+
+#define FUNC_MACRO_VECTOR_STORE_COL(TYPE) \
+static psVector *vectorStoreCol##TYPE(psVector *vec, const psImage *in, int col) \
+{ \
+    \
+    for (int i = 0; i < in->numRows; i++) \
+    { \
+        vec->data.TYPE[i] = in->data.TYPE[col][i]; \
+    } \
+    return vec; \
+} \
+
+FUNC_MACRO_VECTOR_STORE_COL(S8)
+FUNC_MACRO_VECTOR_STORE_COL(S16)
+FUNC_MACRO_VECTOR_STORE_COL(S32)
+FUNC_MACRO_VECTOR_STORE_COL(S64)
+FUNC_MACRO_VECTOR_STORE_COL(U8)
+FUNC_MACRO_VECTOR_STORE_COL(U16)
+FUNC_MACRO_VECTOR_STORE_COL(U32)
+FUNC_MACRO_VECTOR_STORE_COL(U64)
+FUNC_MACRO_VECTOR_STORE_COL(F32)
+FUNC_MACRO_VECTOR_STORE_COL(F64)
+FUNC_MACRO_VECTOR_STORE_COL(C32)
+FUNC_MACRO_VECTOR_STORE_COL(C64)
+
+
+psVector *psImageCol(psVector *out,
+                     const psImage *input,
+                     psU32 column)
+{
+    if (input == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true, PS_ERRORTEXT_psImage_IMAGE_NULL);
+        return NULL;
+    }
+    if (column >= input->numRows) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                "Specified column number is out of range for specified image.\n");
+        return NULL;
+    }
+    psVectorRecycle(out, input->numCols, input->type.type);
+
+    switch (input->type.type) {
+    case PS_TYPE_S8:
+        out = vectorStoreColS8(out, input, column);
+        break;
+    case PS_TYPE_S16:
+        out = vectorStoreColS16(out, input, column);
+        break;
+    case PS_TYPE_S32:
+        out = vectorStoreColS32(out, input, column);
+        break;
+    case PS_TYPE_S64:
+        out = vectorStoreColS64(out, input, column);
+        break;
+    case PS_TYPE_U8:
+        out = vectorStoreColU8(out, input, column);
+        break;
+    case PS_TYPE_U16:
+        out = vectorStoreColU16(out, input, column);
+        break;
+    case PS_TYPE_U32:
+        out = vectorStoreColU32(out, input, column);
+        break;
+    case PS_TYPE_U64:
+        out = vectorStoreColU64(out, input, column);
+        break;
+    case PS_TYPE_F32:
+        out = vectorStoreColF32(out, input, column);
+        break;
+    case PS_TYPE_F64:
+        out = vectorStoreColF64(out, input, column);
+        break;
+    case PS_TYPE_C32:
+        out = vectorStoreColC32(out, input, column);
+        break;
+    case PS_TYPE_C64:
+        out = vectorStoreColC64(out, input, column);
+        break;
+    default:
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                "Specified psImage has invalid type for this function.\n");
+        return NULL;
+    }
+
+    return out;
+
+}
+
 
 psVector* psImageSlice(psVector* out,
Index: trunk/psLib/src/imageops/psImagePixelExtract.h
===================================================================
--- trunk/psLib/src/imageops/psImagePixelExtract.h	(revision 5173)
+++ trunk/psLib/src/imageops/psImagePixelExtract.h	(revision 5174)
@@ -8,6 +8,6 @@
 *  @author Robert DeSonia, MHPCC
 *
-*  @version $Revision: 1.6 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2005-07-21 02:39:57 $
+*  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-09-29 01:15:38 $
 *
 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -32,4 +32,26 @@
     PS_CUT_Y_NEG                       ///< Cut in the y dimension from top down.
 } psImageCutDirection;
+
+/** Extracts a single complete row from the image and returns it to the
+ *  provided vector, allocating it if it is NULL.
+ *
+ *  @return psVector*:      The row data extracted from psImage input
+ */
+psVector *psImageRow(
+    psVector *out,                     ///< specified vector to return
+    const psImage *input,              ///< input image
+    psU32 row                          ///< row number to extract
+);
+
+/** Extracts a single complete column from the image and returns it to the
+ *  provided vector, allocating it if it is NULL.
+ *
+ *  @return psVector*:      The column data extracted from psImage input
+ */
+psVector *psImageCol(
+    psVector *out,                     ///< specified vector to return
+    const psImage *input,              ///< input image
+    psU32 column                       ///< column number to extract
+);
 
 /** Extract pixels from rectlinear region to a vector (array of floats).
Index: trunk/psLib/src/sys/psTrace.h
===================================================================
--- trunk/psLib/src/sys/psTrace.h	(revision 5173)
+++ trunk/psLib/src/sys/psTrace.h	(revision 5174)
@@ -9,6 +9,6 @@
  *  @author GLG, MHPCC
  *
- *  @version $Revision: 1.41 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-09-19 22:50:29 $
+ *  @version $Revision: 1.42 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-09-29 01:15:38 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -143,5 +143,5 @@
  *  @return FILE*:      File Destination
  */
-int psTraceGetDestination();
+int psTraceGetDestination(void);
 
 /* \} */// End of SystemGroup Functions
Index: trunk/psLib/src/types/psList.c
===================================================================
--- trunk/psLib/src/types/psList.c	(revision 5173)
+++ trunk/psLib/src/types/psList.c	(revision 5174)
@@ -6,6 +6,6 @@
  *  @author Robert Daniel DeSonia, MHPCC
  *
- *  @version $Revision: 1.42 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-08-30 01:14:13 $
+ *  @version $Revision: 1.43 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-09-29 01:15:38 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -39,6 +39,5 @@
     }
 
-    pthread_mutex_lock(&list->lock)
-    ;
+    pthread_mutex_lock(&list->p_lock);
 
     // remove the free function of iterators to avoid double removal from list
@@ -59,9 +58,7 @@
     }
 
-    pthread_mutex_unlock(&list->lock)
-    ;
-
-    pthread_mutex_destroy(&list->lock)
-    ;
+    pthread_mutex_unlock(&list->p_lock);
+
+    pthread_mutex_destroy(&list->p_lock);
 
 }
@@ -88,6 +85,5 @@
     int index = iterator->index;
 
-    pthread_mutex_lock(&list->lock)
-    ;
+    pthread_mutex_lock(&list->p_lock);
 
     if (elem == list->head) {        // head of list?
@@ -115,5 +111,5 @@
     list->n--;
 
-    pthread_mutex_unlock(&list->lock)
+    pthread_mutex_unlock(&list->p_lock)
     ;
 
@@ -139,6 +135,5 @@
     psListIteratorAlloc(list,PS_LIST_HEAD,true);
 
-    pthread_mutex_init(&(list->lock), NULL)
-    ;
+    pthread_mutex_init(&(list->p_lock), NULL);
 
     if (data != NULL) {
@@ -322,6 +317,5 @@
     psListElem* elem = psAlloc(sizeof(psListElem));
 
-    pthread_mutex_lock(&list->lock)
-    ;
+    pthread_mutex_lock(&list->p_lock);
 
     // set the new list element's attributes
@@ -359,6 +353,5 @@
     }
 
-    pthread_mutex_unlock(&list->lock)
-    ;
+    pthread_mutex_unlock(&list->p_lock);
 
     return true;
@@ -397,6 +390,5 @@
     psListElem* elem = psAlloc(sizeof(psListElem));
 
-    pthread_mutex_lock(&list->lock)
-    ;
+    pthread_mutex_lock(&list->p_lock);
 
     // set the new list element's attributes
@@ -434,6 +426,5 @@
     }
 
-    pthread_mutex_unlock(&list->lock)
-    ;
+    pthread_mutex_unlock(&list->p_lock);
 
     return true;
Index: trunk/psLib/src/types/psList.h
===================================================================
--- trunk/psLib/src/types/psList.h	(revision 5173)
+++ trunk/psLib/src/types/psList.h	(revision 5174)
@@ -7,6 +7,6 @@
  *  @ingroup LinkedList
  *
- *  @version $Revision: 1.31 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-08-30 01:14:13 $
+ *  @version $Revision: 1.32 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-09-29 01:15:38 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -60,6 +60,6 @@
     ///< others are user-level iterators created by psListIteratorAlloc.
 
-    pthread_mutex_t lock;              ///< mutex to lock a node during changes
-//    void *lock;                        ///< Optional lock for thread safety
+    pthread_mutex_t p_lock;            ///< mutex to lock a node during changes
+    void *lock;                        ///< Optional lock for thread safety
 }
 psList;
@@ -75,9 +75,9 @@
 typedef struct
 {
-psList* list;                      ///< List iterator to works on
-psListElem* cursor;                ///< current cursor position
-bool offEnd;                       ///< Iterator off the end?
-long index;                         ///< the index number in the list
-bool mutable;                      ///< Is it permissible to modify the list?
+    psList* list;                      ///< List iterator to works on
+    psListElem* cursor;                ///< current cursor position
+    bool offEnd;                       ///< Iterator off the end?
+    long index;                         ///< the index number in the list
+    bool mutable;                      ///< Is it permissible to modify the list?
 }
 psListIterator;
Index: trunk/psLib/src/types/psMetadata.h
===================================================================
--- trunk/psLib/src/types/psMetadata.h	(revision 5173)
+++ trunk/psLib/src/types/psMetadata.h	(revision 5174)
@@ -11,6 +11,6 @@
 *  @author Ross Harman, MHPCC
 *
-*  @version $Revision: 1.65 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2005-09-26 21:13:26 $
+*  @version $Revision: 1.66 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-09-29 01:15:38 $
 *
 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -136,5 +136,4 @@
 ;
 
-
 /** Checks the type of a particular pointer.
  *
Index: trunk/psLib/src/types/psMetadataConfig.c
===================================================================
--- trunk/psLib/src/types/psMetadataConfig.c	(revision 5173)
+++ trunk/psLib/src/types/psMetadataConfig.c	(revision 5174)
@@ -10,6 +10,6 @@
 *  @author Eric Van Alst, MHPCC
 *
-*  @version $Revision: 1.46 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2005-09-26 21:13:26 $
+*  @version $Revision: 1.47 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-09-29 01:15:38 $
 *
 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -57,5 +57,5 @@
 /** Maximum size of a string */
 #define MAX_STRING_LENGTH 256
-#define MAXSTR 256
+#define MAXSTR 2256
 
 
@@ -1228,5 +1228,5 @@
     psString newString = NULL;
     psString newStr = NULL;
-    char mdString[2048];
+    char mdString[16000];
     psMetadataItem *item = NULL;
     psMetadataIterator *iter = psMetadataIteratorAlloc(md, PS_LIST_HEAD, NULL);
@@ -1242,12 +1242,19 @@
     while ( (item = psMetadataGetAndIncrement(iter)) ) {
         type = item->type;
-        if ( type == PS_DATA_STRING)
+        if ( type == PS_DATA_STRING) {
             type = PS_DATA_STRING;
-        if ( type == PS_DATA_VECTOR)
+        }
+        if ( type == PS_DATA_VECTOR) {
             type = PS_DATA_VECTOR;
-        if ( type == PS_DATA_TIME)
+        }
+        if ( type == PS_DATA_TIME) {
             type = PS_DATA_TIME;
-        if ( item->type == PS_DATA_METADATA)
+        }
+        if ( item->type == PS_DATA_METADATA) {
             type = PS_DATA_METADATA;
+        }
+        if (item == NULL) {
+            type = PS_DATA_UNKNOWN;
+        }
 
         switch (type) {
@@ -1455,5 +1462,5 @@
         }
     }
-    newString = psStringNCopy(mdString, 2048);
+    newString = psStringNCopy(mdString, 16000);
     psFree(iter);
     return newString;
