From d2af2558dc54bf11b16d029a0510fdcd4f1498c8 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Sat, 10 Sep 2011 19:43:46 +0000 Subject: [PATCH] greatly improve escape code for cnp escapes, also fixes all cnp escaping bugs also fix another non-elm cnp crash SVN revision: 63318 --- legacy/elementary/src/lib/elm_cnp_helper.c | 96 +++++++++++++++------- 1 file changed, 66 insertions(+), 30 deletions(-) diff --git a/legacy/elementary/src/lib/elm_cnp_helper.c b/legacy/elementary/src/lib/elm_cnp_helper.c index cb05dfeef6..8769331852 100644 --- a/legacy/elementary/src/lib/elm_cnp_helper.c +++ b/legacy/elementary/src/lib/elm_cnp_helper.c @@ -153,11 +153,11 @@ static const Escape escapes[] = { { "", _PARAGRAPH_SEPARATOR }, { "
", "\n" }, { "<\t>", "\t" }, - { "gt;", ">" }, - { "lt;", "<" }, - { "amp;", "&" }, - { "quot;", "\'" }, - { "dquot;", "\"" } + { ">", ">" }, + { "<", "<" }, + { "&", "&" }, + { """, "'" }, + { "&dquot;", "\"" } }; #define N_ESCAPES ((int)(sizeof(escapes) / sizeof(escapes[0]))) @@ -578,7 +578,7 @@ selection_notify(void *udata __UNUSED__, int type __UNUSED__, void *event) static Eina_Bool -targets_converter(char *target __UNUSED__, void *data, int size __UNUSED__, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize) +targets_converter(char *target __UNUSED__, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *typesize) { int i,count; Ecore_X_Atom *aret; @@ -586,6 +586,13 @@ targets_converter(char *target __UNUSED__, void *data, int size __UNUSED__, void if (!data_ret) return EINA_FALSE; + if (size != sizeof(int)) + { + if (data_ret) *data_ret = strndup(data, size); + if (size_ret) *size_ret = size; + return EINA_TRUE; + } + sel = selections + *((int *)data); for (i = 0, count = 0; i < CNP_N_ATOMS ; i++) @@ -958,8 +965,8 @@ text_converter(char *target __UNUSED__, void *data, int size, void **data_ret, i cnp_debug("text converter\n"); if (size != sizeof(int)) { - if (data_ret) *data_ret = strndup(data, size - 1); - if (size_ret) *size_ret = size - 1; + if (data_ret) *data_ret = strndup(data, size); + if (size_ret) *size_ret = size; return EINA_TRUE; } sel = selections + *((int *)data); @@ -1000,8 +1007,8 @@ general_converter(char *target __UNUSED__, void *data, int size, void **data_ret } else if (size) { - if (data_ret) *data_ret = strndup(data, size - 1); - if (size_ret) *size_ret = size - 1; + if (data_ret) *data_ret = strndup(data, size); + if (size_ret) *size_ret = size; } return EINA_TRUE; } @@ -1032,40 +1039,69 @@ remove_tags(const char *p, int *len) int i; if (!p) return NULL; - q = malloc(strlen(p)+1); + q = malloc(strlen(p) + 1); if (!q) return NULL; ret = q; while (*p) { - if ((*p != '<') && (*p != '&')) *q++ = *p++; - else if (*p == '<') + Eina_Bool esc = EINA_TRUE; + const char *x; + switch (p[0]) { - if ((p[1] == 'b') && (p[2] == 'r') && - ((p[3] == ' ') || (p[3] == '/') || (p[3] == '>'))) - *q++ = '\n'; - else if ((p[1] == 'p') && (p[2] == 's') && (p[3] == '>')) + case '<': + x = strchr(p + 3, '>'); + if (!x) { - strcpy(q, _PARAGRAPH_SEPARATOR); - q += (sizeof(_PARAGRAPH_SEPARATOR)-1); + strcpy(q, p); + if (len) *len = strlen(ret); + return ret; } - while ((*p) && (*p != '>')) p++; - p++; - } - else if (*p == '&') - { - p++; - for (i = 0 ; i < N_ESCAPES ; i++) + if (memcmp(p + 1, "br", 2) && memcmp(p + 1, "ps", 2)) { - if (!strncmp(p,escapes[i].escape, strlen(escapes[i].escape))) + strncpy(q, p, x - p + 1); + p = x + 1; + break; + } + i = x - p - 1; + if (p[i] == '/') i--; + for (; i > 2; i++) + { + if (p[i] != ' ') { - p += strlen(escapes[i].escape); - strcpy(q, escapes[i].value); - q += strlen(escapes[i].value); + esc = EINA_FALSE; break; } } + if (!esc) + { + strncpy(q, p, x - p + 1); + p = x + 1; + break; + } + if (p[1] == 'b') + *q++ = '\n'; + else + { + strcpy(q, _PARAGRAPH_SEPARATOR); + q += sizeof(_PARAGRAPH_SEPARATOR) - 1; + } + p = x + 1; + break; + case '&': + for (i = 3 ; i < N_ESCAPES ; i++) + { + if (strncmp(p, escapes[i].escape, strlen(escapes[i].escape))) + continue; + p += strlen(escapes[i].escape); + strcpy(q, escapes[i].value); + q += strlen(escapes[i].value); + break; + } if (i == N_ESCAPES) *q ++= '&'; + break; + default: + *q++ = *p++; } } *q = 0;