X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fnmemsdup.c;h=fcfb074566bf704fbca7c343a39ae53fa0d4e6c1;hp=1f9d4152430246d828e752f7299f27538e594a0a;hb=cfb1b8ff4632b51bec4e5eab18137081efdfb02d;hpb=8356ea58313ee1f350226172cf99bfb0b7c5583c diff --git a/src/nmemsdup.c b/src/nmemsdup.c index 1f9d415..fcfb074 100644 --- a/src/nmemsdup.c +++ b/src/nmemsdup.c @@ -1,5 +1,5 @@ /* 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. */ @@ -57,37 +57,74 @@ void nmem_strsplit_blank(NMEM nmem, const char *dstr, char ***darray, int *num) nmem_strsplit(nmem, " ", dstr, darray, num); } + void nmem_strsplit(NMEM nmem, const char *delim, const char *dstr, char ***darray, int *num) { - const char *cp = dstr; - for (*num = 0; *cp; (*num)++) - { - while (*cp && strchr(delim, *cp)) - cp++; - if (!*cp) - break; - while (*cp && !strchr(delim, *cp)) - cp++; - } - if (!*num) - *darray = 0; - else + 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) +{ + nmem_strsplit_escape(nmem, delim, dstr, darray, num, collapse, 0); +} + +void nmem_strsplit_escape(NMEM nmem, const char *delim, const char *dstr, + char ***darray, int *num, int collapse, + int escape_char) +{ + *darray = 0; + /* two passes over the input string.. */ + while (1) { size_t i = 0; - *darray = (char **) nmem_malloc(nmem, *num * sizeof(**darray)); - for (cp = dstr; *cp; ) + const char *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 != escape_char) + cp++; + if (!*cp) + break; + cp0 = cp; + while (*cp && !strchr(delim, *cp)) + { + if (*cp == escape_char) + cp++; + cp++; + } + if (*darray) + (*darray)[i] = nmem_strdupn(nmem, cp0, cp - cp0); + i++; + } + else + { + cp0 = cp; + while (*cp && !strchr(delim, *cp)) + { + if (*cp == escape_char) + cp++; + cp++; + } + if (*darray) + (*darray)[i] = nmem_strdupn(nmem, cp0, cp - cp0); + i++; + if (!*cp) + break; cp++; - (*darray)[i++] = nmem_strdupn(nmem, cp0, cp - cp0); + } } + *num = i; + if (!*num) + break; /* no items, so stop, *darray=0 already */ + else if (*darray) + break; /* second pass, stop */ + *darray = (char **) nmem_malloc(nmem, *num * sizeof(**darray)); } }