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;