1/*++
2/* NAME
3/*	mystrtok 3
4/* SUMMARY
5/*	safe tokenizer
6/* SYNOPSIS
7/*	#include <stringops.h>
8/*
9/*	char	*mystrtok(bufp, delimiters)
10/*	char	**bufp;
11/*	const char *delimiters;
12/* DESCRIPTION
13/*	mystrtok() splits a buffer on the specified \fIdelimiters\fR.
14/*	Tokens are delimited by runs of delimiters, so this routine
15/*	cannot return zero-length tokens.
16/*
17/*	The \fIbufp\fR argument specifies the start of the search; it
18/*	is updated with each call. The input is destroyed.
19/*
20/*	The result value is the next token, or a null pointer when the
21/*	end of the buffer was reached.
22/* LICENSE
23/* .ad
24/* .fi
25/*	The Secure Mailer license must be distributed with this software.
26/* AUTHOR(S)
27/*	Wietse Venema
28/*	IBM T.J. Watson Research
29/*	P.O. Box 704
30/*	Yorktown Heights, NY 10598, USA
31/*--*/
32
33/* System library. */
34
35#include "sys_defs.h"
36#include <string.h>
37
38/* Utility library. */
39
40#include "stringops.h"
41
42/* mystrtok - safe tokenizer */
43
44char   *mystrtok(char **src, const char *sep)
45{
46    char   *start = *src;
47    char   *end;
48
49    /*
50     * Skip over leading delimiters.
51     */
52    start += strspn(start, sep);
53    if (*start == 0) {
54	*src = start;
55	return (0);
56    }
57
58    /*
59     * Separate off one token.
60     */
61    end = start + strcspn(start, sep);
62    if (*end != 0)
63	*end++ = 0;
64    *src = end;
65    return (start);
66}
67
68#ifdef TEST
69
70 /*
71  * Test program: read lines from stdin, split on whitespace.
72  */
73#include "vstring.h"
74#include "vstream.h"
75#include "vstring_vstream.h"
76
77int     main(void)
78{
79    VSTRING *vp = vstring_alloc(100);
80    char   *start;
81    char   *str;
82
83    while (vstring_fgets(vp, VSTREAM_IN)) {
84	start = vstring_str(vp);
85	while ((str = mystrtok(&start, " \t\r\n")) != 0)
86	    vstream_printf(">%s<\n", str);
87	vstream_fflush(VSTREAM_OUT);
88    }
89    vstring_free(vp);
90    return (0);
91}
92
93#endif
94