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) { |