ecere/gui/Window: Prevent uninitialized values if base Window methods not overridden...
[sdk] / extras / types / DynamicString.ec
index 6ee8bcd..4189386 100644 (file)
@@ -1,6 +1,10 @@
+#ifdef ECERE_STATIC
+public import static "ecere"
+#endif
+
 #include <stdarg.h>
 
-class DynamicString : Array<char>
+public class DynamicString : Array<char>
 {
    minAllocSize = 1024;
 
@@ -11,16 +15,32 @@ class DynamicString : Array<char>
 
    property String
    {
-      get
-      {
-         return &(this[0]);
-      }
       set
       {
+         DynamicString s { };
+         if(value)
+         {
+            int len = strlen(value) + 1;
+            s.size = len;
+            memcpy(s.array, value, len);
+         }
+         return s;
       }
+      get { return array; }
+   }
+
+   const char * OnGetString(char * tempString, void * fieldData, bool * needClass)
+   {
+      return array;
    }
 
-   void concat(String s)
+   bool OnGetDataFromString(const char * string)
+   {
+      this = (DynamicString)(char *)string;
+      return true;
+   }
+
+   void concat(const String s)
    {
       int len = strlen(s);
       if(len)
@@ -32,25 +52,65 @@ class DynamicString : Array<char>
       }
    }
 
-   void concatf(char * format, ...)
+   void concatf(const char * format, ...)
    {
-      char string[MAX_F_STRING*16];
+      // TODO: improve this to vsprinf directly in the Array<char> instead of calling concat
+      char string[MAX_F_STRING];
       va_list args;
       va_start(args, format);
-      vsprintf(string, format, args);
+      vsnprintf(string, sizeof(string), format, args);
+      string[sizeof(string)-1] = 0;
       va_end(args);
       concat(string);
    }
 
    void concatx(typed_object object, ...)
    {
-      char string[MAX_F_STRING*16];
+      // TODO: improve this to work directly on the Array<char> instead of calling PrintStdArgsToBuffer
+      char string[MAX_F_STRING];
       va_list args;
-      int len;
+      //int len;
       va_start(args, object);
-      len = PrintStdArgsToBuffer(string, sizeof(string), object, args);
+      /*len = */PrintStdArgsToBuffer(string, sizeof(string), object, args);
       concat(string);
       va_end(args);
    }
 
+   void copySingleBlankReplTrim(String s, char replace, bool trim)
+   {
+      privateCommonCopyLenSingleBlankReplTrim(s, replace, trim, strlen(s));
+   }
+
+   void copyLenSingleBlankReplTrim(String s, char replace, bool trim, int copyLen)
+   {
+      privateCommonCopyLenSingleBlankReplTrim(s, replace, trim, Min(strlen(s), copyLen));
+   }
+
+   void privateCommonCopyLenSingleBlankReplTrim(String s, char replace, bool trim, int len)
+   {
+      int c, d;
+      bool wasBlank = trim;
+      size = len + 1;
+      for(c = d = 0; c < len; c++)
+      {
+         if(isblank(s[c]))
+         {
+            if(!wasBlank)
+            {
+               wasBlank = true;
+               /*array*/this[d++] = replace ? replace : s[c];
+            }
+         }
+         else
+         {
+            /*array*/this[d++] = s[c];
+            if(wasBlank)
+               wasBlank = false;
+         }
+      }
+      if(!trim || (len && !isblank(/*array*/this[d])))
+         d++;
+      /*array*/this[d] = '\0';
+      size = d + 1;
+   }
 }