diff mbox

[1/9] utils: Add cstr_token() function

Message ID 1435843287-25665-2-git-send-email-ilan.peer@intel.com
State Accepted
Headers show

Commit Message

Peer, Ilan July 2, 2015, 1:21 p.m. UTC
From: Max Stepanov <Max.Stepanov@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@intel.com>
Reviewed-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com>
Reviewed-by: Ilan Peer <ilan.peer@intel.com>
---
 src/utils/common.c | 65 +++++++++++++++++++++++++++++++++++++++---------------
 src/utils/common.h |  1 +
 2 files changed, 48 insertions(+), 18 deletions(-)
diff mbox

Patch

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);