summaryrefslogtreecommitdiff
path: root/source3/lib/util_str.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2007-11-30 13:09:04 -0800
committerJeremy Allison <jra@samba.org>2007-11-30 13:09:04 -0800
commit810f760afd814c869df91b47ae3c5de958edb355 (patch)
tree9dcfe0bdc0a0741eb16075f00c20d983930afd08 /source3/lib/util_str.c
parent5b184c3525b19e1c13c229a5e05503d7ab7cc234 (diff)
downloadsamba-810f760afd814c869df91b47ae3c5de958edb355.tar.gz
samba-810f760afd814c869df91b47ae3c5de958edb355.tar.bz2
samba-810f760afd814c869df91b47ae3c5de958edb355.zip
Add talloc versions of all the next_token() functions.
Now I can really start removing fixed length strings... Jeremy. (This used to be commit 0ae61e26547e594e94037d4474a008221e5df8cf)
Diffstat (limited to 'source3/lib/util_str.c')
-rw-r--r--source3/lib/util_str.c105
1 files changed, 102 insertions, 3 deletions
diff --git a/source3/lib/util_str.c b/source3/lib/util_str.c
index f5a50b360e..886ae2a043 100644
--- a/source3/lib/util_str.c
+++ b/source3/lib/util_str.c
@@ -85,6 +85,73 @@ static bool next_token_internal(const char **ptr,
return(true);
}
+static bool next_token_internal_talloc(TALLOC_CTX *ctx,
+ const char **ptr,
+ char **pp_buff,
+ const char *sep,
+ bool ltrim)
+{
+ char *s;
+ char *pbuf;
+ bool quoted;
+ size_t len=1;
+
+ *pp_buff = NULL;
+ if (!ptr) {
+ return(false);
+ }
+
+ s = (char *)*ptr;
+
+ /* default to simple separators */
+ if (!sep) {
+ sep = " \t\n\r";
+ }
+
+ /* find the first non sep char, if left-trimming is requested */
+ if (ltrim) {
+ while (*s && strchr_m(sep,*s))
+ s++;
+ }
+
+ /* nothing left? */
+ if (!*s) {
+ return(false);
+ }
+
+ /* Work out the length needed. */
+ for (quoted = false; *s &&
+ (quoted || !strchr_m(sep,*s)); s++) {
+ if (*s == '\"') {
+ quoted = !quoted;
+ } else {
+ len++;
+ }
+ }
+
+ /* We started with len = 1 so we have space for the nul. */
+ *pp_buff = TALLOC_ARRAY(ctx, char, len);
+ if (!*pp_buff) {
+ return false;
+ }
+
+ /* copy over the token */
+ pbuf = *pp_buff;
+ for (quoted = false; *s &&
+ (quoted || !strchr_m(sep,*s)); s++) {
+ if ( *s == '\"' ) {
+ quoted = !quoted;
+ } else {
+ *pbuf++ = *s;
+ }
+ }
+
+ *ptr = (*s) ? s+1 : s;
+ *pbuf = 0;
+
+ return true;
+}
+
/*
* Get the next token from a string, return false if none found. Handles
* double-quotes. This version trims leading separator characters before
@@ -92,7 +159,15 @@ static bool next_token_internal(const char **ptr,
*/
bool next_token(const char **ptr, char *buff, const char *sep, size_t bufsize)
{
- return next_token_internal(ptr, buff, sep, bufsize, true);
+ return next_token_internal(ptr, buff, sep, bufsize, true);
+}
+
+bool next_token_talloc(TALLOC_CTX *ctx,
+ const char **ptr,
+ char **pp_buff,
+ const char *sep)
+{
+ return next_token_internal_talloc(ctx, ptr, pp_buff, sep, true);
}
/*
@@ -105,7 +180,15 @@ bool next_token_no_ltrim(const char **ptr,
const char *sep,
size_t bufsize)
{
- return next_token_internal(ptr, buff, sep, bufsize, false);
+ return next_token_internal(ptr, buff, sep, bufsize, false);
+}
+
+bool next_token_no_ltrim_talloc(TALLOC_CTX *ctx,
+ const char **ptr,
+ char **pp_buff,
+ const char *sep)
+{
+ return next_token_internal_talloc(ctx, ptr, pp_buff, sep, false);
}
/**
@@ -119,14 +202,30 @@ static const char *last_ptr=NULL;
bool next_token_nr(const char **ptr,char *buff, const char *sep, size_t bufsize)
{
bool ret;
- if (!ptr)
+ if (!ptr) {
ptr = &last_ptr;
+ }
ret = next_token(ptr, buff, sep, bufsize);
last_ptr = *ptr;
return ret;
}
+bool next_token_nr_talloc(TALLOC_CTX *ctx,
+ const char **ptr,
+ char **pp_buff,
+ const char *sep)
+{
+ bool ret;
+ if (!ptr) {
+ ptr = &last_ptr;
+ }
+
+ ret = next_token_talloc(ctx, ptr, pp_buff, sep);
+ last_ptr = *ptr;
+ return ret;
+}
+
void set_first_token(char *ptr)
{
last_ptr = ptr;