--- /dev/null
+#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