greatly improve escape code for cnp escapes, also fixes all cnp escaping bugs

also fix another non-elm cnp crash


SVN revision: 63318
This commit is contained in:
Mike Blumenkrantz 2011-09-10 19:43:46 +00:00
parent 1360b4df3b
commit d2af2558dc
1 changed files with 66 additions and 30 deletions

View File

@ -153,11 +153,11 @@ static const Escape escapes[] = {
{ "<ps>", _PARAGRAPH_SEPARATOR }, { "<ps>", _PARAGRAPH_SEPARATOR },
{ "<br>", "\n" }, { "<br>", "\n" },
{ "<\t>", "\t" }, { "<\t>", "\t" },
{ "gt;", ">" }, { "&gt;", ">" },
{ "lt;", "<" }, { "&lt;", "<" },
{ "amp;", "&" }, { "&amp;", "&" },
{ "quot;", "\'" }, { "&quot;", "'" },
{ "dquot;", "\"" } { "&dquot;", "\"" }
}; };
#define N_ESCAPES ((int)(sizeof(escapes) / sizeof(escapes[0]))) #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 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; int i,count;
Ecore_X_Atom *aret; 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 (!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); sel = selections + *((int *)data);
for (i = 0, count = 0; i < CNP_N_ATOMS ; i++) 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"); cnp_debug("text converter\n");
if (size != sizeof(int)) if (size != sizeof(int))
{ {
if (data_ret) *data_ret = strndup(data, size - 1); if (data_ret) *data_ret = strndup(data, size);
if (size_ret) *size_ret = size - 1; if (size_ret) *size_ret = size;
return EINA_TRUE; return EINA_TRUE;
} }
sel = selections + *((int *)data); sel = selections + *((int *)data);
@ -1000,8 +1007,8 @@ general_converter(char *target __UNUSED__, void *data, int size, void **data_ret
} }
else if (size) else if (size)
{ {
if (data_ret) *data_ret = strndup(data, size - 1); if (data_ret) *data_ret = strndup(data, size);
if (size_ret) *size_ret = size - 1; if (size_ret) *size_ret = size;
} }
return EINA_TRUE; return EINA_TRUE;
} }
@ -1032,40 +1039,69 @@ remove_tags(const char *p, int *len)
int i; int i;
if (!p) return NULL; if (!p) return NULL;
q = malloc(strlen(p)+1); q = malloc(strlen(p) + 1);
if (!q) return NULL; if (!q) return NULL;
ret = q; ret = q;
while (*p) while (*p)
{ {
if ((*p != '<') && (*p != '&')) *q++ = *p++; Eina_Bool esc = EINA_TRUE;
else if (*p == '<') const char *x;
switch (p[0])
{ {
if ((p[1] == 'b') && (p[2] == 'r') && case '<':
((p[3] == ' ') || (p[3] == '/') || (p[3] == '>'))) x = strchr(p + 3, '>');
*q++ = '\n'; if (!x)
else if ((p[1] == 'p') && (p[2] == 's') && (p[3] == '>'))
{ {
strcpy(q, _PARAGRAPH_SEPARATOR); strcpy(q, p);
q += (sizeof(_PARAGRAPH_SEPARATOR)-1); if (len) *len = strlen(ret);
return ret;
} }
while ((*p) && (*p != '>')) p++; if (memcmp(p + 1, "br", 2) && memcmp(p + 1, "ps", 2))
p++;
}
else if (*p == '&')
{
p++;
for (i = 0 ; i < N_ESCAPES ; i++)
{ {
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); esc = EINA_FALSE;
strcpy(q, escapes[i].value);
q += strlen(escapes[i].value);
break; 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 ++= '&'; if (i == N_ESCAPES) *q ++= '&';
break;
default:
*q++ = *p++;
} }
} }
*q = 0; *q = 0;