/*
* tokenise.c:
* Break a string into a list of tokens.
*
* Copyright (c) 2000 Chris Lightfoot. All rights reserved.
*
*/
static const char rcsid[] = "$Id: tokenise.c,v 1.12 2002/11/13 20:08:59 chris Exp $";
#define _REENTRANT /* needed on some systems to get strtok_r */
#include <stdlib.h>
#include <string.h>
#include "tokenise.h"
#include "util.h"
/* chomp:
* Remove a CR/CRLF-type combination from the end of a string. */
void chomp(char *str) {
char *p;
p = str + strlen(str) - 1;
while (p >= str && strchr("\r\n", *p)) *(p--) = 0;
}
/* tokenise_string:
* Break a string into tokens, using the separator characters in seps. The
* return value is a tokens object which contains a copy of the string and an
* array of pointers to the individual tokens in it. */
tokens tokens_new(const char *str, const char *seps) {
tokens T;
char *p, *r;
int nn = 4;
alloc_struct(_tokens, T);
T->str = xstrdup(str);
T->toks = xcalloc(nn, sizeof *T->toks);
p = strtok_r(T->str, seps, &r);
while (p) {
T->toks[T->num++] = p;
if (T->num == nn) {
T->toks = (char**)xrealloc(T->toks, sizeof(char*) * nn * 2);
memset(T->toks + nn, 0, sizeof(char*) * nn);
nn *= 2;
}
p = strtok_r(NULL, seps, &r);
};
return T;
}
/* tokens_delete:
* Free a tokens object. */
void tokens_delete(tokens T) {
if (!T) return;
xfree(T->str);
xfree(T->toks);
xfree(T);
}
syntax highlighted by Code2HTML, v. 0.9.1