diff options
author | Andrew Tridgell <tridge@samba.org> | 2001-06-21 09:10:42 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 2001-06-21 09:10:42 +0000 |
commit | 674ee2f1d12b0afc164a9e9072758fd1c5e54df7 (patch) | |
tree | 84890e9066bfd274e800ad74e1cb0d61e49f79ab /source/lib/util_str.c | |
parent | 86613493a9b2e56523153486931d0bf8d39beb7a (diff) | |
download | samba-674ee2f1d12b0afc164a9e9072758fd1c5e54df7.tar.gz samba-674ee2f1d12b0afc164a9e9072758fd1c5e54df7.tar.xz samba-674ee2f1d12b0afc164a9e9072758fd1c5e54df7.zip |
next_token() was supposed to be a reentrant replacement for strtok(),
but the code suffered from bitrot and is not now reentrant. That means
we can get bizarre behaviour
i've fixed this by making next_token() reentrant and creating a
next_token_nr() that is a small non-reentrant wrapper for those lumps
of code (mostly smbclient) that have come to rely on the non-reentrant
behaviour
Diffstat (limited to 'source/lib/util_str.c')
-rw-r--r-- | source/lib/util_str.c | 129 |
1 files changed, 72 insertions, 57 deletions
diff --git a/source/lib/util_str.c b/source/lib/util_str.c index 0f32fda63c9..f1376fe0f7b 100644 --- a/source/lib/util_str.c +++ b/source/lib/util_str.c @@ -23,13 +23,6 @@ extern int DEBUGLEVEL; -static char *last_ptr=NULL; - -void set_first_token(char *ptr) -{ - last_ptr = ptr; -} - /**************************************************************************** Get the next token from a string, return False if none found handles double-quotes. @@ -38,77 +31,99 @@ Extensively modified by Andrew.Tridgell@anu.edu.au ****************************************************************************/ BOOL next_token(char **ptr,char *buff,char *sep, size_t bufsize) { - char *s; - BOOL quoted; - size_t len=1; + char *s; + BOOL quoted; + size_t len=1; - if (!ptr) ptr = &last_ptr; - if (!ptr) return(False); + if (!ptr) return(False); - s = *ptr; + s = *ptr; - /* default to simple separators */ - if (!sep) sep = " \t\n\r"; + /* default to simple separators */ + if (!sep) sep = " \t\n\r"; - /* find the first non sep char */ - while(*s && strchr(sep,*s)) s++; + /* find the first non sep char */ + while (*s && strchr(sep,*s)) s++; + + /* nothing left? */ + if (! *s) return(False); + + /* copy over the token */ + for (quoted = False; len < bufsize && *s && (quoted || !strchr(sep,*s)); s++) { + if (*s == '\"') { + quoted = !quoted; + } else { + len++; + *buff++ = *s; + } + } + + *ptr = (*s) ? s+1 : s; + *buff = 0; + + return(True); +} - /* nothing left? */ - if (! *s) return(False); - /* copy over the token */ - for (quoted = False; len < bufsize && *s && (quoted || !strchr(sep,*s)); s++) - { - if (*s == '\"') { - quoted = !quoted; - } else { - len++; - *buff++ = *s; - } - } - *ptr = (*s) ? s+1 : s; - *buff = 0; - last_ptr = *ptr; +/**************************************************************************** +This is like next_token but is not re-entrant and "remembers" the first +parameter so you can pass NULL. This is useful for user interface code +but beware the fact that it is not re-entrant! +****************************************************************************/ +static char *last_ptr=NULL; - return(True); +BOOL next_token_nr(char **ptr,char *buff,char *sep, size_t bufsize) +{ + BOOL ret; + if (!ptr) ptr = &last_ptr; + + ret = next_token(ptr, buff, sep, bufsize); + last_ptr = *ptr; + return ret; } +void set_first_token(char *ptr) +{ + last_ptr = ptr; +} + + /**************************************************************************** Convert list of tokens to array; dependent on above routine. Uses last_ptr from above - bit of a hack. ****************************************************************************/ char **toktocliplist(int *ctok, char *sep) { - char *s=last_ptr; - int ictok=0; - char **ret, **iret; + char *s=last_ptr; + int ictok=0; + char **ret, **iret; - if (!sep) sep = " \t\n\r"; + if (!sep) sep = " \t\n\r"; - while(*s && strchr(sep,*s)) s++; + while(*s && strchr(sep,*s)) s++; - /* nothing left? */ - if (!*s) return(NULL); + /* nothing left? */ + if (!*s) return(NULL); - do { - ictok++; - while(*s && (!strchr(sep,*s))) s++; - while(*s && strchr(sep,*s)) *s++=0; - } while(*s); - - *ctok=ictok; - s=last_ptr; - - if (!(ret=iret=malloc(ictok*sizeof(char *)))) return NULL; - - while(ictok--) { - *iret++=s; - while(*s++); - while(!*s) s++; - } + do { + ictok++; + while(*s && (!strchr(sep,*s))) s++; + while(*s && strchr(sep,*s)) *s++=0; + } while(*s); + + *ctok=ictok; + s=last_ptr; + + if (!(ret=iret=malloc(ictok*sizeof(char *)))) return NULL; + + while(ictok--) { + *iret++=s; + while(*s++); + while(!*s) s++; + } - return ret; + return ret; } |