utils: Add cstr_token() function

Add an auxiliary cstr_token() function to get a token from a const char
string. The function usage syntax is similar to str_token(), but unlike
str_token() the function doesn't modify the buffer of the string. Change
str_token() function implementation to use cstr_token().

Signed-off-by: Max Stepanov <Max.Stepanov@intel.com>
Reviewed-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com>
Reviewed-by: Ilan Peer <ilan.peer@intel.com>
This commit is contained in:
Max Stepanov 2015-07-02 16:21:19 +03:00 committed by Jouni Malinen
parent e999e56c2c
commit add5975751
2 changed files with 47 additions and 17 deletions

View file

@ -972,6 +972,48 @@ int random_mac_addr_keep_oui(u8 *addr)
} }
/**
* cstr_token - Get next token from const char string
* @str: a constant string to tokenize
* @delim: a string of delimiters
* @last: a pointer to a character following the returned token
* It has to be set to NULL for the first call and passed for any
* futher call.
* Returns: a pointer to token position in str or NULL
*
* This function is similar to str_token, but it can be used with both
* char and const char strings. Differences:
* - The str buffer remains unmodified
* - The returned token is not a NULL terminated string, but a token
* position in str buffer. If a return value is not NULL a size
* of the returned token could be calculated as (last - token).
*/
const char * cstr_token(const char *str, const char *delim, const char **last)
{
const char *end, *token = str;
if (!str || !delim || !last)
return NULL;
if (*last)
token = *last;
while (*token && os_strchr(delim, *token))
token++;
if (!*token)
return NULL;
end = token + 1;
while (*end && !os_strchr(delim, *end))
end++;
*last = end;
return token;
}
/** /**
* str_token - Get next token from a string * str_token - Get next token from a string
* @buf: String to tokenize. Note that the string might be modified. * @buf: String to tokenize. Note that the string might be modified.
@ -982,25 +1024,12 @@ int random_mac_addr_keep_oui(u8 *addr)
*/ */
char * str_token(char *str, const char *delim, char **context) char * str_token(char *str, const char *delim, char **context)
{ {
char *end, *pos = str; char *token = (char *) cstr_token(str, delim, (const char **) context);
if (*context) if (token && **context)
pos = *context; *(*context)++ = '\0';
while (*pos && os_strchr(delim, *pos)) return token;
pos++;
if (!*pos)
return NULL;
end = pos + 1;
while (*end && !os_strchr(delim, *end))
end++;
if (*end)
*end++ = '\0';
*context = end;
return pos;
} }

View file

@ -528,6 +528,7 @@ void bin_clear_free(void *bin, size_t len);
int random_mac_addr(u8 *addr); int random_mac_addr(u8 *addr);
int random_mac_addr_keep_oui(u8 *addr); int random_mac_addr_keep_oui(u8 *addr);
const char * cstr_token(const char *str, const char *delim, const char **last);
char * str_token(char *str, const char *delim, char **context); char * str_token(char *str, const char *delim, char **context);
size_t utf8_escape(const char *inp, size_t in_size, size_t utf8_escape(const char *inp, size_t in_size,
char *outp, size_t out_size); char *outp, size_t out_size);