1 .\" Man page generated from reStructuredText.
3 .TH CTXOPT 3 "2020" "" ""
5 ctxopt \- An advanced command line options manager.
7 .nr rst2man-indent-level 0
11 level \\n[rst2man-indent-level]
12 level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
19 .\" .rstReportMargin pre:
21 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
22 . nr rst2man-indent-level +1
23 .\" .rstReportMargin post:
27 .\" indent \\n[an-margin]
28 .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
29 .nr rst2man-indent-level -1
30 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
31 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
35 \fBctxopt\fP provides an advanced way to parse and evaluate complex command
36 line parameters and arguments.
38 Only two files \fBctxopt.h\fP and \fBctxopt.c\fP are needed to use \fBctxopt\fP
42 The command line can be considered as a tree of contexts.
43 This offers the possibility of having a hierarchy of option groups.
45 Each option has a set of parameters which must start with a single dash
46 and may appear in the command line.
47 These parameters are not limited to a dash followed by single letter.
48 In what follows, I will consider for simplicity that these are the options
49 which are visible in the command line and not one of their parameters.
51 Unless explicitly stated, the options are processed in the same order
52 as they appear in the command line, from left to right.
54 Any option may have the ability to modify the current context.
55 If such an option is seen in the command line, then the next option will
56 be looked for in this new context.
58 Initially the default context is the first created one in the program.
60 Exiting a context can be explicit, see below, or implicit if the current
61 option is not supported in this context.
62 The previous context in the hierarchy then becomes the current context
63 if it is not already the highest one.
65 An option which is unknown in the current context will be automatically
66 reevaluated in the previous one in the hierarchy.
67 If there is no such context, then a fatal error occurs.
69 A context can be explicitly delimited by a pair of symbols \fB{\fP and
71 The symbol \fB{\fP car appear just before or after the option responsible
72 of the context change.
74 The symbol \fB}\fP forces the end of a context.
76 The presence of \fB{\fP and \fB}\fP is purely optional and rarely necessary
77 but can help readability.
80 The API consists in the following functions:
83 \fBvoid ctxopt_init(char *\fP \fIprog_name\fP\fB);\fP
85 This function initializes the internal structures uses by \fBctxopt\fP\&.
86 It is mandatory and must me called first.
88 Its only argument \fIprog_name\fP is typically the content of \fBargv[0]\fP
89 which nearly always contains the name of the program.
91 \fIprog_name\fP is used by the error system.
99 \fBvoid ctxopt_new_ctx(char *\fP \fIname\fP\fB, char *\fP \fIopts_specs\fP\fB);\fP
101 The next thing to do after having called \fBctxopt_new_ctx\fP is to
102 define the contexts and its associated options.
104 Using this function, you can name the new context and its authorized
105 options and determine their main characteristics with a syntax easy
107 If they already exist in another context, then they must have the same
108 signature (described below) as in their previous appearance.
110 \fIname\fP is the name of the new context and \fIopts_specs\fP must contain a
111 description of the options allowed in this context.
113 \fIopts_specs\fP is a string containing various components separated by
114 spaces according to the syntax below:
118 A mandatory option named opt without parameter usable only one type in
122 Two mandatory option named \fBopt1\fP and \fBopt2\fP without argument.
125 Same as above but can appear multiple time in the context.
128 Same as above but the option is optional
131 One mandatory and one optional option named \fBopt1\fP and \fBopt2\fP
132 without argument. \fBopt2\fP can appear multiple times in the context.
135 One mandatory option named \fBopt*\fP taking one mandatory argument.
138 One mandatory option named \fBopt\fP taking one mandatory argument.
139 \fBtag\fP is ignored but can be used to improve the readability.
142 One mandatory option named \fBopt\fP taking one optional argument.
145 One mandatory option named \fBopt\fP taking one or more mandatory
148 .B opt>ctx... [#<value>]
149 The mandatory multiple option named \fBopt\fP will switch to the
150 context named \fBcxt\fP which will become the new current context.
152 It takes an optional argument with a tag named \fB<value>\fP\&.
155 One optional option named \fBopt\fP taking multiple optional
159 The mandatory option \fBopt\fP is restricted to only appear one or
160 two times in the context.
161 The number of its mandatory arguments must be exactly three.
164 The multiplicity or not of the options and argument, their mandatory or
165 optional characteristics constitutes their signatures.s
167 As said above, an option can appear in more than one context but must
168 have the same signature.
176 ctxopt_new_ctx("context1",
177 "[opt1>context2...] #arg1... [opt3]");
179 ctxopt_new_ctx("context2",
180 "[opt2 [#arg2]] [opt3]");
186 In the previous example, three options \fBopt1\fP, \fBopt2\fP and \fBopt3\fP
193 is mandatory and can appear more than one time and take multiple
197 is optional and take an optional argument.
200 is optional and take no argument.
201 Note that \fBopt3\fP is legal in both contexts.
208 \fBopt2\fP, if present in the command line, will be evaluated in the
209 context \fBcontext2\fP\&.
210 Note that, in this example, the \fBcontext2\fP can only be entered if
211 \fBopt1\fP has previously been seen in the command line.
212 Hence, \fBopt2\fP is only legal if \fBopt1\fP is present first.
214 \fBopt3\fP does not have this limitation.
215 In fact, as \fBopt3\fP is optional in \fBcontext2\fP and if its action
216 function is not interested in the name of the current context,
217 then it could have been omitted from the second setting thanks to
218 the backtracking: an option which is illegal in a context is retried
219 in the previous context in the hierarchy.
229 \fBvoid ctxopt_ctx_disp_usage(char *\fP \fIctx_name\fP\fB, usage_behaviour\fP \fIaction\fP\fB);\fP
231 This function builds and prints an usage help text for the
232 specific context \fIctx_name\fP\&.
233 The symbols used in this text are the same as those used when defining
234 options in \fBctxopt_new_ctx\fP\&.
236 The parameter \fIaction\fP can take the following values:
240 The program is not stopped when this function returns.
243 The program is stopped with a non zero return code (typically 1)
244 when this function returns.
247 The usage text is followed by a legend explaining the symbols meanings.
248 This function is useful when associated with a \fBhelp\fP or \fBusage\fP
257 \fBvoid ctxopt_disp_usage(usage_behaviour\fP \fIaction\fP\fB);\fP
259 This function is similar to the preceding one but displays the usage
260 help text for all the defined contexts.
261 It is useful when associated with a general \fBhelp\fP or \fBusage\fP
264 The parameter \fIaction\fP can take the following values:
268 The program is not stopped when this function returns.
271 The program is stopped with a non zero return code (typically 1)
272 when this function returns.
281 \fBvoid ctxopt_add_global_settings(settings\fP \fIs\fP\fB,\fP \fI\&...\fP\fB);\fP
283 This function allows to set general \fBctxopt\fP settings.
284 As for now, the only possible setting for \fIs\fP is \fBerror_functions\fP\&.
286 This setting tells \fBctxopt_add_global_settings\fP to use the rest of
287 its arguments in order to replace the built\-in error functions with
290 When the value of the first parameter is \fBerror_functions\fP,
291 then the second one must be one of the following constants:
295 A mandatory parameter is missing.
298 A given parameter is unknown in the current context.
301 An option has been seen more than once but has not been declared as
302 multiple in the context.
305 An option is incompatible with an option already given in the context.
308 A mandatory argument is missing.
310 .B CTXOPTCNTEOPT, CTXOPTCNTLOPT and CTXOPTCNTGOPT
311 The number of occurrences is not equal, lower or greater than a
314 .B CTXOPTCNTEARG, CTXOPTCNTLARG and CTXOPTCNTGARG
315 The number of arguments of an option is not equal, lower or greater
319 and the third parameter is a function pointer with the following
326 void (*) (errors err, state_t * state);
332 \fIstate\fP will point to the publicly available analysis state structure.
333 This structure contains a snapshot of variables related to the command
334 line analysis so far.
335 They and can be used to give the user clues about errors.
337 This structure available in \fBctxopt.h\fP is:
345 char * prog_name; /* base name of the program name. */
346 char * ctx_name; /* current context name. */
347 char * ctx_par_name; /* parameter which led to this context. */
348 char * opt_name; /* current option name. */
349 char * opt_params; /* all parameters of the current option. */
350 int opts_count; /* limit of the number of occurrences of *
351 | the current option. */
352 int opt_args_count; /* limit of the number of parameters of *
353 | the current option. */
354 char * pre_opt_par_name; /* parameter just before the current one. */
355 char * cur_opt_par_name; /* current parameter. */
362 All these pointers can be equal to the \fBNULL\fP pointer.
370 ctxopt_add_global_settings(error_functions, CTXOPTMISPAR, error);
382 \fBvoid ctxopt_add_ctx_settings(settings\fP \fIs\fP\fB,\fP \fI\&...\fP\fB);\fP
384 This function manages some settings for a given context.
385 Its first parameter \fIs\fP determines the setting and the signification
386 of the remaining arguments.
388 Its possible values are:
391 .B incompatibilities:
392 This setting allows to declare a set of options incompatible with
395 In this case the second argument must be a context name and the
396 third argument must be a string containing option names separated
399 Example of \fBincompatibilities\fP setting:
405 void ctxopt_add_ctx_settings(incompatibilities,
413 The three options named \fBopt1\fP, \fBopt2\fP and \fBopt3\fP will be
414 marked as mutually incompatibles in each instance of the context
418 This setting allows to associate a function to the context.
420 The second argument (called \fIf\fP below) will be called as soon as the
421 context is entered or exited during the evaluation phase.
423 Note that \fIf\fP will NOT be called if the context is empty
424 (does not contain any option).
426 The next parameters must be pointers to arbitrary data which may
427 be used by \fIf\fP\&.
429 In this setting, the last parameter must be \fBNULL\fP\&.
431 \fIf\fP must have the following prototype:
437 int (*) (char * name1, /* Context name */
438 direction status, /* entering or exiting */
439 char * name2, /* previous or next context */
440 int nb_data, /* Number of data */
441 void ** data /* Data */);
447 This function \fIf\fP will be called when entering \fBAND\fP exiting
449 Its arguments will then be set to:
453 the name of the context.
456 will be \fBentering\fP when entering the context and \fBexiting\fP
457 when exiting the context.
460 according to the content of \fIstatus\fP, the name of the context we
461 are coming from or the name of the context we are returning to.
463 \fIname2\fP can be \fBNULL\fP if we are entering in the main context or
467 The number of data pointers passed to the \fBctxopt_add_ctx_settings\fP
468 function after the \fIs\fP parameter.
471 The data pointers passed to the \fBctxopt_add_ctx_settings\fP function
472 after the \fIs\fP parameter and arranged in an array of \fInb_data\fP
475 Example of \fBactions\fP setting:
481 void ctxopt_add_ctx_settings(actions,
484 &data_1, &data_2, &data_3,
491 This function call registers the \fBaction\fP function to the context
492 named \fBcontext1\fP\&.
494 The action function will be called \fBafter\fP entering to and
495 \fBbefore\fP exiting from each instance of the context
496 named \fBcontext1\fP\&.
498 The optional \fIdata_X\fP pointers will be passed to \fBaction\fP through
499 its data pointer to allow it to manipulate them if needed.
500 The count of these pointers (3 here) will also be passed to action
501 through its \fInb_data\fP parameter.
503 The ending \fBNULL\fP is mandatory.
512 \fBvoid ctxopt_add_opt_settings(settings\fP \fIs\fP\fB, char *\fP \fIopt\fP\fB,\fP \fI\&...\fP\fB);\fP
514 This function manages some settings for an option whose name is given in
517 The first parameter \fIs\fP determines the exact setting and the
518 signification of the remaining arguments.
519 Its possible values are:
523 This setting allows to associate command line parameters with \fIopt\fP\&.
524 The set of parameters must be given in the third argument as a string
525 containing words separated by blanks.
527 Each appearance of one of these parameters in the command line will
528 trigger the action associated with the named option.
530 Each of these words must start with one and exactly one dash.
532 Example of \fBparameters\fP setting:
538 ctxopt_add_opt_settings(parameters,
546 In this example, \fBopt1\fP is the name of a previously defined option and
547 \fB\-p\fP, \fB\-parm\fP and \fB\-p1\fP will be three valid command line
548 parameters for the option \fBopt1\fP\&.
551 This setting allows to associate a function to this options.
552 As said above, this function will be called each time the option will be
553 recognized when evaluating the command line.
555 The function pointer must be given as the third argument.
557 Following the function pointer, it is possible to add a bunch of
558 other parameters which must be pointers to some pre\-allocated arbitrary
561 These pointers will be passed to the function when called.
562 The last parameter must be \fBNULL\fP to end the sequence.
564 The function needs to be given as the third argument and must
565 match the following prototype:
571 void (*) (char * ctx_name, /* Context name */
572 char * opt_name, /* Option name */
573 char * param, /* Parameter name */
574 int nb_values, /* Number of arguments */
575 char ** values, /* Arguments */
576 int nb_opt_data, /* Number of option data passed */
577 void ** opt_data, /* Array of option data passed */
578 int nb_ctx_data, /* Number of context data passed */
579 void ** ctx_data /* Array of context data passed */)
587 is the name of the current context.
590 is the name of the option.
593 is the name of the parameter that triggered the option \fIopt_name\fP\&.
596 is the number of arguments immediately following this option in
600 is an array of stings containing the arguments following this
601 option in the command line.
604 is the number of data pointers which were given after the third
605 arguments of \fBctxopt_add_opt_settings\fP\&.
608 The data pointers passed after the third arguments of
609 \fBctxopt_add_opt_settings\fP and reorganized as an array of
610 \fInb_opt_data\fP elements.
612 The aim is to be able to consult/alter options specific data.
615 Same as \fInb_opt_data\fP but referencing to the number of data
616 pointers given to \fBctxopt_add_ctx_settings\fP for the current
617 context after its third argument.
620 are the data pointers given to \fBctxopt_add_ctx_settings\fP for the
621 current context after its third argument.
623 The aim is to be able to consult/alter contexts specific data.
626 Example of \fBactions\fP setting:
632 void action(char * ctx_name,
635 int nb_values, char ** values,
636 int nb_opt_data, void ** opt_data,
637 int nb_ctx_data, void ** ctx_data)
644 void ctxopt_add_opt_settings(actions, "opt1", action,
645 &data_1, &data_2, &data_3,
652 This example associates the function \fIaction\fP to the option \fBopt1\fP\&.
654 Here, the \fIdata_*\fP pointers will be accessible to the function
655 \fIaction\fP when called through its argument \fIopt_data\fP and their number
656 (3 here) through its argument \fInb_opt_data\fP as mentioned above.
658 \fIaction\fP will also have access to the current context data in the
659 same way through its arguments \fIctx_data\fP and \fInb_ctx_data\fP\&.
661 The \fIaction\fP argument \fIparam\fP will receive the value of the specific
662 parameter which triggered it \- one of the parameters registered with
663 \fBctxopt_add_opt_settings\fP\&.
666 This setting registers a function whose responsibility is to validate
667 that the arguments of the option respect some constraints.
669 To do that the third argument must be a function pointer and the fourth
670 argument must be some arbitrary parameter to this function needed
671 to validate the constraint.
673 The constraint function must match the following prototype:
679 int (*) (int nb_args, char ** args, char * value, char * parameter);
691 is the number which will be set to the number of arguments fol\-
692 lowing the command line parameter.
695 is an array of nb_args strings containing theses arguments.
698 is an arbitrary string containing the constraints which must be
702 is the parameter of which \fIvalue\fP is an argument.
707 Three constraint functions are built\-in and are described below.
708 They give examples on how to build them.
710 Example of constraint function using the built\-it regular expression
711 constraint checker function:
717 ctxopt_add_opt_settings(constraints,
719 ctxopt_re_constraint,
726 In this example all the arguments of the option \fBopt1\fP must match
727 the extended regular expression:
739 See below for details about the function \fBctxopt_re_constraint\fP\&.
748 \fBint ctxopt_format_constraint(int\fP \fInb_args\fP\fB, char **\fP \fIargs\fP\fB, char *\fP \fIvalue\fP\fB, char *\fP \fIparameter\fP\fB);\fP
750 This pre\-defined constraint function checks whether the arguments
751 in \fIargs\fP respect a C printf format given in value, \fI%2d\fP by e.g.
752 It returns 1 if the checking is successful and 0 if not.
760 \fBint ctxopt_re_constraint(int\fP \fInb_args\fP\fB, char **\fP \fIargs\fP\fB, char *\fP \fIvalue\fP\fB, char *\fP \fIparameter\fP\fB);\fP
762 Another pre\-defined constraint function which checks if the arguments
763 of an option respects the extended regular expression given in \fIvalue\fP\&.
765 It returns 1 if the arguments respects the constraint and 0 if this
774 \fBint ctxopt_range_constraint(int\fP \fInb_args\fP\fB, char **\fP \fIargs\fP\fB, char *\fP \fIvalue\fP\fB, char *\fP \fIparameter\fP\fB);\fP
776 Yet another pre\-defined constraint function. This one checks if the
777 arguments of an option are in in a specified ranges.
779 \fIvalue\fP must contain a string made of a maximum of 2 long integers
782 The first or the second of these numbers can be replaced with the
783 character \(aq\fI\&.\fP\(aq. In this case only the minimum or maximum is checked
784 and the \(aq\fI\&.\fP\(aq equals to plus or minus infinity depending of this
787 It returns 1 if the arguments respects the constraint and 0 if this
796 \fBvoid ctxopt_analyze(int\fP \fInb_words\fP\fB, char **\fP \fIwords\fP\fB, int *\fP \fIrem_count\fP\fB, char ***\fP \fIrem_args\fP\fB);\fP
798 This function processes the registered contexts instances tree, detects
799 errors and possibly reorganizes the options order according
802 The first two arguments are similar to the \fIargc\fP and \fIargv\fP arguments
803 of the main function but without counting \fIargv[0]\fP\&.
804 Therefore, in many cases, \fInb_words\fP will have the value of \fIargc\-1\fP
805 and \fIwords\fP will have the value of \fIargv+1\fP\&.
807 The last two will receive the number of remaining (non analyzed)
808 command line words and the array of these remaining words.
809 Remaining words can be words appearing after \fB\-\-\fP per example.
811 All errors are fatal and terminates the program with a return code
823 ctxopt_analyze(argc\-1, argv+1, &res_argc, &res_argv);
835 \fBvoid ctxopt_evaluate(void);\fP
837 This function walks through the tree of context instances previously
838 built by \fBctxopt_analyze\fP and launches the action attached to
839 each options, if any, one after the other.
842 Pierre Gentile p.gen.progs@gmail.com
845 .\" Generated by docutils manpage writer.