1/*++ 2/* NAME 3/* argv_split 3 4/* SUMMARY 5/* string array utilities 6/* SYNOPSIS 7/* #include <argv.h> 8/* 9/* ARGV *argv_split(string, delim) 10/* const char *string; 11/* 12/* ARGV *argv_split_count(string, delim, count) 13/* const char *string; 14/* ssize_t count; 15/* 16/* ARGV *argv_split_append(argv, string, delim) 17/* ARGV *argv; 18/* const char *string; 19/* const char *delim; 20/* DESCRIPTION 21/* argv_split() breaks up \fIstring\fR into tokens according 22/* to the delimiters specified in \fIdelim\fR. The result is 23/* a null-terminated string array. 24/* 25/* argv_split_count() is like argv_split() but stops splitting 26/* input after at most \fIcount\fR -1 times and leaves the 27/* remainder, if any, in the last array element. It is an error 28/* to specify a count < 1. 29/* 30/* argv_split_append() performs the same operation as argv_split(), 31/* but appends the result to an existing string array. 32/* SEE ALSO 33/* mystrtok(), safe string splitter. 34/* DIAGNOSTICS 35/* Fatal errors: memory allocation problem. 36/* LICENSE 37/* .ad 38/* .fi 39/* The Secure Mailer license must be distributed with this software. 40/* AUTHOR(S) 41/* Wietse Venema 42/* IBM T.J. Watson Research 43/* P.O. Box 704 44/* Yorktown Heights, NY 10598, USA 45/*--*/ 46 47/* System libraries. */ 48 49#include <sys_defs.h> 50#include <string.h> 51 52/* Application-specific. */ 53 54#include "mymalloc.h" 55#include "stringops.h" 56#include "argv.h" 57#include "msg.h" 58 59/* argv_split - split string into token array */ 60 61ARGV *argv_split(const char *string, const char *delim) 62{ 63 ARGV *argvp = argv_alloc(1); 64 char *saved_string = mystrdup(string); 65 char *bp = saved_string; 66 char *arg; 67 68 while ((arg = mystrtok(&bp, delim)) != 0) 69 argv_add(argvp, arg, (char *) 0); 70 argv_terminate(argvp); 71 myfree(saved_string); 72 return (argvp); 73} 74 75/* argv_split_count - split string into token array */ 76 77ARGV *argv_split_count(const char *string, const char *delim, ssize_t count) 78{ 79 ARGV *argvp = argv_alloc(1); 80 char *saved_string = mystrdup(string); 81 char *bp = saved_string; 82 char *arg; 83 84 if (count < 1) 85 msg_panic("argv_split_count: bad count: %ld", (long) count); 86 while (count-- > 1 && (arg = mystrtok(&bp, delim)) != 0) 87 argv_add(argvp, arg, (char *) 0); 88 if (*bp) 89 bp += strspn(bp, delim); 90 if (*bp) 91 argv_add(argvp, bp, (char *) 0); 92 argv_terminate(argvp); 93 myfree(saved_string); 94 return (argvp); 95} 96 97/* argv_split_append - split string into token array, append to array */ 98 99ARGV *argv_split_append(ARGV *argvp, const char *string, const char *delim) 100{ 101 char *saved_string = mystrdup(string); 102 char *bp = saved_string; 103 char *arg; 104 105 while ((arg = mystrtok(&bp, delim)) != 0) 106 argv_add(argvp, arg, (char *) 0); 107 argv_terminate(argvp); 108 myfree(saved_string); 109 return (argvp); 110} 111