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