greatly improve escape code for cnp escapes, also fixes all cnp escaping bugs
authordiscomfitor <discomfitor@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sat, 10 Sep 2011 19:43:46 +0000 (19:43 +0000)
committerdiscomfitor <discomfitor@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sat, 10 Sep 2011 19:43:46 +0000 (19:43 +0000)
also fix another non-elm cnp crash

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/elementary@63318 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/elm_cnp_helper.c

index cb05dfe..8769331 100644 (file)
@@ -153,11 +153,11 @@ static const Escape escapes[] = {
   { "<ps>",  _PARAGRAPH_SEPARATOR },
   { "<br>",  "\n" },
   { "<\t>",  "\t" },
-  { "gt;",   ">" },
-  { "lt;",    "<" },
-  { "amp;",   "&" },
-  { "quot;",  "\'" },
-  { "dquot;", "\"" }
+  { "&gt;",   ">" },
+  { "&lt;",    "<" },
+  { "&amp;",   "&" },
+  { "&quot;",  "'" },
+  { "&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))
+               {
+                  strncpy(q, p, x - p + 1);
+                  p = x + 1;
+                  break;
+               }
+             i = x - p - 1;
+             if (p[i] == '/') i--;
+             for (; i > 2; i++)
                {
-                  if (!strncmp(p,escapes[i].escape, strlen(escapes[i].escape)))
+                  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;