9a5c53c204f4d4c780f6e57dc88a58f7a84ea28c kent Tue Aug 6 08:50:23 2019 -0700 Adding new function - fieldedTableAddHead. diff --git src/lib/fieldedTable.c src/lib/fieldedTable.c index 78f8365..15a51c1 100644 --- src/lib/fieldedTable.c +++ src/lib/fieldedTable.c @@ -29,56 +29,81 @@ } return table; } void fieldedTableFree(struct fieldedTable **pTable) /* Free up memory resources associated with table. */ { struct fieldedTable *table = *pTable; if (table != NULL) { lmCleanup(&table->lm); freez(pTable); } } -struct fieldedRow *fieldedTableAdd(struct fieldedTable *table, char **row, int rowSize, int id) -/* Create a new row and add it to table. Return row. */ + +static struct fieldedRow *fieldedTableNewRow(struct fieldedTable *table, + char **row, int rowSize, int id) +/* Create a new row and populate it, but don't add it to table yet. */ { /* Make sure we got right number of fields. */ if (table->fieldCount != rowSize) errAbort("%s starts with %d fields, but at line %d has %d fields instead", table->name, table->fieldCount, id, rowSize); /* Allocate field from local memory and start filling it in. */ struct lm *lm = table->lm; struct fieldedRow *fr; lmAllocVar(lm, fr); lmAllocArray(lm, fr->row, rowSize); fr->id = id; int i; for (i=0; i<rowSize; ++i) fr->row[i] = lmCloneString(lm, row[i]); +return fr; +} + +struct fieldedRow *fieldedTableAdd(struct fieldedTable *table, char **row, int rowSize, int id) +/* Create a new row and add it to table. Return row. */ +{ +struct fieldedRow *fr = fieldedTableNewRow(table, row, rowSize, id); + /* Add it to end of list using cursor to avoid slReverse hassles. */ *(table->cursor) = fr; table->cursor = &fr->next; table->rowCount += 1; return fr; } +struct fieldedRow *fieldedTableAddHead(struct fieldedTable *table, char **row, int rowSize, int id) +/* Create a new row and add it to start of table. Return row. */ +{ +if (table->rowCount == 0) + { + // Let fieldedTableAdd() handle the edges of the empty case + return fieldedTableAdd(table, row, rowSize, id); + } +struct fieldedRow *fr = fieldedTableNewRow(table, row, rowSize, id); +slAddHead(&table->rowList, fr); +table->rowCount += 1; +return fr; +} + + int fieldedTableMaxColChars(struct fieldedTable *table, int colIx) /* Calculate the maximum number of characters in a cell for a column */ { if (colIx >= table->fieldCount) errAbort("fieldedTableMaxColChars on %d, but only have %d columns", colIx, table->fieldCount); int max = strlen(table->fields[colIx]) + 1; struct fieldedRow *fr; for (fr = table->rowList; fr != NULL; fr = fr->next) { char *val = fr->row[colIx]; if (val != NULL) { int len = strlen(val); if (len > max) max = len;