util: add strsplit_len: simplified strtok with delimiter escaping

This will be used to make iterators for configuration values.
This commit is contained in:
David Bremner 2020-08-08 11:16:48 -03:00
parent 319efe21c9
commit 3fb123f215
2 changed files with 37 additions and 0 deletions

View file

@ -24,6 +24,7 @@
#include <ctype.h> #include <ctype.h>
#include <errno.h> #include <errno.h>
#include <stdbool.h>
char * char *
strtok_len (char *s, const char *delim, size_t *len) strtok_len (char *s, const char *delim, size_t *len)
@ -37,6 +38,28 @@ strtok_len (char *s, const char *delim, size_t *len)
return *len ? s : NULL; return *len ? s : NULL;
} }
const char *
strsplit_len (const char *s, char delim, size_t *len)
{
bool escaping = false;
size_t count = 0;
/* Skip initial unescaped delimiters */
while (*s && *s == delim)
s++;
while (s[count] && (escaping || s[count] != delim)) {
escaping = (s[count] == '\\');
count++;
}
if (count==0)
return NULL;
*len = count;
return s;
}
const char * const char *
strtok_len_c (const char *s, const char *delim, size_t *len) strtok_len_c (const char *s, const char *delim, size_t *len)
{ {

View file

@ -26,6 +26,20 @@ char *strtok_len (char *s, const char *delim, size_t *len);
/* Const version of strtok_len. */ /* Const version of strtok_len. */
const char *strtok_len_c (const char *s, const char *delim, size_t *len); const char *strtok_len_c (const char *s, const char *delim, size_t *len);
/* Simplified version of strtok_len, with a single delimiter.
* Handles escaping delimiters with \
* Usage pattern:
*
* const char *tok = input;
* const char *delim = ';';
* size_t tok_len = 0;
*
* while ((tok = strsplit_len (tok + tok_len, delim, &tok_len)) != NULL) {
* // do stuff with string tok of length tok_len
* }
*/
const char *strsplit_len (const char *s, char delim, size_t *len);
/* Return a talloced string with str sanitized. /* Return a talloced string with str sanitized.
* *
* Whitespace characters (tabs and newlines) are replaced with spaces, * Whitespace characters (tabs and newlines) are replaced with spaces,