123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- /***************************************************************************
- * *
- * _____ ____ *
- * | __ \ / __ \ _ _ _____ *
- * | | \ \ / / \_\ | | | | _ \ *
- * | | \ \| | | | | | |_| | *
- * | | | || | | | | | ___/ *
- * | | / /| | __ | | | | _ \ *
- * | |__/ / \ \__/ / | |___| | |_| | *
- * |_____/ \____/ |_____|_|_____/ *
- * *
- * Wiimms source code library *
- * *
- ***************************************************************************
- * *
- * Copyright (c) 2012-2022 by Dirk Clemens <wiimm@wiimm.de> *
- * *
- ***************************************************************************
- * *
- * This library 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 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This library 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. *
- * *
- * See file gpl-2.0.txt or http://www.gnu.org/licenses/gpl-2.0.txt *
- * *
- ***************************************************************************/
- #ifndef DCLIB_UI_H
- #define DCLIB_UI_H
- #include "dclib-basics.h"
- #include <getopt.h>
- //
- ///////////////////////////////////////////////////////////////////////////////
- /////////////// definitions ///////////////
- ///////////////////////////////////////////////////////////////////////////////
- // [[OptionIndex_t]] // max size of OptionIndex[]
- #ifndef UIOPT_INDEX_SIZE
- #define UIOPT_INDEX_SIZE 0x100
- #endif
- #undef UIOPT_INDEX_FW
- #if UIOPT_INDEX_SIZE <= 0x100
- #define UIOPT_INDEX_FW 2
- typedef u8 OptionIndex_t;
- #else
- #define UIOPT_INDEX_FW 3
- typedef u16 OptionIndex_t;
- #endif
- ///////////////////////////////////////////////////////////////////////////////
- enum // some const
- {
- UIOPT_USED_MASK = 0x7f, // mask to calculate usage count
- UIOPT_LONG_BASE = 0x80, // first index for "only long options"
- };
- //
- ///////////////////////////////////////////////////////////////////////////////
- /////////////// InfoOption_t ///////////////
- ///////////////////////////////////////////////////////////////////////////////
- // [[InfoOption_t]]
- typedef struct InfoOption_t
- {
- int id; // id of the option
- bool optional_parm; // true: option has optional parameters
- bool hidden; // true: option is hidden
- bool deprecated; // true: option is deprecated
- bool ignore; // true: ignore on 'HELP OPTIONS'
- bool separator; // true: print a separator above
- char short_name; // short option name
- ccp long_name; // the main long option name
- ccp param; // parameter name
- ccp help; // help info
- } InfoOption_t;
- //
- ///////////////////////////////////////////////////////////////////////////////
- /////////////// InfoCommand_t ///////////////
- ///////////////////////////////////////////////////////////////////////////////
- // [[InfoCommand_t]]
- typedef struct InfoCommand_t
- {
- int id; // id of the command
- bool hidden; // true: command is hidden
- bool deprecated; // true: command is deprecated
- bool separator; // true: print a separator above
- ccp name1; // main name
- ccp name2; // NULL or alternative name
- ccp syntax; // NULL or syntax info
- ccp help; // help text
- ccp xhelp; // NULL or a extended help text
- int n_opt; // number of options == elements of 'opt'
- const InfoOption_t ** opt; // field with option info
- u8 * opt_allowed; // field with OPT__N_SPECIFIC elements
- // 0: option permitted, 1: option allowed
- } InfoCommand_t;
- //
- ///////////////////////////////////////////////////////////////////////////////
- /////////////// InfoUI_t ///////////////
- ///////////////////////////////////////////////////////////////////////////////
- // [[InfoUI_t]]
- typedef struct InfoUI_t
- {
- ccp tool_name; // name of the tool
- //----- commands -----
- int n_cmd; // == CMD__N
- const KeywordTab_t * cmd_tab; // NULL or pointer to command table
- const InfoCommand_t * cmd_info; // pointer to 'CommandInfo[]'
- //----- options -----
- int n_opt_specific; // == OPT__N_SPECIFIC
- int n_opt_total; // == OPT__N_TOTAL
- const InfoOption_t * opt_info; // pointer to 'OptionInfo[]'
- u8 * opt_used; // pointer to 'OptionUsed[]'
- const OptionIndex_t * opt_index; // pointer to 'OptionIndex[]'
- ccp opt_short; // pointer to 'OptionShort[]'
- const struct option * opt_long; // pointer to 'OptionLong[]'
- } InfoUI_t;
- //
- ///////////////////////////////////////////////////////////////////////////////
- /////////////// Interface ///////////////
- ///////////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////
- enumError RegisterOptionByIndex
- (
- const InfoUI_t * iu, // valid pointer
- int opt_index, // index of option (OPT_*)
- int level, // the level of registration
- bool is_env // true: register environment pre setting
- );
- enumError RegisterOptionByName
- (
- const InfoUI_t * iu, // valid pointer
- int opt_name, // short name of GO_* value of option
- int level, // the level of registration
- bool is_env // true: register environment pre setting
- );
- enumError VerifySpecificOptions ( const InfoUI_t * iu, const KeywordTab_t * cmd );
- int GetOptionCount ( const InfoUI_t * iu, int option );
- void DumpUsedOptions ( const InfoUI_t * iu, FILE * f, int indent );
- void WarnDepractedOptions ( const InfoUI_t * iu );
- typedef enumError (*check_opt_func) ( int argc, char ** argv, bool mode );
- enumError CheckEnvOptions ( ccp varname, check_opt_func );
- ///////////////////////////////////////////////////////////////////////////////
- void DumpText
- (
- FILE * f, // output file, if NULL: 'pbuf' must be set
- char * pbuf, // output buffer, ignored if 'f' not NULL
- char * pbuf_end, // end of output buffer
- ccp text, // source text
- int text_len, // >=0: length of text, <0: use strlen(text)
- bool is_makedoc, // true: write makedoc format
- ccp end // write this text at the end of all
- );
- ///////////////////////////////////////////////////////////////////////////////
- void PrintHelp
- (
- const InfoUI_t * iu, // valid pointer
- FILE * f, // valid output stream
- int indent, // indent of output
- ccp help_cmd, // NULL or name of help command
- ccp info, // NULL or additional text
- ccp base_uri, // NULL or base URI for a external help link
- ccp first_param // NULL or first param of argv[]
- );
- void PrintHelpCmd
- (
- const InfoUI_t * iu, // valid pointer
- FILE * f, // valid output stream
- int indent, // indent of output
- int cmd, // index of command
- ccp help_cmd, // NULL or name of help command
- ccp info, // NULL or poiner to additional text
- ccp base_uri // NULL or base URI for a external help link
- );
- //
- ///////////////////////////////////////////////////////////////////////////////
- /////////////// END ///////////////
- ///////////////////////////////////////////////////////////////////////////////
- #endif // DCLIB_UI_H
|