06d7be056190c14b85e71bc12523f18ea6815b5e
markd
  Mon Dec 7 00:50:29 2020 -0800
BLAT mmap index support merge with master

diff --git src/hg/utils/phyloRenameAndPrune/phyloRenameAndPrune.c src/hg/utils/phyloRenameAndPrune/phyloRenameAndPrune.c
index 0636628..11f55e4 100644
--- src/hg/utils/phyloRenameAndPrune/phyloRenameAndPrune.c
+++ src/hg/utils/phyloRenameAndPrune/phyloRenameAndPrune.c
@@ -1,84 +1,85 @@
 /* phyloRenameAndPrune - Rename or remove leaves of phylogenetic tree and prune any branches with no remaining leaves. */
 #include "common.h"
 #include "hash.h"
 #include "linefile.h"
 #include "obscure.h"
 #include "options.h"
 #include "phyloTree.h"
 
 void usage()
 /* Explain usage and exit. */
 {
 errAbort(
   "phyloRenameAndPrune - Rename or remove leaves of phylogenetic tree and prune any branches with no remaining leaves\n"
   "usage:\n"
-  "   phyloRenameAndPrune treeIn.nh renaming.tab treeOut.nh\n"
+  "   phyloRenameAndPrune treeIn.nh renaming.txt treeOut.nh\n"
 //  "options:\n"
 //  "   -xxx=XXX\n"
-  "renaming.tab has two columns: old name (must uniquely match some leaf in tree) and new name.\n"
+  "renaming.txt has two whitespace-separated columns: old name (must uniquely match\n"
+  "some leaf in tree) and new name.\n"
   );
 }
 
 /* Command line validation table. */
 static struct optionSpec options[] = {
    {NULL, 0},
 };
 
 struct phyloTree *rRenameAndPrune(struct phyloTree *node, struct hash *renaming)
 {
 if (node->numEdges == 0)
     {
     char *newName = NULL;
     if (node->ident->name && (newName = hashFindVal(renaming, node->ident->name)) != NULL)
         node->ident->name = newName;
     else
         return NULL;
     }
 else
     {
     // Rename or prune children
     struct phyloTree *newKids[node->numEdges];
     int newKidCount = 0;
     int i;
     for (i = 0;  i < node->numEdges;  i++)
         {
         struct phyloTree *kid = rRenameAndPrune(node->edges[i], renaming);
         if (kid)
             newKids[newKidCount++] = kid;
         }
     if (newKidCount == 0)
         return NULL;
     else if (newKidCount < node->numEdges)
         {
         // At least one kid was pruned; update node.
         node->numEdges = newKidCount;
         for (i = 0;  i < newKidCount;  i++)
             node->edges[i] = newKids[i];
         }
     }
 return node;
 }
 
 void phyloRenameAndPrune(char *treeInFile, char *renamingFile, char *treeOutFile)
 /* phyloRenameAndPrune - Rename or remove leaves of phylogenetic tree and prune any branches with no remaining leaves. */
 {
 struct phyloTree *tree = phyloOpenTree(treeInFile);
 struct hash *renaming = hashTwoColumnFile(renamingFile);
 tree = rRenameAndPrune(tree, renaming);
 FILE *outF = mustOpen(treeOutFile, "w");
 if (tree)
     phyloPrintTree(tree, outF);
 else
     warn("No leaves were renamed, all were pruned; no tree to write to %s.", treeOutFile);
 carefulClose(&outF);
 }
 
 int main(int argc, char *argv[])
 /* Process command line. */
 {
 optionInit(&argc, argv, options);
 if (argc != 4)
     usage();
 phyloRenameAndPrune(argv[1], argv[2], argv[3]);
 return 0;
 }