pgnuplot stops function in Octave 3.0.1

gOS bkirklin at quantapoint.com
Thu Jul 3 14:10:34 CDT 2008


No clue why, but this fixed the problem: set(0, 'defaulttextfontname', '*')
All the same, I'm not sure I like the fact that I had to put it in to my
.octaverc to have octave function and not have it documented anywhere.



gOS wrote:
> 
> I can't isolate the error. I've tried several times, but the problem seems
> to randomly fix itself and then crop back up every 2 weeks or so. I'm
> looking for anyone with similar issues.
> 
> I'm running the windows version of Octave, the one that isn't cygwin. On a
> pentium 4 windows xp machine.
> 
> GNU plot crashes with messages like:
> 
> (gnuplot.exe:4580): Pango-WARNING **: couldn't load font "Helvetica
> Not-Rotated 200", falling back to "Sans Not-Rotated 200", expect ugly
> output.
> 
> Unfortunately, GNU plot stops working shortly after and I get the windows
> error report dialogue.
> 
> I usually recieve these errors when I call input inside of an Octave
> script where a user would traditionally input some value.
> 
> I've attempted to generate a bug report. Automatic sending doesn't work so
> I copied it and here it is:
> 
> #! /bin/sh -
> #
> # Copyright (C) 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2004,
> #               2005, 2006 John W. Eaton
> #
> # This file is part of Octave.
> # 
> # Octave is free software; you can redistribute it and/or modify it
> # under the terms of the GNU General Public License as published by the
> # Free Software Foundation; either version 3 of the License, or (at
> # your option) any later version.
> # 
> # Octave is distributed in the hope that it will be useful, but WITHOUT
> # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
> # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
> # for more details.
> # 
> # You should have received a copy of the GNU General Public License
> # along with Octave; see the file COPYING.  If not, see
> # <http://www.gnu.org/licenses/>.
> 
> # octave-bug - create a bug report and mail it to the bug-octave
> # mailing list.
> #
> # Patterned after the bashbug script from bash 1.14.
> 
> # Configuration:  these variables are filled in when running make to
> # compile Octave.
> 
> config_opts="'--build=i686-pc-msdosmsvc'
> '--prefix=/c/Software/VCLibs/local/octave-3.0.1' '--with-zlib=zlib'
> '--with-curl=libcurl' 'build_alias=i686-pc-msdosmsvc' 'CC=cc-msvc'
> 'CFLAGS=-O2' 'CXX=cc-msvc' 'CXXFLAGS=-O2' 'F77=fc-msvc' 'FFLAGS=-O2'"
> VERSION="3.0.1"
> SED="/usr/bin/sed"
> MACHINE="i686-pc-msdosmsvc"
> F77="fc-msvc"
> FFLAGS="-O2"
> FPICFLAG=""
> FLIBS="-lhdf5 -lzlib -lf2c -lkernel32"
> F2C="@F2C@"
> F2CFLAGS="@F2CFLAGS@"
> CPPFLAGS="-I.  -Ic:/Software/VCLibs/include"
> INCFLAGS="-I. -I. -I./liboctave -I./src -I./libcruft/misc"
> CC="cc-msvc"
> CC_VERSION=""
> CFLAGS="-O2 -MD"
> CPICFLAG=""
> CXX="cc-msvc"
> CXX_VERSION=""
> CXXFLAGS="-O2 -EHs -MD"
> CXXPICFLAG=""
> LD_CXX="cc-msvc"
> LDFLAGS=""
> LIBFLAGS="-L."
> RLD_FLAG=""
> LIBS="-lreadline  -lncurses -lhdf5 -lzlib  -lws2_32 -lkernel32"
> BLAS_LIBS="-llapack -lblas"
> FFTW_LIBS="-lfftw3"
> LEXLIB=""
> LIBGLOB="-lglob"
> DEFS="-DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\"
> -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DOCTAVE_SOURCE=1
> -D_GNU_SOURCE=1 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1
> -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_UNISTD_H=1
> -DSEPCHAR=';' -DSEPCHAR_STR=\";\" -D__NO_MATH_INLINES=1
> -DCXX_NEW_FRIEND_TEMPLATE_DECL=1 -DCXX_ISO_COMPLIANT_LIBRARY=1
> -DCXX_ABI=unknown -DHAVE_QHULL=1 -DHAVE_PCRE=1 -DHAVE_ZLIB_H=1
> -DHAVE_ZLIB=1 -DHAVE_HDF5_H=1 -DHAVE_HDF5=1 -DHAVE_H5GGET_NUM_OBJS=1
> -D_HDF5USEDLL_=1 -DHAVE_FFTW3=1 -DHAVE_GLPK_H=1 -DHAVE_GLPK=1
> -DHAVE_CURL_CURL_H=1 -DHAVE_CURL=1 -DHAVE_IEEE754_DATA_FORMAT=1
> -DF77_FUNC(name,NAME)=name ## _ -DF77_FUNC_(name,NAME)=name ## __
> -DHAVE_BLAS=1 -DHAVE_SUITESPARSE_UMFPACK_H=1 -DHAVE_UMFPACK=1
> -DUMFPACK_SEPARATE_SPLIT=1 -DHAVE_SUITESPARSE_COLAMD_H=1 -DHAVE_COLAMD=1
> -DHAVE_SUITESPARSE_CCOLAMD_H=1 -DHAVE_CCOLAMD=1
> -DHAVE_SUITESPARSE_CHOLMOD_H=1 -DHAVE_CHOLMOD=1 -DHAVE_SUITESPARSE_CS_H=1
> -DHAVE_CXSPARSE=1 -Dmode_t=int -Dpid_t=int -Duid_t=int -Dgid_t=int
> -DHAVE_DEV_T=1 -DHAVE_INO_T=1 -DHAVE_LONG_LONG_INT=1
> -DHAVE_UNSIGNED_LONG_LONG_INT=1 -DHAVE_SIG_ATOMIC_T=1 -DSIZEOF_SHORT=2
> -DSIZEOF_INT=4 -DSIZEOF_LONG=4 -DSIZEOF_LONG_LONG=8 -DHAVE_ALLOCA=1
> -DNPOS=std::string::npos -DHAVE_PLACEMENT_DELETE=1 -DSTDC_HEADERS=1
> -DHAVE_ASSERT_H=1 -DHAVE_DIRECT_H=1 -DHAVE_FCNTL_H=1 -DHAVE_FLOAT_H=1
> -DHAVE_LIMITS_H=1 -DHAVE_LOCALE_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STDLIB_H=1
> -DHAVE_STRING_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_SYS_TYPES_H=1
> -DHAVE_SYS_UTIME_H=1 -DHAVE_UNISTD_H=1 -DHAVE_VARARGS_H=1 -DHAVE_SSTREAM=1
> -DHAVE_GLOB_H=1 -DHAVE_FNMATCH_H=1 -DHAVE_CONIO_H=1 -DHAVE_ATEXIT=1
> -DHAVE_CHMOD=1 -DHAVE_DUP2=1 -DHAVE_EXECVP=1 -DHAVE_GETCWD=1
> -DHAVE_GETPID=1 -DHAVE__KBHIT=1 -DHAVE_MEMMOVE=1 -DHAVE_MKDIR=1
> -DHAVE_PUTENV=1 -DHAVE_RAISE=1 -DHAVE_RENAME=1 -DHAVE_RMDIR=1
> -DHAVE_SETLOCALE=1 -DHAVE_SETVBUF=1 -DHAVE_STAT=1 -DHAVE_STRDUP=1
> -DHAVE_STRERROR=1 -DHAVE_STRICMP=1 -DHAVE_STRNICMP=1 -DHAVE_TEMPNAM=1
> -DHAVE_UMASK=1 -DHAVE_UNLINK=1 -DHAVE_UTIME=1 -DHAVE_VFPRINTF=1
> -DHAVE_VSPRINTF=1 -DHAVE_VSNPRINTF=1 -DHAVE__CHMOD=1 -DHAVE__SNPRINTF=1
> -DHAVE__UTIME32=1 -DOCTAVE_HAVE_BROKEN_STRPTIME=1 -D_WIN32_WINNT=0x0403
> -D_USE_MATH_DEFINES=1 -DHAVE_LOADLIBRARY_API=1 -DENABLE_DYNAMIC_LINKING=1
> -DHAVE__FINITE=1 -DHAVE__ISNAN=1 -DHAVE__COPYSIGN=1 -DHAVE_DECL_SIGNBIT=0
> -DHAVE_STRUCT_STAT_ST_RDEV=1 -DHAVE_DECL_TZNAME=1 -DHAVE_TZNAME=1
> -DCLOSEDIR_VOID=1 -DMKDIR_TAKES_ONE_ARG=1 -DUSE_READLINE=1
> -DRETSIGTYPE=void -DHAVE_DECL_SYS_SIGLIST=0 -DMUST_REINSTALL_SIGHANDLERS=1
> -DRETSIGTYPE_IS_VOID=1 -DGNUPLOT_BINARY=\"pgnuplot\""
> 
> : ${USER=$LOGNAME}
> 
> CC_AND_VERSION=
> if test -n "$CC_VERSION"; then
>   CC_AND_VERSION="$CC, version $CC_VERSION"
> fi
> 
> CXX_AND_VERSION=
> if test -n "$CXX_VERSION"; then
>   CXX_AND_VERSION="$CXX, version $CXX_VERSION"
> fi
> 
> PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:$PATH
> export PATH
> 
> TEMP=/tmp/octave-bug.$$
> 
> if [ -z "$DEFEDITOR" ] && [ -z "$EDITOR" ]; then
>   if [ -x /usr/bin/editor ]; then
>     DEFEDITOR=editor
>   elif [ -x /usr/local/bin/ce ]; then
>     DEFEDITOR=ce
>   elif [ -x /usr/local/bin/emacs ]; then
>     DEFEDITOR=emacs
>   elif [ -x /usr/contrib/bin/emacs ]; then
>     DEFEDITOR=emacs
>   elif [ -x /usr/bin/emacs ]; then
>     DEFEDITOR=emacs
>   elif [ -x /usr/bin/xemacs ]; then
>     DEFEDITOR=xemacs
>   elif [ -x /usr/contrib/bin/jove ]; then
>     DEFEDITOR=jove
>   elif [ -x /usr/local/bin/jove ]; then
>     DEFEDITOR=jove
>   elif [ -x /usr/bin/vi ]; then
>     DEFEDITOR=vi
>   else
>     echo "octave-bug: No default editor found: attempting to use vi" >&2
>     DEFEDITOR=vi
>   fi
> fi
> 
> : ${EDITOR=$DEFEDITOR}
> 
> if [ -z "$DEFPAGER" ] && [ -z "$PAGER" ]; then
>   if [ -x /usr/bin/pager ]; then
>     DEFPAGER=pager
>   elif [ -x /usr/bin/less ]; then
>     DEFPAGER=less
>   elif [ -x /bin/less ]; then
>     DEFPAGER=less
>   elif [ -x /usr/local/bin/less ]; then
>     DEFPAGER=less
>   elif [ -x /usr/bin/more ]; then
>     DEFPAGER=more
>   elif [ -x /bin/more ]; then
>     DEFPAGER=more
>   elif [ -x /usr/bin/pg ]; then
>     DEFPAGER=pg
>   elif [ -x /bin/pg ]; then
>     DEFPAGER=pg
>   else
>     echo "octave-bug: No default pager found: attempting to use more" >&2
>     DEFPAGER=more
>   fi
> fi
> 
> : ${PAGER=$DEFPAGER}
> 
> trap 'rm -f $TEMP $TEMP.x; exit 1' 1 2 3 13 15
> trap 'rm -f $TEMP $TEMP.x' 0
> 
> UN=
> if (uname) > /dev/null 2>&1; then
>   UN=`uname -a`
> fi
> 
> HAVE_FMT=false
> if (fmt < /dev/null) > /dev/null 2>&1; then
>   HAVE_FMT=true
> fi
> 
> # Check whether to use -n or \c to keep echo from printing a newline
> # character.  Stolen from autoconf, which borrowed the idea from dist 3.0.
> 
> if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
>   # Stardent Vistra SVR4 grep lacks -e, says ghazi at caip.rutgers.edu.
>   if (echo -n testing; echo 1,2,3) | $SED s/-n/xn/ | grep xn >/dev/null;
> then
>     echo_n=
>     echo_c='
> '
>   else
>     echo_n=-n
>     echo_c=
>   fi
> else
>   echo_n=
>   echo_c='\c'
> fi
> 
> ss_p=`echo $VERSION | grep "^ss-"`
> if test -n "$ss_p"; then
>   BUGADDR="maintainers at octave.org"
> else
>   pretest_p=`echo $VERSION \
>     | $SED 's,.*\.\([0-9]*\).*,\1,' \
>     | grep -v '\.' \
>     | grep '[0-9]'`
> 
>   if test -n "$pretest_p" && test "$pretest_p" -ge 90; then
>     BUGADDR="maintainers at octave.org"
>   else
>     BUGADDR="bug at octave.org"
>   fi
> fi
> 
> SUBJECT="[50 character or so descriptive subject here (for reference)]"
> if test $# -gt 0; then
>   case "$1" in
>     -s)
>       shift
>       if test $# -gt 0; then
>         SUBJECT="$1"
>         shift
>       else
>         echo "usage: octave-bug [-s subject]"
>         exit 1
>       fi
>     ;;
>   esac
> fi
> 
> cat > $TEMP << EOF
> To: $BUGADDR
> EOF
> if test -n "$USER"; then
> cat >> $TEMP << EOF
> Cc: $USER
> EOF
> fi
> cat >> $TEMP << EOF
> Subject: $SUBJECT
> --------
> Bug report for Octave $VERSION configured for $MACHINE
> 
> Description:
> -----------
> 
>   * Octave stops recognizing packages and files in its path with out
>     much warning. It may have to do with the error handling system,
>     but I can't be sure.
> 
>     The main problem is that there appears to be no reliable way to
>     cause this to happen, even with the same input. It happens between,
>     1 out of 5 and 1 out of 10 times, depending on the day or hour.
> 
>     Windows XP machine. Pentium 4.
> 
> Repeat-By:
> ---------
> 
>   * 
> 
> 	1) Compile qpParseSum.c
> 	2) run testQpLoadAnalyzeData(true, true)
> 		This should cause an error no matter what on input. 
> 		When it asks you to pick a column just pick UTC each time, case matters.
> 		Occasionally this causes Octave to stop recognizing files.
> 
> %%%%%%%%%%%%%%%%%%%%%%%
> % You'll need to compile this as a mex file for octave
> % qpParseSum.c
> %%%%%%%%%%%%%%%%%%%%%%%
> 
> #include "mex.h"
> #include "stdio.h"
> #include "stdlib.h"
> #include "string.h"
> 
> // Error Codes
> #define NOERROR 0
> #define CELLNOTSTRING 1
> #define ELEMENTNOTSTRING 2
> #define UNBALANCEDINPUTOUTPUT 3
> #define MISSINGOUTPUT 4
> #define UNDEFINEDCOLUMN 5
> #define FILENOTFOUND 6
> #define COLUMNNOTFOUND 7
> #define BADSUMMARYFILE 8
> 
> //  Files to open
> FILE *sumFile, *typeFile;
> long lSize; // Storeing size of file
> 
> // Different stages of File parsing
> char *typeBuffer, *sumBuffer, *noTrash, *line, *token, *errBuffer;
> char *columnName, *fileLocation, *columnNameNoEndl;
> char *char13;
> char **argv, **lines;
> 
> size_t result;
> int cell_dims[2];
> int nlhs1, nrhs1;
> int matlabSuccesful;
> // Details for columns
> 
> mxArray *rhs[1], *lhs[1];int nlhs1, nrhs1;
> mxArray *cellArr, *charArr;
> 
> long double dataCell; // for converting to numbers
> 
> double *pr;
> int *neededColumns;
> double *columnTypes;
> long double *output;
> 
> int argc, len;
> int k, ncell; // For Input
> int numberOfRows, numberOfColumns; // Of Entire File
> int i,j; // Iteration vars
> int inComment, firstLine, found; // Control Vars (are we in a comment) (is
> this the first line?);
> int index; // index for cell arrays
> 
> int justHead, errorStatus;
> 
> /*************************************************************************************
> //  mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray
> *prhs[])
> // 
> //	Opens a summary file and parses columns into double arrays for OCTAVE
> if it is a number and cell strings the column is a string
> //	
> //	ARGUMENTS:
> //		nlhs	-	The number of left hand side arguments that will be returned to
> the calling Octave code
> //		plhs[]	-	An array of pointers to the data being returned should have a
> size of nlhs 
> //		nrhs	-	The number of right hand sides passed in for use by the calling
> Octave code
> //		prhs[]	-	An array of pointers to the data being passed in, having a
> size of nrhs. The data being pointed to is read only.
> //
> // A note on mxCalloc & mxMalloc: Matlab & Octave free these vars
> automatically when return to the prompt
> // occurs. Still free them though, when you are done with them.
> ***********************************************************************************/
> 
> void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray
> *prhs[]) {
>   matlabSuccesful = 0;
>   
>   errorStatus = NOERROR;
>   argc = 0;
>   j = 0;
>   justHead = 0;
>   
>   /*****************************************************
>        *
>        * Verify all data passed in is string data
>        *
>        *****************************************************/
>  
>   for(k=0; k<nrhs; k++)
>   {
>     if( mxIsCell( prhs[k] ) )
>     {
>       argc += ncell = mxGetNumberOfElements( prhs[k] );
>       for( i=0; i<ncell; i++ ) {
>         if( !mxIsChar( mxGetCell( prhs[k], i ) ) ) {
>           errorStatus = CELLNOTSTRING;
>           goto out;
>         }
>       }
>     }
>     else
>     {
>       argc++;
>       if( !mxIsChar( prhs[k] ) ) {
>         errorStatus = ELEMENTNOTSTRING;
>         goto out;
>       }
>     }
>   }  
> 
>   if(nlhs != argc - 1) {
>     if(nlhs == 1 && argc == 1) {
>       justHead = 1;  
>     } else {
>       errorStatus = UNBALANCEDINPUTOUTPUT;
>       goto out;      
>     }
>   }
>   
>   if(nlhs == 0) {
>     errorStatus = MISSINGOUTPUT;
>     goto out;
>   }
>   
>   argv = (char **) mxCalloc( argc, sizeof(char *) );  
> 
>   /***************************************************
>        *
>        *  Convert data stored in cells to strings
>        *
>        ***************************************************/
>   
>   for( k=0; k<nrhs; k++ )
>   {
>     if( mxIsCell( prhs[k] ) )
>     {
>         ncell = mxGetNumberOfElements( prhs[k] );
>         for( i=0; i<ncell; i++ )
>             argv[j++] = mxArrayToString( mxGetCell( prhs[k], i ));
>     }
>     else
>     {
>         argv[j++] = mxArrayToString( prhs[k] );
>     }
>   }
>   
>  
> /**************************************************************************************************
>        *
>        *  Octave has array types of cellstr and double. If a column is
> numeric want to store the data as numeric data. 
>        *  Call summaryColumnLookUpType to get the type of each column for
> later conversion. 
>        *  String is represented by 1, Numeric by 0.
>        *
>       
> **************************************************************************************************/
> 
>   columnTypes = (double*) mxMalloc (sizeof(double)*(argc-1)); // 0 =
> Number, 1 = String
>   
>   char13 = (char*)mxCalloc(2,sizeof(char));
>   k = sprintf(char13, "%c", 13);
>   
>   for(k = 0; k < argc - 1; k++) {
>     columnName = (char*)mxCalloc(strlen(argv[k+1])+10,sizeof(char));
>     
>     strcpy(columnName, argv[k+1]);   
>     
>     columnNameNoEndl = strtok(columnName,char13);    
>     strcpy(argv[k+1], columnNameNoEndl);
>     
>     nrhs1 = 1;
>     nlhs1 = 1;
>     rhs[0] = mxCreateString(columnNameNoEndl);    
>     
>     /* Note: this call is represented the same way as mexFunction.*/
>     
>     mexSetTrapFlag(1);
>     matlabSuccesful = mexCallMATLAB(nlhs1, lhs, nrhs1, rhs,
> "summaryColumnLookUpType");
>     mexSetTrapFlag(0);
>     if(matlabSuccesful) {
>       errorStatus = UNDEFINEDCOLUMN;
>       goto out;
>     }    
>     
>     
>     pr = mxGetPr(lhs[0]);
>     columnTypes[k] = *pr;
>     mxFree(pr);
>     mxFree(columnName);
>   }
>   mxFree(char13);
>   
>  
> /*******************************************************************************
>       *
>       *   Read in and parse the summary file. Remove any element known
> that it won't be needed 
>       *   to return. (linefeed, comments...)
>       *
>      
> ******************************************************************************/
> 
>   sumFile = fopen(argv[0], "rb");
>  
>   if (sumFile==NULL) { errorStatus = FILENOTFOUND; goto out; }
>  
>   fseek(sumFile, -4, SEEK_END);
>   lSize = ftell(sumFile);
>   rewind(sumFile);
> 
>   // sumBuffer holds data directly from file
>   sumBuffer = (char*) mxCalloc (lSize+1,sizeof(char));
>   // noTrash will not have comments or extra linebreaks
>   noTrash = (char*) mxCalloc (lSize+1,sizeof(char));
>   result = fread (sumBuffer,1,lSize,sumFile); // read in the data
>   
>   fclose(sumFile);
>  
>   j = 0;
>   
>   inComment = 0; // Have we found a comment?
>   firstLine = 0; // Is this the first line?
>   numberOfRows = 0;
>   numberOfColumns = 0;
>   for(i = 0; i < lSize; i++) {
>     if(inComment == 0) { 
>       if(sumBuffer[i] == '#') {
>         inComment = 1;
>        continue;
>       }
>       if(sumBuffer[i] == '\n') {
>         numberOfRows++; 
>         if(firstLine == 1) {        
>           firstLine = 2; // Can't be first line anymore
>         }
>       }
>       if(sumBuffer[i] == 13) continue; // Don't add char(13) to noTrash
>      
>       if(firstLine == 0 && sumBuffer[i] == ',') {
>         numberOfColumns++;
>         firstLine = 1; // This is the first comma, so this is the first
> line of data
>       }
>       if(firstLine == 1 && sumBuffer[i] == ',') {
>         numberOfColumns++;
>       }
>       noTrash[j] = sumBuffer[i]; // this byte wasn't trash
>       
>       j++; // Current position in noTrash updated
>     } else {
>       
>       if(sumBuffer[i] == '\n') inComment = 0; //Comment must be over,
> found a new line.
>     }
>   }
> 
>  
> /******************************************************************************
>       *   Split the file first into lines and then into cols, thereby
> storing each piece of data in a different cell of a cell matrix.
>       *   This makes it simple to just grab the appropriate column of data
> and place it in nlhs[]. This block of code also locates
>       *   the columns that were requested in the original data.
>      
> *******************************************************************************/
>   
>   lines = (char**) mxCalloc(numberOfRows,sizeof(char*));
>   lines[0] = (char *)strtok(noTrash,"\n");
>   for(i = 1; i < numberOfRows; i++) {
>    lines[i] = (char *)strtok(NULL,"\n");
>   }
> 
>   cell_dims[0] = numberOfRows;
>   cell_dims[1] = numberOfColumns;
> 
>   neededColumns = (int*) mxMalloc (sizeof(int)*(argc-1));
>   
>   for(k = 0; k < argc-1; k++) {
>     neededColumns[k] = -1;
>   }
>   
>   cellArr = mxCreateCellArray(2,cell_dims);
> 
>   for(i = 0; i < numberOfRows; i++) {
>     line = lines[i];
>     token = (char*)strtok(line," ,");
>     for(j = 0; j < numberOfColumns; j++) {
>       if(token == NULL) {
>         errorStatus = BADSUMMARYFILE;
>         goto out;
>       }
>       charArr = mxCreateString(token); 
>       // Cell arrays are indexed based column major order
>       index = calcIndex(numberOfRows,i,j);
>       mxSetCell(cellArr,index,charArr);
>       
>       if(i == 0) {
>         //Looking at first row. Find columns requested by user
>         for(k = 0; k < argc - 1; k++) { 
>           if(strcmp(argv[k+1],token) == 0) { 
>             neededColumns[k] = j;
>           }
>         }
>       }
>       if(j != numberOfColumns) { // If still looking, keep tokening
>         token = (char *)strtok(NULL," ,");
>       }
>     }
>   }
>   
>   for(k = 0; k < argc-1; k++) {
>     if(neededColumns[k] == -1) {
>       errorStatus = COLUMNNOTFOUND;
>       goto out;
>     }
>   }
>   
>  
> /***************************************************************************************
>        * Place Data into PLHS[], the return array.
>        *  - Convert each column to the type discovered earlier.
>        *  - Place each column in PLHS
>        *
>        *  Numbers are stored as Double arrays. Strings are stored Cellstr
> arrays.
>        *  For an unknown reason, must convert back to string to store in a
> new cell array, otherwise data is corrupted.
>        *  Use long doubles to grab all of the data, in C you lose
> information with just %f,e,g
>       
> ***************************************************************************************/
>   
>   if(justHead) {
>     cell_dims[0] = 1;
>     cell_dims[1] = numberOfColumns;
>     
>     plhs[0] = mxCreateCellArray(2,cell_dims);
>     
>     for(k = 0; k < numberOfColumns; k++) {      
>       charArr = mxGetCell(cellArr, calcIndex(numberOfRows,0,k));
>       token =
> (char*)mxCalloc(mxGetNumberOfElements(charArr)+1,sizeof(char));      
>       mxGetString(charArr, token, mxGetNumberOfElements(charArr)+1);
>       charArr = mxCreateString(token);
>       mxSetCell(plhs[0],calcIndex(1,0,k),charArr);      
>     }  
>   } else {
>     cell_dims[0] = numberOfRows-1;
>     cell_dims[1] = 1;
>     for(k = 0; k < argc-1; k++) {
>       if(!(columnTypes[k] > 0)) { // 0 means numeric
>         plhs[k] = mxCreateDoubleMatrix(numberOfRows-1,1,mxREAL); 
>         for(i = 1; i < numberOfRows; i++) {
>           charArr = mxGetCell(cellArr,
> calcIndex(numberOfRows,i,neededColumns[k])); 
>           token =
> (char*)mxCalloc(mxGetNumberOfElements(charArr)+1,sizeof(char));
>           mxGetString(charArr, token,mxGetNumberOfElements(charArr)+1);
>           sscanf(token,"%Lf",&dataCell);
>           output = (long double*) mxGetPr(plhs[k]);
>           mxFree(token);
>           output[i-1] = dataCell; 
>         }
>       } else { // 1 meant string
>         plhs[k] = mxCreateCellArray(2,cell_dims); 
>         for(i = 1; i < numberOfRows; i++) {
>           charArr = mxGetCell(cellArr,
> calcIndex(numberOfRows,i,neededColumns[k])); 
>           token =
> (char*)mxCalloc(mxGetNumberOfElements(charArr)+1,sizeof(char));
>           mxGetString(charArr, token,mxGetNumberOfElements(charArr)+1);
>           charArr = mxCreateString(token);
>           mxSetCell(plhs[k],i-1,charArr);
>           mxFree(token);
>         }
>       }
>     }
>   }
> 
>   // CLEAN  UP
> 
> out:
>   switch(errorStatus) {
>     case COLUMNNOTFOUND:
>       len = strlen(argv[0]) + 130;
>       errBuffer =(char*) mxCalloc(len, sizeof(char));            
>       sprintf(errBuffer, "qpParseSum was unable to find requested column,
> '%s', in '%s'  Verify all requested columns exist in the summary
> file.",argv[k+1],argv[0]);      
>     case BADSUMMARYFILE:
>       mxFree(lines);
>       mxFree(sumBuffer);
>       mxFree(noTrash);
>       mxFree(neededColumns);      
>     case FILENOTFOUND:
>       if(errorStatus == FILENOTFOUND) {
>         len = strlen(argv[0])*2 + 200;
>         errBuffer =(char*) mxCalloc(len, sizeof(char));            
>         sprintf(errBuffer, "qpParseSum expects a file that exists, but %s
> does not exist in the path, and can not be opened. Check that %s is
> spelled correctly and that it exists in your current directory.",
> argv[0],argv[0]);
>       }
>     case UNDEFINEDCOLUMN:
>       mxFree(columnTypes);
>       if( argc ) {
>         for( j=argc-1; j>=0; j-- )
>           mxFree( argv[j] );
>         mxFree( argv );
>       }      
>     case MISSINGOUTPUT:
>     case UNBALANCEDINPUTOUTPUT:
>     case ELEMENTNOTSTRING:
>     case CELLNOTSTRING:
>       break;
>     case NOERROR:
>     default:
>       mxFree(lines);
>       mxFree(sumBuffer);
>       mxFree(noTrash);
>       mxFree(neededColumns);
>       mxFree(columnTypes);  
>   }  
>   
> 
>   switch(errorStatus) {
>     case NOERROR:
>       return;    
>     case CELLNOTSTRING:      
>       mexErrMsgIdAndTxt("qpMEX:FunctionCall:WrongTypeOfInput", "qpParseSum
> expects all input to be string data but recieved a cell input element that
> was not a string. Check input values for numeric data."); 
>       break;    
>     case ELEMENTNOTSTRING:
>         mexErrMsgIdAndTxt("qpMEX:FunctionCall:WrongTypeOfInput",
> "qpParseSum expects all input to be string data but recieved an input
> element that was not a string. Check input values for numeric data.  "); 
>       break;    
>     case UNBALANCEDINPUTOUTPUT:
>         mexErrMsgIdAndTxt("qpMEX:FunctionCall:InvalidCall","qpParseSum
> expects the number of output variables(%d) to be equivalent to the number
> of columns requested(%d). Check the number of arguments being passed in. 
> ",nlhs,(argc-1));
>       break;    
>     case MISSINGOUTPUT:
>         mexErrMsgIdAndTxt("qpMEX:FunctionCall:InvalidCall","qpParseSum
> expects at least one output variable, but recieved none."); 
>       break;    
>     case UNDEFINEDCOLUMN:      
>      
> mexErrMsgIdAndTxt("qpMEX:SummaryFileInteraction:DataNotFound","qpParseSum
> expected a defined column, but recieved '%s' which has not been defined in
> summaryColumnLookUpType.m",columnName);
>       break;
>     case FILENOTFOUND:
>       mexErrMsgIdAndTxt("qpMEX:FileInteraction:FileNotFound",errBuffer);              
>       break;    
>     case COLUMNNOTFOUND:
>      
> mexErrMsgIdAndTxt("qpMEX:SummaryFileInteraction:DataNotFound",errBuffer); 
>       break;
>     case BADSUMMARYFILE:  
>      
> mexErrMsgIdAndTxt("qpMEX:SummaryFileInteraction:EncounteredBadVersion","qpParseSum
> expected data to exist for each column, but one row was incomplete.");
>       break;
>     default: 
>       break;
>   }
>   return;
> }
> 
> /*****************************************************************************
> // calcIndex - Calculates the desired index for an array stored in column
> major order
> //
> //  ARGUMENTS:
> //    rows - total number of rows in the table
> //    row - row containing element e
> //    col - column containing element e
> //
> //  RETURNS
> //    An integer representing the index of a column major order entry of
> an array in memory
> 
> *****************************************************************************/
> 
> int calcIndex(int rows, int row, int col) {
>   return rows * col + row;
> }
> 
> %%%%%%%%%%%%%%%%%%%%% testQpLoadAnalyzeData.m
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> 
> function success = testQpLoadAnalyzeData(verbose,cleanUp)
>   more('off');
>   if(~exist('verbose')) verbose = false; end;
>   if(~exist('cleanUp')) cleanUp = false; end;
> 
>   for i = 1:7
>       files{i} = sprintf('00_GEN_99_00000%d.sum',i);
>   end
>   setup(files);
>   
>   success = false;
>   try
>     if(verbose)
>       for i = 5:7
>         t = sprintf('qpLoadAnalyzeData: Bad Calls %d',i);
>         fail = true;
>         try
>           [a b c] = qpLoadAnalyzeData(files{i});
>         catch
>           fail = false;
>         end    
>         if(fail)
>           qpFailTest(t);
>         end
>         qpEndTest(t);
>       end
>     end
>     
>     try
>       for i = 1:4
>         t = sprintf('qpLoadAnalyzeData: Perfect Calls %d',i);
>         [a b c] = qpLoadAnalyzeData(files{i});
>         qpEndTest(t);
>       end
>     catch
>       qpFailTest(t);
>     end  
>     teardown(files,cleanUp);
>     success = true;
>   catch    
>     teardown(files,cleanUp);
>     qpHandleError(mfilename);
>     rethrow(lasterror);
>   end
> end
> 
> function setup(files)
>   a = (1:100)';
>   try
>     writeSummaryFile(files{1},{'rangeReference' 'rangeAvg'
> 'rangeStd'},a,a,a);
>     writeSummaryFile(files{2},{'rangeReference' 'phaseAvg'
> 'phaseStd'},a,a,a);
>     writeSummaryFile(files{3},{'rangeReference' 'phaseHFAvg'
> 'phaseHFStd'},a,a,a);
>     writeSummaryFile(files{4},{'rangeReference' 'phaseLFAvg'
> 'phaseLFStd'},a,a,a);
>     
>     writeSummaryFile(files{5},{'undefined' 'rangeAvg' 'rangeStd'},a,a,a);
>     writeSummaryFile(files{6},{'rangeReference' 'rangeAvg'
> 'undefined'},a,a,a);
>     writeSummaryFile(files{7},{'rangeReference' 'undefined'
> 'rangeStd'},a,a,a);
>   catch
>     qpHandleError([mfilename 'setup']);
>     teardown(files,cleanUp);
>     rethrow(lasterror);
>   end
> end
> 
> function teardown(files,cleanUp)
>   if(cleanUp)
>     for i = 1:length(files)
>       delete(files{i});
>     end
>   end
> end
> 
> %%%%%%%%%%%%%%%%%%%%%%%% qpLoadAnalyzeData.m %%%%%%%%%%%%%%%%%%%%%%%%%
> 
> 
> function [rangeReference mean standard] = qpLoadAnalyzeData(sumFile)
>   try
>     header = qpParseSum(char(sumFile));
> 
>     if(sum(strcmp(header, 'rangeAvg')) == 1)
>       mnStr ='rangeAvg';
>       stStr ='rangeStd';
>     elseif(sum(strcmp(header, 'phaseAvg')) == 1)
>       mnStr = 'phaseAvg';
>       stStr = 'phaseStd';
>     elseif(sum(strcmp(header, 'phaseLFAvg')) == 1)
>       mnStr = 'phaseLFAvg';
>       stStr = 'phaseLFStd';
>     elseif(sum(strcmp(header, 'phaseHFAvg')) == 1)
>       mnStr = 'phaseHFAvg';
>       stStr = 'phaseHFStd';
>     else
>       char(header)
>       disp('Unable to find range/phase Mean and Standard Columns\n');
>       mnStr = input('Please enter the name of the Mean column: ','s');
>       stStr = input('Please enter the name of the Standard column: ','s')
> 
>       disp('\n');
>       disp('Checking for existance... ');
>       if(sum(strcmp(header, mnStr)) == 1)
>         disp(sprintf('%s found ... ', mnStr));
>       else
>         suggestion = ['Check to see if ' sumFile ' is the right file.'];
>        
> error('qp:SummaryFileInteraction:DataNotFound',sprintf('qpLoadAnalyzeData
> expected %s, but could not find it.', mnStr));
>       end
> 
>       if(sum(strcmp(header, stStr)) == 1)
>         disp(sprintf('%s found ... ', stStr));
>       else
>        
> error('qp:SummaryFileInteraction:DataNotFound',sprintf('qpLoadAnalyzeData
> expected %s, but could not find it.', stStr));
>       end
>     end
> 
>     if(sum(strcmp(header, 'rangeReference')) == 1)
>       refStr = 'rangeReference';
>     else
>       char(header)
>       disp('Unable to find reference range data');
>       refStr = input('Please enter the name of the Reference column:
> ','s');
> 
>       if(sum(strcmp(header, refStr)) == 1)
>         disp(sprintf('%s found ... ', refStr));
>       else
>        
> error('qp:SummaryFileInteraction:DataNotFound',sprintf('qpLoadAnalyzeData
> expected %s, but could not find it.', refStr));
>       end
>     end
> 
>     cols{1} = refStr;
>     cols{2} = mnStr;
>     cols{3} = stStr;
> 
>     [rangeReference mean standard] = qpParseSum(sumFile, refStr, mnStr,
> stStr);
> 
>     return
>   catch
>     if(exist('suggestion'))
>       qpHandleError(mfilename,suggestion);
>     else
>       qpHandleError(mfilename);
>     end
> 
>     rethrow(lasterror);
>   end
> end
> 
> 
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% qpEndTest.m
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> 
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> %
> % qpEndTest
> %   Call to end a test case. Prints to the terminal that the test is
> %   over and that it passed. Prints the time it took to run the test.
> %
> % ARGUMENTS
> %   NONE
> %
> % RETURNS
> %   NONE
> %
> % DEPENDENCIES
> %   Call qpSetCurrentTest before this function is called.
> %
> %   Original Author: Brian Kirklin
> %   $Id:  $
> %   (c) Copyright Quantapoint Inc. All rights reserved.
> %
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> 
> function qpEndTest(name)
>   fprintf(['> ' name]);
>   for i = 1:66 - length(name)
>     fprintf('.');
>   end  
>   disp(['<<<[ P ]>>>']);
> end
> 
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% qpFailTest.m
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> 
> function qpFailTest(name)
> 
>   lasterror
>  
>   fprintf(['> ' name]);
>   for i = 1:66 - length(name)
>     fprintf('.');
>   end  
>   disp(['<  ! F !  >']);
>   error('qp:TestingSoftware:FailedTestCase',lasterror.message);   
> end
> 
> %%%%%%%%%%%%%%%%%%%%%%%% writeSummaryFile.m
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> 
> function [succeed] = writeSummaryFile(filename, header, varargin)
> 
>   try
>     succeed = false;
> 
>     if(nargin < 3)
>       error('qp:FunctionCall:InvalidCall',sprintf('writeSummaryFile
> expects at least 3 inputs and recieved %d', nargin));
>     end
> 
>     if(nargout > 1)
>       error('qp:FunctionCall:InvalidCall',sprintf('writeSummaryFile
> expects no more than one output variable and recieved %d', nargout));
>     end
> 
>     if(~ischar(filename))
>       suggestion = 'Check that first argument is a string. [ischar()]';
>       error('qp:FunctionCall:WrongTypeOfInput','writeSummaryFile expects
> filename to be a string, but it was not a string');
>     end
> 
>     % Check number of input arguments
>     columns = max(size(header(1, :)));
>     nvarargin = nargin-2;
>     if (columns ~= nvarargin)
>       error('qp:FunctionCall:InvalidCall',sprintf('writeSummaryFile
> expects the number of column names columns and number of columns of data
> to be the same, but recieved %d column name(s) and %d column(s) of data',
> columns, nvarargin));
>     end
> 
> 
>     % check vectors
>     for it = 1:nvarargin
>       sz = size(varargin{it});
>       if(~isvector(varargin{it}) || sz(2) ~= 1)
>         suggestion = 'Check that each array of data is a vector.
> [isvector()]';
>         error('qp:FunctionCall:WrongTypeOfInput','writeSummaryFile expects
> each column of data to be a verticle vector, but at least one was not.')
>       end
>     end
> 
>     % combine data into 1 array
>     data = varargin{1};
>     data(:, 1) = 0;
>     for col = 1:columns
>       data(:, col+1) = varargin{col};
>     end
> 
>     % Write file
>     [fid msg] = fopen(filename, 'wb');
> 
>     if(fid == -1)
>       if(isequal(msg,'Permision denied'))
>         suggestion = ['Check that ' filename ' is not read only'];
>        
> error('qp:FileInteraction:CouldNotWriteToFile',sprintf('writeSummaryFile
> expected %s to be writable, but it was protected.',filename));
>       elseif(isequal(msg,'Invalid argument'))
>         suggestion = ['Check that ' filename ' contains valid characters,
> is not protected, and is a legal name for a file on your operating
> sytem.'];
>         error('qp:FileInteraction:UnableToOpen',sprintf('writeSummaryFile
> could not open %s because an argument was incorrect',filename));
>       else
>         suggestion = ['Check that ' filename ' contains valid characters,
> is not protected, and is a legal name for a file on your operating
> sytem.'];
>         error('qp:FileInteraction:UnableToOpen',sprintf('writeSummaryFile
> expected to be able to open %s but could not for an unknown
> reason.',filename))
>       end
>     end
> 
>     % Write UTC and then rest of header
>     fprintf(fid, '%s, ', 'UTC');
>     for currentColumn = 1:columns
>       if(currentColumn~=columns)
>         fprintf(fid, '%s, ', char(header(1, currentColumn)));
>       else
>         fprintf(fid, '%s', char(header(1, currentColumn)));
>       end
>     end
>     fprintf(fid, '%s\r\n', '');
> 
>     % Discover what format to write data
>     format = '';
>     for currentColumn = 1:columns+1
>       if(isa(data(:, currentColumn), 'int32'))
>         type = '%d';
>       elseif(isa(data(:, currentColumn), 'float'))
>         type = '%0.7e';
>       elseif(isa(data(:, currentColumn), 'double'))
>         type = '%0.7e';
>       elseif(isa(data(:, curruntColumn), 'numeric'))
>         type = '%0.7e';
>       else
>         type = '%s';
>       end
> 
>       if(currentColumn~=columns+1)
>         format =[format type ', '];
>       else
>         format =[format type '\r\n'];
>       end
>     end
> 
>     % Write the data
>     fprintf(fid, format, data');
> 
>     % Close the file
>     fclose(fid);
> 
>     % Does the file exist?
>     if(exist(filename) ~= 2)
>       return;
>     end
> 
>     qpCrc32(filename,'w');
>     if(~qpCrc32(filename,'c'))
>       return;
>     end
> 
>     succeed = true;
>   catch
> 
>     if(exist('suggestion'))
>       qpHandleError(mfilename, suggestion);
>     else
>       qpHandleError(mfilename);
>     end
> 
>     if(exist('fid'))
>       if(isequal(ferror(fid),''))
>         fclose(fid);
>       end
>     end
> 
>     rethrow(lasterror);
>   end
>   return
> end
> 
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% qpStandardErrorSuggestions.m
> %%%%%%%%%%%%%%%%%%%%
> 
> %%%%%%%%%%%%%55%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> % qpStandardErrorSuggestions(id)
> %   Gets a standard suggestion on how to fix an error, for a standard 
> %   Quantapoint error identifier
> %   
> %   ARGUMENTS:
> %     id - a standard Quantapoint identifier of format 'qp:task:error'.
> %
> %   RETURNS:
> %     sug - a standard suggestion for a standard error identifier.
> %
> %   ADDING NEW SUGGESTIONS:
> %     Add the related identifier to the identifier list 'identifiers'
> %     Add the related suggestion to the suggestion list 'suggestions'
> %
> %   MATLAB/Octave portability unconfirmed
> %
> % Original Author: Brian Kirklin
> % $Id: $
> % (c) Copyright Quantapoint Inc. All rights reserved.
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> 
> function sug = qpStandardErrorSuggestions(id)
>   
>   n = nextNum;  
>   identifiers{n} = 'qp:FileInteraction:UnableToOpen';
>   suggestions{n} = 'Verify that the file is not protected, exists in the
> specified path, and contains no illigal characters in its name.';
> 
>   n = nextNum;  
>   identifiers{n} = 'qp:FileInteraction:FileNotFound';
>   suggestions{n} = 'Check your working directory for the file.';
> 
>   n = nextNum;  
>   identifiers{n} = 'qp:FileInteractionCouldNotWriteToFile';
>   suggestions{n} = 'Check file for protection, check working directory for
> file.';
> 
>   n = nextNum;  
>   identifiers{n} = 'qp:FileInteraction:CouldNotReadFromFile';
>   suggestions{n} = 'Check file for protection, check working directory for
> file.';  
>   
>   n = nextNum;  
>   identifiers{n} = 'qp:FileInteraction:CouldNotCloseFile';
>   suggestions{n} = 'Check for existance of file in working directory, free
> space on current device, etc.';  
>   
>   n = nextNum;  
>   identifiers{n} = 'qp:SummaryFileInteraction:RequestedUndefinedColumn';
>   suggestions{n} = 'Check that the right kind of file was passed in as the
> desired variable was not present.';
>   
>   n = nextNum;  
>   identifiers{n} = 'qp:SummaryFileInteraction:RequestedAbsentColumn';
>   suggestions{n} = 'Check that the right kind of file was passed in as the
> desired variable was not present.';
>   
>   n = nextNum;  
>   identifiers{n} = 'qp:SummaryFileInteraction:EncounteredBlankLine';
>   suggestions{n} = 'Check last opened summary file for a blank line. Blank
> lines are not allowed in summary files.';
>   
>   n = nextNum;  
>   identifiers{n} = 'qp:SummaryFileInteraction:EncounteredBadVersion';
>   suggestions{n} = 'Check the format of the last opened summary file to
> see if its the latest version of summary files.';  
>   
>   n = nextNum;  
>   identifiers{n} = 'qp:SummaryFileInteraction:BadCRC';
>   suggestions{n} = 'The data for the last opened summary file was
> corrupted and is unusable per quantapoint standards. Regenerate the
> data.';
>   
>   n = nextNum;  
>   identifiers{n} = 'qp:LanguageSpecificTask:NeededOctave';
>   suggestions{n} = 'Run this software under Octave.';  
>   
>   n = nextNum;  
>   identifiers{n} = 'qp:LanguageSpecificTask:NeededMatlab';
>   suggestions{n} = 'Run this software under Matlab.';
>   
>   n = nextNum;
>   identifiers{n} = 'qp:LanguageSpecificTask:NeededGNUPlog';
>   suggestions{n} = 'Turn off the jhandles package. Then, run this software
> again.';
>   
>   n = nextNum;
>   identifiers{n} = 'qp:LanguageSpecificTask:NeededJhandles';
>   suggestions{n} = 'Turn on the jhandles package. Then, run this software
> again.';
>   
>   n = nextNum;
>   identifiers{n} = 'qp:TestingSoftware:TestCaseFailed';
>   suggestions{n} = 'Check the code base for programmer errors.';
>   
>   clear('nextNum');
>   
>   idx = strmatch(id, identifiers);
>   if(sum(idx) > 0)
>     sug = suggestions{idx};
>   else
>     le = lasterror;
>     if(sum(strfind(le.identifier,'qpMEX')))
>       nm = strfind(le.message,':');
>       sug = ['Review ''help ' le.message((nm(1)+2):(nm(2)-1)) ''''];
>     else   
>       sug = ['Review ''help ' le.stack.name ''''];
>     end
>   end
>   
>   return
> end
> 
> function n = nextNum;
>   persistent NUMCOUNTER;
>   if(isempty(NUMCOUNTER))
>     NUMCOUNTER = 1;
>   else
>     NUMCOUNTER = NUMCOUNTER + 1;
>   end;
>   n = NUMCOUNTER;
>   return
> end
> 
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% qpCrc32.m
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> 
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> %
> %	result = qpCrc32(file, action)
> %
> % Takes in a file name, then computes the CRC of the chosen file, using
> %	the polynomial 0x04c11db7. If the result of the CRC math is 0, then
> %	the file is assumed to be unaltered since the creation of the original
> %	CRC.
> %
> % ARGUMENTS:
> %   file    - the name of the file on which to compute the CRC, place in
> %	            single quotes
> %   action  - 'c' --> check crc
> %             'w' --> write crc
> %
> % RETURNS:
> %   result - Returns 1 for an ok file.
> %
> % MATLAB/Octave portability confirmed.
> %
> % Original Author:
> % $Id: qpCrc32.m 8998 2008-06-06 20:28:13Z bkirklin $
> % (c) Copyright Quantapoint Inc. All rights reserved.
> %
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> 
> function result = qpCrc32(file, action)
>   try
>     if(nargin < 2)
>       error('qp:FunctionCall:InvalidCall','qpCrc32 expects at least 2
> input values and recieved less');
>     elseif(nargin > 2)
>       error('qp:FunctionCall:InvalidCall','qpCrc32 expects no more than 2
> input values and recieved more');
>     end
> 
>     if(~(strcmp(action,'c') || strcmp(action,'w')))
>       error('qp:FunctionCall:WrongTypeOfInput','qpCrc32 expects an action
> equivalent to ''c'' or ''w'', but recieved some other value.');
>     end
> 
>     if(exist(file,'file') ~= 2)
>       error('qp:FileInteraction:FileNotFound',['qpCrc32 expected to find '
> file ' in the working directory, but could not.']);
>     end    
> 
>     % Polynomial for CRC generation:
>     KEY = uint32(79764919); % Integer equivalent of 0x04c11db7
>     % Generate Look Up Table
>     % Start crc at the decimial equivalent to 0xFFFFFFFF
> 
>     key = KEY;
>     CRCTABLE = bitshift(uint32(0:255), 24);
>     for m = 0:7
>       b2 = bitand(CRCTABLE, bitshift(1, 31));
>       fn0 = find(b2>0);
>       f0 = find(b2==0);
>       CRCTABLE(fn0) = bitxor(uint32(bitshift(CRCTABLE(fn0), 1)), key);
>       CRCTABLE(f0) = uint32(bitshift(CRCTABLE(f0), 1));
>     end
> 
>     CRC = uint32(4294967295);
> 
>     % Read in file, byte by byte and generate CRC Byte by Byte
> 
> 
>     fFile = fopen(file,'rb');
>     if(fFile == -1)
>       if(isequal(msg,'Permision denied'))
>         suggestion = ['Check whether ' file ' is read/write protected'];
>         error('qp:FileInteraction:CouldNotReadFromFile',['qpCrc32 expects
> to be able to read from ' file ', but it was protected.']);
>       else
>         suggestion = ['Check to see if ' file ' exists.'];
>         error('qp:FileInteraction:UnableToOpen',['qpCrc32 expected to be
> able to open ' file ' but could not.'])
>       end
>     end
> 
>     bytes = fread(fFile);
>     fclose(fFile);
> 
>     len = length(bytes);
>     bytes = uint8(bytes);
>     CRCTABLE = uint32(CRCTABLE);
> 
>     for i = 1:len
>       CRC = bitxor(bitshift(CRC, -8),
> CRCTABLE(uint32(bitxor(uint8(bitand(CRC, 255)), bytes(i)))+1));
>     end
> 
>     if(strcmp(action,'c'))
>       result = (~CRC);
>     elseif(strcmp(action,'w'))
>       fOutId = fopen(file, 'ab');
> 
>     if(fOutId == -1)
>       if(isequal(msg,'Permision denied'))
>         suggestion = ['Check whether ' file ' is read/write protected'];
>         error('qp:FileInteraction:CouldNotReadFromFile',['qpOldSum2v14
> expects to be able to read from ' file ', but it was protected.']);
>       else
>         suggestion = ['Check to see if ' file ' exists.'];
>         error('qp:FileInteraction:UnableToOpen',['qpOldSum2v14 expected to
> be able to open ' file ' but could not.'])
>       end
>     end
> 
>       fwrite(fOutId, CRC, 'uint32');
>       fclose(fOutId);
>     end
>     return;
>   catch
>     if(exist('suggestion'))
>       qpHandleError(mfilename, suggestion);
>     else
>       qpHandleError(mfilename);
>     end
> 
>     rethrow(lasterror);
>   end
> end
> 
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% qpHandleError.m
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> 
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> % qpHandleError(functionIdentifier)
> %   called whenever an error is caught, this function is responsible for
> % printing details to the terminal and controlling what information is
> printed
> % based on what function called it.
> %
> % ARGUMENTS
> %   functionIdentifier - An identifier for the function calling
> qpHandleError.
> %                        If the function calling qpHandleError is a
> subfunction,
> %                        or one of may functions inside of a single file,
> then
> %                        functionIdentifier is equivalent to:
> %                           [mfilename ':functionName']
> %                        If the function calling qpHandleError is the
> first
> %                        function in its file, then mfilename will
> suffice.
> %
> %   suggestions -        This field is optional and is used to define
> custom
> %                        suggestions.
> %
> %                        A structure which contains all of the error
> %                        identifiers and suggestions the calling script
> could
> %                        have thrown. Suggestions should have the
> following
> %                        fields:
> %
> %                         > ids - Stores all the identifiers
> %                         > sug - Stores all of the suggestions
> %
> %                       ids and sug should be indexed so that matching
> pairs
> %                       have the same index.
> %
> %   MATLAB/Octave portability unconfirmed.
> %
> %   Original Author: Brian Kirklin
> %   $Id: $
> %   (c) Copyright Quantapoint Inc. All rights reserved.
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> 
> function qpHandleError(functionIdentifier, suggestion)
>   if(nargin <1)
>     return
>   end
>   if(nargin > 2)
>     return
>   end  
>   
>   global TESTING_IS_ACTIVE;
>   if(isempty(TESTING_IS_ACTIVE))
>     TESTING_IS_ACTIVE = false;
>     errFileId = 1;
>   elseif(TESTING_IS_ACTIVE)
>     errFileId = fopen('ErrorLog.txt','a');
>     if(errFileId == -1)
>       error('omg wtf?');      
>     end
>   else
>     errFileId = 1;
>   end
>     
>   le = lasterror;
>   mex = false;
>   
>   if(~isempty(le.identifier)) % Octave errors do not recieve identifiers      
>     if(isequal(le.stack.name,functionIdentifier))    
>       if(sum(strfind(le.identifier,'qpMEX')))  
>         mex = true;
>         idx = strfind(le.message,':');        
>         fprintf(errFileId,['>>> An error occured in '
> le.message((idx(1)+2):(idx(2)-1)) sprintf('\n')]);
>         fprintf(errFileId,['    (' le.identifier ')' sprintf('\n')]);
>         edisp(['Error occured because '
> le.message((idx(2)+1):(length(le.message)-1)) sprintf('\n')],errFileId,'     
> ');
>       else
>         fprintf(errFileId, ['>>> An error occured in ' functionIdentifier
> sprintf('\n')]);
>         fprintf(errFileId, ['    (' le.identifier ')' sprintf('\n')]);
>         edisp(['Error occured because '
> le.message(8:(length(le.message)-1))],errFileId,'      ');
>       end
> 
>       expFound = false;
>       if(nargin == 2)
>         edisp('Suggestion: ',errFileId,'    ');
>         edisp(suggestion,errFileId,'      ');
>         expFound = true;
>       end
> 
>       if(~expFound)
>         edisp('Suggestion: ',errFileId,'    ');
>         edisp(qpStandardErrorSuggestions(le.identifier),errFileId,'     
> ');
>       end
> 
>       edisp([le.identifier ' caused failure in:'],errFileId,'    ');
>       if(mex)
>         fprintf(errFileId, ['      + ' le.message((idx(1)+2):(idx(2)-1))
> sprintf('\n')]);
>       end
>       fprintf(errFileId, ['      + ' functionIdentifier sprintf('\n')]);
>     else
>       fprintf(errFileId, ['      + ' functionIdentifier sprintf('\n')]);
>     end
>   end
>   if(TESTING_IS_ACTIVE)
>     fclose(errFileId);
>   end
> end
> 
> function edisp(txt,errFileId,prepend)
>   a = qpSplit(txt, ' ');
>   for j = 1:length(a)
>     b(j) = length(a{j});
>   end
>   msg = [prepend a{1}];
>   for j = 2:length(a)
>     if(length(msg) + b(j) <= 70)
>       msg = [msg ' ' a{j}];
>     else
>       fprintf(errFileId, [msg sprintf('\n')]);
>       msg = [prepend a{j}];
>     end
>   end
>   fprintf(errFileId, [msg sprintf('\n')]);
> end
> 
> Configuration (please do not edit this section):
> -----------------------------------------------
> 
> uname output:     $UN
> configure opts:   $config_opts
> Fortran compiler: $F77
> FFLAGS:           $FFLAGS
> F2C:              $F2C
> F2CFLAGS:         $F2CFLAGS
> FLIBS:            $FLIBS
> CPPFLAGS:         $CPPFLAGS
> INCFLAGS:         $INCFLAGS
> C compiler:       $CC_AND_VERSION
> CFLAGS:           $CFLAGS
> CPICFLAG:         $CPICFLAG
> C++ compiler:     $CXX_AND_VERSION
> CXXFLAGS:         $CXXFLAGS
> CXXPICFLAG:       $CXXPICFLAG
> LD_CXX:           $LD_CXX
> LDFLAGS:          $LDFLAGS
> LIBFLAGS:         $LIBFLAGS
> RLD_FLAG:         $RLD_FLAG
> BLAS_LIBS:        $BLAS_LIBS
> FFTW_LIBS:        $FFTW_LIBS
> LIBS:             $LIBS
> LEXLIB:           $LEXLIB
> LIBGLOB:          $LIBGLOB
> SED:              $SED
> DEFS:
> 
> EOF
> 
> if $HAVE_FMT; then
>   echo $DEFS | fmt | $SED 's/^/  /' >> $TEMP
> else
>   echo $DEFS >> $TEMP
> fi
> 
> if test $# -gt 0; then
>   if test -f "$1"; then
>     cat >> $TEMP << EOF
> 
> User-preferences (please do not edit this section):
> --------------------------------------------------
> 
> EOF
>     cat $1 >> $TEMP
>   fi
> fi
> 
> chmod u+w $TEMP
> cp $TEMP $TEMP.x
> 
> status=0
> 
> editing=true
> 
> while $editing; do
>   if $EDITOR $TEMP; then
>     while $editing; do
>       echo $echo_n "(a)bort, (e)dit, (l)ist, (s)end? $echo_c"
>       read ans
>       case "$ans" in
>         a* | A*)
>           status=1
>           editing=false
>         ;;
>         e* | E*)
>           break;
>         ;;
>         l* | L*)
>           $PAGER $TEMP
>         ;;
>         s* | S*)
>           editing=false
>         ;;
>       esac
>     done
>   else
>     echo "problems with edit -- no bug report submitted"
>     status=1
>     editing=false
>   fi
> done
> 
> if test $status -eq 0; then
>   if cmp -s $TEMP $TEMP.x; then
>     echo "file not changed -- no bug report submitted"
>     status=1
>   elif test `wc $TEMP | awk '{print $1}'` -eq 0; then
>     echo "empty bug report file -- not submitted"
>     status=1
>   else
> 
> # Try to extract the recipient address, in case the To: line in the
> # message template has been changed.  Also get cc: lines.
> 
>     TO_ADDR=`$SED -e '/^--------[ \t]*$/q' $TEMP | $SED -n -e
> 's/^[Tt][Oo]://p'`
>     CC_ADDR=`$SED -e '/^--------[ \t]*$/q' $TEMP | $SED -n -e
> 's/^[Cc][Cc]://p'`
> 
>     if test -z "$TO_ADDR"; then
>       echo "no valid \`To:' field found in header -- using $BUGADDR
> instead"
>     else
>       BUGADDR="$TO_ADDR"      
>     fi
> 
>     BUGADDR="$BUGADDR $CC_ADDR"
> 
>     TMP_SUB=`$SED -e '/^--------[ \t]*$/q' $TEMP | $SED -n -e
> 's/^Subject://p'`
> 
>     if test -n "$TMP_SUB"; then
>       SUBJECT="$TMP_SUB"
>     fi
> 
> # Delete the `--------' separator in the message.
> 
> # Don't pretty-print this.  Odd whitespace kills Ultrix AWK!
> 
>     awk 'BEGIN{in_header=1;} /^--------[ \t]*$/ {
>       if (in_header) { in_header=0; print ""; next; }
>     } { print $0; }' $TEMP > $TEMP.x
> 
> # Now try to mail it.
> 
>     # indicate that we have not yet sent email successfully
>     status=11
> 
>     if test $status -ne 0; then
>       ( mailx -s "$SUBJECT" $BUGADDR < $TEMP.x ) > /dev/null 2>&1
>       status=$?
>       if test $status -ne 0; then
>         ( Mail -s "$SUBJECT" $BUGADDR < $TEMP.x ) > /dev/null 2>&1
>         status=$?
>         if test $status -ne 0; then
>           ( /usr/ucb/mail -s "$SUBJECT" $BUGADDR < $TEMP.x ) > /dev/null
> 2>&1
>           status=$?
>           # make /bin/mail our last resort -- it ignores the subject line
>           if test $status -ne 0; then
>             ( /bin/mail $BUGADDR < $TEMP.x ) > /dev/null 2>&1
>             status=$?
>             if test $status -ne 0; then
>               echo "unable to send mail..."
>             fi
>           fi
>         fi
>       fi
>     fi
>   fi
> fi
> 
> if test $status -ne 0; then
>   dead_bug_file=$HOME/dead-octave-bug
>   looking_for_file=true;
>   n=1
>   while $looking_for_file; do
>     if test -f "$dead_bug_file-$n"; then
>       n=`expr $n + 1`
>     else
>       looking_for_file=false
>       dead_bug_file=$dead_bug_file-$n
>     fi
>   done
>   echo "saving message in $dead_bug_file";
>   cat $TEMP >> $dead_bug_file;
>   exit 1
> else
>   echo "bug report sent to: $TO_ADDR"
>   echo "             cc to: $CC_ADDR"
> fi
> 
> exit $status
> 
> 

-- 
View this message in context: http://www.nabble.com/pgnuplot-stops-function-in-Octave-3.0.1-tp18266274p18266416.html
Sent from the Octave - Bugs mailing list archive at Nabble.com.



More information about the Bug-octave mailing list