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