Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas
Dir : e17/libs/evas/src/lib/canvas Modified Files: evas_object_textblock.c Log Message: Fix bug introduced with r1.138, removed incorrect offset table. I changed evas_object_textblock_text_markup_get() to just return previously known contents, not try to recreate them set with other means, this was not used (at least in our CVS) and was slow and incorrect. =================================================================== RCS file: /cvs/e/e17/libs/evas/src/lib/canvas/evas_object_textblock.c,v retrieving revision 1.140 retrieving revision 1.141 diff -u -3 -r1.140 -r1.141 --- evas_object_textblock.c 28 Jun 2007 23:22:20 -0000 1.140 +++ evas_object_textblock.c 20 Jul 2007 22:30:12 -0000 1.141 @@ -627,48 +627,6 @@ "Ω\0\xce\xa9\0" ; -static const unsigned short escape_offsets[] = { - 0, 4, 5, 9, 10, 15, 16, 22, 23, 29, 30, 36, - 38, 43, 45, 53, 56, 64, 66, 74, 76, 84, 86, - 94, 96, 103, 105, 112, 114, 121, 123, 128, 130, - 135, 137, 144, 146, 153, 155, 160, 162, 167, - 169, 175, 177, 184, 186, 194, 196, 201, 203, - 209, 212, 218, 220, 226, 228, 235, 237, 244, - 246, 253, 255, 263, 265, 273, 275, 281, 283, - 289, 291, 298, 300, 306, 308, 315, 318, 323, - 326, 331, 334, 340, 343, 349, 352, 356, 359, - 364, 367, 374, 377, 381, 384, 392, 395, 402, - 405, 412, 415, 421, 424, 430, 433, 439, 442, - 448, 451, 457, 460, 466, 469, 475, 478, 486, - 488, 496, 498, 505, 507, 515, 517, 523, 525, - 531, 533, 539, 541, 549, 551, 559, 561, 569, - 571, 576, 578, 586, 588, 596, 598, 606, 608, - 616, 618, 626, 628, 636, 638, 646, 648, 656, - 658, 666, 668, 676, 678, 686, 688, 696, 698, - 705, 707, 714, 716, 723, 725, 732, 734, 741, - 743, 750, 752, 759, 761, 768, 770, 777, 779, - 786, 788, 796, 798, 806, 808, 816, 818, 826, - 828, 836, 838, 846, 848, 856, 858, 866, 868, - 876, 878, 886, 888, 894, 896, 902, 904, 910, - 912, 918, 920, 926, 928, 934, 936, 942, 944, - 950, 952, 958, 960, 966, 968, 976, 978, 986, - 988, 996, 998, 1006, 1008, 1015, 1017, 1024, 1026, - 1034, 1036, 1044, 1046, 1053, 1055, 1062, 1064, 1072, - 1074, 1082, 1084, 1092, 1094, 1102, 1104, 1111, 1113, - 1120, 1122, 1129, 1131, 1136, 1138, 1143, 1145, 1152, - 1154, 1160, 1162, 1169, 1171, 1178, 1180, 1189, 1191, - 1197, 1199, 1204, 1206, 1213, 1215, 1221, 1223, 1230, - 1232, 1240, 1242, 1246, 1248, 1252, 1254, 1263, 1265, - 1269, 1271, 1275, 1277, 1282, 1284, 1291, 1293, 1298, - 1300, 1309, 1311, 1316, 1318, 1323, 1325, 1330, 1332, - 1339, 1341, 1348, 1350, 1356, 1358, 1365, 1367, 1374, - 1376, 1385, 1387, 1393, 1395, 1400, 1402, 1409, 1411, - 1417, 1419, 1426, 1428, 1436, 1438, 1442, 1444, 1448, - 1450, 1459, 1461, 1465, 1467, 1471, 1473, 1478, 1480, - 1487, 1489, 1494, 1496, 1505, 1507, 1512, 1514, 1519, - 1521, 1526, 1528, 1535 -}; - static int _is_white(int c) @@ -2462,6 +2420,55 @@ return o->style; } +static inline void +_advance_after_end_of_string(const char **p_buf) +{ + while (**p_buf != '\0') + (*p_buf)++; + + if (**p_buf == '\0') + (*p_buf)++; +} + +static inline int +_is_eq_and_advance(const char *s, const char *s_end, + const char **p_m, const char *m_end) +{ + for (;((s < s_end) && (*p_m < m_end)); s++, (*p_m)++) + if (*s != **p_m) + { + _advance_after_end_of_string(p_m); + return 0; + } + + if (*p_m < m_end) + _advance_after_end_of_string(p_m); + + return s == s_end; +} + +static inline void +_append_escaped_char(Evas_Textblock_Cursor *cur, const char *s, + const char *s_end) +{ + const char *map_itr, *map_end; + + map_itr = escape_strings; + map_end = map_itr + sizeof(escape_strings); + + while (map_itr < map_end) + { + if (_is_eq_and_advance(s, s_end, &map_itr, map_end)) + { + evas_textblock_cursor_text_append(cur, map_itr); + return; + } + + if (map_itr < map_itr) + _advance_after_end_of_string(&map_itr); + } +} + EAPI void evas_object_textblock_text_markup_set(Evas_Object *obj, const char *text) { @@ -2535,19 +2542,7 @@ } else if (esc_end) { - int i; - - for (i = 0; i < (int)(sizeof(escape_offsets) / sizeof(escape_offsets[0])); i += 2) - { - const char *in = escape_strings + escape_offsets[i]; - const char *out = escape_strings + escape_offsets[i + 1]; - - if (!strncmp(in, esc_start, esc_end - esc_start + 1)) - { - evas_textblock_cursor_text_append(o->cursor, out); - break; - } - } + _append_escaped_char(o->cursor, esc_start, esc_end); esc_start = esc_end = NULL; } else if (*p == 0) @@ -2612,87 +2607,6 @@ evas_object_textblock_text_markup_get(Evas_Object *obj) { TB_HEAD_RETURN(NULL); - if (!o->markup_text) - { - Evas_Textblock_Cursor *cur; - int slen = 0; - int salloc = 0; - - cur = evas_object_textblock_cursor_new(obj); - evas_textblock_cursor_node_first(cur); - do - { - char *s, *p, *ps; - - s = (char *)evas_textblock_cursor_node_text_get(cur); - if (s) - { - p = s; - ps = p; - for (;;) - { - if (*p == 0) - { - o->markup_text = _strbuf_append(o->markup_text, - ps, - &slen, &salloc); - break; - } - else - { - int i; - - for (i = 1; i < (int)(sizeof(escape_offsets) / sizeof(escape_offsets[0])); i += 2) - { - const char *in = escape_strings + escape_offsets[i]; - const char *out = escape_strings + escape_offsets[i - 1]; - - if (!strncmp(in, p, strlen(in))) - { - o->markup_text = _strbuf_append_n(o->markup_text, - ps, p - ps, - &slen, &salloc); - o->markup_text = _strbuf_append(o->markup_text, - out, - &slen, &salloc); - ps = p + strlen(in); - p += strlen(in) - 1; - } - } - } - /* FIXME: strip extra whitespace ala HTML */ - p++; - } - } - else - { - s = (char *)evas_textblock_cursor_node_format_get(cur); - if (s) - { - char *stag; - - o->markup_text = _strbuf_append(o->markup_text, - "<", - &slen, &salloc); - stag = _style_match_replace(o->style, s); - if (stag) - o->markup_text = _strbuf_append(o->markup_text, - stag, - &slen, &salloc); - else - o->markup_text = _strbuf_append(o->markup_text, - s, - &slen, &salloc); - o->markup_text = _strbuf_append(o->markup_text, - ">", - &slen, &salloc); - } - } - - } - while (evas_textblock_cursor_node_next(cur)); - evas_textblock_cursor_free(cur); - } return o->markup_text; } ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2005. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs