Revision: 23734
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23734
Author:   aligorith
Date:     2009-10-09 14:18:32 +0200 (Fri, 09 Oct 2009)

Log Message:
-----------
(Untested) String Replacement Function in blenlib

Currently this hasn't been tested yet, but committing this first before I 
potentially use it for fixing RNA-paths...

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   2009-10-09 12:16:58 UTC 
(rev 23733)
+++ trunk/blender/source/blender/blenlib/BLI_string.h   2009-10-09 12:18:32 UTC 
(rev 23734)
@@ -68,6 +68,18 @@
         */
 char *BLI_strncpy(char *dst, const char *src, int maxncpy);
 
+       /**
+        * Returns a copy of the cstring @a str into a newly mallocN'd
+        * string with all instances of oldText replaced with newText,
+        * and returns it.
+        * 
+        * @param str The string to replace occurances of oldText in
+        * @param oldText The text in the string to find and replace
+        * @param newText The text in the string to find and replace
+        * @retval Returns the duplicated string
+        */
+char *BLI_replacestr(char *str, const char *oldText, const char *newText);
+
        /* 
         * Replacement for snprintf
         */

Modified: trunk/blender/source/blender/blenlib/intern/string.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/string.c        2009-10-09 
12:16:58 UTC (rev 23733)
+++ trunk/blender/source/blender/blenlib/intern/string.c        2009-10-09 
12:18:32 UTC (rev 23734)
@@ -100,6 +100,77 @@
        return n;
 }
 
+/* Replaces all occurances of oldText with newText in str, returning a new 
string that doesn't 
+ * contain the 'replaced' occurances.
+ */
+// A rather wasteful string-replacement utility, though this shall do for 
now...
+// Feel free to replace this with an even safe + nicer alternative 
+char *BLI_replacestr(char *str, const char *oldText, const char *newText)
+{
+       DynStr *ds= NULL;
+       int lenOld= strlen(oldText);
+       char *match;
+       
+       /* sanity checks */
+       if ((str == NULL) || (str[0]==0))
+               return NULL;
+       else if ((oldText == NULL) || (newText == NULL) || (oldText[0]==0))
+               return BLI_strdup(str);
+       
+       /* while we can still find a match for the old substring that we're 
searching for, 
+        * keep dicing and replacing
+        */
+       while ( (match = strstr(str, oldText)) ) {
+               /* the assembly buffer only gets created when we actually need 
to rebuild the string */
+               if (ds == NULL)
+                       ds= BLI_dynstr_new();
+                       
+               /* if the match position does not match the current position in 
the string, 
+                * copy the text up to this position and advance the current 
position in the string
+                */
+               if (str != match) {
+                       /* replace the token at the 'match' position with \0 so 
that the copied string will be ok,
+                        * add the segment of the string from str to match to 
the buffer, then restore the value at match
+                        */
+                       match[0]= 0;
+                       BLI_dynstr_append(ds, str);
+                       match[0]= oldText[0];
+                       
+                       /* now our current position should be set on the start 
of the match */
+                       str= match;
+               }
+               
+               /* add the replacement text to the accumulation buffer */
+               BLI_dynstr_append(ds, newText);
+               
+               /* advance the current position of the string up to the end of 
the replaced segment */
+               str += lenOld;
+       }
+       
+       /* finish off and return a new string that has had all occurances of */
+       if (ds) {
+               char *newStr;
+               
+               /* add what's left of the string to the assembly buffer 
+                *      - we've been adjusting str to point at the end of the 
replaced segments
+                */
+               if (str != NULL)
+                       BLI_dynstr_append(ds, str);
+               
+               /* convert to new c-string (MEM_malloc'd), and free the buffer 
*/
+               newStr= BLI_dynstr_get_cstring(ds);
+               BLI_dynstr_free(ds);
+               
+               return newStr;
+       }
+       else {
+               /* just create a new copy of the entire string - we avoid going 
through the assembly buffer 
+                * for what should be a bit more efficiency...
+                */
+               return BLI_strdup(str);
+       }
+} 
+
 int BLI_streq(const char *a, const char *b) 
 {
        return (strcmp(a, b)==0);


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to