Return to autoopts.h CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / ntp / sntp / libopts |
1.1 ! misho 1: ! 2: /* ! 3: * \file autoopts.h ! 4: * ! 5: * Time-stamp: "2011-03-25 17:51:34 bkorb" ! 6: * ! 7: * This file defines all the global structures and special values ! 8: * used in the automated option processing library. ! 9: * ! 10: * This file is part of AutoOpts, a companion to AutoGen. ! 11: * AutoOpts is free software. ! 12: * AutoOpts is Copyright (c) 1992-2011 by Bruce Korb - all rights reserved ! 13: * ! 14: * AutoOpts is available under any one of two licenses. The license ! 15: * in use must be one of these two and the choice is under the control ! 16: * of the user of the license. ! 17: * ! 18: * The GNU Lesser General Public License, version 3 or later ! 19: * See the files "COPYING.lgplv3" and "COPYING.gplv3" ! 20: * ! 21: * The Modified Berkeley Software Distribution License ! 22: * See the file "COPYING.mbsd" ! 23: * ! 24: * These files have the following md5sums: ! 25: * ! 26: * 43b91e8ca915626ed3818ffb1b71248b pkg/libopts/COPYING.gplv3 ! 27: * 06a1a2e4760c90ea5e1dad8dfaac4d39 pkg/libopts/COPYING.lgplv3 ! 28: * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd ! 29: */ ! 30: ! 31: #ifndef AUTOGEN_AUTOOPTS_H ! 32: #define AUTOGEN_AUTOOPTS_H ! 33: ! 34: #include "compat/compat.h" ! 35: #include "ag-char-map.h" ! 36: ! 37: #define AO_NAME_LIMIT 127 ! 38: #define AO_NAME_SIZE ((size_t)(AO_NAME_LIMIT + 1)) ! 39: ! 40: #ifndef AG_PATH_MAX ! 41: # ifdef PATH_MAX ! 42: # define AG_PATH_MAX ((size_t)PATH_MAX) ! 43: # else ! 44: # define AG_PATH_MAX ((size_t)4096) ! 45: # endif ! 46: #else ! 47: # if defined(PATH_MAX) && (PATH_MAX > MAXPATHLEN) ! 48: # undef AG_PATH_MAX ! 49: # define AG_PATH_MAX ((size_t)PATH_MAX) ! 50: # endif ! 51: #endif ! 52: ! 53: #undef EXPORT ! 54: #define EXPORT ! 55: ! 56: #if defined(_WIN32) && !defined(__CYGWIN__) ! 57: # define DIRCH '\\' ! 58: #else ! 59: # define DIRCH '/' ! 60: #endif ! 61: ! 62: #ifndef EX_NOINPUT ! 63: # define EX_NOINPUT 66 ! 64: #endif ! 65: #ifndef EX_SOFTWARE ! 66: # define EX_SOFTWARE 70 ! 67: #endif ! 68: #ifndef EX_CONFIG ! 69: # define EX_CONFIG 78 ! 70: #endif ! 71: ! 72: /* ! 73: * Convert the number to a list usable in a printf call ! 74: */ ! 75: #define NUM_TO_VER(n) ((n) >> 12), ((n) >> 7) & 0x001F, (n) & 0x007F ! 76: ! 77: #define NAMED_OPTS(po) \ ! 78: (((po)->fOptSet & (OPTPROC_SHORTOPT | OPTPROC_LONGOPT)) == 0) ! 79: ! 80: #define SKIP_OPT(p) (((p)->fOptState & (OPTST_DOCUMENT|OPTST_OMITTED)) != 0) ! 81: ! 82: typedef int tDirection; ! 83: #define DIRECTION_PRESET -1 ! 84: #define DIRECTION_PROCESS 1 ! 85: #define DIRECTION_CALLED 0 ! 86: ! 87: #define PROCESSING(d) ((d)>0) ! 88: #define PRESETTING(d) ((d)<0) ! 89: ! 90: /* ! 91: * When loading a line (or block) of text as an option, the value can ! 92: * be processed in any of several modes: ! 93: * ! 94: * @table @samp ! 95: * @item keep ! 96: * Every part of the value between the delimiters is saved. ! 97: * ! 98: * @item uncooked ! 99: * Even if the value begins with quote characters, do not do quote processing. ! 100: * ! 101: * @item cooked ! 102: * If the value looks like a quoted string, then process it. ! 103: * Double quoted strings are processed the way strings are in "C" programs, ! 104: * except they are treated as regular characters if the following character ! 105: * is not a well-established escape sequence. ! 106: * Single quoted strings (quoted with apostrophies) are handled the way ! 107: * strings are handled in shell scripts, *except* that backslash escapes ! 108: * are honored before backslash escapes and apostrophies. ! 109: * @end table ! 110: */ ! 111: typedef enum { ! 112: OPTION_LOAD_COOKED, ! 113: OPTION_LOAD_UNCOOKED, ! 114: OPTION_LOAD_KEEP ! 115: } tOptionLoadMode; ! 116: ! 117: static tOptionLoadMode option_load_mode; ! 118: ! 119: /* ! 120: * The pager state is used by optionPagedUsage() procedure. ! 121: * When it runs, it sets itself up to be called again on exit. ! 122: * If, however, a routine needs a child process to do some work ! 123: * before it is done, then 'pagerState' must be set to ! 124: * 'PAGER_STATE_CHILD' so that optionPagedUsage() will not try ! 125: * to run the pager program before its time. ! 126: */ ! 127: typedef enum { ! 128: PAGER_STATE_INITIAL, ! 129: PAGER_STATE_READY, ! 130: PAGER_STATE_CHILD ! 131: } tePagerState; ! 132: ! 133: typedef enum { ! 134: ENV_ALL, ! 135: ENV_IMM, ! 136: ENV_NON_IMM ! 137: } teEnvPresetType; ! 138: ! 139: typedef enum { ! 140: TOPT_UNDEFINED = 0, ! 141: TOPT_SHORT, ! 142: TOPT_LONG, ! 143: TOPT_DEFAULT ! 144: } teOptType; ! 145: ! 146: typedef struct { ! 147: tOptDesc* pOD; ! 148: tCC* pzOptArg; ! 149: tAoUL flags; ! 150: teOptType optType; ! 151: } tOptState; ! 152: #define OPTSTATE_INITIALIZER(st) \ ! 153: { NULL, NULL, OPTST_ ## st, TOPT_UNDEFINED } ! 154: ! 155: #define TEXTTO_TABLE \ ! 156: _TT_(LONGUSAGE) \ ! 157: _TT_(USAGE) \ ! 158: _TT_(VERSION) ! 159: #define _TT_(n) \ ! 160: TT_ ## n , ! 161: ! 162: typedef enum { TEXTTO_TABLE COUNT_TT } teTextTo; ! 163: ! 164: #undef _TT_ ! 165: ! 166: typedef struct { ! 167: char const * pzStr; ! 168: char const * pzReq; ! 169: char const * pzNum; ! 170: char const * pzFile; ! 171: char const * pzKey; ! 172: char const * pzKeyL; ! 173: char const * pzBool; ! 174: char const * pzNest; ! 175: char const * pzOpt; ! 176: char const * pzNo; ! 177: char const * pzBrk; ! 178: char const * pzNoF; ! 179: char const * pzSpc; ! 180: char const * pzOptFmt; ! 181: char const * pzTime; ! 182: } arg_types_t; ! 183: ! 184: #define AGALOC(c, w) ao_malloc((size_t)c) ! 185: #define AGREALOC(p, c, w) ao_realloc((void*)p, (size_t)c) ! 186: #define AGFREE(_p) free((void *)_p) ! 187: #define AGDUPSTR(p, s, w) (p = ao_strdup(s)) ! 188: ! 189: static void * ! 190: ao_malloc(size_t sz); ! 191: ! 192: static void * ! 193: ao_realloc(void *p, size_t sz); ! 194: ! 195: #define ao_free(_p) free((void *)_p) ! 196: ! 197: static char * ! 198: ao_strdup(char const *str); ! 199: ! 200: #define TAGMEM(m, t) ! 201: ! 202: /* ! 203: * DO option handling? ! 204: * ! 205: * Options are examined at two times: at immediate handling time and at ! 206: * normal handling time. If an option is disabled, the timing may be ! 207: * different from the handling of the undisabled option. The OPTST_DIABLED ! 208: * bit indicates the state of the currently discovered option. ! 209: * So, here's how it works: ! 210: * ! 211: * A) handling at "immediate" time, either 1 or 2: ! 212: * ! 213: * 1. OPTST_DISABLED is not set: ! 214: * IMM must be set ! 215: * DISABLE_IMM don't care ! 216: * TWICE don't care ! 217: * DISABLE_TWICE don't care ! 218: * 0 -and- 1 x x x ! 219: * ! 220: * 2. OPTST_DISABLED is set: ! 221: * IMM don't care ! 222: * DISABLE_IMM must be set ! 223: * TWICE don't care ! 224: * DISABLE_TWICE don't care ! 225: * 1 -and- x 1 x x ! 226: */ ! 227: #define DO_IMMEDIATELY(_flg) \ ! 228: ( (((_flg) & (OPTST_DISABLED|OPTST_IMM)) == OPTST_IMM) \ ! 229: || ( ((_flg) & (OPTST_DISABLED|OPTST_DISABLE_IMM)) \ ! 230: == (OPTST_DISABLED|OPTST_DISABLE_IMM) )) ! 231: ! 232: /* B) handling at "regular" time because it was not immediate ! 233: * ! 234: * 1. OPTST_DISABLED is not set: ! 235: * IMM must *NOT* be set ! 236: * DISABLE_IMM don't care ! 237: * TWICE don't care ! 238: * DISABLE_TWICE don't care ! 239: * 0 -and- 0 x x x ! 240: * ! 241: * 2. OPTST_DISABLED is set: ! 242: * IMM don't care ! 243: * DISABLE_IMM don't care ! 244: * TWICE must be set ! 245: * DISABLE_TWICE don't care ! 246: * 1 -and- x x 1 x ! 247: */ ! 248: #define DO_NORMALLY(_flg) ( \ ! 249: (((_flg) & (OPTST_DISABLED|OPTST_IMM)) == 0) \ ! 250: || (((_flg) & (OPTST_DISABLED|OPTST_DISABLE_IMM)) == \ ! 251: OPTST_DISABLED) ) ! 252: ! 253: /* C) handling at "regular" time because it is to be handled twice. ! 254: * The immediate bit was already tested and found to be set: ! 255: * ! 256: * 3. OPTST_DISABLED is not set: ! 257: * IMM is set (but don't care) ! 258: * DISABLE_IMM don't care ! 259: * TWICE must be set ! 260: * DISABLE_TWICE don't care ! 261: * 0 -and- ? x 1 x ! 262: * ! 263: * 4. OPTST_DISABLED is set: ! 264: * IMM don't care ! 265: * DISABLE_IMM is set (but don't care) ! 266: * TWICE don't care ! 267: * DISABLE_TWICE must be set ! 268: * 1 -and- x ? x 1 ! 269: */ ! 270: #define DO_SECOND_TIME(_flg) ( \ ! 271: (((_flg) & (OPTST_DISABLED|OPTST_TWICE)) == \ ! 272: OPTST_TWICE) \ ! 273: || (((_flg) & (OPTST_DISABLED|OPTST_DISABLE_TWICE)) == \ ! 274: (OPTST_DISABLED|OPTST_DISABLE_TWICE) )) ! 275: ! 276: /* ! 277: * text_mmap structure. Only active on platforms with mmap(2). ! 278: */ ! 279: #ifdef HAVE_SYS_MMAN_H ! 280: # include <sys/mman.h> ! 281: #else ! 282: # ifndef PROT_READ ! 283: # define PROT_READ 0x01 ! 284: # endif ! 285: # ifndef PROT_WRITE ! 286: # define PROT_WRITE 0x02 ! 287: # endif ! 288: # ifndef MAP_SHARED ! 289: # define MAP_SHARED 0x01 ! 290: # endif ! 291: # ifndef MAP_PRIVATE ! 292: # define MAP_PRIVATE 0x02 ! 293: # endif ! 294: #endif ! 295: ! 296: #ifndef MAP_FAILED ! 297: # define MAP_FAILED ((void*)-1) ! 298: #endif ! 299: ! 300: #ifndef _SC_PAGESIZE ! 301: # ifdef _SC_PAGE_SIZE ! 302: # define _SC_PAGESIZE _SC_PAGE_SIZE ! 303: # endif ! 304: #endif ! 305: ! 306: #ifndef HAVE_STRCHR ! 307: extern char* strchr(char const *s, int c); ! 308: extern char* strrchr(char const *s, int c); ! 309: #endif ! 310: ! 311: /* ! 312: * Define and initialize all the user visible strings. ! 313: * We do not do translations. If translations are to be done, then ! 314: * the client will provide a callback for that purpose. ! 315: */ ! 316: #undef DO_TRANSLATIONS ! 317: #include "autoopts/usage-txt.h" ! 318: ! 319: /* ! 320: * File pointer for usage output ! 321: */ ! 322: FILE * option_usage_fp; ! 323: static char const * program_pkgdatadir; ! 324: ! 325: extern tOptProc optionPrintVersion, optionPagedUsage, optionLoadOpt; ! 326: ! 327: #endif /* AUTOGEN_AUTOOPTS_H */ ! 328: /* ! 329: * Local Variables: ! 330: * mode: C ! 331: * c-file-style: "stroustrup" ! 332: * indent-tabs-mode: nil ! 333: * End: ! 334: * end of autoopts/autoopts.h */