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