a32f737bf8921c365afc2234e612e3b7b1507578
markd
  Sat Feb 8 12:24:01 2020 -0800
create mafRc to reverse-completment MAF files

diff --git src/hg/ratStuff/mafRc/mafRc.c src/hg/ratStuff/mafRc/mafRc.c
new file mode 100644
index 0000000..02412c8
--- /dev/null
+++ src/hg/ratStuff/mafRc/mafRc.c
@@ -0,0 +1,85 @@
+/* mafRc - Reverse-complement a MAF. */
+#include "common.h"
+#include "linefile.h"
+#include "options.h"
+#include "jksql.h"
+#include "maf.h"
+
+void usage()
+/* Explain usage and exit. */
+{
+errAbort(
+  "mafRc - Reverse-complement a MAF\n"
+  "usage:\n"
+  "   mafRc inMafName outMafName\n"
+  );
+}
+
+/* Command line validation table. */
+static struct optionSpec options[] = {
+   {NULL, 0},
+};
+
+static void exchangeInts(int *i1, int *i2)
+/* exchange two ints */
+{
+int ihold = *i1;
+*i1 = *i2;
+*i2 = ihold;
+}
+
+static void exchangeChars(char *c1, char *c2)
+/* exchange two chars */
+{
+char chold = *c1;
+*c1 = *c2;
+*c2 = chold;
+}
+
+static void mafRcComponent(struct mafComp *mafComp)
+/* reverse-complement a MAF component */
+{
+mafComp->strand = (mafComp->strand == '+') ? '-' : '+';
+mafComp->start = mafComp->srcSize - mafComp-> start;
+if (mafComp->text != NULL)
+    reverseComplement(mafComp->text, strlen(mafComp->text));
+if (mafComp->quality != NULL)
+    reverseBytes(mafComp->quality, strlen( mafComp->quality));
+exchangeChars(&mafComp->leftStatus, &mafComp->rightStatus);
+exchangeInts(&mafComp-> leftLen, &mafComp->rightLen);
+}
+
+static void mafRcBlock(struct mafAli *mafAli)
+/* reverse-complement a MAF block */
+{
+struct mafComp *mafComp;
+for (mafComp = mafAli->components; mafComp != NULL; mafComp = mafComp->next)
+    mafRcComponent(mafComp);
+}
+
+static void mafRc(char *inMafName, char *outMafName)
+/* mafRc - Reverse-complement a MAF. */
+{
+struct mafFile* inMaf = mafOpen(inMafName);
+FILE* outMafFh = mustOpen(outMafName, "w");
+mafWriteStart(outMafFh, inMaf->scoring);
+
+struct mafAli *mafAli;
+while ((mafAli = mafNext(inMaf)) != NULL)
+    {
+    mafRcBlock(mafAli);
+    mafWrite(outMafFh, mafAli);
+    mafAliFree(&mafAli);
+    }
+carefulClose(&outMafFh);
+}
+
+int main(int argc, char *argv[])
+/* Process command line. */
+{
+optionInit(&argc, argv, options);
+if (argc != 3)
+    usage();
+mafRc(argv[1], argv[2]);
+return 0;
+}