--- /dev/null
+#include "muscle.h"\r
+#include "pwpath.h"\r
+\r
+#define TRACE 0\r
+\r
+void DiffPaths(const PWPath &p1, const PWPath &p2, unsigned Edges1[],\r
+ unsigned *ptruDiffCount1, unsigned Edges2[], unsigned *ptruDiffCount2)\r
+ {\r
+#if TRACE\r
+ Log("DiffPaths\n");\r
+ Log("p1=");\r
+ p1.LogMe();\r
+ Log("p2=");\r
+ p2.LogMe();\r
+#endif\r
+ const unsigned uEdgeCount1 = p1.GetEdgeCount();\r
+ const unsigned uEdgeCount2 = p2.GetEdgeCount();\r
+\r
+ unsigned uDiffCount1 = 0;\r
+ unsigned uDiffCount2 = 0;\r
+ unsigned uEdgeIndex1 = 0;\r
+ unsigned uEdgeIndex2 = 0;\r
+ const PWEdge *Edge1 = &p1.GetEdge(uEdgeIndex1);\r
+ const PWEdge *Edge2 = &p2.GetEdge(uEdgeIndex2);\r
+ for (;;)\r
+ {\r
+ unsigned uEdgeIndexTop1 = uEdgeIndex1;\r
+ unsigned uEdgeIndexTop2 = uEdgeIndex2;\r
+ Edge1 = &p1.GetEdge(uEdgeIndex1);\r
+ Edge2 = &p2.GetEdge(uEdgeIndex2);\r
+#if TRACE\r
+ Log("e1[%u] PLA%u PLB%u %c, e2[%u] PLA%u PLB %u %c DC1=%u DC2=%u\n",\r
+ uEdgeIndex1, Edge1->uPrefixLengthA, Edge1->uPrefixLengthB, Edge1->cType,\r
+ uEdgeIndex2, Edge2->uPrefixLengthA, Edge2->uPrefixLengthB, Edge2->cType,\r
+ uDiffCount1, uDiffCount2);\r
+#endif\r
+ if (Edge1->uPrefixLengthA == Edge2->uPrefixLengthA &&\r
+ Edge1->uPrefixLengthB == Edge2->uPrefixLengthB)\r
+ {\r
+ if (!Edge1->Equal(*Edge2))\r
+ {\r
+ Edges1[uDiffCount1++] = uEdgeIndex1;\r
+ Edges2[uDiffCount2++] = uEdgeIndex2;\r
+ }\r
+ ++uEdgeIndex1;\r
+ ++uEdgeIndex2;\r
+ }\r
+\r
+ else if (Edge2->uPrefixLengthA < Edge1->uPrefixLengthA ||\r
+ Edge2->uPrefixLengthB < Edge1->uPrefixLengthB)\r
+ Edges2[uDiffCount2++] = uEdgeIndex2++;\r
+\r
+ else if (Edge1->uPrefixLengthA < Edge2->uPrefixLengthA ||\r
+ Edge1->uPrefixLengthB < Edge2->uPrefixLengthB)\r
+ Edges1[uDiffCount1++] = uEdgeIndex1++;\r
+\r
+ if (uEdgeCount1 == uEdgeIndex1)\r
+ {\r
+ while (uEdgeIndex2 < uEdgeCount2)\r
+ Edges2[uDiffCount2++] = uEdgeIndex2++;\r
+ goto Done;\r
+ }\r
+ if (uEdgeCount2 == uEdgeIndex2)\r
+ {\r
+ while (uEdgeIndex1 < uEdgeCount1)\r
+ Edges1[uDiffCount1++] = uEdgeIndex1++;\r
+ goto Done;\r
+ }\r
+ if (uEdgeIndex1 == uEdgeIndexTop1 && uEdgeIndex2 == uEdgeIndexTop2)\r
+ Quit("DiffPaths stuck");\r
+ }\r
+Done:;\r
+#if TRACE\r
+ Log("DiffCount1=%u (%u %u)\n", uDiffCount1, uEdgeCount1, uEdgeCount2);\r
+ Log("Diffs1=");\r
+ for (unsigned i = 0; i < uDiffCount1; ++i)\r
+ {\r
+ const PWEdge e = p1.GetEdge(Edges1[i]);\r
+ Log(" %u=%c%u.%u", Edges1[i], e.cType, e.uPrefixLengthA, e.uPrefixLengthB); \r
+ }\r
+ Log("\n");\r
+ Log("DiffCount2=%u\n", uDiffCount2);\r
+ Log("Diffs2=");\r
+ for (unsigned i = 0; i < uDiffCount2; ++i)\r
+ {\r
+ const PWEdge e = p2.GetEdge(Edges2[i]);\r
+ Log(" %u=%c%u.%u", Edges2[i], e.cType, e.uPrefixLengthA, e.uPrefixLengthB); \r
+ }\r
+ Log("\n");\r
+#endif\r
+ *ptruDiffCount1 = uDiffCount1;\r
+ *ptruDiffCount2 = uDiffCount2;\r
+ }\r
+\r
+void TestDiffPaths()\r
+ {\r
+ PWPath p1;\r
+ PWPath p2;\r
+\r
+ p1.AppendEdge('M', 1, 1);\r
+ p1.AppendEdge('M', 2, 2);\r
+ p1.AppendEdge('M', 3, 3);\r
+\r
+ p2.AppendEdge('M', 1, 1);\r
+ p2.AppendEdge('D', 2, 1);\r
+ p2.AppendEdge('I', 2, 2);\r
+ p2.AppendEdge('M', 3, 3);\r
+\r
+ unsigned Edges1[64];\r
+ unsigned Edges2[64];\r
+ unsigned uDiffCount1;\r
+ unsigned uDiffCount2;\r
+ DiffPaths(p1, p2, Edges1, &uDiffCount1, Edges2, &uDiffCount2);\r
+ }\r