e1a3e66b150100bcb49a4d995aeb38ff95fe43d2 kent Thu Jun 8 23:28:29 2017 -0700 Made nextStringBetween for when you are looking repeatedly for a pattern. diff --git src/lib/common.c src/lib/common.c index 1fc01b9..c7cafb0 100644 --- src/lib/common.c +++ src/lib/common.c @@ -1440,51 +1440,65 @@ } char *rStringIn(char *needle, char *haystack) /* Return last position of needle in haystack, or NULL if it's not there. */ { int nSize = strlen(needle); char *pos; for (pos = haystack + strlen(haystack) - nSize; pos >= haystack; pos -= 1) { if (memcmp(needle, pos, nSize) == 0) return pos; } return NULL; } -char *stringBetween(char *start, char *end, char *haystack) -/* Return string between start and end strings, or NULL if - * none found. The first such instance is returned. - * String must be freed by caller. */ +char *nextStringBetween(char *start, char *end, char **pHaystack) +/* Return next string that occurs between start and end strings + * starting seach at *pHaystack. This will update *pHaystack to after + * end, so it can be called repeatedly. Returns NULL when + * no more to be found*/ { char *pos, *p; int len; +char *haystack = *pHaystack; +if (isEmpty(haystack)) + return NULL; if ((p = stringIn(start, haystack)) != NULL) { pos = p + strlen(start); if ((p = stringIn(end, pos)) != NULL) { len = p - pos; pos = cloneMem(pos, len + 1); pos[len] = 0; + *pHaystack = p; return pos; } } +*pHaystack = NULL; return NULL; } +char *stringBetween(char *start, char *end, char *haystack) +/* Return string between start and end strings, or NULL if + * none found. The first such instance is returned. + * String must be freed by caller. */ +{ +return nextStringBetween(start, end, &haystack); +} + boolean endsWith(char *string, char *end) /* Returns TRUE if string ends with end. */ { int sLen, eLen, offset; sLen = strlen(string); eLen = strlen(end); offset = sLen - eLen; if (offset < 0) return FALSE; return sameString(string+offset, end); } char lastChar(char *s) /* Return last character in string. */ {