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