6 static char XlatEdgeType(char c)
\r
15 static const char *BitsToStr(char Bits)
\r
17 static char Str[] = "xM xD xI";
\r
19 switch (Bits & BIT_xM)
\r
32 switch (Bits & BIT_xD)
\r
42 switch (Bits & BIT_xI)
\r
55 static inline char XChar(char Bits, char cType)
\r
61 switch (Bits & BIT_xM)
\r
81 switch (Bits & BIT_xD)
\r
93 switch (Bits & BIT_xI)
\r
106 switch (Bits & BIT_xE)
\r
118 switch (Bits & BIT_xJ)
\r
135 void BitTraceBack(char **TraceBack, unsigned uLengthA, unsigned uLengthB,
\r
136 char LastEdge, PWPath &Path)
\r
139 Log("BitTraceBack\n");
\r
144 Edge.uPrefixLengthA = uLengthA;
\r
145 Edge.uPrefixLengthB = uLengthB;
\r
146 char Bits = TraceBack[uLengthA][uLengthB];
\r
147 Edge.cType = LastEdge;
\r
151 Log("Prepend %c%d.%d\n", Edge.cType, Edge.uPrefixLengthA, Edge.uPrefixLengthB);
\r
153 char cSave = Edge.cType;
\r
154 Edge.cType = XlatEdgeType(cSave);
\r
155 Path.PrependEdge(Edge);
\r
156 Edge.cType = cSave;
\r
158 unsigned PLA = Edge.uPrefixLengthA;
\r
159 unsigned PLB = Edge.uPrefixLengthB;
\r
160 char Bits = TraceBack[PLA][PLB];
\r
161 char NextEdgeType = XChar(Bits, Edge.cType);
\r
163 Log("XChar(%s, %c) = %c\n", BitsToStr(Bits), Edge.cType, NextEdgeType);
\r
165 switch (Edge.cType)
\r
169 if (Edge.uPrefixLengthA == 0)
\r
170 Quit("BitTraceBack MA=0");
\r
171 if (Edge.uPrefixLengthB == 0)
\r
172 Quit("BitTraceBack MA=0");
\r
173 --(Edge.uPrefixLengthA);
\r
174 --(Edge.uPrefixLengthB);
\r
180 if (Edge.uPrefixLengthA == 0)
\r
181 Quit("BitTraceBack DA=0");
\r
182 --(Edge.uPrefixLengthA);
\r
188 if (Edge.uPrefixLengthB == 0)
\r
189 Quit("BitTraceBack IB=0");
\r
190 --(Edge.uPrefixLengthB);
\r
194 Quit("BitTraceBack: Invalid edge %c", Edge);
\r
197 if (0 == Edge.uPrefixLengthA && 0 == Edge.uPrefixLengthB)
\r
200 Edge.cType = NextEdgeType;
\r