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;
Index: /trunk/psLib/test/imageops/tst_psImagePixelExtract.c
===================================================================
--- /trunk/psLib/test/imageops/tst_psImagePixelExtract.c	(revision 5173)
+++ /trunk/psLib/test/imageops/tst_psImagePixelExtract.c	(revision 5174)
@@ -6,6 +6,6 @@
 *  @author Robert DeSonia, MHPCC
 *
-*  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2005-07-13 02:47:00 $
+*  @version $Revision: 1.2 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-09-29 01:15:38 $
 *
 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -21,4 +21,5 @@
 static psS32 testImageCut(void);
 static psS32 testImageRadialCut(void);
+static psS32 testImageRowCol(void);
 
 
@@ -27,4 +28,5 @@
                               {testImageCut, 555, "psImageCut", 0, false},
                               {testImageRadialCut, 557, "psImageRadialCut", 0, false},
+                              {testImageRowCol, 559, "psImageRowCol", 0, false},
                               {NULL}
                           };
@@ -742,2 +744,52 @@
     return 0;
 }
+
+psS32 testImageRowCol(void)
+{
+    psVector *rowcol = NULL;
+    psVector *empty = NULL;
+    psImage *image = NULL;
+    psImage *emptyImage = NULL;
+
+    image = psImageAlloc(3, 3, PS_TYPE_F64);
+    rowcol = psVectorAlloc(3, PS_TYPE_F64);
+
+    image->data.F64[0][0] = 666.666;
+    image->data.F64[1][0] = 66.6;
+    image->data.F64[2][0] = 6.66;
+    image->data.F64[0][1] = 6.6;
+    image->data.F64[1][1] = 6.666;
+    image->data.F64[2][1] = 66.666;
+    image->data.F64[0][2] = 666.6;
+    image->data.F64[1][2] = 666.66;
+    image->data.F64[2][2] = 66.66;
+
+    //Test for error with NULL image
+    empty = psImageCol(empty, emptyImage, 0);
+    if (empty != NULL) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, false,
+                "psImageCol failed to return NULL for NULL image input.\n");
+        return 1;
+    }
+    //Test for error with Out of Range Row
+    empty = psImageRow(empty, image, 5);
+    if (empty != NULL) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, false,
+                "psImageRow failed to return NULL for out of range row input.\n");
+        return 2;
+    }
+    rowcol->data.F64[0] = 1.1;
+    rowcol->data.F64[2] = 2.2;
+    //Test recycling of non-NULL vector & correct output
+    rowcol = psImageCol(rowcol, image, 1);
+    if (rowcol->data.F64[0] != 66.6 && rowcol->data.F64[2] != 666.66) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, false,
+                "psImageCol failed to return correct values.\n");
+        return 3;
+    }
+
+    psFree(rowcol);
+    psFree(image);
+    return 0;
+}
+
Index: /trunk/psLib/test/imageops/verified/tst_psImagePixelExtract.stderr
===================================================================
--- /trunk/psLib/test/imageops/verified/tst_psImagePixelExtract.stderr	(revision 5173)
+++ /trunk/psLib/test/imageops/verified/tst_psImagePixelExtract.stderr	(revision 5174)
@@ -146,2 +146,15 @@
 ---> TESTPOINT PASSED (psImage{psImageRadialCut} | tst_psImagePixelExtract.c)
 
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImagePixelExtract.c                                  *
+*            TestPoint: psImage{psImageRowCol}                                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|E|psImageCol (FILE:LINENO)
+    Can not operate on a NULL psImage.
+<DATE><TIME>|<HOST>|E|psImageRow (FILE:LINENO)
+    Specified row number is out of range for specified image.
+
+---> TESTPOINT PASSED (psImage{psImageRowCol} | tst_psImagePixelExtract.c)
+
Index: /trunk/psLib/test/mathtypes/tst_psImage.c
===================================================================
--- /trunk/psLib/test/mathtypes/tst_psImage.c	(revision 5173)
+++ /trunk/psLib/test/mathtypes/tst_psImage.c	(revision 5174)
@@ -6,6 +6,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-09-23 00:04:36 $
+ *  @version $Revision: 1.8 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-09-29 01:15:38 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -36,5 +36,5 @@
                               {testRegion3,793,"psRegionForSquare",0,false},
                               {testImageInit,794,"psImageInit",0,false},
-                              {testImageGetSet,795,"psImageInit",0,false},
+                              {testImageGetSet,795,"psImageGetSet",0,false},
                               {NULL}
                           };
Index: /trunk/psLib/test/mathtypes/verified/tst_psImage.stderr
===================================================================
--- /trunk/psLib/test/mathtypes/verified/tst_psImage.stderr	(revision 5173)
+++ /trunk/psLib/test/mathtypes/verified/tst_psImage.stderr	(revision 5174)
@@ -134,5 +134,5 @@
 /***************************** TESTPOINT ******************************************\
 *             TestFile: tst_psImage.c                                              *
-*            TestPoint: psImage{psImageInit}                                       *
+*            TestPoint: psImage{psImageGetSet}                                     *
 *             TestType: Positive                                                   *
 \**********************************************************************************/
@@ -141,4 +141,4 @@
     Invalid position.  Position too large
 
----> TESTPOINT PASSED (psImage{psImageInit} | tst_psImage.c)
+---> TESTPOINT PASSED (psImage{psImageGetSet} | tst_psImage.c)
 
