ucx/string.c

changeset 68
88dbea299440
parent 67
27e67e725d35
child 69
fb59270b1de3
equal deleted inserted replaced
67:27e67e725d35 68:88dbea299440
9 #include <strings.h> 9 #include <strings.h>
10 #include <stdarg.h> 10 #include <stdarg.h>
11 11
12 #include "string.h" 12 #include "string.h"
13 13
14 sstr_t sstr (char *s) { 14 sstr_t sstr(char *s) {
15 sstr_t string; 15 sstr_t string;
16 string.ptr = s; 16 string.ptr = s;
17 string.length = strlen(s); 17 string.length = strlen(s);
18 return string; 18 return string;
19 } 19 }
20 20
21 sstr_t sstrn (char *s, size_t n) { 21 sstr_t sstrn(char *s, size_t n) {
22 sstr_t string; 22 sstr_t string;
23 string.ptr = s; 23 string.ptr = s;
24 string.length = n; 24 string.length = n;
25 return string; 25 return string;
26 } 26 }
27 27
28 size_t sstrnlen (size_t n, const sstr_t s, ...) { 28 size_t sstrnlen(size_t n, sstr_t s, ...) {
29 va_list ap; 29 va_list ap;
30 size_t size = s.length; 30 size_t size = s.length;
31 va_start(ap, s); 31 va_start(ap, s);
32 32
33 for (int i=0;i<n-1;i++) { 33 for (int i=0;i<n-1;i++) {
37 va_end(ap); 37 va_end(ap);
38 38
39 return size; 39 return size;
40 } 40 }
41 41
42 sstr_t sstrcat (sstr_t s, ...) { 42 sstr_t sstrcat(sstr_t s, ...) {
43 va_list ap; 43 va_list ap;
44 va_start(ap, s); 44 va_start(ap, s);
45 s.ptr[0] = 0; 45 s.ptr[0] = 0;
46 46
47 sstr_t str = va_arg (ap, sstr_t); 47 sstr_t str = va_arg (ap, sstr_t);
52 va_end(ap); 52 va_end(ap);
53 53
54 return s; 54 return s;
55 } 55 }
56 56
57 sstr_t sstrncat (size_t n, sstr_t s, const sstr_t c1, ...) { 57 sstr_t sstrncat(size_t n, sstr_t s, sstr_t c1, ...) {
58 va_list ap; 58 va_list ap;
59 va_start(ap, c1); 59 va_start(ap, c1);
60 s.ptr[0] = 0; 60 s.ptr[0] = 0;
61 61
62 size_t len = s.length; 62 size_t len = s.length;
80 va_end(ap); 80 va_end(ap);
81 81
82 return s; 82 return s;
83 } 83 }
84 84
85 sstr_t sstrsubs (const sstr_t s, size_t start) { 85 sstr_t sstrsubs(sstr_t s, size_t start) {
86 return sstrsubsl (s, start, s.length-start); 86 return sstrsubsl (s, start, s.length-start);
87 } 87 }
88 88
89 sstr_t sstrsubsl (const sstr_t s, size_t start, size_t length) { 89 sstr_t sstrsubsl(sstr_t s, size_t start, size_t length) {
90 sstr_t new_sstr; 90 sstr_t new_sstr;
91 if (start < 0 || start >= s.length || length < 0) { 91 if (start < 0 || start >= s.length || length < 0) {
92 return s; 92 return s;
93 } 93 }
94 if (length > s.length-start) { 94 if (length > s.length-start) {
97 new_sstr.ptr = &s.ptr[start]; 97 new_sstr.ptr = &s.ptr[start];
98 new_sstr.length = length; 98 new_sstr.length = length;
99 return new_sstr; 99 return new_sstr;
100 } 100 }
101 101
102 sstr_t* sstrsplit(const sstr_t s, const sstr_t d, size_t *n) { 102 sstr_t* sstrsplit(sstr_t s, sstr_t d, size_t *n) {
103 if (d.length == 0) { 103 if (d.length == 0) {
104 return NULL; 104 return NULL;
105 } 105 }
106 106
107 sstr_t* result; 107 sstr_t* result;
153 free(sv.ptr); 153 free(sv.ptr);
154 154
155 return result; 155 return result;
156 } 156 }
157 157
158 int sstrcmp(const sstr_t s1, const sstr_t s2) { 158 int sstrcmp(sstr_t s1, sstr_t s2) {
159 return strncmp(s1.ptr, s2.ptr, s1.length>s2.length ? s2.length: s1.length); 159 return strncmp(s1.ptr, s2.ptr, s1.length>s2.length ? s2.length: s1.length);
160 } 160 }
161 161
162 sstr_t sstrdup(const sstr_t s) { 162 sstr_t sstrdup(sstr_t s) {
163 sstr_t newstring; 163 sstr_t newstring;
164 newstring.ptr = (char*) malloc(s.length + 1); 164 newstring.ptr = (char*) malloc(s.length + 1);
165 if (newstring.ptr != NULL) { 165 if (newstring.ptr != NULL) {
166 newstring.length = s.length; 166 newstring.length = s.length;
167 newstring.ptr[newstring.length] = 0; 167 newstring.ptr[newstring.length] = 0;

mercurial