72327e4e2d294b9d2fcb6cbdadd4e628c006345b
braney
  Fri Sep 18 10:07:40 2026 -0700
bigChain: move the chain to bigChain conversion into the library

chainRecToBigChain() and chainBlockToBigLink() sat in chainToBigChain.c
next to its main(), so a CGI could not link against them.  Move both into
hg/lib/bigChain.c, add chainToBigChainOne() for one chain and
chainToBigChainList() for a list, and leave the utility as a thin main().
No behavior change; the chainToBigChain test output is unchanged.

refs #38382

diff --git src/hg/utils/chainToBigChain/chainToBigChain.c src/hg/utils/chainToBigChain/chainToBigChain.c
index 2b6cc310740..6537e36ab40 100644
--- src/hg/utils/chainToBigChain/chainToBigChain.c
+++ src/hg/utils/chainToBigChain/chainToBigChain.c
@@ -15,85 +15,38 @@
   "  chainToBigChain chainIn bigChainOut bigLinkOut\n"
   "\n"
   "Output will be sorted\n"
   "\n"
   "To build bigBed files:\n"
   "  bedToBigBed -type=bed6+6 -as=bigChain.as -tab data.bigChain hg38.chrom.sizes data.bb\n"
   "  bedToBigBed -type=bed4+1 -as=bigLink.as -tab data.bigLink hg38.chrom.sizes data.link.bb\n"
   );
 }
 
 /* Command line validation table. */
 static struct optionSpec options[] = {
    {NULL, 0},
 };
 
-struct bigChain *chainRecToBigChain(struct chain *chain)
-/* make a bigChain from a chain */
-{
-struct bigChain *bc;
-AllocVar(bc);
-bc->chrom = cloneString(chain->tName);
-bc->chromStart = chain->tStart;
-bc->chromEnd = chain->tEnd;
-char buf[128];
-safef(buf, sizeof(buf), "%d", chain->id);
-bc->name = cloneString(buf);
-bc->score = 1000;
-bc->strand[0] = chain->qStrand;
-bc->tSize = chain->tSize;
-bc->qName = cloneString(chain->qName);
-bc->qSize = chain->qSize;
-bc->qStart = chain->qStart;
-bc->qEnd = chain->qEnd;
-bc->chainScore = chain->score;
-return bc;
-}
-
-struct bigLink *chainBlockToBigLink(struct chain *chain, struct cBlock *cblk)
-/* make a chain link from a chain block */
-{
-struct bigLink *bl;
-AllocVar(bl);
-bl->chrom = cloneString(chain->tName);
-bl->chromStart = cblk->tStart;
-bl->chromEnd = cblk->tEnd;
-char buf[128];
-safef(buf, sizeof(buf), "%d", chain->id);
-bl->name = cloneString(buf);
-bl->qStart = cblk->qStart;
-return bl;
-}
-
-void convertChain(struct chain *chain, struct bigChain **bigChains, struct bigLink **bigLinks)
-/* convert on chain to bigChain and bigLink */
-{
-for (struct cBlock *cblk = chain->blockList; cblk != NULL; cblk = cblk->next)
-    {
-    slAddHead(bigLinks, chainBlockToBigLink(chain, cblk));
-    }
-slAddHead(bigChains, chainRecToBigChain(chain));
-}
-
 static void convertChains(char *chainIn, struct bigChain **bigChains, struct bigLink **bigLinks)
 /* convert all chains to bigChains and links  */
 {
 struct chain *chain;
 struct lineFile *lf = lineFileOpen(chainIn, TRUE);
 while ((chain = chainRead(lf)) != NULL)
     {
-    convertChain(chain, bigChains, bigLinks);
+    chainToBigChainOne(chain, bigChains, bigLinks);
     chainFree(&chain);
     }
 lineFileClose(&lf);
 slSort(bigChains, bigChainCmpTarget);
 slSort(bigLinks, bigLinkCmpTarget);
 }
 
 static void bigChainWrite(char *bigChainOut, struct bigChain *bigChains)
 /* write bigChain records to a tab file */
 {
 FILE *fh = mustOpen(bigChainOut, "w");
 for (struct bigChain *bc = bigChains; bc != NULL; bc = bc->next)
     bigChainTabOut(bc, fh);
 carefulClose(&fh);
 }