From: Collins, R. (Research) <co...@re...> - 2004-12-21 20:55:00
|
Hello... It seems that mentioning a boolean option on the command line always sets it to be true, with no easy way set it to false. I'd like to suggest this diff to allow any boolean option to alternately be specified as "-no-OPTION_NAME", which would explicitly set it to be false. My concern is with the use of "argv-1" to get the string which appeared on the command line; it's safe when parse() is called from vul_arg.cxx:284, but I'm not so sure about what would happen if it were called from vul_arg.cxx:316 (it looks like it wouldn't crash, but I'm not sure it would always be correct.) But (judging by the comments) it looks like that would only happen if a boolean were set as a "non-option" argument, and I'm not sure exactly what that would entail. So... suggestions and comments are welcome! Thanks, -Roddy --------------------- $ cvs diff -w vul_arg.cxx Index: vul_arg.cxx =================================================================== RCS file: /cvsroot/vxl/vxl/core/vul/vul_arg.cxx,v retrieving revision 1.34 diff -w -r1.34 vul_arg.cxx 280c280,282 < if (args_[i]->option_==argmt) { --- > bool is_negated_bool_opt = > ((args_[i]->type_ == "bool") && (argmt == "-no"+args_[i]->option_)); > if ( (args_[i]->option_==argmt) || is_negated_bool_opt) { 494c496 < VDS int parse(vul_arg<bool>* argmt, char ** /*argv*/) --- > VDS int parse(vul_arg<bool>* argmt, char ** argv) 496c498,500 < argmt->value_ = true; --- > // value_ ==> false if (arg_as_passed == "-no-OPTION_NAME"); true otherwise > vcl_string arg_as_passed( *(argv-1) ), arg_as_named( argmt->option() ); > argmt->value_ = (arg_as_passed != "-no"+arg_as_named); |
From: Ian S. <ian...@st...> - 2005-01-14 18:29:50
|
Collins, Roderic (Research) wrote: > Hello... > > It seems that mentioning a boolean option on the command line always sets > it to be true, with no easy way set it to false. I'd like to suggest this > diff > to allow any boolean option to alternately be specified as > "-no-OPTION_NAME", > which would explicitly set it to be false. > > My concern is with the use of "argv-1" to get the string which appeared on > the > command line; it's safe when parse() is called from vul_arg.cxx:284, but I'm > not > so sure about what would happen if it were called from vul_arg.cxx:316 (it > looks > like it wouldn't crash, but I'm not sure it would always be correct.) But > (judging by the comments) it looks like that would only happen if a boolean > were set > as a "non-option" argument, and I'm not sure exactly what that would entail. > So... > suggestions and comments are welcome! > Support for additional boolean option formats -- especially ones that looked more like other standards (e.g. GNU's options) would be very valuable. I suspect that the best way to answer your question about implementation details is to write it and test it. The only thing I remember from previous experience of hacking the vul_arg code is that it isn't as complicated as it looks. Ian. |