Home | History | Annotate | Line # | Download | only in util
      1 /*	$NetBSD: argv.h,v 1.6 2026/05/09 18:49:22 christos Exp $	*/
      2 
      3 #ifndef _ARGV_H_INCLUDED_
      4 #define _ARGV_H_INCLUDED_
      5 
      6 /*++
      7 /* NAME
      8 /*	argv 3h
      9 /* SUMMARY
     10 /*	string array utilities
     11 /* SYNOPSIS
     12 /*	#include "argv.h"
     13 /* DESCRIPTION
     14 /* .nf
     15 
     16  /*
     17   * External interface.
     18   */
     19 typedef struct ARGV {
     20     ssize_t len;			/* number of array elements */
     21     ssize_t argc;			/* array elements in use */
     22     char  **argv;			/* string array */
     23 } ARGV;
     24 
     25 typedef int (*ARGV_COMPAR_FN) (const void *, const void *);
     26 
     27 extern ARGV *argv_alloc(ssize_t);
     28 extern ARGV *argv_sort(ARGV *);		/* backwards compatibility */
     29 extern ARGV *argv_qsort(ARGV *, ARGV_COMPAR_FN);
     30 extern ARGV *argv_uniq(ARGV *, ARGV_COMPAR_FN);
     31 extern void argv_add(ARGV *,...);
     32 extern void argv_addn(ARGV *,...);
     33 extern ARGV *argv_addv(ARGV *, const char *const *);
     34 extern void argv_terminate(ARGV *);
     35 extern void argv_truncate(ARGV *, ssize_t);
     36 extern void argv_insert_one(ARGV *, ssize_t, const char *);
     37 extern void argv_replace_one(ARGV *, ssize_t, const char *);
     38 extern void argv_delete(ARGV *, ssize_t, ssize_t);
     39 struct VSTRING;
     40 extern char *argv_join(struct VSTRING *buf, ARGV *, int);
     41 extern ARGV *argv_free(ARGV *);
     42 
     43 extern ARGV *argv_split(const char *, const char *);
     44 extern ARGV *argv_split_count(const char *, const char *, ssize_t);
     45 extern ARGV *argv_split_append(ARGV *, const char *, const char *);
     46 
     47 extern ARGV *argv_splitq(const char *, const char *, const char *);
     48 extern ARGV *argv_splitq_count(const char *, const char *, const char *, ssize_t);
     49 extern ARGV *argv_splitq_append(ARGV *, const char *, const char *, const char *);
     50 
     51 extern ARGV *argv_split_at(const char *, int);
     52 extern ARGV *argv_split_at_count(const char *, int, ssize_t);
     53 extern ARGV *argv_split_at_append(ARGV *, const char *, int);
     54 
     55 #define ARGV_FAKE_BEGIN(fake_argv, arg) { \
     56 	ARGV fake_argv; \
     57 	char *__fake_argv_args__[2]; \
     58 	__fake_argv_args__[0] = (char *) (arg); \
     59 	__fake_argv_args__[1] = 0; \
     60 	fake_argv.argv = __fake_argv_args__; \
     61 	fake_argv.argc = fake_argv.len = 1;
     62 
     63 #define ARGV_FAKE2_BEGIN(fake_argv, arg1, arg2) { \
     64 	ARGV fake_argv; \
     65 	char *__fake_argv_args__[3]; \
     66 	__fake_argv_args__[0] = (char *) (arg1); \
     67 	__fake_argv_args__[1] = (char *) (arg2); \
     68 	__fake_argv_args__[2] = 0; \
     69 	fake_argv.argv = __fake_argv_args__; \
     70 	fake_argv.argc = fake_argv.len = 2;
     71 
     72 #define ARGV_FAKE_END	}
     73 
     74 #define ARGV_END	((char *) 0)
     75 
     76 /* LICENSE
     77 /* .ad
     78 /* .fi
     79 /*	The Secure Mailer license must be distributed with this software.
     80 /* AUTHOR(S)
     81 /*	Wietse Venema
     82 /*	IBM T.J. Watson Research
     83 /*	P.O. Box 704
     84 /*	Yorktown Heights, NY 10598, USA
     85 /*
     86 /*	Wietse Venema
     87 /*	Google, Inc.
     88 /*	111 8th Avenue
     89 /*	New York, NY 10011, USA
     90 /*--*/
     91 
     92 #endif
     93