*** empty log message ***
[m17n/m17n-lib-cs.git] / MText.cs
index b7f273e..fcf4a58 100644 (file)
--- a/MText.cs
+++ b/MText.cs
@@ -478,10 +478,8 @@ namespace M17N.Core
 
     public void DumpPropNested ()
     {
-      Console.Write ("(");
       foreach (MPlist p in intervals)
        ((MInterval) p.Val).DumpNested (true);
-      Console.WriteLine (")");
     }
 
     private class MInterval
@@ -1217,11 +1215,15 @@ namespace M17N.Core
        if (! mergeable (prev))
          return false;
 
+       M17N.DebugPrint ("merging "); DumpOne (false, false);
+       M17N.DebugPrint (" with prev "); prev.DumpOne (false, true);
        int len = prev.Length - prev.LeftLength;
 
        // PREV is Left, Left.Right, ..., or Left....Right.
        if (prev != Left)
          {
+           if (prev.Left != null)
+             prev.Left.Parent = prev.Parent;
            prev.Parent.Right = prev.Left;
            while (prev.Parent != Left)
              {
@@ -1231,7 +1233,11 @@ namespace M17N.Core
          }
        Left.Length -= len;
        if (Left.Length == Left.LeftLength)
-         Left = Left.Left;
+         {
+           if (Left.Left != null)
+             Left.Left.Parent = this;
+           Left = Left.Left;
+         }
        return true;
       }
 
@@ -1242,11 +1248,16 @@ namespace M17N.Core
        if (! mergeable (next))
          return false;
 
-       int len = next.Length - next.LeftLength;
+       M17N.DebugPrint ("merging "); DumpOne (false, false);
+       M17N.DebugPrint (" with next "); next.DumpOne (false, true);
+
+       int len = next.Length - next.RightLength;
 
        // NEXT is Right, Right.Left, ..., or Right....Left.
        if (next != Right)
          {
+           if (next.Right != null)
+             next.Right.Parent = next.Parent;
            next.Parent.Left = next.Right;
            while (next.Parent != Right)
              {
@@ -1255,9 +1266,12 @@ namespace M17N.Core
              }
          }
        Right.Length -= len;
-       if (Right.Length == Right.LeftLength)
-         Right = Right.Left;
-
+       if (Right.Length == Right.RightLength)
+         {
+           if (Right.Right != null)
+             Right.Right.Parent = this;
+           Right = Right.Right;
+         }
        return true;
       }
 
@@ -1329,6 +1343,8 @@ namespace M17N.Core
            Console.Write (")");
            if (newline)
              Console.WriteLine ();
+           if (Length <= 0)
+             throw new Exception ("Invalid interval length");
          }
       }
 
@@ -1350,26 +1366,42 @@ namespace M17N.Core
          }
       }
 
+      private int Depth {
+       get { return (Parent == null ? 0 : Parent.Depth + 1); }
+      }
+
       public void DumpNested (bool force)
       {
+       DumpNested ("", force);
+      }
+
+      public void DumpNested (string indent, bool force)
+      {
        if (force || M17N.debug)
          {
-           update_from_to ();
+           int indent_type = (Parent == null ? 1
+                              : Parent.Left == this ? 0 : 2);
 
-           Console.Write ("#{0}({1} {2} {3}", ID, Length, From, To);
-           foreach (MPlist p in Stack)
-             Console.Write (" " + p.Val);
+           update_from_to ();
            if (Left != null)
              {
-               Console.Write (" left=");
-               Left.DumpNested (force);
+               if (indent_type <= 1)
+                 Left.DumpNested (indent + "  ", force);
+               else
+                 Left.DumpNested (indent + "| ", force);
              }
+           if (indent_type == 0)
+             Console.Write (indent + ".-");
+           else if (indent_type == 2)
+             Console.Write (indent + "`-");
+           DumpOne (true, true);
            if (Right != null)
              {
-               Console.Write (" right=");
-               Right.DumpNested (force);
+               if (indent_type >= 1)
+                 Right.DumpNested (indent + "  ", force);
+               else if (indent_type == 2)
+                 Right.DumpNested (indent + "| ", force);
              }
-           Console.Write (")");
          }
       }
     }