[PATCH 1/9] utils: Add cstr_token() function
Ilan Peer
ilan.peer
Thu Jul 2 06:21:19 PDT 2015
From: Max Stepanov <Max.Stepanov at intel.com>
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 at intel.com>
Reviewed-by: Andrei Otcheretianski <andrei.otcheretianski at intel.com>
Reviewed-by: Ilan Peer <ilan.peer at intel.com>
---
src/utils/common.c | 65 +++++++++++++++++++++++++++++++++++++++---------------
src/utils/common.h | 1 +
2 files changed, 48 insertions(+), 18 deletions(-)
diff --git a/src/utils/common.c b/src/utils/common.c
index 5cf0d57..40e937c 100644
--- a/src/utils/common.c
+++ b/src/utils/common.c
@@ -973,34 +973,63 @@ int random_mac_addr_keep_oui(u8 *addr)
/**
- * str_token - Get next token from a string
- * @buf: String to tokenize. Note that the string might be modified.
- * @delim: String of delimiters
- * @context: Pointer to save our context. Should be initialized with
- * NULL on the first call, and passed for any further call.
- * Returns: The next token, NULL if there are no more valid tokens.
+ * 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).
*/
-char * str_token(char *str, const char *delim, char **context)
+const char *cstr_token(const char *str, const char *delim, const char **last)
{
- char *end, *pos = str;
+ const char *end, *token = str;
+
+ if (!str || !delim || !last)
+ return NULL;
- if (*context)
- pos = *context;
+ if (*last)
+ token = *last;
- while (*pos && os_strchr(delim, *pos))
- pos++;
- if (!*pos)
+ while (*token && os_strchr(delim, *token))
+ token++;
+
+ if (!*token)
return NULL;
- end = pos + 1;
+ end = token + 1;
+
while (*end && !os_strchr(delim, *end))
end++;
- if (*end)
- *end++ = '\0';
+ *last = end;
+ return token;
+}
+
+
+/**
+ * str_token - Get next token from a string
+ * @buf: String to tokenize. Note that the string might be modified.
+ * @delim: String of delimiters
+ * @context: Pointer to save our context. Should be initialized with
+ * NULL on the first call, and passed for any further call.
+ * Returns: The next token, NULL if there are no more valid tokens.
+ */
+char *str_token(char *str, const char *delim, char **context)
+{
+ char *token = (char *)cstr_token(str, delim, (const char **)context);
+
+ if (token && **context)
+ *(*context)++ = '\0';
- *context = end;
- return pos;
+ return token;
}
diff --git a/src/utils/common.h b/src/utils/common.h
index 88318f5..f184f8a 100644
--- a/src/utils/common.h
+++ b/src/utils/common.h
@@ -549,6 +549,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);
--
1.9.1
More information about the Hostap
mailing list