document arg_collect
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@7185 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		| @@ -65,7 +65,8 @@ struct getargs{ | ||||
| 	   arg_flag,  | ||||
| 	   arg_negative_flag,  | ||||
| 	   arg_strings, | ||||
| 	   arg_double | ||||
| 	   arg_double, | ||||
|            arg_collect | ||||
|     } type; | ||||
|     void *value; | ||||
|     const char *help; | ||||
| @@ -131,6 +132,76 @@ argument is a double precision floating point value, and | ||||
| .Fa value | ||||
| should point to a | ||||
| .Fa double . | ||||
| .It Fa arg_collect | ||||
| allows more fine-grained control of the option parsing process. | ||||
| .Fa value | ||||
| should be a pointer to a  | ||||
| .Fa getarg_collect_info | ||||
| structure: | ||||
| .Bd -literal | ||||
| typedef int (*getarg_collect_func)(int short_opt, | ||||
| 				   int argc, | ||||
| 				   char **argv, | ||||
| 				   int *optind, | ||||
| 				   int *optarg, | ||||
| 				   void *data); | ||||
|  | ||||
| typedef struct getarg_collect_info { | ||||
|     getarg_collect_func func; | ||||
|     void *data; | ||||
| } getarg_collect_info; | ||||
| .Ed | ||||
| .Pp | ||||
| With the | ||||
| .Fa func | ||||
| member set to a function to call, and  | ||||
| .Fa data | ||||
| to some application specific data. The parameters to the collect function are: | ||||
| .Bl -inset | ||||
| .It Fa short_flag | ||||
| non-zero if this call is via a short option flag, zero otherwise | ||||
| .It Fa argc , argv | ||||
| the whole argument list | ||||
| .It Fa optind | ||||
| pointer to the index in argv where the flag is | ||||
| .It Fa optarg | ||||
| pointer to the index in argv[*optind] where the flag name starts | ||||
| .It Fa data | ||||
| application specific data | ||||
| .El | ||||
| .Pp | ||||
| You can modify | ||||
| .Fa *optind , | ||||
| and  | ||||
| .Fa *optarg , | ||||
| but to do this correct you (more or less) have to know about the inner | ||||
| workings of getarg. | ||||
|   | ||||
| You can skip parts of arguments by increasing | ||||
| .Fa *optarg | ||||
| (you could | ||||
| implement the  | ||||
| .Fl z Ns Ar 3 | ||||
| set of flags from | ||||
| .Nm gzip | ||||
| with this), or whole argument strings by increasing | ||||
| .Fa *optind | ||||
| (let's say you want a flag  | ||||
| .Fl c Ar x y z | ||||
| to specify a coordinate); if you also have to set | ||||
| .Fa *optarg | ||||
| to a sane value. | ||||
| .Pp | ||||
| The collect function should return one of  | ||||
| .Dv ARG_ERR_NO_MATCH , ARG_ERR_BAD_ARG , ARG_ERR_NO_ARG | ||||
| on error, zero otherwise. | ||||
| .Pp | ||||
| For your convenience there is a function, | ||||
| .Fn getarg_optarg , | ||||
| that returns the traditional argument string, and you pass it all | ||||
| arguments, sans data, that where given to the collection function. | ||||
| .Pp | ||||
| Don't use this more this unless you absolutely have to. | ||||
| .El | ||||
| .Pp | ||||
| Option parsing is similar to what  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Johan Danielsson
					Johan Danielsson