BLI_string: Adding the BLI_strtok_r function, which mimics stdlib strtok_r (unavailab...
authorBastien Montagne <montagne29@wanadoo.fr>
Fri, 28 Oct 2011 13:07:11 +0000 (13:07 +0000)
committerBastien Montagne <montagne29@wanadoo.fr>
Fri, 28 Oct 2011 13:07:11 +0000 (13:07 +0000)
It allows to iterate over a string, returning an new element each time, using a char as separator. See BLI_String.h's comments for more info and an example.

Needed by the UI template list patch following!

source/blender/blenlib/BLI_string.h
source/blender/blenlib/intern/string.c

index 0cdb573..9a7fa52 100644 (file)
@@ -133,6 +133,28 @@ int BLI_strncasecmp(const char *s1, const char *s2, size_t len);
 int BLI_natstrcmp(const char *s1, const char *s2);
 size_t BLI_strnlen(const char *str, size_t maxlen);
 
+       /**
+        * Split str on the first occurence of delimiter, returns the first
+        * part as a mallocN'd string, and stores the second part into
+        * ctx (also mallocN'd).
+        * If str is NULL, split on ctx instead.
+        * This allows to iterate over this "generator" function:
+        *
+        * char *ctx = NULL;
+        * char *res = NULL;
+        * for(res = BLI_strtok_r("a;dummy;csv;line", ";", &ctx); res; res = BLI_strtok_r(NULL, ";", &ctx)) {
+        *     printf(res);
+        *     MEM_freeN(res);
+        * }
+        * 
+        * @param str The string to be split.
+        * @param delimiter The char used to split str apart.
+        * @param ctx The "context" string. It’s a pointer inside the org passed @str,
+        *            so it has no specific mem management.
+        * @retval Returns the mallocN'd first element from split str (or ctx).
+        */
+char *BLI_strtok_r(char *str, const char *delimiter, char **ctx);
+
 void BLI_timestr(double _time, char *str); /* time var is global */
 
 void BLI_ascii_strtolower(char *str, int len);
index 3a66425..3ec84e0 100644 (file)
@@ -375,6 +375,35 @@ int BLI_natstrcmp(const char *s1, const char *s2)
        return 0;
 }
 
+/* As unfortunately strtok_r is not available everywhere... */
+char *BLI_strtok_r(char *str, const char *delimiter, char **ctx)
+{
+       char *cut = NULL, *ret = NULL;
+       char *split = str ? str : *ctx;
+
+       if(!split) {
+               return ret;
+       }
+
+       cut = strchr(split, *delimiter);
+       if(cut) {
+               size_t len_ret = cut - split;
+               size_t len_ctx = strlen(split) - len_ret - 1;
+               ret = BLI_strdupn(split, len_ret);
+               if(len_ctx > 0) {
+                       *ctx = split+len_ret+1;
+               }
+               else {
+                       *ctx = NULL;
+               }
+       }
+       else {
+               ret = BLI_strdup(split);
+               *ctx = NULL;
+       }
+       return ret;
+}
+
 void BLI_timestr(double _time, char *str)
 {
        /* format 00:00:00.00 (hr:min:sec) string has to be 12 long */