Revision: 41337
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41337
Author:   mont29
Date:     2011-10-28 13:07:11 +0000 (Fri, 28 Oct 2011)
Log Message:
-----------
BLI_string: Adding the BLI_strtok_r function, which mimics stdlib strtok_r 
(unavailable on some systems).

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!

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_string.h
    trunk/blender/source/blender/blenlib/intern/string.c

Modified: trunk/blender/source/blender/blenlib/BLI_string.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_string.h   2011-10-28 12:57:37 UTC 
(rev 41336)
+++ trunk/blender/source/blender/blenlib/BLI_string.h   2011-10-28 13:07:11 UTC 
(rev 41337)
@@ -133,6 +133,28 @@
 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);

Modified: trunk/blender/source/blender/blenlib/intern/string.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/string.c        2011-10-28 
12:57:37 UTC (rev 41336)
+++ trunk/blender/source/blender/blenlib/intern/string.c        2011-10-28 
13:07:11 UTC (rev 41337)
@@ -375,6 +375,35 @@
        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 */

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to