const char *dstr,
char ***darray, int *num);
+/** \brief allocates sub strings out of string using certain delimitors
+ \param nmem NMEM handle
+ \param delim delimitor chars (splits on each char in there)
+ \param dstr string to be split
+ \param darray result string array for each sub string
+ \param num number of result strings
+ \param collapse 1=collapse multiple delims to one; 0=no collapse
+*/
+YAZ_EXPORT void nmem_strsplitx(NMEM nmem, const char *delim,
+ const char *dstr,
+ char ***darray, int *num,
+ int collapse);
+
/** \brief splits string into sub strings delimited by blanks
\param nmem NMEM handle
\param dstr string to be split
nmem_strsplit(nmem, " ", dstr, darray, num);
}
+
void nmem_strsplit(NMEM nmem, const char *delim, const char *dstr,
char ***darray, int *num)
{
+ nmem_strsplitx(nmem, delim, dstr, darray, num, 1);
+}
+
+void nmem_strsplitx(NMEM nmem, const char *delim, const char *dstr,
+ char ***darray, int *num, int collapse)
+{
const char *cp = dstr;
- for (*num = 0; *cp; (*num)++)
+ *num = 0;
+
+ while (1)
{
- while (*cp && strchr(delim, *cp))
- cp++;
- if (!*cp)
- break;
- while (*cp && !strchr(delim, *cp))
+ if (collapse)
+ {
+ if (!*cp)
+ break;
+ while (*cp && strchr(delim, *cp))
+ cp++;
+ if (!*cp)
+ break;
+ while (*cp && !strchr(delim, *cp))
+ cp++;
+ (*num)++;
+ }
+ else
+ {
+ (*num)++;
+ while (*cp && !strchr(delim, *cp))
+ cp++;
+ if (!*cp)
+ break;
cp++;
+ }
}
if (!*num)
*darray = 0;
{
size_t i = 0;
*darray = (char **) nmem_malloc(nmem, *num * sizeof(**darray));
- for (cp = dstr; *cp; )
+ cp = dstr;
+ while (1)
{
const char *cp0;
- while (*cp && strchr(delim, *cp))
- cp++;
- if (!*cp)
- break;
- cp0 = cp;
- while (*cp && !strchr(delim, *cp))
+ if (collapse)
+ {
+ if (!*cp)
+ break;
+ while (*cp && strchr(delim, *cp))
+ cp++;
+ if (!*cp)
+ break;
+ cp0 = cp;
+ while (*cp && !strchr(delim, *cp))
+ cp++;
+ (*darray)[i++] = nmem_strdupn(nmem, cp0, cp - cp0);
+ }
+ else
+ {
+ cp0 = cp;
+ while (*cp && !strchr(delim, *cp))
+ cp++;
+ (*darray)[i++] = nmem_strdupn(nmem, cp0, cp - cp0);
+ if (!*cp)
+ break;
cp++;
- (*darray)[i++] = nmem_strdupn(nmem, cp0, cp - cp0);
+ }
}
}
}
#include <yaz/nmem.h>
#include <yaz/test.h>
-void tst(void)
+void tst_nmem_malloc(void)
{
NMEM n;
int j;
nmem_destroy(n);
}
+void tst_nmem_strsplit(void)
+{
+ NMEM nmem = nmem_create();
+ int num = 0;
+ char **array = 0;
+
+ nmem_strsplit(nmem, ",", "", &array, &num);
+ YAZ_CHECK(num == 0);
+
+ nmem_strsplitx(nmem, ",", "", &array, &num, 0);
+ YAZ_CHECK(num == 1);
+ YAZ_CHECK(num > 0 && !strcmp(array[0], ""));
+
+ nmem_strsplit(nmem, ",", ",,", &array, &num);
+ YAZ_CHECK(num == 0);
+
+ nmem_strsplitx(nmem, ",", ",,", &array, &num, 0);
+ YAZ_CHECK(num == 3);
+ YAZ_CHECK(num > 0 && !strcmp(array[0], ""));
+ YAZ_CHECK(num > 1 && !strcmp(array[1], ""));
+ YAZ_CHECK(num > 2 && !strcmp(array[2], ""));
+
+ nmem_strsplit(nmem, ",", ",a,b,,cd", &array, &num);
+ YAZ_CHECK(num == 3);
+ 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_strsplitx(nmem, ",", ",a,b,,cd", &array, &num, 0);
+
+ YAZ_CHECK(num == 5);
+ 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 > 3 && !strcmp(array[3], ""));
+ YAZ_CHECK(num > 4 && !strcmp(array[4], "cd"));
+
+ nmem_destroy(nmem);
+}
+
int main (int argc, char **argv)
{
YAZ_CHECK_INIT(argc, argv);
- tst();
+ tst_nmem_malloc();
+ tst_nmem_strsplit();
YAZ_CHECK_TERM;
}
/*