extras;DynamicString; fix DynamicString.ec for static compiling. add DynamicString...
[sdk] / extras / types / DynamicString.ec
1 #ifdef ECERE_STATIC
2 public import static "ecere"
3 #endif
4
5 #include <stdarg.h>
6
7 extern int isblank(int c);
8
9 public class DynamicString : Array<char>
10 {
11    minAllocSize = 1024;
12
13    DynamicString()
14    {
15       Add('\0');
16    }
17
18    property String
19    {
20       set
21       {
22          DynamicString s { };
23          if(value)
24          {
25             int len = strlen(value) + 1;
26             s.size = len;
27             memcpy(s.array, value, len);
28          }
29          return s;
30       }
31       get { return array; }
32    }
33
34    char * OnGetString(char * tempString, void * fieldData, bool * needClass)
35    {
36       return array;
37    }
38
39    bool OnGetDataFromString(char * string)
40    {
41       this = (DynamicString)string;
42    }
43
44    void concat(String s)
45    {
46       int len = strlen(s);
47       if(len)
48       {
49          int pos = size-1;
50          if(pos == -1) { Add('\0'); pos = 0; }
51          size += len;
52          memcpy(&(this[pos]), s, len+1);
53       }
54    }
55
56    void concatf(char * format, ...)
57    {
58       // TODO: improve this to vsprinf directly in the Array<char> instead of calling concat
59       char string[MAX_F_STRING];
60       va_list args;
61       va_start(args, format);
62       vsnprintf(string, sizeof(string), format, args);
63       string[sizeof(string)-1] = 0;
64       va_end(args);
65       concat(string);
66    }
67
68    void concatx(typed_object object, ...)
69    {
70       // TODO: improve this to work directly on the Array<char> instead of calling PrintStdArgsToBuffer
71       char string[MAX_F_STRING];
72       va_list args;
73       int len;
74       va_start(args, object);
75       len = PrintStdArgsToBuffer(string, sizeof(string), object, args);
76       concat(string);
77       va_end(args);
78    }
79
80    void copySingleBlankReplTrim(String s, char replace, bool trim)
81    {
82       privateCommonCopyLenSingleBlankReplTrim(s, replace, trim, strlen(s));
83    }
84
85    void copyLenSingleBlankReplTrim(String s, char replace, bool trim, int copyLen)
86    {
87       privateCommonCopyLenSingleBlankReplTrim(s, replace, trim, Min(strlen(s), copyLen));
88    }
89
90    void privateCommonCopyLenSingleBlankReplTrim(String s, char replace, bool trim, int len)
91    {
92       int c, d;
93       bool wasBlank = trim;
94       size = len + 1;
95       for(c = d = 0; c < len; c++)
96       {
97          if(isblank(s[c]))
98          {
99             if(!wasBlank)
100             {
101                wasBlank = true;
102                /*array*/this[d++] = replace ? replace : s[c];
103             }
104          }
105          else
106          {
107             /*array*/this[d++] = s[c];
108             if(wasBlank)
109                wasBlank = false;
110          }
111       }
112       if(!trim || (len && !isblank(/*array*/this[d])))
113          d++;
114       /*array*/this[d] = '\0';
115       size = d + 1;
116    }
117 }