Fix nmem_strsplit_escape subsitutes escape char away
authorAdam Dickmeiss <adam@indexdata.dk>
Thu, 22 Sep 2011 12:30:10 +0000 (14:30 +0200)
committerAdam Dickmeiss <adam@indexdata.dk>
Thu, 22 Sep 2011 12:30:10 +0000 (14:30 +0200)
src/nmemsdup.c
test/test_nmem.c

index fcfb074..a0fa637 100644 (file)
@@ -91,29 +91,29 @@ void nmem_strsplit_escape(NMEM nmem, const char *delim, const char *dstr,
                     cp++;
                 if (!*cp)
                     break;
                     cp++;
                 if (!*cp)
                     break;
-                cp0 = cp;
-                while (*cp && !strchr(delim, *cp))
-                {
-                    if (*cp == escape_char)
-                        cp++;
+            }
+
+            cp0 = cp;
+            while (*cp && !strchr(delim, *cp))
+            {
+                if (*cp == escape_char)
                     cp++;
                     cp++;
-                }
-                if (*darray)
-                    (*darray)[i] = nmem_strdupn(nmem, cp0, cp - cp0);
-                i++;
+                cp++;
             }
             }
-            else
+            if (*darray)
             {
             {
-                cp0 = cp;
-                while (*cp && !strchr(delim, *cp))
+                char *dst, *src;
+                (*darray)[i] = nmem_strdupn(nmem, cp0, cp - cp0);
+                dst = src = (*darray)[i];
+                for (; (*dst = *src) != '\0'; src++)                    
                 {
                 {
-                    if (*cp == escape_char)
-                        cp++;
-                    cp++;
+                    if (*src != escape_char)
+                        dst++;
                 }
                 }
-                if (*darray)
-                    (*darray)[i] = nmem_strdupn(nmem, cp0, cp - cp0);
-                i++;
+            }
+            i++;
+            if (!collapse)
+            {
                 if (!*cp)
                     break;
                 cp++;
                 if (!*cp)
                     break;
                 cp++;
index cc34f27..b2a0b7b 100644 (file)
@@ -93,19 +93,19 @@ void tst_nmem_strsplit(void)
     YAZ_CHECK(num == 4);
     YAZ_CHECK(num > 0 && !strcmp(array[0], ""));
     YAZ_CHECK(num > 1 && !strcmp(array[1], "a"));
     YAZ_CHECK(num == 4);
     YAZ_CHECK(num > 0 && !strcmp(array[0], ""));
     YAZ_CHECK(num > 1 && !strcmp(array[1], "a"));
-    YAZ_CHECK(num > 2 && !strcmp(array[2], "b\\,"));
+    YAZ_CHECK(num > 2 && !strcmp(array[2], "b,"));
     YAZ_CHECK(num > 3 && !strcmp(array[3], "cd"));
 
     nmem_strsplit_escape(nmem, ",", "\\,a,b\\,,cd", &array, &num, 0, '\\');
     YAZ_CHECK(num == 3);
     YAZ_CHECK(num > 3 && !strcmp(array[3], "cd"));
 
     nmem_strsplit_escape(nmem, ",", "\\,a,b\\,,cd", &array, &num, 0, '\\');
     YAZ_CHECK(num == 3);
-    YAZ_CHECK(num > 0 && !strcmp(array[0], "\\,a"));
-    YAZ_CHECK(num > 1 && !strcmp(array[1], "b\\,"));
+    YAZ_CHECK(num > 0 && !strcmp(array[0], ",a"));
+    YAZ_CHECK(num > 1 && !strcmp(array[1], "b,"));
     YAZ_CHECK(num > 2 && !strcmp(array[2], "cd"));
 
     nmem_strsplit_escape(nmem, ",", "\\,a,b\\,\\,cd", &array, &num, 0, '\\');
     YAZ_CHECK(num == 2);
     YAZ_CHECK(num > 2 && !strcmp(array[2], "cd"));
 
     nmem_strsplit_escape(nmem, ",", "\\,a,b\\,\\,cd", &array, &num, 0, '\\');
     YAZ_CHECK(num == 2);
-    YAZ_CHECK(num > 0 && !strcmp(array[0], "\\,a"));
-    YAZ_CHECK(num > 1 && !strcmp(array[1], "b\\,\\,cd"));
+    YAZ_CHECK(num > 0 && !strcmp(array[0], ",a"));
+    YAZ_CHECK(num > 1 && !strcmp(array[1], "b,,cd"));
 
     nmem_destroy(nmem);
 }
 
     nmem_destroy(nmem);
 }