Mac binaries
[jabaws.git] / website / archive / binaries / mac / src / muscle / tracebackopt.cpp
1 #include "muscle.h"\r
2 #include "pwpath.h"\r
3 \r
4 void TraceBackToPath(int **TraceBack, unsigned uLengthA,\r
5   unsigned uLengthB, PWPath &Path)\r
6         {\r
7         Path.Clear();\r
8 \r
9         PWEdge Edge;\r
10         Edge.uPrefixLengthA = uLengthA;\r
11         Edge.uPrefixLengthB = uLengthB;\r
12 \r
13         for (;;)\r
14                 {\r
15                 if (0 == Edge.uPrefixLengthA && 0 == Edge.uPrefixLengthB)\r
16                         break;\r
17 \r
18                 int iDelta = TraceBack[Edge.uPrefixLengthA][Edge.uPrefixLengthB];\r
19 #if     TRACE\r
20                 Log("TraceBack[%u][%u] = %d\n",\r
21                   Edge.uPrefixLengthA, Edge.uPrefixLengthB, iDelta);\r
22 #endif\r
23                 if (0 == iDelta)\r
24                         {\r
25                         assert(Edge.uPrefixLengthA > 0);\r
26                         assert(Edge.uPrefixLengthB > 0);\r
27 \r
28                         Edge.cType = 'M';\r
29                         Path.PrependEdge(Edge);\r
30                         --(Edge.uPrefixLengthA);\r
31                         --(Edge.uPrefixLengthB);\r
32                         continue;\r
33                         }\r
34                 else if (iDelta > 0)\r
35                         {\r
36                         Edge.cType = 'D';\r
37                         while (iDelta-- > 0)\r
38                                 {\r
39                                 assert(Edge.uPrefixLengthA > 0);\r
40 \r
41                                 Path.PrependEdge(Edge);\r
42                                 --(Edge.uPrefixLengthA);\r
43                                 }\r
44                         }\r
45                 else if (iDelta < 0)\r
46                         {\r
47                         Edge.cType = 'I';\r
48                         while (iDelta++ < 0)\r
49                                 {\r
50                                 assert(Edge.uPrefixLengthB > 0);\r
51 \r
52                                 Path.PrependEdge(Edge);\r
53                                 --(Edge.uPrefixLengthB);\r
54                                 }\r
55                         }\r
56 \r
57                 if (0 == Edge.uPrefixLengthA && 0 == Edge.uPrefixLengthB)\r
58                         break;\r
59 \r
60                 assert(Edge.uPrefixLengthA > 0);\r
61                 assert(Edge.uPrefixLengthB > 0);\r
62 \r
63                 Edge.cType = 'M';\r
64                 Path.PrependEdge(Edge);\r
65                 --(Edge.uPrefixLengthA);\r
66                 --(Edge.uPrefixLengthB);\r
67                 }\r
68 \r
69 #if     TRACE\r
70         Log("TraceBackToPath ");\r
71         Path.LogMe();\r
72 #endif\r
73         }\r