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