a44421a79fb36cc2036fe116b97ea3bc9590cd0c braney Fri Dec 2 09:34:39 2011 -0800 removed rcsid (#295) diff --git src/lib/spacedColumn.c src/lib/spacedColumn.c index 35fd32c..c1256e4 100644 --- src/lib/spacedColumn.c +++ src/lib/spacedColumn.c @@ -1,135 +1,134 @@ /* spacedColumn - stuff to handle parsing text files where fields are * fixed width rather than tab delimited. */ #include "common.h" #include "linefile.h" #include "spacedColumn.h" #include "obscure.h" #include "sqlNum.h" -static char const rcsid[] = "$Id: spacedColumn.c,v 1.1 2007/03/23 06:29:51 kent Exp $"; struct spacedColumn *spacedColumnFromSample(char *sample) /* Return spaced column list from a sampleline , which is assumed to * have no spaces except between columns */ { struct spacedColumn *col, *colList = NULL; char *dupe = cloneString(sample); char *word, *line = dupe; while ((word = nextWord(&line)) != NULL) { AllocVar(col); col->start = word - dupe; col->size = strlen(word); slAddHead(&colList, col); } freeMem(dupe); slReverse(&colList); return colList; } struct spacedColumn *spacedColumnFromLineFile(struct lineFile *lf) /* Scan through lineFile and figure out column spacing. Assumes * file contains nothing but columns. */ { int maxLine = 64*1024; int lineSize, widestLine = 0; char *projection = needMem(maxLine+1); char *line; struct spacedColumn *colList; int i; /* Create projection of all lines. */ for (i=0; i<maxLine; ++i) projection[i] = ' '; while (lineFileNext(lf, &line, &lineSize)) { if (lineSize > widestLine) widestLine = lineSize; for (i=0; i<lineSize; ++i) { char c = line[i]; if (c != 0 && c != ' ') projection[i] = line[i]; } } projection[widestLine] = 0; colList = spacedColumnFromSample(projection); freeMem(projection); return colList; } struct spacedColumn *spacedColumnFromFile(char *fileName) /* Read file and figure out where columns are. */ { struct lineFile *lf = lineFileOpen(fileName, TRUE); struct spacedColumn *colList = spacedColumnFromLineFile(lf); lineFileClose(&lf); return colList; } int spacedColumnBiggestSize(struct spacedColumn *colList) /* Return size of biggest column. */ { int maxSize = 0; struct spacedColumn *col; for (col = colList; col != NULL; col = col->next) if (maxSize < col->size) maxSize = col->size; return maxSize; } boolean spacedColumnParseLine(struct spacedColumn *colList, char *line, char *row[]) /* Parse line into row according to colList. This will * trim leading and trailing spaces. It will write 0's * into line. Returns FALSE if there's a problem (like * line too short.) */ { struct spacedColumn *col; int i, len = strlen(line); for (i=0, col = colList; col != NULL; col = col->next, ++i) { if (col->start > len) return FALSE; int end = col->start + col->size; if (end > len) end = len; line[end] = 0; row[i] = trimSpaces(line + col->start); } return TRUE; } struct spacedColumn *spacedColumnFromWidthArray(int array[], int size) /* Return a list of spaced columns corresponding to widths in array. * The final char in each column should be whitespace. */ { struct spacedColumn *col, *colList = NULL; int i; int start = 0; for (i=0; i<size; ++i) { int width = array[i]; AllocVar(col); col->start = start; col->size = width-1; slAddHead(&colList, col); start += width; } slReverse(&colList); return colList; } struct spacedColumn *spacedColumnFromSizeCommaList(char *commaList) /* Given an comma-separated list of widths in ascii, return * a list of spacedColumns. */ { struct slName *ascii, *asciiList = commaSepToSlNames(commaList); int colCount = slCount(asciiList); int widths[colCount], i; for (ascii = asciiList, i=0; ascii != NULL; ascii = ascii->next, ++i) widths[i] = sqlUnsigned(ascii->name); slFreeList(&asciiList); return spacedColumnFromWidthArray(widths, colCount); }