Home | History | Annotate | Line # | Download | only in util
      1 /*	$NetBSD: argv_split_at.c,v 1.2 2022/10/08 16:12:50 christos Exp $	*/
      2 
      3 /*++
      4 /* NAME
      5 /*	argv_split_at 3
      6 /* SUMMARY
      7 /*	string array utilities
      8 /* SYNOPSIS
      9 /*	#include <argv.h>
     10 /*
     11 /*	ARGV	*argv_split_at(string, sep)
     12 /*	const char *string;
     13 /*	int	sep;
     14 /*
     15 /*	ARGV	*argv_split_at_count(string, sep, count)
     16 /*	const char *string;
     17 /*	int	sep;
     18 /*	ssize_t	count;
     19 /*
     20 /*	ARGV	*argv_split_at_append(argv, string, sep)
     21 /*	ARGV	*argv;
     22 /*	const char *string;
     23 /*	int	sep;
     24 /* DESCRIPTION
     25 /*	argv_split_at() splits \fIstring\fR into fields using a
     26 /*	single separator specified in \fIsep\fR. The result is a
     27 /*	null-terminated string array.
     28 /*
     29 /*	argv_split_at_count() is like argv_split_at() but stops
     30 /*	splitting input after at most \fIcount\fR -1 times and
     31 /*	leaves the remainder, if any, in the last array element.
     32 /*	It is an error to specify a count < 1.
     33 /*
     34 /*	argv_split_at_append() performs the same operation as
     35 /*	argv_split_at(), but appends the result to an existing
     36 /*	string array.
     37 /* SEE ALSO
     38 /*	split_at(), trivial string splitter.
     39 /* DIAGNOSTICS
     40 /*	Fatal errors: memory allocation problem.
     41 /* LICENSE
     42 /* .ad
     43 /* .fi
     44 /*	The Secure Mailer license must be distributed with this software.
     45 /* AUTHOR(S)
     46 /*	Wietse Venema
     47 /*	IBM T.J. Watson Research
     48 /*	P.O. Box 704
     49 /*	Yorktown Heights, NY 10598, USA
     50 /*
     51 /*	Wietse Venema
     52 /*	Google, Inc.
     53 /*	111 8th Avenue
     54 /*	New York, NY 10011, USA
     55 /*--*/
     56 
     57 /* System libraries. */
     58 
     59 #include <sys_defs.h>
     60 #include <string.h>
     61 
     62 /* Application-specific. */
     63 
     64 #include <mymalloc.h>
     65 #include <stringops.h>
     66 #include <argv.h>
     67 #include <msg.h>
     68 #include <split_at.h>
     69 
     70 /* argv_split_at - split string into field array */
     71 
     72 ARGV   *argv_split_at(const char *string, int sep)
     73 {
     74     ARGV   *argvp = argv_alloc(1);
     75     char   *saved_string = mystrdup(string);
     76     char   *bp = saved_string;
     77     char   *arg;
     78 
     79     while ((arg = split_at(bp, sep)) != 0) {
     80 	argv_add(argvp, bp, (char *) 0);
     81 	bp = arg;
     82     }
     83     argv_add(argvp, bp, (char *) 0);
     84     argv_terminate(argvp);
     85     myfree(saved_string);
     86     return (argvp);
     87 }
     88 
     89 /* argv_split_at_count - split string into field array */
     90 
     91 ARGV   *argv_split_at_count(const char *string, int sep, ssize_t count)
     92 {
     93     ARGV   *argvp = argv_alloc(1);
     94     char   *saved_string = mystrdup(string);
     95     char   *bp = saved_string;
     96     char   *arg;
     97 
     98     if (count < 1)
     99 	msg_panic("argv_split_at_count: bad count: %ld", (long) count);
    100     while (count-- > 1 && (arg = split_at(bp, sep)) != 0) {
    101 	argv_add(argvp, bp, (char *) 0);
    102 	bp = arg;
    103     }
    104     argv_add(argvp, bp, (char *) 0);
    105     argv_terminate(argvp);
    106     myfree(saved_string);
    107     return (argvp);
    108 }
    109 
    110 /* argv_split_at_append - split string into field array, append to array */
    111 
    112 ARGV   *argv_split_at_append(ARGV *argvp, const char *string, int sep)
    113 {
    114     char   *saved_string = mystrdup(string);
    115     char   *bp = saved_string;
    116     char   *arg;
    117 
    118     while ((arg = split_at(bp, sep)) != 0) {
    119 	argv_add(argvp, bp, (char *) 0);
    120 	bp = arg;
    121     }
    122     argv_add(argvp, bp, (char *) 0);
    123     argv_terminate(argvp);
    124     myfree(saved_string);
    125     return (argvp);
    126 }
    127