ucx/string.c

changeset 116
234920008754
parent 109
75cb6590358b
child 119
baa839a7633f
equal deleted inserted replaced
115:965fd17ed9cf 116:234920008754
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;

mercurial