]>
git.saurik.com Git - wxWidgets.git/blob - src/regex/split.c
   5  - split - divide a string into fields, like awk split() 
   6  = int split(char *string, char *fields[], int nfields, char *sep); 
   8 int                             /* number of fields, including overflow */ 
   9 split(string
, fields
, nfields
, sep
) 
  11 char *fields
[];                 /* list is not NULL-terminated */ 
  12 int nfields
;                    /* number of entries available in fields[] */ 
  13 char *sep
;                      /* "" white, "c" single char, "ab" [ab]+ */ 
  15         register char *p 
= string
; 
  16         register char c
;                        /* latest character */ 
  17         register char sepc 
= sep
[0]; 
  20         register char **fp 
= fields
; 
  22         register int trimtrail
; 
  26                 while ((c 
= *p
++) == ' ' || c 
== '\t') 
  30                 sep 
= " \t";    /* note, code below knows this is 2 long */ 
  34         sepc2 
= sep
[1];         /* now we can safely pick this up */ 
  40         /* single separator */ 
  48                         while ((c 
= *p
++) != sepc
) 
  53                 /* we have overflowed the fields vector -- just count them */ 
  56                         while ((c 
= *p
++) != sepc
) 
  70                         while ((c 
= *p
++) != sepc 
&& c 
!= sepc2
) 
  72                                         if (trimtrail 
&& **(fp
-1) == '\0') 
  79                         while ((c 
= *p
++) == sepc 
|| c 
== sepc2
) 
  83                 /* we have overflowed the fields vector -- just count them */ 
  86                         while ((c 
= *p
++) == sepc 
|| c 
== sepc2
) 
  90                         while ((c 
= *p
++) != '\0' && c 
!= sepc 
&& c 
!= sepc2
) 
  93                 /* might have to trim trailing white space */ 
  96                         while ((c 
= *--p
) == sepc 
|| c 
== sepc2
) 
 119                         while ((sepc 
= *sepp
++) != '\0' && sepc 
!= c
) 
 121                         if (sepc 
!= '\0')       /* it was a separator */ 
 129                         while ((sepc 
= *sepp
++) != '\0' && sepc 
!= c
) 
 131                         if (sepc 
== '\0')       /* it wasn't a separator */ 
 145  * pgm          runs regression 
 146  * pgm sep      splits stdin lines by sep 
 147  * pgm str sep  splits str by sep 
 148  * pgm str sep n        splits str by sep n times 
 161                 for (n 
= atoi(argv
[3]); n 
> 0; n
--) { 
 162                         (void) strcpy(buf
, argv
[1]); 
 165                 for (n 
= atoi(argv
[3]); n 
> 0; n
--) { 
 166                         (void) strcpy(buf
, argv
[1]); 
 167                         (void) split(buf
, fields
, MNF
, argv
[2]); 
 170                 dosplit(argv
[1], argv
[2]); 
 172                 while (fgets(buf
, sizeof(buf
), stdin
) != NULL
) { 
 173                         buf
[strlen(buf
)-1] = '\0';      /* stomp newline */ 
 174                         dosplit(buf
, argv
[1]); 
 182 dosplit(string
, seps
) 
 190         nf 
= split(string
, fields
, NF
, seps
); 
 191         print(nf
, NF
, fields
); 
 194 print(nf
, nfp
, fields
) 
 202         bound 
= (nf 
> nfp
) ? nfp 
: nf
; 
 204         for (fn 
= 0; fn 
< bound
; fn
++) 
 205                 printf("\"%s\"%s", fields
[fn
], (fn
+1 < nf
) ? ", " : "\n"); 
 208 #define RNF     5               /* some table entries know this */ 
 216         " ",            " ",    2,      { "", "" }, 
 217         "x",            " ",    1,      { "x" }, 
 218         "xy",           " ",    1,      { "xy" }, 
 219         "x y",          " ",    2,      { "x", "y" }, 
 220         "abc def  g ",  " ",    5,      { "abc", "def", "", "g", "" }, 
 221         "  a bcd",      " ",    4,      { "", "", "a", "bcd" }, 
 222         "a b c d e f",  " ",    6,      { "a", "b", "c", "d", "e f" }, 
 223         " a b c d ",    " ",    6,      { "", "a", "b", "c", "d " }, 
 226         " ",            " _",   2,      { "", "" }, 
 227         "x",            " _",   1,      { "x" }, 
 228         "x y",          " _",   2,      { "x", "y" }, 
 229         "ab _ cd",      " _",   2,      { "ab", "cd" }, 
 230         " a_b  c ",     " _",   5,      { "", "a", "b", "c", "" }, 
 231         "a b c_d e f",  " _",   6,      { "a", "b", "c", "d", "e f" }, 
 232         " a b c d ",    " _",   6,      { "", "a", "b", "c", "d " }, 
 234         "",             " _~",  0,      { "" }, 
 235         " ",            " _~",  2,      { "", "" }, 
 236         "x",            " _~",  1,      { "x" }, 
 237         "x y",          " _~",  2,      { "x", "y" }, 
 238         "ab _~ cd",     " _~",  2,      { "ab", "cd" }, 
 239         " a_b  c~",     " _~",  5,      { "", "a", "b", "c", "" }, 
 240         "a b_c d~e f",  " _~",  6,      { "a", "b", "c", "d", "e f" }, 
 241         "~a b c d ",    " _~",  6,      { "", "a", "b", "c", "d " }, 
 243         "",             " _~-", 0,      { "" }, 
 244         " ",            " _~-", 2,      { "", "" }, 
 245         "x",            " _~-", 1,      { "x" }, 
 246         "x y",          " _~-", 2,      { "x", "y" }, 
 247         "ab _~- cd",    " _~-", 2,      { "ab", "cd" }, 
 248         " a_b  c~",     " _~-", 5,      { "", "a", "b", "c", "" }, 
 249         "a b_c-d~e f",  " _~-", 6,      { "a", "b", "c", "d", "e f" }, 
 250         "~a-b c d ",    " _~-", 6,      { "", "a", "b", "c", "d " }, 
 253         " ",            "  ",   2,      { "", "" }, 
 254         "x",            "  ",   1,      { "x" }, 
 255         "xy",           "  ",   1,      { "xy" }, 
 256         "x y",          "  ",   2,      { "x", "y" }, 
 257         "abc def  g ",  "  ",   4,      { "abc", "def", "g", "" }, 
 258         "  a bcd",      "  ",   3,      { "", "a", "bcd" }, 
 259         "a b c d e f",  "  ",   6,      { "a", "b", "c", "d", "e f" }, 
 260         " a b c d ",    "  ",   6,      { "", "a", "b", "c", "d " }, 
 265         "xy",           "",     1,      { "xy" }, 
 266         "x y",          "",     2,      { "x", "y" }, 
 267         "abc def  g ",  "",     3,      { "abc", "def", "g" }, 
 268         "\t a bcd",     "",     2,      { "a", "bcd" }, 
 269         "  a \tb\t c ", "",     3,      { "a", "b", "c" }, 
 270         "a b c d e ",   "",     5,      { "a", "b", "c", "d", "e" }, 
 271         "a b\tc d e f", "",     6,      { "a", "b", "c", "d", "e f" }, 
 272         " a b c d e f ",        "",     6,      { "a", "b", "c", "d", "e f " }, 
 274         NULL
,           NULL
,   0,      { NULL 
}, 
 284         register int printit
; 
 287         for (n 
= 0; tests
[n
].str 
!= NULL
; n
++) { 
 288                 (void) strcpy(buf
, tests
[n
].str
); 
 290                 nf 
= split(buf
, fields
, RNF
, tests
[n
].seps
); 
 292                 if (nf 
!= tests
[n
].nf
) { 
 293                         printf("split `%s' by `%s' gave %d fields, not %d\n", 
 294                                 tests
[n
].str
, tests
[n
].seps
, nf
, tests
[n
].nf
); 
 296                 } else if (fields
[RNF
] != NULL
) { 
 297                         printf("split() went beyond array end\n"); 
 300                         for (i 
= 0; i 
< nf 
&& i 
< RNF
; i
++) { 
 304                                 if (strcmp(f
, tests
[n
].fi
[i
]) != 0) { 
 305                                         printf("split `%s' by `%s', field %d is `%s', not `%s'\n", 
 306                                                 tests
[n
].str
, tests
[n
].seps
, 
 307                                                 i
, fields
[i
], tests
[n
].fi
[i
]); 
 313                         print(nf
, RNF
, fields
);