// // aegis - project change supervisor // Copyright (C) 1991-1993, 1995, 1999, 2001-2006, 2008 Peter Miller // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see // . // #ifndef ARGLEX_H #define ARGLEX_H /** \addtogroup arglex * \brief Parse command switch * \ingroup Common * @{ */ #include #define ARGLEX_END_MARKER { (const char *)0, 0, } enum { ARGLEX_PREFETCH_FAIL = -99, arglex_token_eoln = -20, arglex_token_help, arglex_token_number, arglex_token_number_incomplete, arglex_token_option, arglex_token_option_incomplete, arglex_token_page_length, arglex_token_page_width, arglex_token_stdio, arglex_token_string, arglex_token_string_incomplete, arglex_token_trace, arglex_token_version }; struct arglex_table_ty { const char *t_name; int t_token; }; struct arglex_value_ty { const char *alv_string; long alv_number; }; extern int arglex_token; extern arglex_value_ty arglex_value; void arglex_init(int, char **, arglex_table_ty *); int arglex(void); int arglex_prefetch(int *, int); /** * The arglex_compare function is used to compare a command line string * with a formal spec of the option, to see if they compare equal. * * The actual is case-insensitive. Uppercase in the formal means a * mandatory character, while lower case means optional. Any number of * consecutive optional characters may be supplied by actual, but none * may be skipped, unless all are skipped to the next non-lower-case * letter. * * The underscore (_) is like a lower-case minus, it matches "", "-" * and "_". * * The "*" in a pattern matches everything to the end of the line, * anything after the "*" is ignored. The rest of the line is pointed * to by the "partial" variable as a side-effect (else it will be 0). * This rather ugly feature is to support "-I./dir" type options. * * A backslash in a pattern nominates an exact match required, case * must matche excatly here. This rather ugly feature is to support * "-I./dir" type options. * * For example: "-project" and "-P' both match "-Project", as does * "-proJ", but "-prj" does not. * * For example: "-devDir" and "-d_d' both match * "-Development_Directory", but "-dvlpmnt_drctry" does not. * * For example: to match include path specifications, use a pattern * such as "-\\I*", and the partial global variable will have the path * in it on return. * * \param formal * the "pattern" for the option * \param actual * what the user supplied * \param partial * Where to put the results of a "*" match. * * \returns * int; zero if no match, non-zero if they do match. */ bool arglex_compare(const char *formal, const char *actual, const char **partial); const char *arglex_token_name(int); arglex_table_ty *arglex_table_catenate(arglex_table_ty *, arglex_table_ty *); struct arglex_dispatch_ty { int token; void (*func)(void); int priority; }; void arglex_dispatch(arglex_dispatch_ty *table, int table_len, void (*usage)(void)); void arglex_synthetic(int, char **, int); void arglex_retable(arglex_table_ty *); int arglex_get_string(void); /** @} */ #endif // ARGLEX_H