| 208 | } |
| 209 | |
| 210 | char **cbm_str_split(CBMArena *a, const char *s, char delim, int *out_count) { |
| 211 | if (!s || !out_count) { |
| 212 | return NULL; |
| 213 | } |
| 214 | |
| 215 | /* Count parts */ |
| 216 | int count = SKIP_ONE; |
| 217 | for (const char *p = s; *p; p++) { |
| 218 | if (*p == delim) { |
| 219 | count++; |
| 220 | } |
| 221 | } |
| 222 | |
| 223 | char **result = (char **)cbm_arena_alloc(a, (size_t)(count + SKIP_ONE) * sizeof(char *)); |
| 224 | if (!result) { |
| 225 | return NULL; |
| 226 | } |
| 227 | |
| 228 | int idx = 0; |
| 229 | const char *start = s; |
| 230 | for (const char *p = s;; p++) { |
| 231 | if (*p == delim || *p == '\0') { |
| 232 | size_t part_len = (size_t)(p - start); |
| 233 | result[idx++] = cbm_arena_strndup(a, start, part_len); |
| 234 | if (*p == '\0') { |
| 235 | break; |
| 236 | } |
| 237 | start = p + SKIP_ONE; |
| 238 | } |
| 239 | } |
| 240 | |
| 241 | result[idx] = NULL; |
| 242 | *out_count = count; |
| 243 | return result; |
| 244 | } |
| 245 | |
| 246 | bool cbm_validate_shell_arg(const char *s) { |
| 247 | if (!s) { |
no test coverage detected