/* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2009 Index Data
+ * Copyright (C) 1995-2011 Index Data
* See the file LICENSE for details.
*/
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);
+ }
}
}
}