1/** \ingroup popt 2 * @file 3 */ 4 5/* (C) 1998-2000 Red Hat, Inc. -- Licensing details are in the COPYING 6 file accompanying popt source distributions, available from 7 ftp://ftp.rpm.org/pub/rpm/dist. */ 8 9#ifndef H_POPTINT 10#define H_POPTINT 11 12#include <stdint.h> 13 14/** 15 * Wrapper to free(3), hides const compilation noise, permit NULL, return NULL. 16 * @param p memory to free 17 * @retval NULL always 18 */ 19static inline void * 20_free(const void * p) 21{ 22 if (p != NULL) free((void *)p); 23 return NULL; 24} 25 26/* Bit mask macros. */ 27typedef unsigned int __pbm_bits; 28#define __PBM_NBITS (8 * sizeof (__pbm_bits)) 29#define __PBM_IX(d) ((d) / __PBM_NBITS) 30#define __PBM_MASK(d) ((__pbm_bits) 1 << (((unsigned)(d)) % __PBM_NBITS)) 31typedef struct { 32 __pbm_bits bits[1]; 33} pbm_set; 34#define __PBM_BITS(set) ((set)->bits) 35 36#define PBM_ALLOC(d) calloc(__PBM_IX (d) + 1, sizeof(pbm_set)) 37#define PBM_FREE(s) _free(s); 38#define PBM_SET(d, s) (__PBM_BITS (s)[__PBM_IX (d)] |= __PBM_MASK (d)) 39#define PBM_CLR(d, s) (__PBM_BITS (s)[__PBM_IX (d)] &= ~__PBM_MASK (d)) 40#define PBM_ISSET(d, s) ((__PBM_BITS (s)[__PBM_IX (d)] & __PBM_MASK (d)) != 0) 41 42extern void poptJlu32lpair(const void *key, size_t size, 43 uint32_t *pc, uint32_t *pb); 44 45/** \ingroup popt 46 * Typedef's for string and array of strings. 47 */ 48typedef const char * poptString; 49typedef poptString * poptArgv; 50 51/** \ingroup popt 52 * A union to simplify opt->arg access without casting. 53 */ 54typedef union poptArg_u { 55 void * ptr; 56 int * intp; 57 short * shortp; 58 long * longp; 59 long long * longlongp; 60 float * floatp; 61 double * doublep; 62 const char ** argv; 63 poptCallbackType cb; 64 poptOption opt; 65} poptArg; 66 67extern unsigned int _poptArgMask; 68extern unsigned int _poptGroupMask; 69 70#define poptArgType(_opt) ((_opt)->argInfo & _poptArgMask) 71#define poptGroup(_opt) ((_opt)->argInfo & _poptGroupMask) 72 73#define F_ISSET(_opt, _FLAG) ((_opt)->argInfo & POPT_ARGFLAG_##_FLAG) 74#define LF_ISSET(_FLAG) (argInfo & POPT_ARGFLAG_##_FLAG) 75#define CBF_ISSET(_opt, _FLAG) ((_opt)->argInfo & POPT_CBFLAG_##_FLAG) 76 77/* XXX sick hack to preserve pretense of a popt-1.x ABI. */ 78#define poptSubstituteHelpI18N(opt) \ 79 { if ((opt) == poptHelpOptions) (opt) = poptHelpOptionsI18N; } 80 81struct optionStackEntry { 82 int argc; 83 poptArgv argv; 84 pbm_set * argb; 85 int next; 86 char * nextArg; 87 const char * nextCharArg; 88 poptItem currAlias; 89 int stuffed; 90}; 91 92struct poptContext_s { 93 struct optionStackEntry optionStack[POPT_OPTION_DEPTH]; 94 struct optionStackEntry * os; 95 poptArgv leftovers; 96 int numLeftovers; 97 int allocLeftovers; 98 int nextLeftover; 99 const struct poptOption * options; 100 int restLeftover; 101 const char * appName; 102 poptItem aliases; 103 int numAliases; 104 unsigned int flags; 105 poptItem execs; 106 int numExecs; 107 char * execFail; 108 poptArgv finalArgv; 109 int finalArgvCount; 110 int finalArgvAlloced; 111 int (*maincall) (int argc, const char **argv); 112 poptItem doExec; 113 const char * execPath; 114 int execAbsolute; 115 const char * otherHelp; 116 pbm_set * arg_strip; 117}; 118 119#if defined(POPT_fprintf) 120#define POPT_dgettext dgettext 121#else 122#ifdef HAVE_ICONV 123#include <iconv.h> 124#endif 125 126#if defined(HAVE_DCGETTEXT) 127char *POPT_dgettext(const char * dom, const char * str); 128#endif 129 130FORMAT(printf, 2, 3) 131int POPT_fprintf (FILE* stream, const char *format, ...); 132#endif /* !defined(POPT_fprintf) */ 133 134const char *POPT_prev_char (const char *str); 135const char *POPT_next_char (const char *str); 136 137#endif 138 139#if defined(ENABLE_NLS) && defined(HAVE_LIBINTL_H) 140#include <libintl.h> 141#endif 142 143#if defined(ENABLE_NLS) && defined(HAVE_GETTEXT) 144#define _(foo) gettext(foo) 145#else 146#define _(foo) foo 147#endif 148 149#if defined(ENABLE_NLS) && defined(HAVE_LIBINTL_H) && defined(HAVE_DCGETTEXT) 150#define D_(dom, str) POPT_dgettext(dom, str) 151#define POPT_(foo) D_("popt", foo) 152#else 153#define D_(dom, str) str 154#define POPT_(foo) foo 155#endif 156 157#define N_(foo) foo 158 159