mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-23 11:28:13 +01:00
util: add strsplit_len: simplified strtok with delimiter escaping
This will be used to make iterators for configuration values.
This commit is contained in:
parent
319efe21c9
commit
3fb123f215
2 changed files with 37 additions and 0 deletions
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue