b3834f9b6ec64e8b6018eca2c0c737cbd394484c
kent
  Sat Dec 19 11:24:16 2020 -0800
Handling some syntax errors with meaningful error messages rather than program crashes.

diff --git src/tabFile/tabToTabDir/tabToTabDir.c src/tabFile/tabToTabDir/tabToTabDir.c
index 6e3f3f8..3f10336 100644
--- src/tabFile/tabToTabDir/tabToTabDir.c
+++ src/tabFile/tabToTabDir/tabToTabDir.c
@@ -211,41 +211,45 @@
     if (isEmpty(val))
 	errAbort("Nothing following %c line %d of %s", c, fileLineNumber, fileName);
     fv->type = fvLink;
     ++gLinkFields;
     }
 else 
     {
     if (c == '$')
 	{
 	char *command = skipLeadingSpaces(s+1);
 	s = skipToSpaces(command);
 	fv->combineHash = hashNew(0);
 	if (startsWithWord("count", command))
 	    {
 	    if (!isEmpty(s))
-		errAbort("Something following $count line %d of %s", fileLineNumber, fileName);;
+		errAbort("Something following $count line %d of %s", fileLineNumber, fileName);
 	    fv->combineType = ctCount;
 	    fv->type = fvCount;
 	    }
         else if (startsWithWord("list", command))
 	    {
 	    fv->combineType = ctUniq;
+	    if (isEmpty(skipLeadingSpaces(s)))
+	        errAbort("Missing parameters to $list line %d of %s", fileLineNumber, fileName);
 	    }
         else if (startsWithWord("stats", command))
 	    {
 	    fv->combineType = ctStats;
+	    if (isEmpty(skipLeadingSpaces(s)))
+	        errAbort("Missing parameters to $stats line %d of %s", fileLineNumber, fileName);
 	    }
 	else
 	    {
 	    errAbort("Unrecognized command $%s line %d of %s", command, fileLineNumber, fileName);
 	    }
 	}
     if (fv->combineHash == NULL || fv->combineType != ctCount)
 	{
 	if (isTotallySimple(s) && hashLookup(symbols->varHash, s) == NULL)
 	    {
 	    fv->val = cloneString(skipLeadingSpaces(s));
 	    eraseTrailingSpaces(fv->val);
 	    fv->type = fvVar;
 	    }
 	else