From c6d4411cae455f138f0fa841be9e291ccc1a811a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net> Date: Thu, 16 Jan 1997 06:19:11 -0800 Subject: [PATCH] get_all_args added Rev: lib/include/getopt.pre.pike:1.2 --- lib/include/getopt.pre.pike | 130 ++++++++++++++++++++++++++++++++++-- 1 file changed, 123 insertions(+), 7 deletions(-) diff --git a/lib/include/getopt.pre.pike b/lib/include/getopt.pre.pike index c4f41ea6ea..b0b6897d5c 100644 --- a/lib/include/getopt.pre.pike +++ b/lib/include/getopt.pre.pike @@ -17,7 +17,7 @@ string|int find_option(array argv, mixed value; int i,hasarg; - hasarg=query_num_arg() == 5; + hasarg=query_num_arg() > 4; if(!arrayp(longform)) longform=({longform}); if(!arrayp(shortform)) shortform=({shortform}); if(!arrayp(envvars)) envvars=({envvars}); @@ -50,7 +50,7 @@ string|int find_option(array argv, exit(1); } value=argv[i+1]; - argv[i+1]=1; + argv[i+1]=0; } return value; } else { @@ -94,9 +94,6 @@ string|int find_option(array argv, } } } - } else { - if(getenv("POSIX_ME_HARDER")) - break; } } } @@ -109,8 +106,124 @@ string|int find_option(array argv, return def; } +/* + * ({ "name", ({aliases}), env_var, default }) + */ +mixed *find_all_options(string *argv, mixed *options, void|int posix_me_harder) +{ + mapping quick=([]); + foreach(options, mixed opt) + { + foreach(stringp(opt[1])?({opt[1]}):opt[1], mixed optname) + { + if(optname[0..1]=="--") + { + quick[optname]=opt; + }else{ + foreach(optname[1..]/"",string optletter) + { + quick["-"+optletter]=opt; + } + } + } + } + + mixed *ret=({}); + for(int e=1;e<sizeof(argv);e++) + { + if(!argv[e]) continue; + + if(strlen(argv[e]) && argv[e][0]=='-') + { + if(strlen(argv[e])>1 && argv[e][1]=='-') + { + string opt=argv[e]; + if(opt=="--") break; + + string arg; + sscanf(opt,"%s=%s",opt, arg); + if(mixed *option=quick[opt]) + { + argv[e]=0; + if(!arg && sizeof(option)>3) + { + if(e==sizeof(argv)-1) + { + werror("No argument to option "+opt+".\n"); + exit(1); + } + arg=argv[e+1]; + argv[e+1]=0; + } + ret+=({ ({ option[0], arg || 1 }) }); + } + }else{ + string *foo=argv[e]/""; + for(int j=1;j<strlen(foo);j++) + { + string opt="-"+foo[j]; + if(mixed *option=quick[opt]) + { + foo[j]=0; + string arg=argv[e][j+1..]; + if(sizeof(option)>3) + { + if(arg=="") + { + if(e==sizeof(argv)-1) + { + werror("No argument to option "+opt+".\n"); + exit(1); + } + arg=argv[e+1]; + argv[e+1]=0; + }else{ + foo=foo[..j]; + } + } + ret+=({ ({ option[0], arg || 1 }) }); + } + } + argv[e]=foo*""; + if(argv[e]=="-") argv[e]=0; + } + }else{ + if(posix_me_harder || getenv("POSIX_ME_HARDER")) + break; + } + } + + multiset done=mkmultiset(column(ret, 0)); + foreach(options, string *option) + { + if(done[ret]) continue; + if(sizeof(option) > 2) + { + mixed foo=option[2]; + if(!foo) continue; + if(stringp(foo)) foo=({foo}); + foreach(foo, foo) + { + if(foo=getenv(foo)) + { + ret+=({ ({name, foo}) }); + done[name]=1; + break; + } + } + + if(!done && sizeof(option)>3 && option[3]) + { + ret+=({ ({name, option[3]}) }); + done[name]=1; + } + } + } + return ret; +} + -string *get_args(string *argv) +string *get_args(string *argv, void|int posix_me_harder) { int i; for(i=1;i<sizeof(argv);i++) @@ -134,10 +247,13 @@ string *get_args(string *argv) werror("Unknown options "+argv[i]+".\n"); exit(1); } + }else{ + if(posix_me_harder || getenv("POSIX_ME_HARDER")) + break; } } - argv-=({0}); + argv-=({0,1}); return argv; } -- GitLab