src/hg/overlapSelect/rowReader.c 1.5

1.5 2009/07/31 18:09:24 markd
added rcsids
Index: src/hg/overlapSelect/rowReader.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/overlapSelect/rowReader.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -b -B -U 1000000 -r1.4 -r1.5
--- src/hg/overlapSelect/rowReader.c	12 Jun 2008 07:06:15 -0000	1.4
+++ src/hg/overlapSelect/rowReader.c	31 Jul 2009 18:09:24 -0000	1.5
@@ -1,90 +1,92 @@
 /* rowReader - read rows from tab files or databases without length restrictions */
 #include "common.h"
 #include "rowReader.h"
 #include "linefile.h"
 #include "psl.h"
 
+static char const rcsid[] = "$Id$";
+
 struct rowReader *rowReaderOpen(char *fileName, boolean isPslFile)
 /* create a row reader for a file */
 {
 struct rowReader *rr;
 AllocVar(rr);
 if (isPslFile)
     rr->lf = pslFileOpen(fileName); // handles psl headers
 else
     rr->lf = lineFileOpen(fileName, TRUE);
 rr->colSpace = 32;
 AllocArray(rr->row, rr->colSpace);
 return rr;
 }
 
 void rowReaderFree(struct rowReader **rrPtr)
 /* free a row reader */
 {
 struct rowReader *rr = *rrPtr;
 if (rr != NULL)
     {
     lineFileClose(&rr->lf);
     freeMem(rr->row);
     freeMem(rr);
     *rrPtr = NULL;
     }
 }
 
 static void growRow(struct rowReader *rr, int needCols)
 /* grow buffer so it can hold the need number of columns */
 {
 int newSpace = rr->colSpace;
 while (newSpace < needCols)
     newSpace *= 2;
 ExpandArray(rr->row, rr->colSpace, newSpace);
 rr->colSpace = newSpace;
 }
 
 static boolean rowReaderNextFile(struct rowReader *rr)
 /* read the next row into the rowReader from a file. */
 {
 char *line;
 if (!lineFileNextReal(rr->lf, &line))
     return FALSE;
 rr->numCols = chopByChar(line, '\t', NULL, 0);
 if (rr->numCols > rr->colSpace)
     growRow(rr, rr->numCols);
 chopByChar(line, '\t', rr->row, rr->numCols);
 return TRUE;
 }
 
 boolean rowReaderNext(struct rowReader *rr)
 /* read the next row into the rowReader, return FALSE on EOF. */
 {
 return rowReaderNextFile(rr);
 }
 
 void rowReaderExpectAtLeast(struct rowReader *rr, int minCols)
 /* generate an error if there are not enough columns in a row */
 {
 if (rr->numCols < minCols)
     errAbort("%s:%d: expected at least %d columns, got %d", 
              rr->lf->fileName, rr->lf->lineIx, minCols, rr->numCols);
 }
 
 char **rowReaderCloneColumns(struct rowReader *rr)
 /* Make dynamic copy of columns currently in reader.  Vector is NULL terminated
  * and should be released with a single freeMem call. Must be called before
  * autoSql parser is called on a row, as it will modify array rows. */
 {
 int vecSz = (rr->numCols+1)*sizeof(char*);
 int memSz = vecSz;
 int i;
 for (i =-0; i < rr->numCols; i++)
     memSz += strlen(rr->row[i])+1;
 char **rawCols = needMem(memSz);
 char *p = ((char*)rawCols) + vecSz;
 for (i =-0; i < rr->numCols; i++)
     {
     rawCols[i] = p;
     strcpy(p, rr->row[i]);
     p += strlen(rr->row[i]) + 1;
     }
 return rawCols;
 }