1 2/* 3 * Time-stamp: "2007-04-15 09:59:39 bkorb" 4 * 5 * autoopts.h $Id: autoopts.h,v 4.23 2007/04/15 19:01:18 bkorb Exp $ 6 * Time-stamp: "2005-02-14 05:59:50 bkorb" 7 * 8 * This file defines all the global structures and special values 9 * used in the automated option processing library. 10 */ 11 12/* 13 * Automated Options copyright 1992-2007 Bruce Korb 14 * 15 * Automated Options is free software. 16 * You may redistribute it and/or modify it under the terms of the 17 * GNU General Public License, as published by the Free Software 18 * Foundation; either version 2, or (at your option) any later version. 19 * 20 * Automated Options is distributed in the hope that it will be useful, 21 * but WITHOUT ANY WARRANTY; without even the implied warranty of 22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 23 * GNU General Public License for more details. 24 * 25 * You should have received a copy of the GNU General Public License 26 * along with Automated Options. See the file "COPYING". If not, 27 * write to: The Free Software Foundation, Inc., 28 * 51 Franklin Street, Fifth Floor, 29 * Boston, MA 02110-1301, USA. 30 * 31 * As a special exception, Bruce Korb gives permission for additional 32 * uses of the text contained in his release of AutoOpts. 33 * 34 * The exception is that, if you link the AutoOpts library with other 35 * files to produce an executable, this does not by itself cause the 36 * resulting executable to be covered by the GNU General Public License. 37 * Your use of that executable is in no way restricted on account of 38 * linking the AutoOpts library code into it. 39 * 40 * This exception does not however invalidate any other reasons why 41 * the executable file might be covered by the GNU General Public License. 42 * 43 * This exception applies only to the code released by Bruce Korb under 44 * the name AutoOpts. If you copy code from other sources under the 45 * General Public License into a copy of AutoOpts, as the General Public 46 * License permits, the exception does not apply to the code that you add 47 * in this way. To avoid misleading anyone as to the status of such 48 * modified files, you must delete this exception notice from them. 49 * 50 * If you write modifications of your own for AutoOpts, it is your choice 51 * whether to permit this exception to apply to your modifications. 52 * If you do not wish that, delete this exception notice. 53 */ 54 55#ifndef AUTOGEN_AUTOOPTS_H 56#define AUTOGEN_AUTOOPTS_H 57 58#include "compat/compat.h" 59 60#define AO_NAME_LIMIT 127 61#define AO_NAME_SIZE ((size_t)(AO_NAME_LIMIT + 1)) 62 63#ifndef AG_PATH_MAX 64# ifdef PATH_MAX 65# define AG_PATH_MAX ((size_t)PATH_MAX) 66# else 67# define AG_PATH_MAX ((size_t)4096) 68# endif 69#else 70# if defined(PATH_MAX) && (PATH_MAX > MAXPATHLEN) 71# undef AG_PATH_MAX 72# define AG_PATH_MAX ((size_t)PATH_MAX) 73# endif 74#endif 75 76#undef EXPORT 77#define EXPORT 78 79#if defined(_WIN32) && !defined(__CYGWIN__) 80# define DIRCH '\\' 81#else 82# define DIRCH '/' 83#endif 84 85#ifndef EX_NOINPUT 86# define EX_NOINPUT 66 87#endif 88#ifndef EX_SOFTWARE 89# define EX_SOFTWARE 70 90#endif 91#ifndef EX_CONFIG 92# define EX_CONFIG 78 93#endif 94 95/* 96 * Convert the number to a list usable in a printf call 97 */ 98#define NUM_TO_VER(n) ((n) >> 12), ((n) >> 7) & 0x001F, (n) & 0x007F 99 100#define NAMED_OPTS(po) \ 101 (((po)->fOptSet & (OPTPROC_SHORTOPT | OPTPROC_LONGOPT)) == 0) 102 103#define SKIP_OPT(p) (((p)->fOptState & (OPTST_DOCUMENT|OPTST_OMITTED)) != 0) 104 105typedef int tDirection; 106#define DIRECTION_PRESET -1 107#define DIRECTION_PROCESS 1 108#define DIRECTION_CALLED 0 109 110#define PROCESSING(d) ((d)>0) 111#define PRESETTING(d) ((d)<0) 112 113#define ISNAMECHAR( c ) (isalnum(c) || ((c) == '_') || ((c) == '-')) 114 115/* 116 * Procedure success codes 117 * 118 * USAGE: define procedures to return "tSuccess". Test their results 119 * with the SUCCEEDED, FAILED and HADGLITCH macros. 120 * 121 * Microsoft sticks its nose into user space here, so for Windows' sake, 122 * make sure all of these are undefined. 123 */ 124#undef SUCCESS 125#undef FAILURE 126#undef PROBLEM 127#undef SUCCEEDED 128#undef SUCCESSFUL 129#undef FAILED 130#undef HADGLITCH 131 132#define SUCCESS ((tSuccess) 0) 133#define FAILURE ((tSuccess)-1) 134#define PROBLEM ((tSuccess) 1) 135 136typedef int tSuccess; 137 138#define SUCCEEDED( p ) ((p) == SUCCESS) 139#define SUCCESSFUL( p ) SUCCEEDED( p ) 140#define FAILED( p ) ((p) < SUCCESS) 141#define HADGLITCH( p ) ((p) > SUCCESS) 142 143/* 144 * When loading a line (or block) of text as an option, the value can 145 * be processed in any of several modes: 146 * 147 * @table @samp 148 * @item keep 149 * Every part of the value between the delimiters is saved. 150 * 151 * @item uncooked 152 * Even if the value begins with quote characters, do not do quote processing. 153 * 154 * @item cooked 155 * If the value looks like a quoted string, then process it. 156 * Double quoted strings are processed the way strings are in "C" programs, 157 * except they are treated as regular characters if the following character 158 * is not a well-established escape sequence. 159 * Single quoted strings (quoted with apostrophies) are handled the way 160 * strings are handled in shell scripts, *except* that backslash escapes 161 * are honored before backslash escapes and apostrophies. 162 * @end table 163 */ 164typedef enum { 165 OPTION_LOAD_COOKED, 166 OPTION_LOAD_UNCOOKED, 167 OPTION_LOAD_KEEP 168} tOptionLoadMode; 169 170extern tOptionLoadMode option_load_mode; 171 172/* 173 * The pager state is used by optionPagedUsage() procedure. 174 * When it runs, it sets itself up to be called again on exit. 175 * If, however, a routine needs a child process to do some work 176 * before it is done, then 'pagerState' must be set to 177 * 'PAGER_STATE_CHILD' so that optionPagedUsage() will not try 178 * to run the pager program before its time. 179 */ 180typedef enum { 181 PAGER_STATE_INITIAL, 182 PAGER_STATE_READY, 183 PAGER_STATE_CHILD 184} tePagerState; 185 186extern tePagerState pagerState; 187 188typedef enum { 189 ENV_ALL, 190 ENV_IMM, 191 ENV_NON_IMM 192} teEnvPresetType; 193 194typedef enum { 195 TOPT_UNDEFINED = 0, 196 TOPT_SHORT, 197 TOPT_LONG, 198 TOPT_DEFAULT 199} teOptType; 200 201typedef struct { 202 tOptDesc* pOD; 203 tCC* pzOptArg; 204 tAoUL flags; 205 teOptType optType; 206} tOptState; 207#define OPTSTATE_INITIALIZER(st) \ 208 { NULL, NULL, OPTST_ ## st, TOPT_UNDEFINED } 209 210#define TEXTTO_TABLE \ 211 _TT_( LONGUSAGE ) \ 212 _TT_( USAGE ) \ 213 _TT_( VERSION ) 214#define _TT_(n) \ 215 TT_ ## n , 216 217typedef enum { TEXTTO_TABLE COUNT_TT } teTextTo; 218 219#undef _TT_ 220 221typedef struct { 222 tCC* pzStr; 223 tCC* pzReq; 224 tCC* pzNum; 225 tCC* pzKey; 226 tCC* pzKeyL; 227 tCC* pzBool; 228 tCC* pzNest; 229 tCC* pzOpt; 230 tCC* pzNo; 231 tCC* pzBrk; 232 tCC* pzNoF; 233 tCC* pzSpc; 234 tCC* pzOptFmt; 235} arg_types_t; 236 237#define AGALOC( c, w ) ao_malloc((size_t)c) 238#define AGREALOC( p, c, w ) ao_realloc((void*)p, (size_t)c) 239#define AGFREE( p ) ao_free((void*)p) 240#define AGDUPSTR( p, s, w ) (p = ao_strdup(s)) 241 242static void * 243ao_malloc( size_t sz ); 244 245static void * 246ao_realloc( void *p, size_t sz ); 247 248static void 249ao_free( void *p ); 250 251static char * 252ao_strdup( char const *str ); 253 254#define TAGMEM( m, t ) 255 256/* 257 * DO option handling? 258 * 259 * Options are examined at two times: at immediate handling time and at 260 * normal handling time. If an option is disabled, the timing may be 261 * different from the handling of the undisabled option. The OPTST_DIABLED 262 * bit indicates the state of the currently discovered option. 263 * So, here's how it works: 264 * 265 * A) handling at "immediate" time, either 1 or 2: 266 * 267 * 1. OPTST_DISABLED is not set: 268 * IMM must be set 269 * DISABLE_IMM don't care 270 * TWICE don't care 271 * DISABLE_TWICE don't care 272 * 0 -and- 1 x x x 273 * 274 * 2. OPTST_DISABLED is set: 275 * IMM don't care 276 * DISABLE_IMM must be set 277 * TWICE don't care 278 * DISABLE_TWICE don't care 279 * 1 -and- x 1 x x 280 */ 281#define DO_IMMEDIATELY(_flg) \ 282 ( (((_flg) & (OPTST_DISABLED|OPTST_IMM)) == OPTST_IMM) \ 283 || ( ((_flg) & (OPTST_DISABLED|OPTST_DISABLE_IMM)) \ 284 == (OPTST_DISABLED|OPTST_DISABLE_IMM) )) 285 286/* B) handling at "regular" time because it was not immediate 287 * 288 * 1. OPTST_DISABLED is not set: 289 * IMM must *NOT* be set 290 * DISABLE_IMM don't care 291 * TWICE don't care 292 * DISABLE_TWICE don't care 293 * 0 -and- 0 x x x 294 * 295 * 2. OPTST_DISABLED is set: 296 * IMM don't care 297 * DISABLE_IMM don't care 298 * TWICE must be set 299 * DISABLE_TWICE don't care 300 * 1 -and- x x 1 x 301 */ 302#define DO_NORMALLY(_flg) ( \ 303 (((_flg) & (OPTST_DISABLED|OPTST_IMM)) == 0) \ 304 || (((_flg) & (OPTST_DISABLED|OPTST_DISABLE_IMM)) == \ 305 OPTST_DISABLED) ) 306 307/* C) handling at "regular" time because it is to be handled twice. 308 * The immediate bit was already tested and found to be set: 309 * 310 * 3. OPTST_DISABLED is not set: 311 * IMM is set (but don't care) 312 * DISABLE_IMM don't care 313 * TWICE must be set 314 * DISABLE_TWICE don't care 315 * 0 -and- ? x 1 x 316 * 317 * 4. OPTST_DISABLED is set: 318 * IMM don't care 319 * DISABLE_IMM is set (but don't care) 320 * TWICE don't care 321 * DISABLE_TWICE must be set 322 * 1 -and- x ? x 1 323 */ 324#define DO_SECOND_TIME(_flg) ( \ 325 (((_flg) & (OPTST_DISABLED|OPTST_TWICE)) == \ 326 OPTST_TWICE) \ 327 || (((_flg) & (OPTST_DISABLED|OPTST_DISABLE_TWICE)) == \ 328 (OPTST_DISABLED|OPTST_DISABLE_TWICE) )) 329 330/* 331 * text_mmap structure. Only active on platforms with mmap(2). 332 */ 333#ifdef HAVE_SYS_MMAN_H 334# include <sys/mman.h> 335#else 336# ifndef PROT_READ 337# define PROT_READ 0x01 338# endif 339# ifndef PROT_WRITE 340# define PROT_WRITE 0x02 341# endif 342# ifndef MAP_SHARED 343# define MAP_SHARED 0x01 344# endif 345# ifndef MAP_PRIVATE 346# define MAP_PRIVATE 0x02 347# endif 348#endif 349 350#ifndef MAP_FAILED 351# define MAP_FAILED ((void*)-1) 352#endif 353 354#ifndef _SC_PAGESIZE 355# ifdef _SC_PAGE_SIZE 356# define _SC_PAGESIZE _SC_PAGE_SIZE 357# endif 358#endif 359 360#ifndef HAVE_STRCHR 361extern char* strchr( char const *s, int c); 362extern char* strrchr( char const *s, int c); 363#endif 364 365/* 366 * Define and initialize all the user visible strings. 367 * We do not do translations. If translations are to be done, then 368 * the client will provide a callback for that purpose. 369 */ 370#undef DO_TRANSLATIONS 371#include "autoopts/usage-txt.h" 372 373/* 374 * File pointer for usage output 375 */ 376extern FILE* option_usage_fp; 377 378extern tOptProc optionPrintVersion, optionPagedUsage, optionLoadOpt; 379 380#endif /* AUTOGEN_AUTOOPTS_H */ 381/* 382 * Local Variables: 383 * mode: C 384 * c-file-style: "stroustrup" 385 * indent-tabs-mode: nil 386 * End: 387 * end of autoopts/autoopts.h */ 388