src/string.c

changeset 272
2def28b65328
parent 270
3d80d425543b
child 275
96f643d30ff1
equal deleted inserted replaced
271:47b8ea435902 272:2def28b65328
55 size_t size = s.length; 55 size_t size = s.length;
56 va_start(ap, s); 56 va_start(ap, s);
57 57
58 for (size_t i = 1 ; i < n ; i++) { 58 for (size_t i = 1 ; i < n ; i++) {
59 sstr_t str = va_arg(ap, sstr_t); 59 sstr_t str = va_arg(ap, sstr_t);
60 if(((size_t)-1) - str.length < size) {
61 size = 0;
62 break;
63 }
60 size += str.length; 64 size += str.length;
61 } 65 }
62 va_end(ap); 66 va_end(ap);
63 67
64 return size; 68 return size;
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 }

mercurial