8 public enum MTextFormat
10 MTEXT_FORMAT_US_ASCII,
12 MTEXT_FORMAT_UTF_16BE,
13 MTEXT_FORMAT_UTF_16LE,
14 MTEXT_FORMAT_UTF_32BE,
15 MTEXT_FORMAT_UTF_32LE,
22 public enum MTextFormat format;
25 private class MTextPlist : MPlist
27 public class MInterval
31 public int start, end;
32 public MInterval prev, next;
37 public MTextPlist (MText mt)
39 head = tail = new MInterval ();
41 head.end = mt.sb.Length;
45 private StringBuilder sb;
47 private int cache_pos;
48 private int cache_idx;
49 private MTextPlist plist;
51 private static UTF8Encoding utf8 = new UTF8Encoding ();
52 private static UTF32Encoding utf32 = new UTF32Encoding (true, false);
54 private static int count_chars (String str)
56 int len = str.Length, n = 0;
58 for (int i = 0; i < len; i++)
59 n += surrogate_high_p (str[i]) ? 2 : 1;
63 private static int count_chars (StringBuilder str)
65 int len = str.Length, n = 0;
67 for (int i = 0; i < len; i++)
68 n += surrogate_high_p (str[i]) ? 2 : 1;
74 sb = new StringBuilder ();
77 public MText (byte[] str)
79 sb = new StringBuilder (utf8.GetString (str));
80 nchars = count_chars (sb);
83 public MText (String str)
85 sb = new StringBuilder (str);
86 nchars = count_chars (str);
89 public MText (StringBuilder str)
92 nchars = count_chars (str);
95 public static MText operator+ (MText mt1, MText mt2)
97 MText mt = new MText (mt1.sb);
99 mt.sb.Append (mt2.sb);
100 mt.nchars = mt1.nchars + mt2.nchars;
104 private static bool surrogate_high_p (char c)
106 return (c >= 0xD800 && c < 0xDC00);
109 private static bool surrogate_low_p (char c)
111 return (c >= 0xDC00 && c < 0xE000);
114 private int inc_idx (int i)
116 return (i + (surrogate_high_p (sb[i]) ? 2 : 1));
119 private int dec_idx (int i)
121 return (i - (surrogate_low_p (sb[i - 1]) ? 2 : 1));
124 private int pos_to_idx (int pos)
131 if (cache_pos == cache_idx)
133 if (pos < cache_pos - pos)
140 p = cache_pos; i = cache_idx;
146 if (nchars - cache_pos == sb.Length - cache_idx)
147 return (cache_idx + pos - cache_pos);
148 if (pos - cache_pos < nchars - pos)
150 p = cache_pos; i = cache_idx;
155 p = nchars; i = sb.Length;
160 for (; p < pos; i = inc_idx (i), p++);
162 for (; p > pos; i = dec_idx (i), p--);
168 private readonly bool readonlyp;
170 private void insert (int pos, MText mt2, int from, int to)
172 if (pos != cache_pos)
173 pos = pos_to_idx (pos);
177 public int this[int i]
183 sb[i] = (char) value;
186 char high = (char) (0xD800 + ((i - 0x10000) >> 10));
187 char low = (char) (0xDC00 + ((i - 0x10000) & 0x3FF));
189 if (! surrogate_high_p (sb[i]))
198 return (surrogate_high_p (sb[i])
199 ? i = ((sb[i] - 0xD800) << 10) + (sb[i + 1] - 0xDC00) + 0x10000
206 return (new MText (this.sb));
209 public MText ins (int pos, MText mt)
211 insert (pos, mt, 0, mt.nchars);
215 public MText ins (int pos, MText mt, int from, int to)
217 insert (pos, mt, from, to);
222 public class MTextProperty