From c75fb21062cf605a8d741964e55728c4b1e9f87d Mon Sep 17 00:00:00 2001 From: raster Date: Wed, 22 Oct 2008 04:44:22 +0000 Subject: [PATCH] better escaping! git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@36954 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/lib/Evas.h | 3 + src/lib/canvas/evas_object_textblock.c | 365 ++++++++++++++++----------------- 2 files changed, 183 insertions(+), 185 deletions(-) diff --git a/src/lib/Evas.h b/src/lib/Evas.h index 5723feb..a4c1f2b 100644 --- a/src/lib/Evas.h +++ b/src/lib/Evas.h @@ -624,6 +624,9 @@ extern "C" { } Evas_Textblock_Text_Type; EAPI Evas_Object *evas_object_textblock_add(Evas *e); + + EAPI const char *evas_textblock_escape_string_get(const char *escape); + EAPI const char *evas_textblock_string_escape_get(const char *string, int *len_ret); EAPI Evas_Textblock_Style *evas_textblock_style_new(void); EAPI void evas_textblock_style_free(Evas_Textblock_Style *ts); diff --git a/src/lib/canvas/evas_object_textblock.c b/src/lib/canvas/evas_object_textblock.c index fae1966..a3217dc 100644 --- a/src/lib/canvas/evas_object_textblock.c +++ b/src/lib/canvas/evas_object_textblock.c @@ -530,184 +530,153 @@ _nodes_adjacent_merge(const Evas_Object *obj, Evas_Object_Textblock_Node *n1) */ static const char escape_strings[] = /* most common escaped stuff */ - "<\0\x3c\0" - ">\0\x3e\0" - "&\0\x26\0" - " \0\x20\0" /* NOTE: this here to avoid escaping to   */ - " \0\x20\0" /* NOTE: we allow nsbp's to break as we map early - maybe map to ascii 0x01 and then make the rendering code think 0x01 -> 0x20 */ - ""\0\x22\0" + " \0" "\x20\0" /* NOTE: this here to avoid escaping to   */ + " \0" "\x20\0" /* NOTE: we allow nsbp's to break as we map early - maybe map to ascii 0x01 and then make the rendering code think 0x01 -> 0x20 */ + ""\0" "\x22\0" + "&\0" "\x26\0" + "<\0" "\x3c\0" + ">\0" "\x3e\0" /* all the rest */ - "©\0\xc2\xa9\0" - "®\0\xc2\xae\0" - "…\0\xe2\x80\xa6\0" - "Ñ\0\xc3\x91\0" - "ñ\0\xc3\xb1\0" - "Ç\0\xc3\x87\0" - "ç\0\xc3\xa7\0" - "ß\0\xc3\x9f\0" - "Þ\0\xc3\x9e\0" - "þ\0\xc3\xbe\0" - "Ð\0\xc3\x90\0" - "ð\0\xc3\xb0\0" - "´\0\xc2\xb4\0" - "¸\0\xc2\xb8\0" - "°\0\xc2\xb0\0" - "¨\0\xc2\xa8\0" - "¢\0\xc2\xa2\0" - "£\0\xc2\xa3\0" - "¤\0\xc2\xa4\0" - "¥\0\xc2\xa5\0" - "€\0\xe2\x82\xac\0" - "§\0\xc2\xa7\0" - "¶\0\xc2\xb6\0" - "«\0\xc2\xab\0" - "»\0\xc2\xbb\0" - "¡\0\xc2\xa1\0" - "¿\0\xc2\xbf\0" - "¦\0\xc2\xa6\0" - "ª\0\xc2\xaa\0" - "º\0\xc2\xba\0" - "µ\0\xc2\xb5\0" - "¯\0\xc2\xaf\0" - "⊕\0\xe2\x8a\x95\0" - "∫\0\xe2\x88\xab\0" - "∑\0\xe2\x88\x91\0" - "∏\0\xe2\x88\x8f\0" - "⊥\0\xe2\x8a\xa5\0" - "∨\0\xe2\x88\xa8\0" - "∧\0\xe2\x88\xa7\0" - "≡\0\xe2\x89\xa1\0" - "≠\0\xe2\x89\xa0\0" - "∀\0\xe2\x88\x80\0" - "∃\0\xe2\x88\x83\0" - "∇\0\xe2\x88\x87\0" - "←\0\xe2\x86\x90\0" - "→\0\xe2\x86\x92\0" - "↑\0\xe2\x86\x91\0" - "↓\0\xe2\x86\x93\0" - "↔\0\xe2\x86\x94\0" - "⇐\0\xe2\x87\x90\0" - "⇒\0\xe2\x87\x92\0" - "±\0\xc2\xb1\0" - "·\0\xc2\xb7\0" - "×\0\xc3\x97\0" - "÷\0\xc3\xb7\0" - "¹\0\xc2\xb9\0" - "²\0\xc2\xb2\0" - "³\0\xc2\xb3\0" - "¼\0\xc2\xbc\0" - "½\0\xc2\xbd\0" - "¾\0\xc2\xbe\0" - "¬\0\xc2\xac\0" - "Á\0\xc3\x81\0" - "É\0\xc3\x89\0" - "Í\0\xc3\x8d\0" - "Ó\0\xc3\x93\0" - "Ú\0\xc3\x9a\0" - "Ý\0\xc3\x9d\0" - "á\0\xc3\xa1\0" - "é\0\xc3\xa9\0" - "í\0\xc3\xad\0" - "ó\0\xc3\xb3\0" - "ú\0\xc3\xba\0" - "ý\0\xc3\xbd\0" - "Â\0\xc3\x82\0" - "Ê\0\xc3\x8a\0" - "Î\0\xc3\x8e\0" - "Ô\0\xc3\x94\0" - "Û\0\xc3\x9b\0" - "â\0\xc3\xa2\0" - "ê\0\xc3\xaa\0" - "î\0\xc3\xae\0" - "ô\0\xc3\xb4\0" - "û\0\xc3\xbb\0" - "À\0\xc3\x80\0" - "È\0\xc3\x88\0" - "Ì\0\xc3\x8c\0" - "Ò\0\xc3\x92\0" - "Ù\0\xc3\x99\0" - "à\0\xc3\xa0\0" - "è\0\xc3\xa8\0" - "ì\0\xc3\xac\0" - "ò\0\xc3\xb2\0" - "ù\0\xc3\xb9\0" - "Ä\0\xc3\x84\0" - "Ë\0\xc3\x8b\0" - "Ï\0\xc3\x8f\0" - "Ö\0\xc3\x96\0" - "ä\0\xc3\xa4\0" - "ë\0\xc3\xab\0" - "ï\0\xc3\xaf\0" - "ö\0\xc3\xb6\0" - "ü\0\xc3\xbc\0" - "ÿ\0\xc3\xbf\0" - "Ã\0\xc3\x83\0" - "ã\0\xc3\xa3\0" - "Õ\0\xc3\x95\0" - "õ\0\xc3\xb5\0" - "å\0\xc3\xa5\0" - "Å\0\xc3\x85\0" - "Ø\0\xc3\x98\0" - "ø\0\xc3\xb8\0" - "Æ\0\xc3\x86\0" - "æ\0\xc3\xa6\0" - "Ñ\0\xc3\x91\0" - "ñ\0\xc3\xb1\0" - "Ç\0\xc3\x87\0" - "ç\0\xc3\xa7\0" - "ß\0\xc3\x9f\0" - "Þ\0\xc3\x9e\0" - "þ\0\xc3\xbe\0" - "Ð\0\xc3\x90\0" - "ð\0\xc3\xb0\0" - "α\0\xce\xb1\0" - "β\0\xce\xb2\0" - "γ\0\xce\xb3\0" - "δ\0\xce\xb4\0" - "ε\0\xce\xb5\0" - "ζ\0\xce\xb6\0" - "η\0\xce\xb7\0" - "θ\0\xce\xb8\0" - "ι\0\xce\xb9\0" - "κ\0\xce\xba\0" - "λ\0\xce\xbb\0" - "μ\0\xce\xbc\0" - "ν\0\xce\xbd\0" - "ο\0\xce\xbf\0" - "ξ\0\xce\xbe\0" - "π\0\xcf\x80\0" - "ρ\0\xcf\x81\0" - "σ\0\xcf\x83\0" - "τ\0\xcf\x84\0" - "υ\0\xcf\x85\0" - "φ\0\xcf\x86\0" - "χ\0\xcf\x87\0" - "ψ\0\xcf\x88\0" - "ω\0\xcf\x89\0" - "Α\0\xce\x91\0" - "Β\0\xce\x92\0" - "Γ\0\xce\x93\0" - "Δ\0\xce\x94\0" - "Ε\0\xce\x95\0" - "Ζ\0\xce\x96\0" - "Η\0\xce\x97\0" - "Θ\0\xce\x98\0" - "Ι\0\xce\x99\0" - "Κ\0\xce\x9a\0" - "Λ\0\xce\x9b\0" - "Μ\0\xce\x9c\0" - "Ν\0\xce\x9d\0" - "Ο\0\xce\x9f\0" - "Ξ\0\xce\x9e\0" - "Π\0\xce\xa0\0" - "Ρ\0\xce\xa1\0" - "Σ\0\xce\xa3\0" - "Τ\0\xce\xa4\0" - "Υ\0\xce\xa5\0" - "Φ\0\xce\xa6\0" - "Χ\0\xce\xa7\0" - "Ψ\0\xce\xa8\0" - "Ω\0\xce\xa9\0" + "¡\0" "\xc2\xa1\0" + "¢\0" "\xc2\xa2\0" + "£\0" "\xc2\xa3\0" + "¤\0" "\xc2\xa4\0" + "¥\0" "\xc2\xa5\0" + "¦\0" "\xc2\xa6\0" + "§\0" "\xc2\xa7\0" + "¨\0" "\xc2\xa8\0" + "©\0" "\xc2\xa9\0" + "ª\0" "\xc2\xaa\0" + "«\0" "\xc2\xab\0" + "¬\0" "\xc2\xac\0" + "®\0" "\xc2\xae\0" + "¯\0" "\xc2\xaf\0" + "°\0" "\xc2\xb0\0" + "±\0" "\xc2\xb1\0" + "²\0" "\xc2\xb2\0" + "³\0" "\xc2\xb3\0" + "´\0" "\xc2\xb4\0" + "µ\0" "\xc2\xb5\0" + "¶\0" "\xc2\xb6\0" + "·\0" "\xc2\xb7\0" + "¸\0" "\xc2\xb8\0" + "¹\0" "\xc2\xb9\0" + "º\0" "\xc2\xba\0" + "»\0" "\xc2\xbb\0" + "¼\0" "\xc2\xbc\0" + "½\0" "\xc2\xbd\0" + "¾\0" "\xc2\xbe\0" + "¿\0" "\xc2\xbf\0" + "à\0" "\xc3\x80\0" + "á\0" "\xc3\x81\0" + "â\0" "\xc3\x82\0" + "ã\0" "\xc3\x83\0" + "ä\0" "\xc3\x84\0" + "å\0" "\xc3\x85\0" + "æ\0" "\xc3\x86\0" + "ç\0" "\xc3\x87\0" + "ç\0" "\xc3\x87\0" + "è\0" "\xc3\x88\0" + "é\0" "\xc3\x89\0" + "ê\0" "\xc3\x8a\0" + "ë\0" "\xc3\x8b\0" + "ì\0" "\xc3\x8c\0" + "í\0" "\xc3\x8d\0" + "î\0" "\xc3\x8e\0" + "ï\0" "\xc3\x8f\0" + "ð\0" "\xc3\x90\0" + "ñ\0" "\xc3\x91\0" + "ñ\0" "\xc3\x91\0" + "ò\0" "\xc3\x92\0" + "ó\0" "\xc3\x93\0" + "ô\0" "\xc3\x94\0" + "õ\0" "\xc3\x95\0" + "ö\0" "\xc3\x96\0" + "×\0" "\xc3\x97\0" + "ø\0" "\xc3\x98\0" + "ù\0" "\xc3\x99\0" + "ú\0" "\xc3\x9a\0" + "û\0" "\xc3\x9b\0" + "ý\0" "\xc3\x9d\0" + "þ\0" "\xc3\x9e\0" + "ß\0" "\xc3\x9f\0" + "à\0" "\xc3\xa0\0" + "á\0" "\xc3\xa1\0" + "â\0" "\xc3\xa2\0" + "ã\0" "\xc3\xa3\0" + "ä\0" "\xc3\xa4\0" + "å\0" "\xc3\xa5\0" + "æ\0" "\xc3\xa6\0" + "ç\0" "\xc3\xa7\0" + "è\0" "\xc3\xa8\0" + "é\0" "\xc3\xa9\0" + "ê\0" "\xc3\xaa\0" + "ë\0" "\xc3\xab\0" + "ì\0" "\xc3\xac\0" + "í\0" "\xc3\xad\0" + "î\0" "\xc3\xae\0" + "ï\0" "\xc3\xaf\0" + "ð\0" "\xc3\xb0\0" + "ñ\0" "\xc3\xb1\0" + "ò\0" "\xc3\xb2\0" + "ó\0" "\xc3\xb3\0" + "ô\0" "\xc3\xb4\0" + "õ\0" "\xc3\xb5\0" + "ö\0" "\xc3\xb6\0" + "÷\0" "\xc3\xb7\0" + "ø\0" "\xc3\xb8\0" + "ù\0" "\xc3\xb9\0" + "ú\0" "\xc3\xba\0" + "û\0" "\xc3\xbb\0" + "ü\0" "\xc3\xbc\0" + "ý\0" "\xc3\xbd\0" + "þ\0" "\xc3\xbe\0" + "ÿ\0" "\xc3\xbf\0" + "α\0" "\xce\x91\0" + "β\0" "\xce\x92\0" + "γ\0" "\xce\x93\0" + "δ\0" "\xce\x94\0" + "ε\0" "\xce\x95\0" + "ζ\0" "\xce\x96\0" + "η\0" "\xce\x97\0" + "θ\0" "\xce\x98\0" + "ι\0" "\xce\x99\0" + "κ\0" "\xce\x9a\0" + "λ\0" "\xce\x9b\0" + "μ\0" "\xce\x9c\0" + "ν\0" "\xce\x9d\0" + "ξ\0" "\xce\x9e\0" + "ο\0" "\xce\x9f\0" + "π\0" "\xce\xa0\0" + "ρ\0" "\xce\xa1\0" + "σ\0" "\xce\xa3\0" + "τ\0" "\xce\xa4\0" + "υ\0" "\xce\xa5\0" + "φ\0" "\xce\xa6\0" + "χ\0" "\xce\xa7\0" + "ψ\0" "\xce\xa8\0" + "ω\0" "\xce\xa9\0" + "…\0" "\xe2\x80\xa6\0" + "€\0" "\xe2\x82\xac\0" + "←\0" "\xe2\x86\x90\0" + "↑\0" "\xe2\x86\x91\0" + "→\0" "\xe2\x86\x92\0" + "↓\0" "\xe2\x86\x93\0" + "↔\0" "\xe2\x86\x94\0" + "←\0" "\xe2\x87\x90\0" + "→\0" "\xe2\x87\x92\0" + "∀\0" "\xe2\x88\x80\0" + "∃\0" "\xe2\x88\x83\0" + "∇\0" "\xe2\x88\x87\0" + "∏\0" "\xe2\x88\x8f\0" + "∑\0" "\xe2\x88\x91\0" + "∧\0" "\xe2\x88\xa7\0" + "∨\0" "\xe2\x88\xa8\0" + "∫\0" "\xe2\x88\xab\0" + "≠\0" "\xe2\x89\xa0\0" + "≡\0" "\xe2\x89\xa1\0" + "⊕\0" "\xe2\x8a\x95\0" + "⊥\0" "\xe2\x8a\xa5\0" ; @@ -2615,6 +2584,7 @@ _escaped_char_match(const char *s, int *adv) match = 1; while ((*mc) && (*sc)) { + if ((unsigned char)*sc < (unsigned char)*mc) return NULL; if (*sc != *mc) match = 0; mc++; sc++; @@ -2629,9 +2599,8 @@ _escaped_char_match(const char *s, int *adv) return NULL; } -static inline void -_append_escaped_char(Evas_Textblock_Cursor *cur, const char *s, - const char *s_end) +static inline const char * +_escaped_char_get(const char *s, const char *s_end) { const char *map_itr, *map_end; @@ -2641,14 +2610,36 @@ _append_escaped_char(Evas_Textblock_Cursor *cur, const char *s, 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; - } - + return map_itr; if (map_itr < map_itr) _advance_after_end_of_string(&map_itr); } + return NULL; +} + +EAPI const char * +evas_textblock_escape_string_get(const char *escape) +{ + /* & -> & */ + return _escaped_char_get(escape, escape + strlen(escape)); +} + +EAPI const char * +evas_textblock_string_escape_get(const char *string, int *len_ret) +{ + /* & -> & */ + return _escaped_char_match(string, len_ret); +} + +static inline void +_append_escaped_char(Evas_Textblock_Cursor *cur, const char *s, + const char *s_end) +{ + const char *escape; + + escape = _escaped_char_get(s, s_end); + if (escape) + evas_textblock_cursor_text_append(cur, escape); } static inline void @@ -3521,6 +3512,7 @@ evas_textblock_cursor_text_append(Evas_Textblock_Cursor *cur, const char *text) free(o->markup_text); o->markup_text = NULL; } + _nodes_adjacent_merge(cur->obj, n); evas_object_change(cur->obj); } @@ -3595,6 +3587,7 @@ evas_textblock_cursor_text_prepend(Evas_Textblock_Cursor *cur, const char *text) free(o->markup_text); o->markup_text = NULL; } + _nodes_adjacent_merge(cur->obj, n); evas_object_change(cur->obj); } @@ -3611,6 +3604,7 @@ evas_textblock_cursor_format_append(Evas_Textblock_Cursor *cur, const char *form Evas_Object_Textblock_Node *n, *nc, *n2; if (!cur) return; + if ((!format) || (format[0] == 0)) return; o = (Evas_Object_Textblock *)(cur->obj->object_data); nc = cur->node; n = calloc(1, sizeof(Evas_Object_Textblock_Node)); @@ -3688,6 +3682,7 @@ evas_textblock_cursor_format_prepend(Evas_Textblock_Cursor *cur, const char *for Evas_Object_Textblock_Node *n, *nc, *n2; if (!cur) return; + if ((!format) || (format[0] == 0)) return; o = (Evas_Object_Textblock *)(cur->obj->object_data); nc = cur->node; n = calloc(1, sizeof(Evas_Object_Textblock_Node)); -- 2.7.4