13 char props[30][NUM_PROPS + 1];
17 { 'A', 'B', 'C', 'D', /* 1-byte */
18 0xA0, 0x100, 0x400, /* 2-byte */
19 0x800, 0x1000, 0xF000, /* 3-byte */
20 0x10000, 0x20000 /* 4-byte */
23 int nchars = sizeof (chars) / sizeof (chars[0]);
32 gen_text (MText *mt, Text *t)
36 mtext_del (mt, 0, mtext_len (mt));
37 memset (t, 0, sizeof (Text));
38 for (i = 0; i < nchars; i++)
41 mtext_cat_char (mt, chars[i]);
42 t->chars[t->nchars++] = chars[i];
44 for (i = 0; i < t->nchars; i++)
46 int nprops = rand () % (NUM_PROPS + 1);
48 t->props[i][nprops] = '\0';
51 int val = '0' + rand () % 10;
53 mtext_push_prop (mt, i, i + 1, Mt, (void *) val);
54 t->props[i][nprops] = val;
60 text_replace (Text *t1, int from1, int to1, Text *t2, int from2, int to2,
63 int len1 = to1 - from1;
64 int len2 = to2 - from2;
68 log->from = from1, log->to = to1;
69 log->new.nchars = len2;
70 for (i = 0; i < len2; i++)
71 log->new.chars[i] = t2->chars[from2 + i];
75 memmove (t1->chars + from1 + len2, t1->chars + to1,
76 sizeof (int) * (t1->nchars - to1));
77 memmove (t1->props[from1 + len2], t1->props[to1],
78 (NUM_PROPS + 1) * (t1->nchars - to1));
80 memcpy (t1->chars + from1, t2->chars + from2,
85 for (i = to1; i < to2; i++)
86 memcpy (t1->props[i], t1->props[to1 - 1], NUM_PROPS + 1);
88 t1->nchars += len2 - len1;
92 dump_text (const char *prefix, Text *t)
96 printf ("%s", prefix);
98 printf (" null text\n");
101 for (i = 0; i < t->nchars; i++)
102 printf (" %04X", t->chars[i]);
103 printf ("\n%s", prefix);
104 for (i = 0; i < t->nchars; i++)
105 printf (" %-4s", t->props[i]);
111 dump_mtext (const char *prefix, MText *mt)
113 int len = mtext_len (mt), i;
115 printf ("%s", prefix);
116 for (i = 0; i < len; i++)
117 printf (" %04X", mtext_ref_char (mt, i));
118 printf ("\n%s", prefix);
119 for (i = 0; i < len; i++)
121 void *values[NUM_PROPS];
124 n = mtext_get_prop_values (mt, i, Mt, values, NUM_PROPS);
126 for (j = n - 1; j >= 0; j--)
127 printf ("%c", (int) values[j]);
135 error_exit (int count, struct Log *log, MText *mt, Text *t)
137 printf ("Count: %d, replace %d-%d with", count, log->from, log->to);
138 dump_text ("", &log->new);
139 dump_text ("Orig: ", &log->orig);
140 dump_text ("Text: ", t);
141 dump_mtext ("M-text:", mt);
146 compare (MText *mt, Text *t)
150 if (mtext_len (mt) != t->nchars)
152 for (i = 0; i < t->nchars; i++)
154 void *values[NUM_PROPS];
157 if (mtext_ref_char (mt, i) != t->chars[i])
159 n = mtext_get_prop_values (mt, i, Mt, values, NUM_PROPS);
160 for (j = 0; j < n; j++)
161 if ((int) values[j] != t->props[i][n - 1 - j])
167 #define DEFAULT_STEP 0x10000
170 main (int argc, char **argv)
175 int from1, to1, from2, to2;
177 int step = DEFAULT_STEP;
185 char *stepchar = getenv ("STEP");
189 step = atoi (stepchar);
195 for (count = 0; ; count++)
197 if (((count + 1) % step) == 0)
198 printf ("Count 0x%X\n", count + 1);
206 from1 = rand () % len1, to1 = from1 + (rand () % (len1 - from1));
210 from2 = rand () % len2, to2 = from2 + (rand () % (len2 - from2));
213 text_replace (&t1, from1, to1, &t2, from2, to2, &log);
214 if (mtext_replace (mt1, from1, to1, mt2, from2, to2) < 0
215 || compare (mt1, &t1) < 0)
216 error_exit (count, &log, mt1, &t1);