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