summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/lib/util_str.c397
1 files changed, 222 insertions, 175 deletions
diff --git a/source3/lib/util_str.c b/source3/lib/util_str.c
index 75338de4d3..6d1f8fe023 100644
--- a/source3/lib/util_str.c
+++ b/source3/lib/util_str.c
@@ -22,29 +22,34 @@
#include "includes.h"
/****************************************************************************
- Get the next token from a string, return False if none found
- handles double-quotes.
-Based on a routine by GJC@VILLAGE.COM.
-Extensively modified by Andrew.Tridgell@anu.edu.au
+ Get the next token from a string, return False if none found.
+ Handles double-quotes.
+ Based on a routine by GJC@VILLAGE.COM.
+ Extensively modified by Andrew.Tridgell@anu.edu.au
****************************************************************************/
-BOOL next_token(char **ptr,char *buff,char *sep, size_t bufsize)
+
+BOOL next_token(char **ptr,char *buff, const char *sep, size_t bufsize)
{
char *s;
BOOL quoted;
size_t len=1;
- if (!ptr) return(False);
+ if (!ptr)
+ return(False);
s = *ptr;
/* default to simple separators */
- if (!sep) sep = " \t\n\r";
+ if (!sep)
+ sep = " \t\n\r";
/* find the first non sep char */
- while (*s && strchr_m(sep,*s)) s++;
+ while (*s && strchr_m(sep,*s))
+ s++;
/* nothing left? */
- if (! *s) return(False);
+ if (! *s)
+ return(False);
/* copy over the token */
for (quoted = False; len < bufsize && *s && (quoted || !strchr_m(sep,*s)); s++) {
@@ -62,19 +67,19 @@ BOOL next_token(char **ptr,char *buff,char *sep, size_t bufsize)
return(True);
}
-
-
/****************************************************************************
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;
-BOOL next_token_nr(char **ptr,char *buff,char *sep, size_t bufsize)
+BOOL next_token_nr(char **ptr,char *buff, const char *sep, size_t bufsize)
{
BOOL ret;
- if (!ptr) ptr = &last_ptr;
+ if (!ptr)
+ ptr = &last_ptr;
ret = next_token(ptr, buff, sep, bufsize);
last_ptr = *ptr;
@@ -88,47 +93,56 @@ 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.
+ 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 **toktocliplist(int *ctok, const char *sep)
{
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_m(sep,*s)) s++;
+ while(*s && strchr_m(sep,*s))
+ s++;
/* nothing left? */
- if (!*s) return(NULL);
+ if (!*s)
+ return(NULL);
do {
ictok++;
- while(*s && (!strchr_m(sep,*s))) s++;
- while(*s && strchr_m(sep,*s)) *s++=0;
+ while(*s && (!strchr_m(sep,*s)))
+ s++;
+ while(*s && strchr_m(sep,*s))
+ *s++=0;
} while(*s);
*ctok=ictok;
s=last_ptr;
- if (!(ret=iret=malloc(ictok*sizeof(char *)))) return NULL;
+ if (!(ret=iret=malloc(ictok*sizeof(char *))))
+ return NULL;
while(ictok--) {
*iret++=s;
- while(*s++);
- while(!*s) s++;
+ while(*s++)
+ ;
+ while(!*s)
+ s++;
}
return ret;
}
/*******************************************************************
- case insensitive string compararison
+ Case insensitive string compararison.
********************************************************************/
+
int StrCaseCmp(const char *s, const char *t)
{
pstring buf1, buf2;
@@ -138,8 +152,9 @@ int StrCaseCmp(const char *s, const char *t)
}
/*******************************************************************
- case insensitive string compararison, length limited
+ Case insensitive string compararison, length limited.
********************************************************************/
+
int StrnCaseCmp(const char *s, const char *t, size_t n)
{
pstring buf1, buf2;
@@ -149,34 +164,43 @@ int StrnCaseCmp(const char *s, const char *t, size_t n)
}
/*******************************************************************
- compare 2 strings
+ Compare 2 strings.
********************************************************************/
+
BOOL strequal(const char *s1, const char *s2)
{
- if (s1 == s2) return(True);
- if (!s1 || !s2) return(False);
+ if (s1 == s2)
+ return(True);
+ if (!s1 || !s2)
+ return(False);
return(StrCaseCmp(s1,s2)==0);
}
/*******************************************************************
- compare 2 strings up to and including the nth char.
- ******************************************************************/
+ Compare 2 strings up to and including the nth char.
+******************************************************************/
+
BOOL strnequal(const char *s1,const char *s2,size_t n)
{
- if (s1 == s2) return(True);
- if (!s1 || !s2 || !n) return(False);
+ if (s1 == s2)
+ return(True);
+ if (!s1 || !s2 || !n)
+ return(False);
return(StrnCaseCmp(s1,s2,n)==0);
}
/*******************************************************************
- compare 2 strings (case sensitive)
+ Compare 2 strings (case sensitive).
********************************************************************/
+
BOOL strcsequal(const char *s1,const char *s2)
{
- if (s1 == s2) return(True);
- if (!s1 || !s2) return(False);
+ if (s1 == s2)
+ return(True);
+ if (!s1 || !s2)
+ return(False);
return(strcmp(s1,s2)==0);
}
@@ -184,6 +208,7 @@ BOOL strcsequal(const char *s1,const char *s2)
/***************************************************************************
Do a case-insensitive, whitespace-ignoring string compare.
***************************************************************************/
+
int strwicmp(const char *psz1, const char *psz2)
{
/* if BOTH strings are NULL, return TRUE, if ONE is NULL return */
@@ -196,8 +221,7 @@ int strwicmp(const char *psz1, const char *psz2)
return (1);
/* sync the strings on first non-whitespace */
- while (1)
- {
+ while (1) {
while (isspace((int)*psz1))
psz1++;
while (isspace((int)*psz2))
@@ -212,7 +236,9 @@ int strwicmp(const char *psz1, const char *psz2)
}
-/* Convert a string to upper case, but don't modify it */
+/*******************************************************************
+ Convert a string to upper case, but don't modify it.
+********************************************************************/
char *strupper_static(const char *s)
{
@@ -225,21 +251,23 @@ char *strupper_static(const char *s)
}
/*******************************************************************
- convert a string to "normal" form
+ Convert a string to "normal" form.
********************************************************************/
+
void strnorm(char *s)
{
- extern int case_default;
- if (case_default == CASE_UPPER)
- strupper(s);
- else
- strlower(s);
+ extern int case_default;
+ if (case_default == CASE_UPPER)
+ strupper(s);
+ else
+ strlower(s);
}
/*******************************************************************
-check if a string is in "normal" case
+ Check if a string is in "normal" case.
********************************************************************/
-BOOL strisnormal(char *s)
+
+BOOL strisnormal(const char *s)
{
extern int case_default;
if (case_default == CASE_UPPER)
@@ -250,9 +278,10 @@ BOOL strisnormal(char *s)
/****************************************************************************
- string replace
- NOTE: oldc and newc must be 7 bit characters
+ String replace.
+ NOTE: oldc and newc must be 7 bit characters
****************************************************************************/
+
void string_replace(char *s,char oldc,char newc)
{
push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE);
@@ -260,10 +289,10 @@ void string_replace(char *s,char oldc,char newc)
pull_ucs2(NULL, s, tmpbuf, -1, sizeof(tmpbuf), STR_TERMINATE);
}
-
/*******************************************************************
-skip past some strings in a buffer
+ Skip past some strings in a buffer.
********************************************************************/
+
char *skip_string(char *buf,size_t n)
{
while (n--)
@@ -276,6 +305,7 @@ char *skip_string(char *buf,size_t n)
be the same as the number of bytes in a string for single byte strings,
but will be different for multibyte.
********************************************************************/
+
size_t str_charnum(const char *s)
{
push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE);
@@ -283,7 +313,7 @@ size_t str_charnum(const char *s)
}
/*******************************************************************
-trim the specified elements off the front and back of a string
+ Trim the specified elements off the front and back of a string.
********************************************************************/
BOOL trim_string(char *s,const char *front,const char *back)
@@ -320,40 +350,46 @@ BOOL trim_string(char *s,const char *front,const char *back)
return ret;
}
-
/****************************************************************************
-does a string have any uppercase chars in it?
+ Does a string have any uppercase chars in it?
****************************************************************************/
+
BOOL strhasupper(const char *s)
{
smb_ucs2_t *ptr;
push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE);
for(ptr=tmpbuf;*ptr;ptr++)
- if(isupper_w(*ptr)) return True;
+ if(isupper_w(*ptr))
+ return True;
return(False);
}
/****************************************************************************
-does a string have any lowercase chars in it?
+ Does a string have any lowercase chars in it?
****************************************************************************/
+
BOOL strhaslower(const char *s)
{
smb_ucs2_t *ptr;
push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE);
for(ptr=tmpbuf;*ptr;ptr++)
- if(islower_w(*ptr)) return True;
+ if(islower_w(*ptr))
+ return True;
return(False);
}
/****************************************************************************
-find the number of 'c' chars in a string
+ Find the number of 'c' chars in a string
****************************************************************************/
+
size_t count_chars(const char *s,char c)
{
smb_ucs2_t *ptr;
int count;
push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE);
- for(count=0,ptr=tmpbuf;*ptr;ptr++) if(*ptr==UCS2_CHAR(c)) count++;
+ for(count=0,ptr=tmpbuf;*ptr;ptr++)
+ if(*ptr==UCS2_CHAR(c))
+ count++;
return(count);
}
@@ -365,18 +401,22 @@ BOOL str_is_all(const char *s,char c)
{
smb_ucs2_t *ptr;
- if(s == NULL) return False;
- if(!*s) return False;
+ if(s == NULL)
+ return False;
+ if(!*s)
+ return False;
push_ucs2(NULL, tmpbuf,s, sizeof(tmpbuf), STR_TERMINATE);
- for(ptr=tmpbuf;*ptr;ptr++) if(*ptr!=UCS2_CHAR(c)) return False;
+ for(ptr=tmpbuf;*ptr;ptr++)
+ if(*ptr!=UCS2_CHAR(c))
+ return False;
return True;
}
/*******************************************************************
-safe string copy into a known length string. maxlength does not
-include the terminating zero.
+ Safe string copy into a known length string. maxlength does not
+ include the terminating zero.
********************************************************************/
char *safe_strcpy(char *dest,const char *src, size_t maxlength)
@@ -407,8 +447,8 @@ char *safe_strcpy(char *dest,const char *src, size_t maxlength)
}
/*******************************************************************
-safe string cat into a string. maxlength does not
-include the terminating zero.
+ Safe string cat into a string. maxlength does not
+ include the terminating zero.
********************************************************************/
char *safe_strcat(char *dest, const char *src, size_t maxlength)
@@ -420,9 +460,8 @@ char *safe_strcat(char *dest, const char *src, size_t maxlength)
return NULL;
}
- if (!src) {
+ if (!src)
return dest;
- }
src_len = strlen(src);
dest_len = strlen(dest);
@@ -487,28 +526,30 @@ char *alpha_strcpy(char *dest, const char *src, const char *other_safe_chars, si
char *StrnCpy(char *dest,const char *src,size_t n)
{
char *d = dest;
- if (!dest) return(NULL);
+ if (!dest)
+ return(NULL);
if (!src) {
*dest = 0;
return(dest);
}
- while (n-- && (*d++ = *src++)) ;
+ while (n-- && (*d++ = *src++))
+ ;
*d = 0;
return(dest);
}
/****************************************************************************
-like strncpy but copies up to the character marker. always null terminates.
-returns a pointer to the character marker in the source string (src).
+ Like strncpy but copies up to the character marker. always null terminates.
+ returns a pointer to the character marker in the source string (src).
****************************************************************************/
+
char *strncpyn(char *dest, const char *src, size_t n, char c)
{
char *p;
size_t str_len;
p = strchr_m(src, c);
- if (p == NULL)
- {
+ if (p == NULL) {
DEBUG(5, ("strncpyn: separator character (%c) not found\n", c));
return NULL;
}
@@ -520,7 +561,6 @@ char *strncpyn(char *dest, const char *src, size_t n, char c)
return p;
}
-
/*************************************************************
Routine to get hex characters and turn them into a 16 byte array.
the array can be variable length, and any non-hex-numeric
@@ -530,6 +570,7 @@ char *strncpyn(char *dest, const char *src, size_t n, char c)
valid examples: "0A5D15"; "0x15, 0x49, 0xa2"; "59\ta9\te3\n"
**************************************************************/
+
size_t strhex_to_str(char *p, size_t len, const char *strhex)
{
size_t i;
@@ -538,25 +579,19 @@ size_t strhex_to_str(char *p, size_t len, const char *strhex)
char *hexchars = "0123456789ABCDEF";
char *p1 = NULL, *p2 = NULL;
- for (i = 0; i < len && strhex[i] != 0; i++)
- {
- if (strnequal(hexchars, "0x", 2))
- {
+ for (i = 0; i < len && strhex[i] != 0; i++) {
+ if (strnequal(hexchars, "0x", 2)) {
i++; /* skip two chars */
continue;
}
if (!(p1 = strchr_m(hexchars, toupper(strhex[i]))))
- {
break;
- }
i++; /* next hex digit */
if (!(p2 = strchr_m(hexchars, toupper(strhex[i]))))
- {
break;
- }
/* get the two nybbles */
hinybble = PTR_DIFF(p1, hexchars);
@@ -572,98 +607,99 @@ size_t strhex_to_str(char *p, size_t len, const char *strhex)
}
/****************************************************************************
-check if a string is part of a list
+ Check if a string is part of a list.
****************************************************************************/
+
BOOL in_list(char *s,char *list,BOOL casesensitive)
{
- pstring tok;
- char *p=list;
-
- if (!list) return(False);
-
- while (next_token(&p,tok,LIST_SEP,sizeof(tok))) {
- if (casesensitive) {
- if (strcmp(tok,s) == 0)
- return(True);
- } else {
- if (StrCaseCmp(tok,s) == 0)
- return(True);
- }
- }
- return(False);
+ pstring tok;
+ char *p=list;
+
+ if (!list)
+ return(False);
+
+ while (next_token(&p,tok,LIST_SEP,sizeof(tok))) {
+ if (casesensitive) {
+ if (strcmp(tok,s) == 0)
+ return(True);
+ } else {
+ if (StrCaseCmp(tok,s) == 0)
+ return(True);
+ }
+ }
+ return(False);
}
/* this is used to prevent lots of mallocs of size 1 */
static char *null_string = NULL;
/****************************************************************************
-set a string value, allocing the space for the string
+ Set a string value, allocing the space for the string
****************************************************************************/
+
static BOOL string_init(char **dest,const char *src)
{
- size_t l;
- if (!src)
- src = "";
-
- l = strlen(src);
-
- if (l == 0)
- {
- if (!null_string) {
- if((null_string = (char *)malloc(1)) == NULL) {
- DEBUG(0,("string_init: malloc fail for null_string.\n"));
- return False;
- }
- *null_string = 0;
- }
- *dest = null_string;
- }
- else
- {
- (*dest) = (char *)malloc(l+1);
- if ((*dest) == NULL) {
- DEBUG(0,("Out of memory in string_init\n"));
- return False;
- }
-
- pstrcpy(*dest,src);
- }
- return(True);
+ size_t l;
+ if (!src)
+ src = "";
+
+ l = strlen(src);
+
+ if (l == 0) {
+ if (!null_string) {
+ if((null_string = (char *)malloc(1)) == NULL) {
+ DEBUG(0,("string_init: malloc fail for null_string.\n"));
+ return False;
+ }
+ *null_string = 0;
+ }
+ *dest = null_string;
+ } else {
+ (*dest) = (char *)malloc(l+1);
+ if ((*dest) == NULL) {
+ DEBUG(0,("Out of memory in string_init\n"));
+ return False;
+ }
+
+ pstrcpy(*dest,src);
+ }
+ return(True);
}
/****************************************************************************
-free a string value
+ Free a string value.
****************************************************************************/
+
void string_free(char **s)
{
- if (!s || !(*s)) return;
- if (*s == null_string)
- *s = NULL;
- SAFE_FREE(*s);
+ if (!s || !(*s))
+ return;
+ if (*s == null_string)
+ *s = NULL;
+ SAFE_FREE(*s);
}
/****************************************************************************
-set a string value, deallocating any existing space, and allocing the space
-for the string
+ Set a string value, deallocating any existing space, and allocing the space
+ for the string
****************************************************************************/
+
BOOL string_set(char **dest,const char *src)
{
- string_free(dest);
-
- return(string_init(dest,src));
+ string_free(dest);
+ return(string_init(dest,src));
}
-
/****************************************************************************
-substitute a string for a pattern in another string. Make sure there is
-enough room!
+ Substitute a string for a pattern in another string. Make sure there is
+ enough room!
-This routine looks for pattern in s and replaces it with
-insert. It may do multiple replacements.
+ This routine looks for pattern in s and replaces it with
+ insert. It may do multiple replacements.
-any of " ; ' $ or ` in the insert string are replaced with _
-if len==0 then the string cannot be extended. This is different from the old
-use of len==0 which was for no length checks to be done.
+ Any of " ; ' $ or ` in the insert string are replaced with _
+ if len==0 then the string cannot be extended. This is different from the old
+ use of len==0 which was for no length checks to be done.
****************************************************************************/
void string_sub(char *s,const char *pattern, const char *insert, size_t len)
@@ -722,11 +758,12 @@ void pstring_sub(char *s,const char *pattern,const char *insert)
string_sub(s, pattern, insert, sizeof(pstring));
}
-/* similar to string_sub, but it will accept only allocated strings
- * and may realloc them so pay attention at what you pass on no
- * pointers inside strings, no pstrings or const may be passed
- * as string.
- */
+/****************************************************************************
+ Similar to string_sub, but it will accept only allocated strings
+ and may realloc them so pay attention at what you pass on no
+ pointers inside strings, no pstrings or const may be passed
+ as string.
+****************************************************************************/
char *realloc_string_sub(char *string, const char *pattern, const char *insert)
{
@@ -788,10 +825,10 @@ char *realloc_string_sub(char *string, const char *pattern, const char *insert)
}
/****************************************************************************
-similar to string_sub() but allows for any character to be substituted.
-Use with caution!
-if len==0 then the string cannot be extended. This is different from the old
-use of len==0 which was for no length checks to be done.
+ Similar to string_sub() but allows for any character to be substituted.
+ Use with caution!
+ if len==0 then the string cannot be extended. This is different from the old
+ use of len==0 which was for no length checks to be done.
****************************************************************************/
void all_string_sub(char *s,const char *pattern,const char *insert, size_t len)
@@ -829,10 +866,10 @@ void all_string_sub(char *s,const char *pattern,const char *insert, size_t len)
}
/****************************************************************************
-similar to all_string_sub but for unicode strings.
-return a new allocated unicode string.
- similar to string_sub() but allows for any character to be substituted.
- Use with caution!
+ Similar to all_string_sub but for unicode strings.
+ Return a new allocated unicode string.
+ similar to string_sub() but allows for any character to be substituted.
+ Use with caution!
****************************************************************************/
smb_ucs2_t *all_string_sub_w(const smb_ucs2_t *s, const smb_ucs2_t *pattern,
@@ -842,7 +879,8 @@ smb_ucs2_t *all_string_sub_w(const smb_ucs2_t *s, const smb_ucs2_t *pattern,
const smb_ucs2_t *sp;
size_t lr, lp, li, lt;
- if (!insert || !pattern || !*pattern || !s) return NULL;
+ if (!insert || !pattern || !*pattern || !s)
+ return NULL;
lt = (size_t)strlen_w(s);
lp = (size_t)strlen_w(pattern);
@@ -885,7 +923,8 @@ smb_ucs2_t *all_string_sub_wa(smb_ucs2_t *s, const char *pattern,
{
wpstring p, i;
- if (!insert || !pattern || !s) return NULL;
+ if (!insert || !pattern || !s)
+ return NULL;
push_ucs2(NULL, p, pattern, sizeof(wpstring) - 1, STR_TERMINATE);
push_ucs2(NULL, i, insert, sizeof(wpstring) - 1, STR_TERMINATE);
return all_string_sub_w(s, p, i);
@@ -1049,11 +1088,12 @@ char *strdup_upper(const char *s)
return t;
}
-/*
- return a RFC2254 binary string representation of a buffer
- used in LDAP filters
- caller must free
-*/
+/*******************************************************************
+ Return a RFC2254 binary string representation of a buffer.
+ Used in LDAP filters.
+ Caller must free.
+********************************************************************/
+
char *binary_string(char *buf, int len)
{
char *s;
@@ -1072,7 +1112,9 @@ char *binary_string(char *buf, int len)
return s;
}
-/* Just a typesafety wrapper for snprintf into a pstring */
+/*******************************************************************
+ Just a typesafety wrapper for snprintf into a pstring.
+********************************************************************/
int pstr_sprintf(pstring s, const char *fmt, ...)
{
@@ -1085,7 +1127,9 @@ int pstr_sprintf(pstring s, const char *fmt, ...)
return ret;
}
-/* Just a typesafety wrapper for snprintf into a fstring */
+/*******************************************************************
+ Just a typesafety wrapper for snprintf into a fstring.
+********************************************************************/
int fstr_sprintf(fstring s, const char *fmt, ...)
{
@@ -1120,8 +1164,9 @@ int fstr_sprintf(fstring s, const char *fmt, ...)
#ifndef HAVE_STRNLEN
/*******************************************************************
-some platforms don't have strnlen
+ Some platforms don't have strnlen
********************************************************************/
+
size_t strnlen(const char *s, size_t n)
{
int i;
@@ -1166,8 +1211,8 @@ char **str_list_make(const char *string, const char *sep)
str_list_free(&list);
SAFE_FREE(s);
return NULL;
- }
- else list = rlist;
+ } else
+ list = rlist;
memset (&list[num], 0, ((sizeof(char**)) * (S_LIST_ABS +1)));
}
@@ -1206,8 +1251,8 @@ BOOL str_list_copy(char ***dest, char **src)
DEBUG(0,("str_list_copy: Unable to re-allocate memory"));
str_list_free(&list);
return False;
- }
- else list = rlist;
+ } else
+ list = rlist;
memset (&list[num], 0, ((sizeof(char **)) * (S_LIST_ABS +1)));
}
@@ -1225,7 +1270,9 @@ BOOL str_list_copy(char ***dest, char **src)
return True;
}
-/* return true if all the elements of the list match exactly */
+/***********************************************************
+ Return true if all the elements of the list match exactly.
+***********************************************************/
BOOL str_list_compare(char **list1, char **list2)
{