75 str.length = 0; |
79 str.length = 0; |
76 if(count < 2) { |
80 if(count < 2) { |
77 return str; |
81 return str; |
78 } |
82 } |
79 |
83 |
|
84 if(((size_t)-1) - s1.length < s2.length) { |
|
85 return str; |
|
86 } |
|
87 |
80 sstr_t *strings = (sstr_t*) calloc(count, sizeof(sstr_t)); |
88 sstr_t *strings = (sstr_t*) calloc(count, sizeof(sstr_t)); |
81 if(!strings) { |
89 if(!strings) { |
82 return str; |
90 return str; |
83 } |
91 } |
84 |
92 |
85 // get all args and overall length |
93 // get all args and overall length |
86 strings[0] = s1; |
94 strings[0] = s1; |
87 strings[1] = s2; |
95 strings[1] = s2; |
88 size_t strlen = s1.length + s2.length; |
96 size_t slen = s1.length + s2.length; |
|
97 int error = 0; |
89 for (size_t i=2;i<count;i++) { |
98 for (size_t i=2;i<count;i++) { |
90 sstr_t s = va_arg (ap, sstr_t); |
99 sstr_t s = va_arg (ap, sstr_t); |
91 strings[i] = s; |
100 strings[i] = s; |
92 strlen += s.length; |
101 if(((size_t)-1) - s.length < slen) { |
|
102 error = 1; |
|
103 break; |
|
104 } |
|
105 slen += s.length; |
|
106 } |
|
107 if(error) { |
|
108 free(strings); |
|
109 return str; |
93 } |
110 } |
94 |
111 |
95 // create new string |
112 // create new string |
96 str.ptr = (char*) almalloc(a, strlen + 1); |
113 str.ptr = (char*) almalloc(a, slen + 1); |
97 str.length = strlen; |
114 str.length = slen; |
98 if(!str.ptr) { |
115 if(!str.ptr) { |
99 free(strings); |
116 free(strings); |
100 str.length = 0; |
117 str.length = 0; |
101 return str; |
118 return str; |
102 } |
119 } |