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