ucx/string.c

changeset 39
bf8ab7bb74ff
parent 31
91ac86557290
child 47
22fb97e9f58a
equal deleted inserted replaced
38:35f67a8ef875 39:bf8ab7bb74ff
84 new_sstr.ptr = &s.ptr[start]; 84 new_sstr.ptr = &s.ptr[start];
85 new_sstr.length = length; 85 new_sstr.length = length;
86 return new_sstr; 86 return new_sstr;
87 } 87 }
88 88
89 sstr_t* sstrsplit(sstr_t s, sstr_t d, size_t *n) {
90 if (d.length == 0) {
91 return NULL;
92 }
93
94 sstr_t* result;
95 size_t nmax = *n;
96 *n = 1;
97
98 /* special case: exact match - no processing needed */
99 if (s.length == d.length && strncmp(s.ptr, d.ptr, s.length) == 0) {
100 result = malloc(sizeof(sstr_t));
101 result[0] = sstrn("", 0);
102 return result;
103 }
104 sstr_t sv = sstrdup(s);
105
106 for (int i = 0 ; i < s.length ; i++) {
107 if (sv.ptr[i] == d.ptr[0]) {
108 _Bool match = 1;
109 for (int j = 1 ; j < d.length ; j++) {
110 if (j+i < s.length) {
111 match &= (sv.ptr[i+j] == d.ptr[j]);
112 } else {
113 match = 0;
114 break;
115 }
116 }
117 if (match) {
118 (*n)++;
119 for (int j = 0 ; j < d.length ; j++) {
120 sv.ptr[i+j] = 0;
121 }
122 i += d.length;
123 }
124 }
125 if ((*n) == nmax) break;
126 }
127 result = malloc(sizeof(sstr_t) * (*n));
128
129 char *pptr = sv.ptr;
130 for (int i = 0 ; i < *n ; i++) {
131 size_t l = strlen(pptr);
132 char* ptr = malloc(l + 1);
133 memcpy(ptr, pptr, l);
134 ptr[l] = 0;
135
136 result[i] = sstrn(ptr, l);
137 pptr += l + d.length;
138 }
139
140 free(sv.ptr);
141
142 return result;
143 }
144
89 int sstrcmp(sstr_t s1, sstr_t s2) { 145 int sstrcmp(sstr_t s1, sstr_t s2) {
90 return strncmp(s1.ptr, s2.ptr, s1.length>s2.length ? s2.length: s1.length); 146 return strncmp(s1.ptr, s2.ptr, s1.length>s2.length ? s2.length: s1.length);
91 } 147 }
92 148
93 sstr_t sstrdup(sstr_t s) { 149 sstr_t sstrdup(sstr_t s) {

mercurial