home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World 2001 April
/
PCWorld_2001-04_cd.bin
/
Software
/
TemaCD
/
junkbust
/
linux
/
ssplit.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-10-30
|
3KB
|
125 lines
char *ssplit_rcs = "$Id: ssplit.c,v 1.6 1998/10/27 16:25:07 ACJC Exp $";
/* Written and copyright 1997 Anonymous Coders and Junkbusters Corporation.
* Distributed under the GNU General Public License; see the README file.
* This code comes with NO WARRANTY. http://www.junkbusters.com/ht/en/gpl.html
*/
/* ssplit() - split a string (in-place) into fields
* s = string to split
* c = list of characters to be used as field separators
* (if NULL, use default separators of space, tab, and newline)
*
* v = vector into which field pointers are placed
* n = number of fields in vector
*
* m = flag indicating whether to treat strings of field
* separators as indicating multiple fields
*
* l = flag indicating whether to ignore leading field separators
*/
#include <string.h>
int ssplit(char *s, char *c, char *v[], int n, int m, int l)
{
char t[256];
char **x = NULL;
int xsize = 0;
unsigned char *p, b;
int xi = 0;
int vi = 0;
int i;
int last_was_null;
if (!s)
return (-1);
memset(t, '\0', sizeof(t));
p = (unsigned char *) c;
if (!p)
p = (unsigned char *) " \t"; /* default field separators */
while (*p)
t[*p++] = 1; /* separator */
t['\0'] = 2; /* terminator */
t['\n'] = 2; /* terminator */
p = (unsigned char *) s;
if(l) { /* are we to skip leading separators ? */
while((b = t[*p]) != 2) {
if(b != 1) break;
p++;
}
}
xsize = 256;
x = (char **) zalloc((xsize) * sizeof(char *));
x[xi++] = (char *) p; /* first pointer is the beginning of string */
/* first pass: save pointers to the field separators */
while((b = t[*p]) != 2) {
if(b == 1) { /* if the char is a separator ... */
*p++ = '\0'; /* null terminate the substring */
if(xi == xsize) {
/* get another chunk */
int new_xsize = xsize + 256;
char **new_x = (char **)
zalloc((new_xsize) * sizeof(char *));
for(i=0; i < xsize; i++) new_x[i] = x[i];
free(x);
xsize = new_xsize;
x = new_x;
}
x[xi++] = (char *) p; /* save pointer to beginning of next string */
} else {
p++;
}
}
*p = '\0'; /* null terminate the substring */
#ifdef DEBUG
print(x, xi); /* debugging */
#endif
/* second pass: copy the relevant pointers to the output vector */
last_was_null = 0;
for(i=0 ; i < xi; i++) {
if(m) {
/* there are NO null fields */
if(*x[i] == 0) continue;
}
if(vi < n) {
v[vi++] = x[i];
} else {
free(x);
return(-1); /* overflow */
}
}
free(x);
#ifdef DEBUG
print(v, vi); /* debugging */
#endif
return (vi);
}
#ifdef DEBUG
print(char **v, int n)
{
int i;
printf("dump %d strings\n", n);
for(i=0; i < n; i++) {
printf("%d '%s'\n", i, v[i]);
}
}
#endif