private static void compare(Options options)
        {
            XmlDocument doc1 = new XmlDocument();
            XmlDocument doc2 = new XmlDocument();
            XmlReader   reader;

            reader = new XmlTextReader(options.f1);
            doc1.Load(reader);

            reader = new XmlTextReader(options.f2);
            doc2.Load(reader);
            reader = null;

            SortedLookup lookup = new SortedLookup();

            lookup.LookupPath = options.p1;
            lookup.SortPath   = options.sortPath;

            XmlNodeList nodes1 = lookup.PerformSortedLookup(doc1);
            XmlNodeList nodes2 = lookup.PerformSortedLookup(doc2);

            ICompareStrategy compareStrategy = new NameCompareStrategy(); //$ HARD-CODED
            ArrayList        nodeVisitors    = new ArrayList();

            if (options.performList)
            {
                nodeVisitors.Add(new NodeLister(options.f1, options.f2));
            }
            //$ if ( options.performDiff )
            //$     nodeVisitors.Add(new NodeDiffer(options.f1, options.f2));

            foreach (object v in nodeVisitors)
            {
                NodesVisitor visitor = (NodesVisitor)v;
                applyVisitors(visitor, nodes1, nodes2, compareStrategy);
            }
        }
        private static void applyVisitors(NodesVisitor visitor,
                                          XmlNodeList nodes1,
                                          XmlNodeList nodes2,
                                          ICompareStrategy compareStrategy)
        {
            ArrayList leftNodes  = new ArrayList();
            ArrayList leftKeys   = new ArrayList();
            ArrayList rightNodes = new ArrayList();
            ArrayList rightKeys  = new ArrayList();

            foreach (XmlNode node in nodes1)
            {
                string key = compareStrategy.GetSortValue(node);
                leftNodes.Add(node);
                leftKeys.Add(key);
            }

            foreach (XmlNode node in nodes2)
            {
                string key = compareStrategy.GetSortValue(node);
                rightNodes.Add(node);
                rightKeys.Add(key);
            }

            int idxLeft  = 0;
            int idxRight = 0;

            visitor.Initialize();

            while (idxLeft < leftKeys.Count || idxRight < rightKeys.Count)
            {
                string  leftKey, rightKey;
                XmlNode leftNode = null, rightNode = null;

                if (idxLeft < leftKeys.Count)
                {
                    if (idxRight < rightKeys.Count)
                    {
                        leftKey   = (string)leftKeys[idxLeft];
                        leftNode  = (XmlNode)leftNodes[idxLeft];
                        rightKey  = (string)rightKeys[idxRight];
                        rightNode = (XmlNode)rightNodes[idxRight];

                        if (leftKey.CompareTo(rightKey) < 0)
                        {
                            rightKey  = "";
                            rightNode = null;
                            ++idxLeft;
                        }
                        else if (leftKey.CompareTo(rightKey) > 0)
                        {
                            leftKey  = "";
                            leftNode = null;
                            ++idxRight;
                        }
                        else
                        {
                            ++idxLeft;
                            ++idxRight;
                        }
                    }
                    else
                    {
                        leftKey   = (string)leftKeys[idxLeft];
                        leftNode  = (XmlNode)leftNodes[idxLeft];
                        rightKey  = "";
                        rightNode = null;
                        ++idxLeft;
                    }
                }
                else
                {
                    leftKey   = "";
                    leftNode  = null;
                    rightKey  = (string)rightKeys[idxRight];
                    rightNode = (XmlNode)rightNodes[idxRight];
                    ++idxRight;
                }

                visitor.visitNodes(leftNode, leftKey, rightNode, rightKey);
            }

            visitor.Uninitialize();
        }