split.c (1056B) download
1#include <stdlib.h>
2
3/* split buf into n strings that are separated by c. return n as *len.
4 * Allocate plus more slots and leave the first ofs of them alone. */
5char **split(char *buf,int c,size_t* len,size_t plus,size_t ofs) {
6 int n=1;
7 char **v=0;
8 char **w;
9 /* step 1: count tokens */
10 char *s;
11 for (s=buf; *s; s++) if (*s==c) n++;
12 /* step 2: allocate space for pointers */
13 v=(char **)malloc((n+plus)*sizeof(char*));
14 if (!v) return 0;
15 w=v+ofs;
16 *w++=buf;
17 for (s=buf; ; s++) {
18 while (*s && *s!=c) s++;
19 if (*s==0) break;
20 if (*s==c) {
21 *s=0;
22 *w++=s+1;
23 }
24 }
25 *len=w-v;
26 return v;
27}
28
29#ifdef UNITTEST
30#include <assert.h>
31#include <string.h>
32#include <stdio.h>
33
34int main() {
35 char inp[]="foo\nbar\nbaz";
36 size_t len;
37 char** x=split(inp, '\n', &len, 2, 1);
38 assert(len==4 && !strcmp(x[1],"foo") && !strcmp(x[2],"bar") && !strcmp(x[3],"baz") && x[4]==NULL);
39 free(x);
40 char inp2[]="fnord";
41 x=split(inp2, '\n', &len, 2, 1);
42 assert(len==2 && !strcmp(x[1],"fnord") && x[2]==NULL);
43 return 0;
44}
45#endif