Mac binaries
[jabaws.git] / website / archive / binaries / mac / src / muscle / tracebackopt.cpp
diff --git a/website/archive/binaries/mac/src/muscle/tracebackopt.cpp b/website/archive/binaries/mac/src/muscle/tracebackopt.cpp
new file mode 100644 (file)
index 0000000..9df1132
--- /dev/null
@@ -0,0 +1,73 @@
+#include "muscle.h"\r
+#include "pwpath.h"\r
+\r
+void TraceBackToPath(int **TraceBack, unsigned uLengthA,\r
+  unsigned uLengthB, PWPath &Path)\r
+       {\r
+       Path.Clear();\r
+\r
+       PWEdge Edge;\r
+       Edge.uPrefixLengthA = uLengthA;\r
+       Edge.uPrefixLengthB = uLengthB;\r
+\r
+       for (;;)\r
+               {\r
+               if (0 == Edge.uPrefixLengthA && 0 == Edge.uPrefixLengthB)\r
+                       break;\r
+\r
+               int iDelta = TraceBack[Edge.uPrefixLengthA][Edge.uPrefixLengthB];\r
+#if    TRACE\r
+               Log("TraceBack[%u][%u] = %d\n",\r
+                 Edge.uPrefixLengthA, Edge.uPrefixLengthB, iDelta);\r
+#endif\r
+               if (0 == iDelta)\r
+                       {\r
+                       assert(Edge.uPrefixLengthA > 0);\r
+                       assert(Edge.uPrefixLengthB > 0);\r
+\r
+                       Edge.cType = 'M';\r
+                       Path.PrependEdge(Edge);\r
+                       --(Edge.uPrefixLengthA);\r
+                       --(Edge.uPrefixLengthB);\r
+                       continue;\r
+                       }\r
+               else if (iDelta > 0)\r
+                       {\r
+                       Edge.cType = 'D';\r
+                       while (iDelta-- > 0)\r
+                               {\r
+                               assert(Edge.uPrefixLengthA > 0);\r
+\r
+                               Path.PrependEdge(Edge);\r
+                               --(Edge.uPrefixLengthA);\r
+                               }\r
+                       }\r
+               else if (iDelta < 0)\r
+                       {\r
+                       Edge.cType = 'I';\r
+                       while (iDelta++ < 0)\r
+                               {\r
+                               assert(Edge.uPrefixLengthB > 0);\r
+\r
+                               Path.PrependEdge(Edge);\r
+                               --(Edge.uPrefixLengthB);\r
+                               }\r
+                       }\r
+\r
+               if (0 == Edge.uPrefixLengthA && 0 == Edge.uPrefixLengthB)\r
+                       break;\r
+\r
+               assert(Edge.uPrefixLengthA > 0);\r
+               assert(Edge.uPrefixLengthB > 0);\r
+\r
+               Edge.cType = 'M';\r
+               Path.PrependEdge(Edge);\r
+               --(Edge.uPrefixLengthA);\r
+               --(Edge.uPrefixLengthB);\r
+               }\r
+\r
+#if    TRACE\r
+       Log("TraceBackToPath ");\r
+       Path.LogMe();\r
+#endif\r
+       }\r