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:
parent
e999e56c2c
commit
add5975751
2 changed files with 47 additions and 17 deletions
|
@ -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
|
||||
* @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 *end, *pos = str;
|
||||
char *token = (char *) cstr_token(str, delim, (const char **) context);
|
||||
|
||||
if (*context)
|
||||
pos = *context;
|
||||
if (token && **context)
|
||||
*(*context)++ = '\0';
|
||||
|
||||
while (*pos && os_strchr(delim, *pos))
|
||||
pos++;
|
||||
if (!*pos)
|
||||
return NULL;
|
||||
|
||||
end = pos + 1;
|
||||
while (*end && !os_strchr(delim, *end))
|
||||
end++;
|
||||
|
||||
if (*end)
|
||||
*end++ = '\0';
|
||||
|
||||
*context = end;
|
||||
return pos;
|
||||
return token;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -528,6 +528,7 @@ void bin_clear_free(void *bin, size_t len);
|
|||
int random_mac_addr(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);
|
||||
size_t utf8_escape(const char *inp, size_t in_size,
|
||||
char *outp, size_t out_size);
|
||||
|
|
Loading…
Reference in a new issue