31 #include <stdarg.h> |
31 #include <stdarg.h> |
32 |
32 |
33 #include "string.h" |
33 #include "string.h" |
34 #include "allocator.h" |
34 #include "allocator.h" |
35 |
35 |
36 sstr_t sstr(char *s) { |
36 sstr_t sstr(char *cstring) { |
37 sstr_t string; |
37 sstr_t string; |
38 string.ptr = s; |
38 string.ptr = cstring; |
39 string.length = strlen(s); |
39 string.length = strlen(cstring); |
40 return string; |
40 return string; |
41 } |
41 } |
42 |
42 |
43 sstr_t sstrn(char *s, size_t n) { |
43 sstr_t sstrn(char *cstring, size_t length) { |
44 sstr_t string; |
44 sstr_t string; |
45 string.ptr = s; |
45 string.ptr = cstring; |
46 string.length = n; |
46 string.length = length; |
47 return string; |
47 return string; |
48 } |
48 } |
49 |
49 |
50 size_t sstrnlen(size_t n, sstr_t s, ...) { |
50 size_t sstrnlen(size_t n, sstr_t s, ...) { |
51 va_list ap; |
51 va_list ap; |
52 size_t size = s.length; |
52 size_t size = s.length; |
53 va_start(ap, s); |
53 va_start(ap, s); |
54 |
54 |
55 for (size_t i = 0 ; i < n-1 ; i++) { |
55 for (size_t i = 1 ; i < n ; i++) { |
56 sstr_t str = va_arg(ap, sstr_t); |
56 sstr_t str = va_arg(ap, sstr_t); |
57 size += str.length; |
57 size += str.length; |
58 } |
58 } |
59 va_end(ap); |
59 va_end(ap); |
60 |
60 |
173 |
173 |
174 return result; |
174 return result; |
175 } |
175 } |
176 |
176 |
177 int sstrcmp(sstr_t s1, sstr_t s2) { |
177 int sstrcmp(sstr_t s1, sstr_t s2) { |
178 return strncmp(s1.ptr, s2.ptr, s1.length>s2.length ? s2.length: s1.length); |
178 if (s1.length == s2.length) { |
|
179 return memcmp(s1.ptr, s2.ptr, s1.length); |
|
180 } else if (s1.length > s2.length) { |
|
181 return 1; |
|
182 } else { |
|
183 return -1; |
|
184 } |
179 } |
185 } |
180 |
186 |
181 sstr_t sstrdup(sstr_t s) { |
187 sstr_t sstrdup(sstr_t s) { |
182 sstr_t newstring; |
188 return sstrdupa(ucx_default_allocator(), s); |
183 newstring.ptr = (char*) malloc(s.length + 1); |
189 } |
184 if (newstring.ptr) { |
190 |
185 newstring.length = s.length; |
191 sstr_t sstrdupa(UcxAllocator *allocator, sstr_t s) { |
186 newstring.ptr[newstring.length] = 0; |
|
187 |
|
188 memcpy(newstring.ptr, s.ptr, s.length); |
|
189 } else { |
|
190 newstring.length = 0; |
|
191 } |
|
192 |
|
193 return newstring; |
|
194 } |
|
195 |
|
196 sstr_t sstrdup_alloc(UcxAllocator *allocator, sstr_t s) { |
|
197 sstr_t newstring; |
192 sstr_t newstring; |
198 newstring.ptr = (char*)allocator->malloc(allocator->pool, s.length + 1); |
193 newstring.ptr = (char*)allocator->malloc(allocator->pool, s.length + 1); |
199 if (newstring.ptr) { |
194 if (newstring.ptr) { |
200 newstring.length = s.length; |
195 newstring.length = s.length; |
201 newstring.ptr[newstring.length] = 0; |
196 newstring.ptr[newstring.length] = 0; |