src/string.c

branch
constsstr
changeset 288
6af5798342e8
parent 276
f1b2146d4805
child 300
d1f814633049
equal deleted inserted replaced
276:f1b2146d4805 288:6af5798342e8
63 string.length = length; 63 string.length = length;
64 return string; 64 return string;
65 } 65 }
66 66
67 67
68 size_t sstrnlen(size_t n, sstr_t s, ...) { 68 size_t ucx_strnlen(size_t n, ...) {
69 va_list ap; 69 va_list ap;
70 size_t size = s.length; 70 va_start(ap, n);
71 va_start(ap, s); 71
72 72 size_t size = 0;
73 for (size_t i = 1 ; i < n ; i++) { 73
74 sstr_t str = va_arg(ap, sstr_t); 74 for (size_t i = 0 ; i < n ; i++) {
75 scstr_t str = va_arg(ap, scstr_t);
75 if(((size_t)-1) - str.length < size) { 76 if(((size_t)-1) - str.length < size) {
76 size = 0; 77 size = 0;
77 break; 78 break;
78 } 79 }
79 size += str.length; 80 size += str.length;
84 } 85 }
85 86
86 static sstr_t sstrvcat_a( 87 static sstr_t sstrvcat_a(
87 UcxAllocator *a, 88 UcxAllocator *a,
88 size_t count, 89 size_t count,
89 sstr_t s1, 90 scstr_t s1,
90 sstr_t s2,
91 va_list ap) { 91 va_list ap) {
92 sstr_t str; 92 sstr_t str;
93 str.ptr = NULL; 93 str.ptr = NULL;
94 str.length = 0; 94 str.length = 0;
95 if(count < 2) { 95 if(count < 2) {
96 return str; 96 return str;
97 } 97 }
98 98
99 scstr_t s2 = va_arg (ap, scstr_t);
100
99 if(((size_t)-1) - s1.length < s2.length) { 101 if(((size_t)-1) - s1.length < s2.length) {
100 return str; 102 return str;
101 } 103 }
102 104
103 sstr_t *strings = (sstr_t*) calloc(count, sizeof(sstr_t)); 105 scstr_t *strings = (scstr_t*) calloc(count, sizeof(scstr_t));
104 if(!strings) { 106 if(!strings) {
105 return str; 107 return str;
106 } 108 }
107 109
108 // get all args and overall length 110 // get all args and overall length
109 strings[0] = s1; 111 strings[0] = s1;
110 strings[1] = s2; 112 strings[1] = s2;
111 size_t slen = s1.length + s2.length; 113 size_t slen = s1.length + s2.length;
112 int error = 0; 114 int error = 0;
113 for (size_t i=2;i<count;i++) { 115 for (size_t i=2;i<count;i++) {
114 sstr_t s = va_arg (ap, sstr_t); 116 scstr_t s = va_arg (ap, scstr_t);
115 strings[i] = s; 117 strings[i] = s;
116 if(((size_t)-1) - s.length < slen) { 118 if(((size_t)-1) - s.length < slen) {
117 error = 1; 119 error = 1;
118 break; 120 break;
119 } 121 }
134 } 136 }
135 137
136 // concatenate strings 138 // concatenate strings
137 size_t pos = 0; 139 size_t pos = 0;
138 for (size_t i=0;i<count;i++) { 140 for (size_t i=0;i<count;i++) {
139 sstr_t s = strings[i]; 141 scstr_t s = strings[i];
140 memcpy(str.ptr + pos, s.ptr, s.length); 142 memcpy(str.ptr + pos, s.ptr, s.length);
141 pos += s.length; 143 pos += s.length;
142 } 144 }
143 145
144 str.ptr[str.length] = '\0'; 146 str.ptr[str.length] = '\0';
146 free(strings); 148 free(strings);
147 149
148 return str; 150 return str;
149 } 151 }
150 152
151 sstr_t sstrcat(size_t count, sstr_t s1, sstr_t s2, ...) { 153 sstr_t ucx_strcat(size_t count, scstr_t s1, ...) {
152 va_list ap; 154 va_list ap;
153 va_start(ap, s2); 155 va_start(ap, s1);
154 sstr_t s = sstrvcat_a(ucx_default_allocator(), count, s1, s2, ap); 156 sstr_t s = sstrvcat_a(ucx_default_allocator(), count, s1, ap);
155 va_end(ap); 157 va_end(ap);
156 return s; 158 return s;
157 } 159 }
158 160
159 sstr_t sstrcat_a(UcxAllocator *a, size_t count, sstr_t s1, sstr_t s2, ...) { 161 sstr_t ucx_strcat_a(UcxAllocator *a, size_t count, scstr_t s1, ...) {
160 va_list ap; 162 va_list ap;
161 va_start(ap, s2); 163 va_start(ap, s1);
162 sstr_t s = sstrvcat_a(a, count, s1, s2, ap); 164 sstr_t s = sstrvcat_a(a, count, s1, ap);
163 va_end(ap); 165 va_end(ap);
164 return s; 166 return s;
165 } 167 }
166 168
167 sstr_t sstrsubs(sstr_t s, size_t start) { 169 sstr_t sstrsubs(sstr_t s, size_t start) {

mercurial