digitalmars.D.announce - optparse.d -- good enough to be std.optparse?
- derick_eddington nospam.yashmoo.com (730/730) May 30 2005 I've made a command-line option helper similar to Python's optparse. It...
- derick_eddington nospam.yashmoo.com (3/18) May 30 2005 Arg, forgot to : these. The help print is nicely formatted...
- Kris (9/145) May 30 2005 Very useful. I'd like to add this to Mango, if that would be OK?
- derick_eddington nospam.yashmoo.com (2/17) May 30 2005
- kris (2/3) May 30 2005 Excellent ~ thx!
- James Dunne (4/7) May 31 2005 Regards,
- derick_eddington nospam.yashmoo.com (737/737) Jun 01 2005 I've updated optparse.d:
- Andrew Fedoniouk (13/155) May 31 2005 Cool, Derick!
- derick_eddington nospam.yashmoo.com (11/22) Jun 01 2005 If it could be setup statically at compile-time and have the same concis...
- Andrew Fedoniouk (7/45) Jun 01 2005 Yep. You are right. I was thinking about simple
I've made a command-line option helper similar to Python's optparse. It allows
you to specify what D-type you want the option as, short name, long name, help,
and more. It automatically creates a formatted help message and prints it on
errors. It checks that clients' usage of the module is proper; and it checks
that the command-line arguments meet what was specified. It has a compehensive
unittest that demonstrates more. The source is attached.
: /**
: * Example usage:
: */
: int main (char[][] args)
: {
: int verbosity;
: char[] outfile;
: char[][] files;
:
: // Constructor parameters are used in printing help.
: // -h / --help is always added by default
: // and uses program-name and usage.
: // --version (no short name) is added by
: // default if version is given.
: // program-name
: OptionParser op = new OptionParser(__FILE__[0..$-2],
: // usage version
: "[options] --files=f1,fN [outfile]", "0.2");
:
: // int, short and long, help, metavar,
: // no default, not mandatory
: op.addOption!(int)("v", "verbose",
: "Be more and more and more and more and more "
: "and more and more verbose.", "LEVEL");
: // comma-separated string list, short and long, help,
: // metavar, no default, mandatory
: op.addOption!(char[][])("fs", "files",
: "Files to process, and make this a really long help "
: "string as well to test aligning.", "FILE,FILE,...",
: null, true);
: // float, long-only, help, metavar, default, not mandatory
: op.addOption!(float)(null, "thing", "Do it with this.",
: "FLOAT", -4.297e21f);
: // no-value, short-only, with help, no metavar,
: // no default, not mandatory
: op.addOption!()("a", null, "Use alternate method.");
:
: // Parse command-line arguments, including args[0]
: // program-name (it's skipped).
: // args will be reset to the remaining non-option
: // command-line arguments in the order they appeared.
: Options options = op.parse(args);
:
: // Check if option was given on the command-line
: // by using (char[] in Options).
: // If the option has both short and long names,
: // either can be used.
: if ("verbose" in options)
: // If option was given and it has a value,
: // retrieve it by indexing Options with short
: // or long name (or only one if only one)
: // and do getValue!(T)
: verbosity = options["verbose"].getValue!(int);
:
: if (verbosity > 0)
: writefln("I'll say a little.");
: if (verbosity > 1)
: writefln("I'll say a lot more.");
:
: // args was reset by parse to the remaining
: // non-option command-line arguments
: if (args.length == 1)
: // use the first non-option argument
: outfile = args[0];
: else if (args.length > 1)
: // OptionError.errorExit("message") can be used to
: // print help and exit process;
: // useful when checking non-option arguments
: op.errorExit("more than one output file specified");
:
: // mandatory options can be assumed to be
: // there after successful parse
: assert ("files" in options);
: files = options["files"].getValue!(char[][]);
: if (files.length == 0)
: op.errorExit("need to specifiy at least one input file");
:
: if (verbosity > 0)
: {
: if ("thing" in options)
: writefln("my thing is: ",
: options["thing"].getValue!(float));
:
: // no-value options are simply tested for being in Options
: if ("a" in options)
: writefln("I would process files using alternate method:");
: else
: writefln("I would process files using normal method:");
: foreach (char[] f; files)
: writefln("\t",f);
: writefln("and output to ",
: outfile.length ? outfile : "<stdout>");
: }
:
: return 0;
: }
Example command-line output of above program:
---------------------------------------------------------------
$ ./example -h
usage: optparse [options] --files=f1,fN [outfile]
options:
-h, --help Show this help message and exit.
--version Show program's version number and exit.
-vLEVEL, --verbose=LEVEL
Be more and more and more and more and more and more
and more verbose.
-fsFILE,FILE,..., --files=FILE,FILE,...
Files to process, and make this a really long help
string as well to test aligning.
--thing=FLOAT Do it with this.
-a Use alternate method.
---------------------------------------------------------------
$ ./example -v2 --files=somefile,anotherfile,nextfile --thing -4.23e-6 -a
outputfile
I'll say a little.
I'll say a lot more.
my thing is: -4.23e-06
I would process files using alternate method:
somefile
anotherfile
nextfile
and output to outputfile
---------------------------------------------------------------
$ ./example --asdf
optparse: error: no such option: --asdf
[help]
---------------------------------------------------------------
$ ./example
optparse: error: -fs / --files option is mandatory
[help]
begin 0644 optparse.d
M*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ
M*BHJ*BHJ* T*("H 0GD 1&5R:6-K($5D9&EN9W1O;BX 4&QA8V5D(&EN('1H
M92!P=6)L:6, 9&]M86EN+B` ("` ("` ("` ("` ("` ("` ("` ("H-"B`J
M($EN<W!I<F5D(&)Y(%!Y=&AO;B=S(&]P='!A<G-E+B` ("` ("` ("` ("`
M("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("`
M("` ("` ("` ("` ("` ("` * T*("H 4V5E(&)O='1O;2!O9B!T:&ES(&9I
M;&4 9F]R(&5X86UP;&4 =7-A9V4N("` ("` ("` ("` ("` ("` ("` ("`
M("` ("` ("H-"B`J*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ
M*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ+PT*
M=&0N<W1D87)G+`T*("` ("` ("` ("` ("` <W1D+G-T9&EO+`T*("` ("`
M97,-"GL-" E.;U9A;'5E+`T*"4EN="P-" E);G1!<G)A>2P-"B\K('5I;G0
M:7, 8V%U<VEN9R!S;VUE($1-1"!B=6<N+BX-" E526YT+`T*"55);G1!<G)A
M:69T>7!E("A4(#H :6YT*2` ("` ("![(')E='5R;B!3=7!P;W)T9614>7!E
M<RY);G0[('T-" D)96QS92!I9G1Y<&4 *%0 .B!I;G1;72D ("` ('L <F5T
M="D ("` ("` >R!R971U<FX 4W5P<&]R=&5D5'EP97,N54EN=#L ?0T*"0EE
M;'-E(&EF='EP92`H5"`Z('5I;G1;72D ("` ('L <F5T=7)N(%-U<'!O<G1E
M"65L<V4 :69T>7!E("A4(#H ;&]N9UM=*2` ("` >R!R971U<FX 4W5P<&]R
M"65L<V4 :69T>7!E("A4(#H =6QO;F=;72D ("` ('L <F5T=7)N(%-U<'!O
M<G1E9%1Y<&5S+E5,;VYG07)R87D[('TK+PT*"0EE;'-E(&EF='EP92`H5"`Z
M(&9L;V%T*2` ("` >R!R971U<FX 4W5P<&]R=&5D5'EP97,N1FQO870[('T-
M" D)96QS92!I9G1Y<&4 *%0 .B!F;&]A=%M=*2` ('L <F5T=7)N(%-U<'!O
M<G1E9%1Y<&5S+D9L;V%T07)R87D[('T-"B\K"0EE;'-E(&EF='EP92`H5"`Z
M(&1O=6)L92D ("` ('L <F5T=7)N(%-U<'!O<G1E9%1Y<&5S+D1O=6)L93L
M?0T*"0EE;'-E(&EF='EP92`H5"`Z(&1O=6)L95M=*2` ('L <F5T=7)N(%-U
M<'!O<G1E9%1Y<&5S+D1O=6)L94%R<F%Y.R!]*R\-" D)96QS92!I9G1Y<&4
M*%0 .B!C:&%R6UTI("` ('L <F5T=7)N(%-U<'!O<G1E9%1Y<&5S+E-T<FEN
M9SL ?0T*"0EE;'-E(&EF='EP92`H5"`Z(&-H87);75M=*2` >R!R971U<FX
M4W5P<&]R=&5D5'EP97,N4W1R:6YG07)R87D[('T-" D)96QS92![('1H<F]W
M="!C;V1E(&%T=&5M<'1I;F<-"B`J('1O('5S92!U;G-U<'!O<G1E9"!T>7!E
M:79A=&4 8VQA<W, 56Y3=7!P;W)T9614>7!E17)R;W( .B!%<G)O< T*>PT*
M("H 17)R;W)S('=I=& ;W!T<&%R<V4 ;6]D=6QE('5S86=E+B!0<F]P;V=A
M(#H 17)R;W(-"GL-" ET:&ES("AC:&%R6UT ;7-G*2` >R!S=7!E<BAM<V<I
M;W!T:6]N<RX 0V%U<V5S(&UE<W-A9V4 =&\ 8F4 <')I;G1E9`T*("H 86YD
M('!R;V=R86T 97AI=&5D+B` 1&]E<R!N;W0 <')O<&]G871E(&]U="!O9B!M
M< T*>PT*"71H:7, *&-H87);72!M<V<I("![('-U<&5R*&US9RD[('T-"GT-
M0V]N<W1R=6-T(&ET('=I=& >6]U<B!P<F]G<F%M)W, ;F%M90T*("H 86YD
M(&]P=&EO;F%L;'D 82!U<V%G92!M97-S86=E(&%N9"!V97)S:6]N('-T<FEN
M;E!A<G-E< T*>PT*"7!R:79A=&4 8VAA<EM=('!R;V=.86UE+"!U<V%G92P
M=F5R.PT*"7!R:79A=&4 0F%S94]P=&EO;EM=(&9I;F1/<'1I;VYS.PT*"7!R
M8VAA<EM=('!R;V=.86UE+"!C:&%R6UT =7-A9V4 /2!N=6QL+"!C:&%R6UT
M=F5R(#T
M" D)=&AI<RYU<V%G92`]('5S86=E.PT*"0ET:&ES+G9E<B`]('9E<CL-" D)
M861D3W!T:6]N(2 I*")H(BP (FAE;'`B+"`B4VAO=R!T:&ES(&AE;'` ;65S
M<'1I;VXA*"DH;G5L;"P (G9E<G-I;VXB+"`B4VAO=R!P<F]G<F%M)W, =F5R
M('=I=&AO=70 82!T>7!E(&9O<B!A(&YO+79A;'5E+W1O9V=L92!O<'1I;VX[
M(&]R('5S92!W:71H(&]N92!O9B!T:&4-" D *B!S=7!P;W)T960 ='EP97,
M=&\ <F5T<FEE=F4 =&AE(&]P=&EO;B=S('9A;'5E(&%S('1H870 1"UT>7!E
M<W!E8VEF:65D+"!O<B!B;W1H+B` :&5L<"!I<R!T:&4 :&5L<"!M97-S86=E
M;2=S(&AE;'` :7, <')I;G1E9"X (&UE=&%687( :7,-" D *B!A(&1E<V-I
M<'1I=F4 ;F%M92!F;W( =&AE(&]P=&EO;B=S('9A;'5E('5S960 :6X <')I
M;G1I;F< ;W!T:6]N<R!W:71H('9A;'5E<RX-" D *B!4:&4 =F%R87)G<R!I
M<R!T;R!A;&QO=R`G5"!D969A=6QT5F%L=64G(&%N9"`G8F]O;"!M86YD871O
M(&1E9F%U;'0 =F%L=64 9F]R(&]P=&EO;G, =VET:"!V86QU97, 86YD(&UA
M:V4 =&AA=`T*"2`J(&]P=&EO;B!A;'=A>7, 9F]U;F0 =VET:"!T:&%T('9A
M;'5E(&)Y(&1E9F%U;'0N("!M86YD871O<GD <W!E8VEF:65S('=H971H97(-
M" D *B!T:&4 ;W!T:6]N(&UU<W0 8F4 9VEV96X ;VX =&AE(&-O;6UA;F0M
M;&EN92X ($EF(&)O=& 9&5F875L=%9A;'5E(&%N9`T*"2`J(&%N9"!M86YD
M871O<GD 87)E(&=I=F5N+"!M86YD871O<GD =VEL;"!H879E(&YO(&5F9F5C
M="X ($EF(&1E9F%U;'1686QU92!I<PT*"2`J(&YU;&PL(&ET(&UE86YS(&YO
M(&1E9F%U;'0 =F%L=64N("!D969A=6QT5F%L=64 ;75S="!B92!N=6QL(&9O
M<B!N;RUV86QU90T*"2`J(&]P=&EO;G, =&AA="!N965D('1O('-P96-I9FEY
M(&UA;F1A=&]R>2X-" D *B\-" ET96UP;&%T92!A9&1/<'1I;VX *%0 /2!.
M;U9A;'5E*0T*"7L-" EV;VED(&%D9$]P=&EO;B`H8VAA<EM=('-H;W)T3F%M
M92P 8VAA<EM=(&QO;F=.86UE(#T ;G5L;"P 8VAA<EM=(&AE;'` /2!N=6QL
M="`H<VAO<G1.86UE+FQE;F=T:"!\?"!L;VYG3F%M92YL96YG=& I.PT*"0EA
M<W-E<G0 *%]A<F=U;65N=',N;&5N9W1H(#P
M" D)9F]R96%C:"`H0F%S94]P=&EO;B!O.R!F:6YD3W!T:6]N<RD >PT*"0D)
M:68 *'-H;W)T3F%M92YL96YG=& )B8 <VAO<G1.86UE(#T](&\N<VAO<G1.
M86UE*0T*"0D)"71H<F]W(&YE=R!/<'1087)S945R<F]R*")C;VYF;&EC=&EN
M9R!O<'1I;VXZ("TB('X <VAO<G1.86UE*3L-" D)"6EF("AL;VYG3F%M92YL
M96YG=& )B8 ;&]N9TYA;64 /3T ;RYL;VYG3F%M92D-" D)"0ET:')O=R!N
M97< 3W!T4&%R<V5%<G)O<B B8V]N9FQI8W1I;F< ;W!T:6]N.B`M+2( ?B!L
M<'1I;VXA*%0I*'-H;W)T3F%M92P ;&]N9TYA;64L(&AE;'`L(&UE=&%687(I
M"0DO+R!N965D960 =&\ 861V86YC92!?87)G<'1R(&)E8V%U<V4 ;6%N9&%T
M('9A7V%R9R$H='EP96]F*&YU;&PI*2A?87)G<'1R*3L-" D)"0EI9B`H7V%R
M9W5M96YT<ULP72`A/2!T>7!E:60H='EP96]F*&YU;&PI*2!\?"!I9VYO<F4
M(3T ;G5L;"D-" D)"0D)=&AR;W< ;F5W($]P=%!A<G-E17)R;W(H9F]R;6%T
M*"(E<R!O<'1I;VX :&%S(&YO('9A;'5E+"!D969A=6QT('9A;'5E(&UU<W0
M8F4 ;G5L;"!W:&5N('-P96-I9FEY:6YG(&UA;F1A=&]R>2(L(&]P=&EO;BDI
M=&AR;W< ;F5W($]P=%!A<G-E17)R;W(H9F]R;6%T*"(E<R!O<'1I;VX :&%S
M(&YO('9A;'5E+"!S;R!N;R!D969A=6QT('9A;'5E(&-A;B!B92!S<&5C:69I
M960B+"!O<'1I;VXI*3L-" D)?0T*"0EE;'-E('L-" D)"6EF("A?87)G=6UE
M;G1S+FQE;F=T:"D >PT*"0D)"6EF("A?87)G=6UE;G1S6S!=("$]('1Y<&5I
M('1Y<&5I9"A4*2D-" D)"0D)"71H<F]W(&YE=R!/<'1087)S945R<F]R*&9O
M<FUA=" B)7, ;W!T:6]N)W, 9&5F875L="!V86QU92!N;W0 ='EP92`E<RP
M:7, ='EP92`E<R(L(&]P=&EO;BP ='EP96ED*%0I+"!?87)G=6UE;G1S6S!=
M9F%U;'1686QU94]P=&EO;G-;;W!T:6]N+G-H;W)T3F%M95T /2!O<'1I;VX[
M875L=%9A;'5E3W!T:6]N<UMO<'1I;VXN;&]N9TYA;65=(#T ;W!T:6]N.PT*
M"0D)"0DO+V1E8G5G('=R:71E9FQN*")<=&1E9F%U;'0 =F%L=64 /2`E<R(L
M=',N;&5N9W1H(#X ,2D >PT*"0D)"0DO+R!N965D960 =&\ 861V86YC92!?
M87)G<'1R(&EN8V%S92!M86YD871O<GD :7, ;F5X="!V87)A<F<-" D)"0D)
M='EP96]F*&YU;&PI(&EG;F]R92`]('9A7V%R9R$H='EP96]F*&YU;&PI*2A?
M;&5N9W1H(#X ,2D >PT*"0D):68 *%]A<F=U;65N='-;,5T (3T ='EP96ED
M*&)O;VPI*0T*"0D)"71H<F]W(&YE=R!/<'1087)S945R<F]R*&9O<FUA=" B
M)7, ;W!T:6]N(&UA;F1A=&]R>2!M=7-T(&)E('1Y<&4 )7,B+"!O<'1I;VXL
M('1Y<&5I9"AB;V]L*2DI.PT*"0D);W!T:6]N+FUA;F1A=&]R>2`]('9A7V%R
M" D *B!087)S92!C;VUM86YD+6QI;F4 87)G=6UE;G1S+B!A<F=S6S!=(&ES
M(&%S<W5M960 =&\ 8F4 =&AE('!R;V=R86TM;F%M90T*"2`J(&%N9"!I<R!S
M:VEP<&5D+B` 0VAE8VMS(&%R9W, ;65E=', =&AE('-P96-I9FEE9"!O<'1I
M;VYS+B` 87)G<R!I<R!R97-E=`T*"2`J('1O(&)E(&%N(&%R<F%Y(&]F(&%L
M;"!N;VXM;W!T:6]N(&%R9W5M96YT<R`H=&AO<V4 =&AA="!D;R!N;W0 <W1A
M<G0 =VET:`T*"2`J("<M)R!A;F0 9&\ ;F]T(&9O;&QO=R!A('9A;'5E+71A
M:7, =7-E9"!T:'5S('1O(&-H96-K(&9O<B!F;W5N9"!O<'1I;VYS.B`H(F]P
M=&YA;64B(&EN(&]P=&EO;G,I.R!A;F0-" D *B!U<V5D('1H=7, =&\ <F5T
M<FEE=F4 ;W!T:6]N('9A;'5E<SH ;W!T:6]N<ULB;W!T;F%M92)=+F=E=%9A
M;'5E(2A4*2X-" D *B\-" E/<'1I;VYS('!A<G-E("AI;F]U="!C:&%R6UU;
M"6)O9'D >PT*"0ED96)U9R!W<FET969L;B B)7,N<&%R<V4H87)G<RYL96YG
M;F1/<'1I;VYS.PT*"0DO+R!C;W!Y(&1E9F%U;'1686QU94]P=&EO;G, :6YT
M"69O<F5A8V *&-H87);72!O<'1S=')I;F<L($)A<V5/<'1I;VX ;SL 9&5F
M875L=%9A;'5E3W!T:6]N<RD-" D)"69O=6YD3W!T:6]N<UMO<'1S=')I;F==
M(#T ;SL-" D)8VAA<EM=6T)A<V5/<'1I;VY=(&]P='-686QS.PT*"0EC:&%R
M('1H870 87)E(&]P=&EO;G,L(&%N9"!G970 =&AE:7( =F%L=64 <W1R:6YG
M<R!I9B!T:&5Y(')E<75I<F4 =&AE;2X-" D)+R\ 268 :70G<R!N;W0 86X
M;W!T:6]N+"!A9&0 :70 =&\ ;&5F=&]V97)!<F=S+ T*"0DO+R!.3U1%.B!A
M<F=S6S!=(&ES('-K:7!P960 87, :70G<R!A<W-U;65D('1O(&)E('!R;V=R
M86T ;F%M90T*"0EF;W( *'-I>F5?="!I(#T ,3L :2`\(&%R9W,N;&5N9W1H
M"2\O(&ET)W, 82!L;VYG(&]P=&EO; T*"0D)"0ED96)U9R!W<FET969L;B B
M8V *$)A<V5/<'1I;VX ;SL 9FEN9$]P=&EO;G,I('L-" D)"0D)"6EF("AO
M+FQO;F=.86UE+FQE;F=T:"` )B8 (&$N9FEN9"AO+FQO;F=.86UE*2`]/2`R
M?'P *&$N;&5N9W1H+3( /B!O+FQO;F=.86UE+FQE;F=T:"`F)B!A6S(K;RYL
M;VYG3F%M92YL96YG=&A=(#T]("<])RDI*0T*"0D)"0D)>PT*"0D)"0D)"2\O
M(&=I=F5N(&]P=&EO;B!I<R!O;F4 =V4G<F4 ;&]O:VEN9R!F;W(-" D)"0D)
M("AO+G1Y<&4 (3T 4W5P<&]R=&5D5'EP97,N3F]686QU92D >PT*"0D)"0D)
M(#X ;RYL;VYG3F%M92YL96YG=& I('L-" D)"0D)"0D)"2\O(&]P=&EO;B=S
M('9A;'5E(&ES(&-O;F-A=&5N871E9"!W:71H(&]P=&EO;CT-" D)"0D)"0D)
M"6%S<V5R="`H85LR*V\N;&]N9TYA;64N;&5N9W1H72`]/2`G/2<I.PT*"0D)
M"0D)"0D);W8 /2!A6S(K;RYL;VYG3F%M92YL96YG=& K,2`N+B`D73L-" D)
M"0D)"0D)?0T*"0D)"0D)"0EE;'-E('L-" D)"0D)"0D)"2\O(&]P=&EO;B=S
M('9A;'5E('-H;W5L9"!B92!N97AT(&EN(&%R9W,-" D)"0D)"0D)"6EF("AI
M(#T
M;D5R<F]R*&9O<FUA=" B+2TE<R!O<'1I;VX <F5Q=6ER97, 82!V86QU92(L
M(&\N;&]N9TYA;64I*3L-" D)"0D)"0D)"6]V(#T 87)G<ULK*VE=.PT*"0D)
M;UT /2!O=CL-" D)"0D)"0EB<F5A:SL ("\O(&9O=6YD('-O('-K:7` =&AE
M(')E<W0 ;V8 ;W!T:6]N<R!W92=R92!L;V]K:6YG(&9O< T*"0D)"7T)?0E]
M8G5G('=R:71E9FQN*")<='!R;V-E<W-I;F< <VAO<G0M;W!T:6]N("5S(BP
M('L-" D)"0D)"6EF("AO+G-H;W)T3F%M92YL96YG=& ("8F("!A+F9I;F0H
M;RYS:&]R=$YA;64I(#T
M.PT*"0D)"0D)"6-H87);72!O=CL-" D)"0D)"0EI9B`H;RYT>7!E("$](%-U
M<'!O<G1E9%1Y<&5S+DYO5F%L=64I('L-" D)"0D)"0D)+R\ 9V5T(&]P=&EO
M;B=S(&%R9PT*"0D)"0D)"0EI9B`H82YL96YG=& M,2`^(&\N<VAO<G1.86UE
M+FQE;F=T:"D >PT*"0D)"0D)"0D)+R\ ;W!T:6]N)W, =F%L=64 :7, 8V]N
M"0D)"0D)"0D)"71H<F]W(&YE=R!/<'1I;VY%<G)O<BAF;W)M870H(BTE<R!O
M"0D)"0EO=B`](&%R9W-;*RMI73L-" D)"0D)"0D)?0T*"0D)"0D)"7T-" D)
M"0D)"0EE;'-E(&EF("AA+FQE;F=T:"TQ(#X ;RYS:&]R=$YA;64N;&5N9W1H
M"6)R96%K.PT*"0D)"0D)"7T-" D)"0D)"0DO+R!E;'-E(&]P=&EO;B!R97%U
M:7)E<R!N;R!V86QU92!A;F0 ;V$ :7, ;G5L;`T*"0D)"0D)"6]P='-686QS
M6V]=(#T
M92!R97-T(&]F(&]P=&EO;G, =V4G<F4 ;&]O:VEN9R!F;W(-" D)"0E]"7T)
M<B B;F\ <W5C:"!O<'1I;VXZ("( ?B!A*3L-" D)"7T-" D)"65L<V4 >PT*
M"0D)"61E8G5G('=R:71E9FQN*")<=&QE9G0M;W9E<B!A<F=U;65N="`B+"!A
M($-H96-K('1H92!F;W5N9"!O<'1I;VYS(&%N9"!P87)S92!A;F0 8VAE8VL
M7'1F;W5N9"!O<'1I;VX )7, =VET:"!V86QU92US=')I;F< /2!<(B5S7"(B
M+"!O+"!V*3L-" T*"0D):68 *&\N<VAO<G1.86UE+FQE;F=T:"D-" D)"0EF
M;W5N9$]P=&EO;G-;;RYS:&]R=$YA;65=(#T ;SL-" D)"6EF("AO+FQO;F=.
M86UE+FQE;F=T:"D-" D)"0EF;W5N9$]P=&EO;G-;;RYL;VYG3F%M95T /2!O
M"0D)8V%S92!3=7!P;W)T9614>7!E<RY.;U9A;'5E. T*"0D)"0D)87-S97)T
M("AV(&ES(&YU;&PI.PT*"0D)"0D)9&5B=6< =W)I=&5F;&XH(EQT7'0E<R!O
M<'1I;VXZ(&AA<R!N;R!V86QU92!T;R!P87)S92(L(&\I.PT*"0D)"0D)8G)E
M=6< =W)I=&5F;&XH(EQT7'0E<R!O<'1I;VXZ('!A<G-I;F< 7"(E<UPB(&%S
M(&EN="(L(&\L('8I.PT*"0D)"0D)*&-A<W0H3W!T:6]N(2AI;G0I*6\I+G9A
M;'5E(#T
M;W)T9614>7!E<RY);G1!<G)A>3H-" D)"0D)"61E8G5G('=R:71E9FQN*")<
M=%QT)7, ;W!T:6]N.B!P87)S:6YG(%PB)7-<(B!A<R!I;G1;72(L(&\L('8I
M.PT*"0D)"0D)*&-A<W0H3W!T:6]N(2AI;G1;72DI;RDN=F%L=64 /2!P87)S
M969L;B B7'1<="5S(&]P=&EO;CH <&%R<VEN9R!<(B5S7"( 87, =6EN="(L
M(&\L('8I.PT*"0D)"0D)*&-A<W0H3W!T:6]N(2AU:6YT*2EO*2YV86QU92`]
M('1O56EN="AV*3L-" D)"0D)"6)R96%K.PT*"0D)"0EC87-E(%-U<'!O<G1E
M9%1Y<&5S+E5);G1!<G)A>3H-" D)"0D)"61E8G5G('=R:71E9FQN*")<=%QT
M)7, ;W!T:6]N.B!P87)S:6YG(%PB)7-<(B!A<R!U:6YT6UTB+"!O+"!V*3L-
M" D)"0D)"2AC87-T*$]P=&EO;B$H=6EN=%M=*2EO*2YV86QU92`]('!A<G-E
M07)R87DA*'5I;G0I*'8L("9T;U5I;G0I.PT*"0D)"0D)8G)E86L[*R\-"B\K
M<FET969L;B B7'1<="5S(&]P=&EO;CH <&%R<VEN9R!<(B5S7"( 87, ;&]N
M9R(L(&\L('8I.PT*"0D)"0D)*&-A<W0H3W!T:6]N(2AL;VYG*2EO*2YV86QU
M92`]('1O3&]N9RAV*3L-" D)"0D)"6)R96%K.PT*"0D)"0EC87-E(%-U<'!O
M<G1E9%1Y<&5S+DQO;F=!<G)A>3H-" D)"0D)"61E8G5G('=R:71E9FQN*")<
M=%QT)7, ;W!T:6]N.B!P87)S:6YG(%PB)7-<(B!A<R!L;VYG6UTB+"!O+"!V
M*3L-" D)"0D)"2AC87-T*$]P=&EO;B$H;&]N9UM=*2EO*2YV86QU92`]('!A
M<FET969L;B B7'1<="5S(&]P=&EO;CH <&%R<VEN9R!<(B5S7"( 87, =6QO
M;F<B+"!O+"!V*3L-" D)"0D)"2AC87-T*$]P=&EO;B$H=6QO;F<I*6\I+G9A
M;'5E(#T =&]5;&]N9RAV*3L-" D)"0D)"6)R96%K.PT*"0D)"0EC87-E(%-U
M;B B7'1<="5S(&]P=&EO;CH <&%R<VEN9R!<(B5S7"( 87, =6QO;F=;72(L
M(&\L('8I.PT*"0D)"0D)*&-A<W0H3W!T:6]N(2AU;&]N9UM=*2EO*2YV86QU
M<F5A:SLK+PT*"0D)"0EC87-E(%-U<'!O<G1E9%1Y<&5S+D9L;V%T. T*"0D)
M"0D)9&5B=6< =W)I=&5F;&XH(EQT7'0E<R!O<'1I;VXZ('!A<G-I;F< 7"(E
M"0D)8V%S92!3=7!P;W)T9614>7!E<RY&;&]A=$%R<F%Y. T*"0D)"0D)9&5B
M=6< =W)I=&5F;&XH(EQT7'0E<R!O<'1I;VXZ('!A<G-I;F< 7"(E<UPB(&%S
M(&9L;V%T6UTB+"!O+"!V*3L-" D)"0D)"2AC87-T*$]P=&EO;B$H9FQO871;
M72DI;RDN=F%L=64 /2!P87)S94%R<F%Y(2AF;&]A="DH=BP )G1O1FQO870I
M="A/<'1I;VXA*&1O=6)L92DI;RDN=F%L=64 /2!T;T1O=6)L92AV*3L-" D)
M"0D)"6)R96%K.PT*"0D)"0EC87-E(%-U<'!O<G1E9%1Y<&5S+D1O=6)L94%R
M<F%Y. T*"0D)"0D)9&5B=6< =W)I=&5F;&XH(EQT7'0E<R!O<'1I;VXZ('!A
M="A/<'1I;VXA*&1O=6)L95M=*2EO*2YV86QU92`]('!A<G-E07)R87DA*&1O
M<V4 4W5P<&]R=&5D5'EP97,N4W1R:6YG. T*"0D)"0D)9&5B=6< =W)I=&5F
M;&XH(EQT7'0E<R!O<'1I;VXZ('!A<G-I;F< 7"(E<UPB(&%S(&-H87);72(L
M(&\L('8I.PT*"0D)"0D)*&-A<W0H3W!T:6]N(2AC:&%R6UTI*6\I+G9A;'5E
M(#T =CL-" D)"0D)"6)R96%K.PT*"0D)"0EC87-E(%-U<'!O<G1E9%1Y<&5S
M+E-T<FEN9T%R<F%Y. T*"0D)"0D)9&5B=6< =W)I=&5F;&XH(EQT7'0E<R!O
M"0D)"0DH8V%S="A/<'1I;VXA*&-H87);75M=*2EO*2YV86QU92`]('!A<G-E
M07)R87DA*&-H87);72DH=BP 9G5N8W1I;VX 8VAA<EM=("AC:&%R6UT =G,I
M"0EC871C:"`H17)R;W( 92D-" D)"0ET:')O=R!N97< 3W!T:6]N17)R;W(H
M9F]R;6%T*"(E<R!O<'1I;VX 97)R;W( <&%R<VEN9R!V86QU92US=')I;F<
M*")H96QP(B!I;B!F;W5N9$]P=&EO;G,I('L-" D)"7!R:6YT2&5L<" I.PT*
M"0D)97AI=" P*3L-" D)?0T*"0EI9B`H(G9E<G-I;VXB(&EN(&9O=6YD3W!T
M3W!T:6]N<PT*"0EF;W)E86-H("A"87-E3W!T:6]N(&\[(&9I;F1/<'1I;VYS
M"0D)"69O<F5A8V *$)A<V5/<'1I;VX 9F\[(&9O=6YD3W!T:6]N<RD-" D)
M*"%F;W5N9"D-" D)"0D)=&AR;W< ;F5W($]P=&EO;D5R<F]R*&9O<FUA=" B
M" T*"0ED96)U9R!W<FET969L;B B)7,N<&%R<V4H*2!D;VYE+B(L('1H:7,I
M.PT*"0EA<F=S(#T ;&5F=&]V97)!<F=S.PT*"0ER971U<FX 9F]U;F1/<'1I
M"6-H87);72!A;&EG;D]P=$AE;'!3='( *&-H87);72!H+"!S:7IE7W0 ;VAL
M(EQN(CL-" D)"0EC:&%R6UT :6YD96YT(#T
M"0D)"6EF("AL:6YE+FQE;F=T:"D-" D)"0D);&EN97, ?CT ;&EN93L-" D)
M"0EF;W)E86-H("AC:&%R6UT ;#L
M" D):68 *&9I;F1/<'1I;VYS+FQE;F=T:"D-" D)"6AE;'` ?CT (EQN7&YO
M<'1I;VYS.EQN(CL-" T*"0EF;W)E86-H("A"87-E3W!T:6]N(&\[(&9I;F1/
M+G-H;W)T3F%M93L-" D)"0EI9B`H;RYM971A5F%R+FQE;F=T:"D-" D)"0D)
M;VYG3F%M92YL96YG=& I('L-" D)"0EO<'1(96QP('X]("(M+2( ?B!O+FQO
M;F=.86UE.PT*"0D)"6EF("AO+FUE=&%687(N;&5N9W1H*0T*"0D)"0EO<'1(
M96QP('X]("(](B!^(&\N;65T859A<CL-" D)"7T-" D)"6EF("AO+FAE;'`N
M;&5N9W1H*0T*"0D)"6]P=$AE;'` ?CT 86QI9VY/<'1(96QP4W1R*&\N:&5L
M<"P ;W!T2&5L<"YL96YG=& I.PT*"0D):&5L<"!^/2!O<'1(96QP('X (EQN
M5F5R<VEO;B`H*0T*"7L-" D)=W)I=&5F;&XH(B5S("5S(BP <')O9TYA;64L
M>PT*"0EW<FET969L;B B)7,Z(&5R<F]R.B`E<UQN(BP <')O9TYA;64L(&US
M=&4 =&5M<&QA=&4 <&%R<V5!<G)A>2`H5"D >PT*"51;72!P87)S94%R<F%Y
M("AC:&%R6UT =G,L(%0 9G5N8W1I;VX *&-H87);72D <&%R<V54*0T*"7L-
M" D)9&5B=6< =W)I=&5F;&XH(B5S+G!A<G-E07)R87DA*"5S*2AV<SU<(B5S
M7"( <&%R<V54/25S*2(L('1H:7,L('1Y<&5I9"A4*2P =G,L('!A<G-E5"D[
M"69O<F5A8V *&-H87);72!S.R!S<RD-" D)"6EF("AS+FQE;F=T:"D-" D)
M("H 26YT96YD960 =&\ 8F4 =7-E9"!S;VUE=&AI;F< ;&EK93H-"B`J(&EF
M(" B;W!T:6]N(B!I;B!O<'1I;VYS*0T*("H ("` (%0 8FQA:"`](&]P=&EO
M;G-;(F]P=&EO;B)=+F=E=%9A;'5E(2A4*3L-"B`J+PT*='EP961E9B!"87-E
M<&QE;65N=', ;65M8F5R<R!C;VUM;VX =&\ 86QL(&]P=&EO;G, 86YD('!R
M;W9I9&5S('1E;7!L871E(&9O< T*("H <F5T<FEE=FEN9R!O<'1I;VX =F%L
M8W0 8VQA<W, 0F%S94]P=&EO; T*>PT*"6-H87);72!S:&]R=$YA;64L(&QO
M;F=.86UE.PT*"6-H87);72!H96QP+"!M971A5F%R.PT*"6)O;VP ;6%N9&%T
M;R!?='EP93L-" T*"71H:7, *%-U<'!O<G1E9%1Y<&5S('0L(%1Y<&5);F9O
M('1I+"!C:&%R6UT <TYA;64L(&-H87);72!L3F%M92P 8VAA<EM=(& L(&-H
M87);72!M5F%R*0T*"6EN('L-" D)87-S97)T("AS3F%M92YL96YG=& ?'P
M='EP92`]('1I.PT*"0ES:&]R=$YA;64 /2!S3F%M93L-" D);&]N9TYA;64
M96)U9R!W<FET969L;B B)7,N=&AI<R I(&1O;F4 +2T 7W1Y<&4 /2`E<R(L
M*2`M+2!2971U<FYS('1H:7, ;W!T:6]N)W, =F%L=64 87, =&AE(&-O<G)E
M8W0 ='EP92X-" D *B` ("` ("` ("` ("` ("` ("!)9B!T:&4 =W)O;F<
M='EP92!I<R!A='1E;7!T960L($]P=%!A<G-E17)R;W( :7, =&AR;W=N+ T*
M"2`J+PT*"71E;7!L871E(&=E=%9A;'5E("A4*0T*"7L-" E4(&=E=%9A;'5E
M*0T*"0D)=&AR;W< ;F5W($]P=%!A<G-E17)R;W(H9F]R;6%T*"(E<R!O<'1I
M;VX 9&]E<R!N;W0 :&%V92!A('9A;'5E('1O(')E=')I979E(BP =&AI<RDI
M=&AR;W< ;F5W($]P=%!A<G-E17)R;W(H9F]R;6%T*"(E<R!O<'1I;VX ;75S
M="!B92!R971R:65V960 87, ='EP92`E<RP ;F]T('1Y<&4 )7,B+"!T:&ES
M<BAF;W)M870H(B5S(&]P=&EO;B!C86X ;F]T(&)E(')E=')I979E9"!A<R!U
M:&%R6UT ;W!T5&]3=')I;F< *&-H87);72!S:&]R=$YA;64L(&-H87);72!L
M;VYG3F%M92D-"GL-" ER971U<FX *'-H;W)T3F%M92YL96YG=& /R`B+2)^
M<VAO<G1.86UE(#H (B(I('X *"AS:&]R=$YA;64N;&5N9W1H("8F(&QO;F=.
M86UE+FQE;F=T:"D /R`B("\ (B`Z("(B*2!^("AL;VYG3F%M92YL96YG=&
M/R`B+2TB?FQO;F=.86UE(#H
M86YD+6QI;F4 ;W!T:6]N+B` 4&%R86UE=&5R:7IE9"!B>2!A('1Y<&4 =&\
M<W!E8VEF:7D 82!V86QU90T*("H :7, 97AP96-T960 86YD('=H870 ='EP
M92P ;W( 3F]686QU92!T;R!M96%N('1H92!O<'1I;VX 9&]E<R!N;W0-"B`J
M92P 8VAA<EM=(&QO;F=.86UE+"!C:&%R6UT :&5L<"P 8VAA<EM=(&UE=&%6
M5"DL('-H;W)T3F%M92P ;&]N9TYA;64L(&AE;'`L(&UE=&%687(I.PT*"0E]
M:')O=R!N97< 3W!T4&%R<V5%<G)O<BAF;W)M870H(B5S(&]P=&EO;B!C86X
M;F]T(&)E('5N<W5P<&]R=&5D('1Y<&4 )7,B+"!O<'14;U-T<FEN9RAS:&]R
M=$YA;64L;&]N9TYA;64I+"!U<W1E+G1Y<&4I*3L-" D)?0T*"7T-"GT-" T*
M=&5S="(L(%]?1DE,15]?*3L-" T*"4]P=&EO;E!A<G-E<B!O<'1I;VY087)S
M;VY087)S97(H7U]&24Q%7U];,"XN)"TR72P (EMO<'1I;VX 6W9A;'5E75TB
M<BYA9&1/<'1I;VXA*&EN="DH(G B+")X96YO(BPB9&]E<R!T:&ES(&%N9"!T
M*&-H87);72DH;G5L;"PB8F%R(BPB;6%K92!I="!H87!P96XB+")"3$]"(BPB
M9&5F875L="UV86QU92(I.PT*"0EO<'1I;VY087)S97(N861D3W!T:6]N(2AI
M"6]P=&EO;E!A<G-E<BYA9&1/<'1I;VXA*&-H87);75M=*2 B<V(B+")S:&%B
M4&%R<V5R+F%D9$]P=&EO;B$H*2 I.PT*"0ED96)U9R!W<FET969L;B B+2TM
M(&YE=R!/<'1I;VY087)S97(G<R!H96QP("TM+2(I.PT*"0ED96)U9R!O<'1I
M96YD("TM+2(I.PT*"7T-" T*"6YE=T]P=&EO;E!A<G-E<B I.PT*"6%R9W,
M87-D9B(I.PT*"4]P=&EO;G, ;W!T:6]N<R`](&]P=&EO;E!A<G-E<BYP87)S
M92AA<F=S*3L-" ES=&%T:6, 8VAA<EM=6UT ;&5F=&]V97( /2!;(FQA;&$B
M+")H;VAO(BPB87-D9B)=.PT*"6%S<V5R="`H87)G<R`]/2!L969T;W9E<BD[
M86QU92$H9FQO870I(#T](#DX-RXV-68I.PT*"6%S<V5R="`H(F)A<B( :6X
M8VAA<EM=*2`]/2`B8F%R+7-T<FEN9R(I.PT*"6%S<V5R="`H(F%P<&QE(B!I
M871I8R!C:&%R6UU;72!S:&%B86YG0T%!(#T 6R)A8F,B+")D(BPB968B+")Z
M>GIZ>GHB73L-" EA<W-E<G0 *&]P=&EO;G-;(G-H86)A;F<B72YG971686QU
M92$H8VAA<EM=6UTI(#T
M*")M>6%P<"`M+79E<F)O<V4 +2UA<'!L93TL(&QA;&$ :&]H;R!A<V1F("TM
M=&EO;E!A<G-E<BYP87)S92AA<F=S*3L-" EA<W-E<G0 *&%R9W, /3T ;&5F
M("AO<'1I;VYS6R)F(ETN9V5T5F%L=64A*&9L;V%T*2`]/2`M,"XY,S%E+35F
M*3L-" EA<W-E<G0 *")A(B!I;B!O<'1I;VYS*3L-" EA<W-E<G0 *&]P=&EO
M;G-;(F%P<&QE(ETN9V5T5F%L=64A*&EN=%M=*2`]/2!N=6QL*3L-" EA<W-E
M<G0 *")S:&%B86YG(B!I;B!O<'1I;VYS*3L-" ES=&%T:6, 8VAA<EM=6UT
M<VAA8F%N9T-!03( /2!;(F]N;'E/;F4B73L-" EA<W-E<G0 *&]P=&EO;G-;
M" EN97=/<'1I;VY087)S97(H*3L-" EA<F=S(#T <W!L:70H(FUY87!P("TM
M("AO<'1I;VYS6R)S8B)=+F=E=%9A;'5E(2AC:&%R6UU;72D /3T <VAA8F%N
M9T1F;'0I.PT*"6%S<V5R="`H(G B(&EN(&]P=&EO;G,I.PT*"6%S<V5R="`H
M;W!T:6]N<ULB>&5N;R)=+F=E=%9A;'5E(2AI;G0I(#T
M97)T(" B8F%R(B!I;B!O<'1I;VYS*3L-" EA<W-E<G0 *&]P=&EO;G-;(F)A
M<B)=+F=E=%9A;'5E(2AC:&%R6UTI(#T
M" DO+R!C:&5C:R!/<'1I;VY%<G)O<B`H=&AE<V4 8V%U<V4 <')O8V5S<R!T
M;R!E>&ET+"!S;R!C86XG="!U;F-O;6UE;G0 8GD 9&5F875L="X-" DO+R`
M("` ("` ("` ("` ("` ("` 22!C:&5C:V5D('1H96T 86QL(&]N92!B>2!O
M.PT*"2\K87)G<R`]('-P;&ET*")M>6%P<"`M+6)A<B(I.PT*"6]P=&EO;G,
M/2!O<'1I;VY087)S97(N<&%R<V4H87)G<RD[*R\-" DO+R!N;R!S=6-H(&]P
M=&EO; T*"2\K87)G<R`]('-P;&ET*")M>6%P<"`M+6YO+7-U8V M;W!T:6]N
M<G-E*&%R9W,I.PT*"2\K87)G<R`]('-P;&ET*")M>6%P<"`M9B!O;W!S(BD[
M(&UI<W-I;F< ;6%N9&%T;W)Y(&]P=&EO;B`M+69O;PT*"2\K87)G<R`]('-P
M;&ET*")M>6%P<"(I.PT*"6]P=&EO;G, /2!O<'1I;VY087)S97(N<&%R<V4H
M"0D)9F%I;&5D(#T =')U93L-" D)"61E8G5G('=R:71E9FQN*")E>'!E8W1E
M=& ;F5S=&5D(&1E;&5G871E<R!T:')O=VEN9R]C871C:&EN9R!P<F5V96YT
M<R!F86EL<R I(&9R;VT =V]R:VEN9RP-" DO+R!S;R!U;G1I;"!T:&%T)W,
M9FEX960L(&)E;&]W(&%R92!N;W0 87-S97)T*&9A:6QS*"XN+BDI('-O($D
M8V]U;&0 =&5S="!T:&5M(&5A8V -" DO+VYE=T]P=&EO;E!A<G-E<B I.PT*
M"2\O(&-O;F9L:6-T:6YG(&]P=&EO;G,-" DO+V%S<V5R="`H9F%I;',H9&5L
M96=A=&4 =F]I9"`H*2![;W!T:6]N4&%R<V5R+F%D9$]P=&EO;B$H8VAA<EM=
M*2 B>"(I.WTI*3L +R\ 1$U$(&)U9SH =&AE($]P=%!A<G-E17)R;W( :7-N
M;B$H8VAA<EM=*2 B>"(I.PT*"2\O('5N<W5P<&]R=&5D('1Y<&4-" DO+V]P
M+R]O<'1I;VY087)S97(N861D3W!T:6]N(2A/8FIE8W0I*")O(BPB;V)J96-T
M<BYA9&1/<'1I;VXA*&EN="DH(GHB+&YU;&PL;G5L;"QN=6QL+&YU;&PL,2D[
M;W!T:6]N4&%R<V5R+F%D9$]P=&EO;B$H*2 B>B(L;G5L;"QN=6QL+&YU;&PL
M,3(S*3L-" DO+R!.;U9A;'5E(&1E9F%U;'1686QU92!M=7-T(#T](&YU;&P
M=VAE;B!M86YD871O<GD-" DO+V]P=&EO;E!A<G-E<BYA9&1/<'1I;VXA*"DH
M96YO/34T,S(Q('AY>B`M9C`N.3DB*3L-" DO+V]P=&EO;G, /2!O<'1I;VY0
M<F)O<V4B72YG971686QU92$H:6YT*3L-" DO+V%S<V5R="`H9F%I;',H9&5L
M96=A=&4 =F]I9"`H*2![(&]P=&EO;G-;(G9E<F)O<V4B72YG971686QU92$H
M8F]O;"D[('TI*3L ("\O(&-A=7-E<R!$340 8G5G($D 8V%N)W0 <F5P<F]D
M=6-E('-I;7!L97(L(&EF(&)O;VP 8B`]('-T871M96YT(&ES(&1O;F4L(&ET
M<&QE('5S86=E+ T*"2`J+PT*"6EN="!M86EN("AC:&%R6UU;72!A<F=S*0T*
M960 :6X <')I;G1I;F< :&5L<`T*"0DO+R!O<'1I;VX +6 +R`M+6AE;'`
M:7, 86QW87ES(&%D9&5D(&)Y(&1E9F%U;'0 86YD('5S97, <')O9W)A;2UN
M86UE(&%N9"!U<V%G90T*"0DO+R!O<'1I;VX +2UV97)S:6]N("AN;R!S:&]R
M="!N86UE*2!I<R!A9&1E9"!B>2!D969A=6QT(&EF('9E<G-I;VX :7, 9VEV
M96X-" D)+R\ ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ('!R
M;V=R86TM;F%M92` ("` ("` ("` ("` ('5S86=E("` ("` ("` ("` ("`
M('9E<G-I;VX-" D)3W!T:6]N4&%R<V5R(&]P(#T ;F5W($]P=&EO;E!A<G-E
M<BA?7T9)3$5?7ULP+BXD+3)=+"`B6V]P=&EO;G-=("TM9FEL97,]9C$L9DX
M;F<L(&AE;'`L(&UE=&%V87(L(&YO(&1E9F%U;'0L(&YO="!M86YD871O<GD-
M" D);W`N861D3W!T:6]N(2AI;G0I*")V(BP (G9E<F)O<V4B+"`B0F4 ;6]R
M92!A;F0 ;6]R92!A;F0 ;6]R92!A;F0 ;6]R92!A;F0 ;6]R92!A;F0 ;6]R
M92!A;F0 ;6]R92!V97)B;W-E+B(L("),159%3"(I.PT*"0DO+R!C;VUM82US
M97!A<F%T960 <W1R:6YG(&QI<W0L('-H;W)T(&%N9"!L;VYG+"!H96QP+"!M
M971A=F%R+"!N;R!D969A=6QT+"!M86YD871O<GD-" D);W`N861D3W!T:6]N
M(2AC:&%R6UU;72DH(F9S(BP (F9I;&5S(BP (D9I;&5S('1O('!R;V-E<W,L
M(&%N9"!M86ME('1H:7, 82!R96%L;'D ;&]N9R!H96QP('-T<FEN9R!A<R!W
M96QL('1O('1E<W0 86QI9VYI;F<N(BP (D9)3$4L1DE,12PN+BXB+"!N=6QL
M+"!T<G5E*3L-" D)+R\ 9FQO870L(&QO;F<M;VYL>2P :&5L<"P ;65T879A
M<BP 9&5F875L="P ;F]T(&UA;F1A=&]R>0T*"0EO<"YA9&1/<'1I;VXA*&9L
M;V%T*2AN=6QL+"`B=&AI;F<B+"`B1&\ :70 =VET:"!T:&ES+B(L(")&3$]!
M5"(L("TT+C(Y-V4R,68I.PT*"0DO+R!N;RUV86QU92P <VAO<G0M;VYL>2P
M=VET:"!H96QP+"!N;R!M971A=F%R+"!N;R!D969A=6QT+"!N;W0 ;6%N9&%T
M871E(&UE=&AO9"XB*3L-" T*"0DO+R!087)S92!C;VUM86YD+6QI;F4 87)G
M=6UE;G1S+"!I;F-L=61I;F< 87)G<ULP72!P<F]G<F%M+6YA;64 *&ET)W,
M<R!I;B!T:&4 ;W)D97( =&AE>2!A<'!E87)E9"X-" D)3W!T:6]N<R!O<'1I
M;VYS(#T
M(&)O=& <VAO<G0 86YD(&QO;F< ;F%M97,L(&5I=&AE<B!C86X 8F4 =7-E
M9"X-" D):68 *")V97)B;W-E(B!I;B!O<'1I;VYS*0T*"0D)+R\ 268 ;W!T
M:65V92!I="!B>2!I;F1E>&EN9R!/<'1I;VYS('=I=& <VAO<G0 ;W( ;&]N
M9R!N86UE("AO<B!O;FQY(&]N92!I9B!O;FQY(&]N92D-" D)"2\O(&%N9"!D
M;R!G971686QU92$H5F%L=654>7!E*0T*"0D)=F5R8F]S:71Y(#T ;W!T:6]N
M='D /B`P*0T*"0D)=W)I=&5F;&XH(DDG;&P <V%Y(&$ ;&ET=&QE+B(I.PT*
M"0EI9B`H=F5R8F]S:71Y(#X ,2D-" D)"7=R:71E9FQN*")))VQL('-A>2!A
M('1O('1H92!R96UA:6YI;F< ;F]N+6]P=&EO;B!C;VUM86YD+6QI;F4 87)G
M<ULP73L-" D)96QS92!I9B`H87)G<RYL96YG=& /B`Q*0T*"0D)+R\ 3W!T
M:6]N17)R;W(N97)R;W)%>&ET*")M97-S86=E(BD 8V%N(&)E('5S960 =&\
M<')I;G0 :&5L<"!A;F0 97AI="!P<F]C97-S.PT*"0D)+R\ =7-E9G5L('=H
M96X 8VAE8VMI;F< ;F]N+6]P=&EO;B!A<F=U;65N=',-" D)"6]P+F5R<F]R
M17AI=" B;6]R92!T:&%N(&]N92!O=71P=70 9FEL92!S<&5C:69I960B*3L-
M" T*"0DO+R!M86YD871O<GD ;W!T:6]N<R!C86X 8F4 87-S=6UE9"!T;R!B
M92!T:&5R92!A9G1E<B!P87)S92AA<F=S*0T*"0EA<W-E<G0 *")F:6QE<R(
M86QU92$H8VAA<EM=6UTI.PT*"0EI9B`H9FEL97,N;&5N9W1H(#T
M"0EO<"YE<G)O<D5X:70H(FYE960 =&\ <W!E8VEF:7D 870 ;&5A<W0 ;VYE
M(&EN<'5T(&9I;&4B*3L-" T*"0EI9B`H=F5R8F]S:71Y(#X ,"D-" D)>PT*
M"0D):68 *")T:&EN9R( :6X ;W!T:6]N<RD-" D)"0EW<FET969L;B B;7D
M=&AI;F< :7,Z("(L(&]P=&EO;G-;(G1H:6YG(ETN9V5T5F%L=64A*&9L;V%T
M960 9F]R(&)E:6YG(&EN($]P=&EO;G,-" D)"6EF(" B82( :6X ;W!T:6]N
M<RD-" D)"0EW<FET969L;B B22!W;W5L9"!P<F]C97-S(&9I;&5S('5S:6YG
M(DD =V]U;&0 <')O8V5S<R!F:6QE<R!U<VEN9R!N;W)M86P ;65T:&]D.B(I
M.PT*"0D)9F]R96%C:"`H8VAA<EM=(&8[(&9I;&5S*0T*"0D)"7=R:71E9FQN
M:6QE+FQE;F=T:"`_(&]U=&9I;&4 .B`B/'-T9&]U=#XB
3"7)E='5R;B`P.PT*"7T-"GT-"F4
`
end
May 30 2005
In article <d7g5nd$3i3$1 digitaldaemon.com>, derick_eddington nospam.yashmoo.com says...Example command-line output of above program: --------------------------------------------------------------- $ ./example -h usage: optparse [options] --files=f1,fN [outfile] options: -h, --help Show this help message and exit. --version Show program's version number and exit. -vLEVEL, --verbose=LEVEL Be more and more and more and more and more and more and more verbose. -fsFILE,FILE,..., --files=FILE,FILE,... Files to process, and make this a really long help string as well to test aligning. --thing=FLOAT Do it with this. -a Use alternate method.Arg, forgot to : these. The help print is nicely formatted...
May 30 2005
Very useful. I'd like to add this to Mango, if that would be OK? - Kris <derick_eddington nospam.yashmoo.com> wrote in message news:d7g5nd$3i3$1 digitaldaemon.com...I've made a command-line option helper similar to Python's optparse. Itallowsyou to specify what D-type you want the option as, short name, long name,help,and more. It automatically creates a formatted help message and prints itonerrors. It checks that clients' usage of the module is proper; and itchecksthat the command-line arguments meet what was specified. It has acompehensiveunittest that demonstrates more. The source is attached. : /** : * Example usage: : */ : int main (char[][] args) : { : int verbosity; : char[] outfile; : char[][] files; : : // Constructor parameters are used in printing help. : // -h / --help is always added by default : // and uses program-name and usage. : // --version (no short name) is added by : // default if version is given. : // program-name : OptionParser op = new OptionParser(__FILE__[0..$-2], : // usage version : "[options] --files=f1,fN [outfile]", "0.2"); : : // int, short and long, help, metavar, : // no default, not mandatory : op.addOption!(int)("v", "verbose", : "Be more and more and more and more and more " : "and more and more verbose.", "LEVEL"); : // comma-separated string list, short and long, help, : // metavar, no default, mandatory : op.addOption!(char[][])("fs", "files", : "Files to process, and make this a really long help " : "string as well to test aligning.", "FILE,FILE,...", : null, true); : // float, long-only, help, metavar, default, not mandatory : op.addOption!(float)(null, "thing", "Do it with this.", : "FLOAT", -4.297e21f); : // no-value, short-only, with help, no metavar, : // no default, not mandatory : op.addOption!()("a", null, "Use alternate method."); : : // Parse command-line arguments, including args[0] : // program-name (it's skipped). : // args will be reset to the remaining non-option : // command-line arguments in the order they appeared. : Options options = op.parse(args); : : // Check if option was given on the command-line : // by using (char[] in Options). : // If the option has both short and long names, : // either can be used. : if ("verbose" in options) : // If option was given and it has a value, : // retrieve it by indexing Options with short : // or long name (or only one if only one) : // and do getValue!(T) : verbosity = options["verbose"].getValue!(int); : : if (verbosity > 0) : writefln("I'll say a little."); : if (verbosity > 1) : writefln("I'll say a lot more."); : : // args was reset by parse to the remaining : // non-option command-line arguments : if (args.length == 1) : // use the first non-option argument : outfile = args[0]; : else if (args.length > 1) : // OptionError.errorExit("message") can be used to : // print help and exit process; : // useful when checking non-option arguments : op.errorExit("more than one output file specified"); : : // mandatory options can be assumed to be : // there after successful parse : assert ("files" in options); : files = options["files"].getValue!(char[][]); : if (files.length == 0) : op.errorExit("need to specifiy at least one input file"); : : if (verbosity > 0) : { : if ("thing" in options) : writefln("my thing is: ", : options["thing"].getValue!(float)); : : // no-value options are simply tested for being in Options : if ("a" in options) : writefln("I would process files using alternate method:"); : else : writefln("I would process files using normal method:"); : foreach (char[] f; files) : writefln("\t",f); : writefln("and output to ", : outfile.length ? outfile : "<stdout>"); : } : : return 0; : } Example command-line output of above program: --------------------------------------------------------------- $ ./example -h usage: optparse [options] --files=f1,fN [outfile] options: -h, --help Show this help message and exit. --version Show program's version number and exit. -vLEVEL, --verbose=LEVEL Be more and more and more and more and more and more and more verbose. -fsFILE,FILE,..., --files=FILE,FILE,... Files to process, and make this a really long help string as well to test aligning. --thing=FLOAT Do it with this. -a Use alternate method. --------------------------------------------------------------- $ ./example -v2 --files=somefile,anotherfile,nextfile --thing -4.23e-6 -a outputfile I'll say a little. I'll say a lot more. my thing is: -4.23e-06 I would process files using alternate method: somefile anotherfile nextfile and output to outputfile --------------------------------------------------------------- $ ./example --asdf optparse: error: no such option: --asdf [help] --------------------------------------------------------------- $ ./example optparse: error: -fs / --files option is mandatory [help]
May 30 2005
Certainly. I'll keep you updated as I enhance and fix bugs. In article <d7g9q7$7b3$1 digitaldaemon.com>, Kris says...Very useful. I'd like to add this to Mango, if that would be OK? - Kris <derick_eddington nospam.yashmoo.com> wrote in message news:d7g5nd$3i3$1 digitaldaemon.com...I've made a command-line option helper similar to Python's optparse. Itallowsyou to specify what D-type you want the option as, short name, long name,help,and more. It automatically creates a formatted help message and prints itonerrors. It checks that clients' usage of the module is proper; and itchecksthat the command-line arguments meet what was specified. It has acompehensiveunittest that demonstrates more. The source is attached.
May 30 2005
derick_eddington nospam.yashmoo.com wrote:Certainly. I'll keep you updated as I enhance and fix bugs.Excellent ~ thx!
May 30 2005
In article <d7gqjo$nth$2 digitaldaemon.com>, kris says...derick_eddington nospam.yashmoo.com wrote:Who doesn't love to enhance bugs? =PCertainly. I'll keep you updated as I enhance and fix bugs.Excellent ~ thx!Regards, James Dunne
May 31 2005
I've updated optparse.d:
Option groups for help printout.
Example:
: optionParser = new OptionParser("myapp", "[option [value]]");
: optionParser.addOption!()("v", "verbose");
: optionParser.addOption!(float)("f", "foo", null, null, null, true);
: optionParser.addOption!(int)("x", "xeno", "does this and that", "THING");
: optionParser.addOption!(int[])("a", "apple", "make applesauce", null);
: optionParser.addOption!(long)("l", "long", "be longer", "LONG");
: optionParser.addOption!(double)("d", "double", null, "DOUBLE");
: optionParser.addOption!(uint[])("ui", "uint", null, "UINT,...");
: // make a group, options must have previously been added
: optionParser.makeGroup("number options", "f", "x", "a", "l", "d", "ui");
: optionParser.addOption!(char[])(null, "bar", "make it happen", "BLOB");
: optionParser.addOption!(char[][])("sb", "shabang", "blow up", "IT");
: // make a group, options must have previously been added
: optionParser.makeGroup("string options", "bar", "sb");
Will make help:
: usage: myapp [option [value]]
:
: options:
: -h, --help Show this help message and exit.
: --version Show program's version number and exit.
: -v, --verbose
:
: number options:
: -f, --foo
: -x THING, --xeno=THING
: does this and that
: -a, --apple make applesauce
: -l LONG, --long=LONG
: be longer
: -d DOUBLE, --double=DOUBLE
: -ui UINT,..., --uint=UINT,...
:
: string options:
: --bar=BLOB make it happen
: -sb IT, --shabang=IT
: blow up
Help string formatting separates short-name from METAVAR by a space for easier
reading.
Smarter use of templates to support more types.
Bug *un-enhanced* :) where "--option= --next-opt" would consume --next-opt as
--option's value instead of causing error because --option has no value.
A few more unittest cases.
Question for potential users of optparse.d:
Would you rather have anal checking of all usage of the module or reduce the
object-file size from 55k to 35k? I tried to use "version" but it's too buggy (I
just wanted version'd else-if...)
--Derick
begin 0644 optparse.d
M*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ
M*BHJ*BHJ* T*("H 0GD 1&5R:6-K($5D9&EN9W1O;BX 4&QA8V5D(&EN('1H
M92!P=6)L:6, 9&]M86EN+B` ("` ("` ("` ("` ("` ("` ("` ("H-"B`J
M($EN<W!I<F5D(&)Y(%!Y=&AO;B=S(&]P='!A<G-E+B` ("` ("` ("` ("`
M("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("`
M("` ("` ("` ("` ("` ("` * T*("H 4V5E(&)O='1O;2!O9B!T:&ES(&9I
M;&4 9F]R(&5X86UP;&4 =7-A9V4N("` ("` ("` ("` ("` ("` ("` ("`
M("` ("` ("H-"B`J*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ
M*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ+PT*
M("` ("` ("` <W1D+G-T9&EO+`T*("` ("` ("` ("` ("` <W1D+F,N<W1D
M<&5S(&=E=%-4(" I("![(')E='5R;B!3=7!P;W)T9614>7!E<RY.;U9A;'5E
M5'EP97, 9V5T4U0 *"D ('L <F5T=7)N(%-U<'!O<G1E9%1Y<&5S+DEN=#L
M?0T*?0T*=&5M<&QA=&4 9V5T4U0 *%0 .B!I;G1;72D >PT*4W5P<&]R=&5D
M5'EP97, 9V5T4U0 *"D ('L <F5T=7)N(%-U<'!O<G1E9%1Y<&5S+DEN=$%R
M<G1E9%1Y<&5S(&=E=%-4(" I("![(')E='5R;B!3=7!P;W)T9614>7!E<RY5
M<&]R=&5D5'EP97, 9V5T4U0 *"D ('L <F5T=7)N(%-U<'!O<G1E9%1Y<&5S
M+E5);G1!<G)A>3L ?0T*?0T*=&5M<&QA=&4 9V5T4U0 *%0 .B!L;VYG*2![
M5'EP97,N3&]N9SL ?0T*?0T*=&5M<&QA=&4 9V5T4U0 *%0 .B!L;VYG6UTI
M('L-"E-U<'!O<G1E9%1Y<&5S(&=E=%-4(" I("![(')E='5R;B!3=7!P;W)T
M9614>7!E<RY,;VYG07)R87D[('T-"GT-"G1E;7!L871E(&=E=%-4("A4(#H
M=6QO;F<I('L-"E-U<'!O<G1E9%1Y<&5S(&=E=%-4(" I("![(')E='5R;B!3
M=7!P;W)T9614>7!E<RY53&]N9SL ?0T*?0T*=&5M<&QA=&4 9V5T4U0 *%0
M<FX 4W5P<&]R=&5D5'EP97,N54QO;F=!<G)A>3L ?0T*?0T*=&5M<&QA=&4
M9V5T4U0 *%0 .B!F;&]A="D >PT*4W5P<&]R=&5D5'EP97, 9V5T4U0 *"D
M92!G97135"`H5"`Z(&9L;V%T6UTI('L-"E-U<'!O<G1E9%1Y<&5S(&=E=%-4
M97, 9V5T4U0 *"D ('L <F5T=7)N(%-U<'!O<G1E9%1Y<&5S+D1O=6)L93L
M?0T*?0T*=&5M<&QA=&4 9V5T4U0 *%0 .B!D;W5B;&5;72D >PT*4W5P<&]R
M=&5D5'EP97, 9V5T4U0 *"D ('L <F5T=7)N(%-U<'!O<G1E9%1Y<&5S+D1O
M>PT*4W5P<&]R=&5D5'EP97, 9V5T4U0 *"D ('L <F5T=7)N(%-U<'!O<G1E
M9%1Y<&5S+E-T<FEN9SL ?0T*?0T*=&5M<&QA=&4 9V5T4U0 *%0 .B!C:&%R
M6UU;72D >PT*4W5P<&]R=&5D5'EP97, 9V5T4U0 *"D ('L <F5T=7)N(%-U
M5"`H5"D >PT*4W5P<&]R=&5D5'EP97, 9V5T4U0 *"D ('L =&AR;W< ;F5W
M(%5N4W5P<&]R=&5D5'EP945R<F]R*'1Y<&5I9"A4*2D[('T-"GT-"GT +R]E
M=&-H(&-L:65N="!C;V1E(&%T=&5M<'1I;F<-"B`J('1O('5S92!U;G-U<'!O
M<G1E9"!T>7!E<RX 1&]E<R!N;W0 <')O<&]G871E(&]U="!O9B!M;V1U;&4N
M87)S945R<F]R(#H 17)R;W(-"GL-" ET:&ES("AC:&%R6UT ;7-G*2` >R!S
M86YD+6QI;F4 ;W!T:6]N<RX 0V%U<V5S(&UE<W-A9V4 =&\ 8F4 <')I;G1E
M9`T*("H 86YD('!R;V=R86T 97AI=&5D+B` 1&]E<R!N;W0 <')O<&]G871E
M;W( .B!%<G)O< T*>PT*"71H:7, *&-H87);72!M<V<I("![('-U<&5R*&US
M;6]D=6QE+B` 0V]N<W1R=6-T(&ET('=I=& >6]U<B!P<F]G<F%M)W, ;F%M
M90T*("H 86YD(&]P=&EO;F%L;'D 82!U<V%G92!M97-S86=E(&%N9"!V97)S
M87-S($]P=&EO;E!A<G-E< T*>PT*"7!R:79A=&4 8VAA<EM=('!R;V=.86UE
M+"!U<V%G92P =F5R.PT*"7!R:79A=&4 0F%S94]P=&EO;EM=(&9I;F1/<'1I
M;VYS.PT*"7!R:79A=&4 3W!T:6]N<R!D969A=6QT5F%L=65/<'1I;VYS.PT*
M("AC:&%R6UT <')O9TYA;64L(&-H87);72!U<V%G92`](&YU;&PL(&-H87);
M72!V97( /2!N=6QL*0T*"6EN('L-" D)87-S97)T("AP<F]G3F%M92YL96YG
M=& I.PT*"7T-" EB;V1Y('L-" D)=&AI<RYP<F]G3F%M92`]('!R;V=.86UE
M.PT*"0ET:&ES+G5S86=E(#T
M"0EO<'1I;VY'<F]U<', ?CT ;F5W($]P=&EO;D=R;W5P*")O<'1I;VYS(BD[
M861D3W!T:6]N(2 I*&YU;&PL(")V97)S:6]N(BP (E-H;W< <')O9W)A;2=S
M('9E<G-I;VX ;G5M8F5R(&%N9"!E>&ET+B(I.PT*"7T-" T*"6EN=F%R:6%N
M=`T*"7L-" D)87-S97)T("AO<'1I;VY'<F]U<',N;&5N9W1H*3L-" D)87-S
M97)T("AO<'1I;VY'<F]U<'-;,%T (3T](&YU;&PI.PT*"7T-" T*"2\J* T*
M"2`J(%5S92!W:71H;W5T(&$ ='EP92!F;W( 82!N;RUV86QU92]T;V=G;&4
M('1Y<&5S('1O(')E=')I979E('1H92!O<'1I;VXG<R!V86QU92!A<R!T:&%T
M($0M='EP92X ($]N92!O9 T*"2`J('-H;W)T3F%M92!O<B!L;VYG3F%M92!M
M=7-T(&)E('-P96-I9FEE9"P ;W( 8F]T:"X (&AE;'` :7, =&AE(&AE;'`
M;65S<V%G90T*"2`J(&9O<B!T:&4 ;W!T:6]N+"!P<FEN=&5D('=H96X =&AE
M82!D97-C:7!T:79E(&YA;64 9F]R('1H92!O<'1I;VXG<R!V86QU92!U<V5D
M<F%R9W, :7, =&\ 86QL;W< )U0 9&5F875L=%9A;'5E)R!A;F0 )V)O;VP
M;6%N9&%T;W)Y)R!P87)A;65T97)S+ T*"2`J(&1E9F%U;'1686QU92!I<R!T
M;R!S970 82!D969A=6QT('9A;'5E(&9O<B!O<'1I;VYS('=I=& =F%L=65S
M(&%N9"!M86ME('1H870-" D *B!O<'1I;VX 86QW87ES(&9O=6YD('=I=&
M=&AA="!V86QU92!B>2!D969A=6QT+B` ;6%N9&%T;W)Y('-P96-I9FEE<R!W
M;VUM86YD+6QI;F4N("!)9B!B;W1H(&1E9F%U;'1686QU92!A;F0-" D *B!A
M;F0 ;6%N9&%T;W)Y(&%R92!G:79E;BP ;6%N9&%T;W)Y('=I;&P :&%V92!N
M;R!E9F9E8W0N("!)9B!D969A=6QT5F%L=64 :7,-" D *B!N=6QL+"!I="!M
M96%N<R!N;R!D969A=6QT('9A;'5E+B` 9&5F875L=%9A;'5E(&UU<W0 8F4
M;G5L;"!F;W( ;F\M=F%L=64-" D *B!O<'1I;VYS('1H870 ;F5E9"!T;R!S
M("A4(#T
M:&]R=$YA;64L(&-H87);72!L;VYG3F%M92`](&YU;&PL(&-H87);72!H96QP
M(#T
M96)U9R!W<FET969L;B B)7,N861D3W!T:6]N*"DB+"!T:&ES*3L-" T*"0EI
M"0ET:')O=R!N97< 3W!T4&%R<V5%<G)O<B B861D3W!T:6]N*"D <F5Q=6ER
M<B B861D3W!T:6]N*"D =&%K97, 870 ;6]S="!T=V\ =F%R:6%D:6, 87)G
M:6]N<RD >PT*"0D):68 *'-H;W)T3F%M92YL96YG=& )B8 <VAO<G1.86UE
M(#T](&\N<VAO<G1.86UE*0T*"0D)"71H<F]W(&YE=R!/<'1087)S945R<F]R
M*")C;VYF;&EC=&EN9R!O<'1I;VXZ("TB('X <VAO<G1.86UE*3L-" D)"6EF
M("AL;VYG3F%M92YL96YG=& )B8 ;&]N9TYA;64 /3T ;RYL;VYG3F%M92D-
M" D)"0ET:')O=R!N97< 3W!T4&%R<V5%<G)O<B B8V]N9FQI8W1I;F< ;W!T
M(&-O;G-T<G5C=&]R(&-H96-K<R!4(&ES('-U<'!O<G1E9"P 86YD('1H<F]W
M<R!/<'1087)S945R<F]R(&EF(&YO=`T*"0E/<'1I;VXA*%0I(&]P=&EO;B`]
M(&YE=R!/<'1I;VXA*%0I*'-H;W)T3F%M92P ;&]N9TYA;64L(&AE;'`L(&UE
M('L-" D)"0DO+R!N965D960 =&\ 861V86YC92!?87)G<'1R(&)E8V%U<V4
M;F]R92`]('9A7V%R9R$H='EP96]F*&YU;&PI*2A?87)G<'1R*3L-" D)"0EI
M9B`H7V%R9W5M96YT<ULP72`A/2!T>7!E:60H='EP96]F*&YU;&PI*2!\?"!I
M9VYO<F4 (3T ;G5L;"D-" D)"0D)=&AR;W< ;F5W($]P=%!A<G-E17)R;W(H
M9F]R;6%T*"(E<R!O<'1I;VX :&%S(&YO('9A;'5E+"!D969A=6QT('9A;'5E
M(&UU<W0 8F4 ;G5L;"!W:&5N('-P96-I9FEY:6YG(&UA;F1A=&]R>2(L(&]P
M=&EO;BDI.PT*"0D)?0T*"0D)96QS92!I9B`H7V%R9W5M96YT<RYL96YG=& I
M;VX :&%S(&YO('9A;'5E+"!S;R!N;R!D969A=6QT('9A;'5E(&-A;B!B92!S
M<&5C:69I960B+"!O<'1I;VXI*3L-" D)?0T*"0EE;'-E('L-" D)"6EF("A?
M87)G=6UE;G1S+FQE;F=T:"D >PT*"0D)"6EF("A?87)G=6UE;G1S6S!=("$]
M6S!=("$]('1Y<&5I9"A4*2D-" D)"0D)"71H<F]W(&YE=R!/<'1087)S945R
M<F]R*&9O<FUA=" B)7, ;W!T:6]N)W, 9&5F875L="!V86QU92!N;W0 ='EP
M92`E<RP :7, ='EP92`E<R(L(&]P=&EO;BP ='EP96ED*%0I+"!?87)G=6UE
M"0D)"61E9F%U;'1686QU94]P=&EO;G-;;W!T:6]N+G-H;W)T3F%M95T /2!O
M"0D)9&5F875L=%9A;'5E3W!T:6]N<UMO<'1I;VXN;&]N9TYA;65=(#T ;W!T
M86QU92`]("(I.PT*"0D)"0D):69T>7!E("A4(#H
M"0D)=W)I=&5F;&XH;W!T:6]N+G9A;'5E*3L-" D)"0D)"7T-" D)"0D)"65L
M<V4 :69T>7!E("A4($$ .B!!6UTI('L-" D)"0D)"0EI9B`H;W!T:6]N+G9A
M+G9A;'5E*0T*"0D)"0D)"0D)=W)I=&5F*"(E<RPB+"!E*3L-" D)"0D)"0EI
M9B`H;W!T:6]N+G9A;'5E+FQE;F=T:"D-" D)"0D)"0D)=W)I=&5F*&]P=&EO
M;BYV86QU95LD+3%=*3L-" D)"0D)"0EW<FET969L;B I.PT*"0D)"0D)?0T*
M" D)"0D)"7T-" D)"0D)?0T*"0D)"7T-" D)"0EE;'-E(&EF("A?87)G=6UE
M"71Y<&5O9BAN=6QL*2!I9VYO<F4 /2!V85]A<F<A*'1Y<&5O9BAN=6QL*2DH
M9"AB;V]L*2D-" D)"0ET:')O=R!N97< 3W!T4&%R<V5%<G)O<BAF;W)M870H
M(B5S(&]P=&EO;B!M86YD871O<GD <&%R86UE=&5R(&UU<W0 8F4 ='EP92`E
M;W)Y(#T =F%?87)G(2AB;V]L*2A?87)G<'1R*3L-" D)"61E8G5G('=R:71E
M<ULP72YO<'1I;VYS('X](&]P=&EO;CL-" T*"0ED96)U9R!W<FET969L;B B
M<%1I=&QE+FQE;F=T:"`]/2`P*0T*"0D)=&AR;W< ;F5W($]P=%!A<G-E17)R
M;W(H(FUA:V5'<F]U<" I(')E<75I<F5S(&$ 9W)O=7`M=&ET;&4B*3L-" D)
M:68 *%]A<F=U;65N=',N;&5N9W1H(#T
M4&%R<V5%<G)O<B B;6%K94=R;W5P*"D <F5Q=6ER97, 870 ;&5A<W0 ;VYE
M8VAA<EM=*2D-" D)"0ET:')O=R!N97< 3W!T4&%R<V5%<G)O<B B;6%K94=R
M9R!W<FET969L;B B7'1A9&1I;F< ;W!T:6]N("5S('1O(&=R;W5P(BP ;VXI
M<V5/<'1I;VY;72!B87-I8T]P=&EO;G, /2!O<'1I;VY'<F]U<'-;,%TN;W!T
M:6]N<SL-" T*"0D)9F]R96%C:"`H<VEZ95]T(&DL($)A<V5/<'1I;VX ;SL
M(&]N(#T](&\N;&]N9TYA;64I('L-" D)"0D)9F]U;F0 /2!T<G5E.PT*"0D)
M=F4 9G)O;2!B87-I8T]P=&EO;G, 86YD('-H:69T(')E;6%I;FEN9R!T;R!P
M<F5S97)V92!O<F1E< T*"0D)"7=H:6QE("AR96UO=F4 *R`Q(#P 8F%S:6-/
M<'1I;VYS+FQE;F=T:"D >PT*"0D)"0EB87-I8T]P=&EO;G-;<F5M;W9E72`]
M"0D)?0T*"0D)"6]P=&EO;D=R;W5P<ULP72YO<'1I;VYS(#T 8F%S:6-/<'1I
M=%!A<G-E17)R;W(H;VX ?B`B(&]P=&EO;B!N965D<R!T;R!B92!A9&1E9"!B
M8V]M;6%N9"UL:6YE(&%R9W5M96YT<RX 87)G<ULP72!I<R!A<W-U;65D('1O
M(&)E('1H92!P<F]G<F%M+6YA;64-" D *B!A;F0 :7, <VMI<'!E9"X ($-H
M96-K<R!A<F=S(&UE971S('1H92!S<&5C:69I960 ;W!T:6]N<RX (&%R9W,
M:7, <F5S970-" D *B!T;R!B92!A;B!A<G)A>2!O9B!A;&P ;F]N+6]P=&EO
M;B!A<F=U;65N=', *'1H;W-E('1H870 9&\ ;F]T('-T87)T('=I=& -" D
M*B`G+2< 86YD(&1O(&YO="!F;VQL;W< 82!V86QU92UT86MI;F< ;W!T:6]N
M*2X (%)E='5R;G, 86X 3W!T:6]N<R!W:&EC:`T*"2`J(&ES('5S960 =&AU
M<R!T;R!C:&5C:R!F;W( 9F]U;F0 ;W!T:6]N<SH *")O<'1N86UE(B!I;B!O
M3W!T:6]N<R!S;R!T:&5Y)W)E(&9O=6YD(&)Y(&1E9F%U;'0-" D)9F]R96%C
M:"`H8VAA<EM=(&]P='-T<FEN9RP 0F%S94]P=&EO;B!O.R!D969A=6QT5F%L
M=65/<'1I;VYS*0T*"0D)9F]U;F1/<'1I;VYS6V]P='-T<FEN9UT /2!O.PT*
M9G1O=F5R07)G<SL-" T*"0ET<GD >PT*"0DO+R!&:6YD(&%R9W, =&AA="!A
M<F4 ;W!T:6]N<RP 86YD(&=E="!T:&5I<B!V86QU92!S=')I;F=S(&EF('1H
M97D <F5Q=6ER92!T:&5M+ T*"0DO+R!)9B!I="=S(&YO="!A;B!O<'1I;VXL
M:7, <VMI<'!E9"!A<R!I="=S(&%S<W5M960 =&\ 8F4 <')O9W)A;2!N86UE
M("AA6S%=(#T
M<W-I;F< ;&]N9RUO<'1I;VX )7,B+"!A*3L-" D)"0D)9F]R96%C:"`H0F%S
M94]P=&EO;B!O.R!F:6YD3W!T:6]N<RD >PT*"0D)"0D):68 *&\N;&]N9TYA
M;64N;&5N9W1H("`F)B` 82YF:6YD*&\N;&]N9TYA;64I(#T
M"0DF)B`H82YL96YG=& M,B`]/2!O+FQO;F=.86UE+FQE;F=T:"!\?"`H82YL
M96YG=& M,B`^(&\N;&]N9TYA;64N;&5N9W1H("8F(&%;,BMO+FQO;F=.86UE
M;W!T:6]N(&ES(&]N92!W92=R92!L;V]K:6YG(&9O< T*"0D)"0D)"69O=6YD
M(#T
M="!O<'1I;VXG<R!A<F<-" D)"0D)"0D):68 *&$N;&5N9W1H+3( /B!O+FQO
M;F=.86UE+FQE;F=T:"D >PT*"0D)"0D)"0D)+R\ ;W!T:6]N)W, =F%L=64
M:7, 8V]N8V%T96YA=&5D('=I=& (BTM;W!T:6]N/2(-" D)"0D)"0D)"6EF
M("AA+FQE;F=T:"TR(#T
M;F5W($]P=&EO;D5R<F]R*&9O<FUA=" B+2TE<R!O<'1I;VX <F5Q=6ER97,
M82!V86QU92(L(&\N;&]N9TYA;64I*3L-" D)"0D)"0D)"6]V(#T 85LR*V\N
M*0T*"0D)"0D)"0D)"71H<F]W(&YE=R!/<'1I;VY%<G)O<BAF;W)M870H(BTM
M"0D)"0D)"0EO=B`](&%R9W-;*RMI73L-" D)"0D)"0D)?0T*"0D)"0D)"7T-
M" D)"0D)"0DO+R!E;'-E(&]P=&EO;B!R97%U:7)E<R!N;R!V86QU92!A;F0
M;W8 :7, ;G5L;`T*"0D)"0D)"6]P='-686QS6V]=(#T
M8G)E86L[("`O+R!F;W5N9"!S;R!S:VEP('1H92!R97-T(&]F(&]P=&EO;G,
M=V4G<F4 ;&]O:VEN9R!F;W(-" D)"0E]"7T)?0T*"0D)"65L<V4 >R` +R\
M:70G<R!A('-H;W)T(&]P=&EO; T*"0D)"0ED96)U9R!W<FET969L;B B7'1P
M<F]C97-S:6YG('-H;W)T+6]P=&EO;B`E<R(L(&$I.PT*"0D)"0EF;W)E86-H
M:&]R=$YA;64N;&5N9W1H("`F)B` 82YF:6YD*&\N<VAO<G1.86UE*2`]/2`Q
M:6YG(&9O< T*"0D)"0D)"69O=6YD(#T =')U93L-" D)"0D)"0EC:&%R6UT
M:68 *&$N;&5N9W1H+3$ /B!O+G-H;W)T3F%M92YL96YG=& I('L-" D)"0D)
M"0D)"2\O(&]P=&EO;B=S('9A;'5E(&ES(&-O;F-A=&5N871E9"!W:71H("(M
M;W!T:6]N( T*"0D)"0D)"0D);W8 /2!A6V\N<VAO<G1.86UE+FQE;F=T:"LQ
M+R\ ;W!T:6]N)W, =F%L=64 <VAO=6QD(&)E(&YE>'0 :6X 87)G<PT*"0D)
M"0D)"0D):68 *&D /3T 87)G<RYL96YG=& M,2D-" D)"0D)"0D)"0ET:')O
M=R!N97< 3W!T:6]N17)R;W(H9F]R;6%T*"(M)7, ;W!T:6]N(')E<75I<F5S
M(&$ =F%L=64B+"!O+G-H;W)T3F%M92DI.PT*"0D)"0D)"0D);W8 /2!A<F=S
M82YL96YG=& M,2`^(&\N<VAO<G1.86UE+FQE;F=T:"D >PT*"0D)"0D)"0DO
M+R!N;RUV86QU92!O<'1I;VX 9&ED;B=T(&UA=&-H+"!I93H +6]74D].1PT*
M"0D)"0D)"0EF;W5N9"`](&9A;'-E.PT*"0D)"0D)"0EB<F5A:SL-" D)"0D)
M86YD(&]A(&ES(&YU;&P-" D)"0D)"0EO<'1S5F%L<UMO72`](&]V.PT*"0D)
M"0D)"6)R96%K.R` +R\ 9F]U;F0 <V\ <VMI<"!T:&4 <F5S="!O9B!O<'1I
M=6YD*0T*"0D)"0ET:')O=R!N97< 3W!T:6]N17)R;W(H(FYO('-U8V ;W!T
M;F0 ;W!T:6]N<R!A;F0 <&%R<V4 86YD(&-H96-K('1H96ER(&9O=6YD('9A
M;'5E<PT*"0EF;W)E86-H("A"87-E3W!T:6]N(&\L(&-H87);72!V.R!O<'1S
M5F%L<RD-" D)>PT*"0D)9&5B=6< =W)I=&5F;&XH(EQT9F]U;F0 ;W!T:6]N
M("5S('=I=& =F%L=64M<W1R:6YG(#T
M"0D)9F]U;F1/<'1I;VYS6V\N;&]N9TYA;65=(#T ;SL-" T*"0D)=')Y('L-
M=&5D5'EP97,N3F]686QU93H-" D)"0D)"6%S<V5R="`H=B!I<R!N=6QL*3L-
M" D)"0D)"61E8G5G('=R:71E9FQN*")<=%QT)7, ;W!T:6]N.B!H87, ;F\
M=F%L=64 =&\ <&%R<V4B+"!O*3L-" D)"0D)"6)R96%K.PT*"0D)"0EC87-E
M(%-U<'!O<G1E9%1Y<&5S+DEN=#H-" D)"0D)"61E8G5G('=R:71E9FQN*")<
M=%QT)7, ;W!T:6]N.B!P87)S:6YG(%PB)7-<(B!A<R!I;G0B+"!O+"!V*3L-
M" D)"0D)"2AC87-T*$]P=&EO;B$H:6YT*2EO*2YV86QU92`]('1O26YT*'8I
M<&%R<VEN9R!<(B5S7"( 87, :6YT6UTB+"!O+"!V*3L-" D)"0D)"2AC87-T
M*$]P=&EO;B$H:6YT6UTI*6\I+G9A;'5E(#T <&%R<V5!<G)A>2$H:6YT*2AV
M5'EP97,N54EN=#H-" D)"0D)"61E8G5G('=R:71E9FQN*")<=%QT)7, ;W!T
M8V%S="A/<'1I;VXA*'5I;G0I*6\I+G9A;'5E(#T =&]5:6YT*'8I.PT*"0D)
M. T*"0D)"0D)9&5B=6< =W)I=&5F;&XH(EQT7'0E<R!O<'1I;VXZ('!A<G-I
M;F< 7"(E<UPB(&%S('5I;G1;72(L(&\L('8I.PT*"0D)"0D)*&-A<W0H3W!T
M:6]N(2AU:6YT6UTI*6\I+G9A;'5E(#T <&%R<V5!<G)A>2$H=6EN="DH=BP
M>7!E<RY,;VYG. T*"0D)"0D)9&5B=6< =W)I=&5F;&XH(EQT7'0E<R!O<'1I
M;VXZ('!A<G-I;F< 7"(E<UPB(&%S(&QO;F<B+"!O+"!V*3L-" D)"0D)"2AC
M"0EB<F5A:SL-" D)"0D)8V%S92!3=7!P;W)T9614>7!E<RY,;VYG07)R87DZ
M;VXA*&QO;F=;72DI;RDN=F%L=64 /2!P87)S94%R<F%Y(2AL;VYG*2AV+"`F
M=&],;VYG*3L-" D)"0D)"6)R96%K.PT*"0D)"0EC87-E(%-U<'!O<G1E9%1Y
M<&5S+E5,;VYG. T*"0D)"0D)9&5B=6< =W)I=&5F;&XH(EQT7'0E<R!O<'1I
M"0D)"0EB<F5A:SL-" D)"0D)8V%S92!3=7!P;W)T9614>7!E<RY53&]N9T%R
M<F%Y. T*"0D)"0D)9&5B=6< =W)I=&5F;&XH(EQT7'0E<R!O<'1I;VXZ('!A
M<G-I;F< 7"(E<UPB(&%S('5L;VYG6UTB+"!O+"!V*3L-" D)"0D)"2AC87-T
M*$]P=&EO;B$H=6QO;F=;72DI;RDN=F%L=64 /2!P87)S94%R<F%Y(2AU;&]N
M="5S(&]P=&EO;CH <&%R<VEN9R!<(B5S7"( 87, 9FQO870B+"!O+"!V*3L-
M" D)"0D)"2AC87-T*$]P=&EO;B$H9FQO870I*6\I+G9A;'5E(#T =&]&;&]A
M="AV*3L-" D)"0D)"6)R96%K.PT*"0D)"0EC87-E(%-U<'!O<G1E9%1Y<&5S
M=&EO;CH <&%R<VEN9R!<(B5S7"( 87, 9FQO871;72(L(&\L('8I.PT*"0D)
M"0D)*&-A<W0H3W!T:6]N(2AF;&]A=%M=*2EO*2YV86QU92`]('!A<G-E07)R
M969L;B B7'1<="5S(&]P=&EO;CH <&%R<VEN9R!<(B5S7"( 87, 9&]U8FQE
M=64 /2!T;T1O=6)L92AV*3L-" D)"0D)"6)R96%K.PT*"0D)"0EC87-E(%-U
M<'!O<G1E9%1Y<&5S+D1O=6)L94%R<F%Y. T*"0D)"0D)9&5B=6< =W)I=&5F
M;&XH(EQT7'0E<R!O<'1I;VXZ('!A<G-I;F< 7"(E<UPB(&%S(&1O=6)L95M=
M86QU92`]('!A<G-E07)R87DA*&1O=6)L92DH=BP )G1O1&]U8FQE*3L-" D)
M"0D)"6)R96%K.PT*"0D)"0EC87-E(%-U<'!O<G1E9%1Y<&5S+E-T<FEN9SH-
M" D)"0D)"61E8G5G('=R:71E9FQN*")<=%QT)7, ;W!T:6]N.B!P87)S:6YG
M(%PB)7-<(B!A<R!C:&%R6UTB+"!O+"!V*3L-" D)"0D)"2AC87-T*$]P=&EO
M8V%S92!3=7!P;W)T9614>7!E<RY3=')I;F=!<G)A>3H-" D)"0D)"61E8G5G
M('=R:71E9FQN*")<=%QT)7, ;W!T:6]N.B!P87)S:6YG(%PB)7-<(B!A<R!C
M:&%R6UU;72(L(&\L('8I.PT*"0D)"0D)*&-A<W0H3W!T:6]N(2AC:&%R6UU;
M72DI;RDN=F%L=64 /2!P87)S94%R<F%Y(2AC:&%R6UTI*'8L(&9U;F-T:6]N
M(&-H87);72`H8VAA<EM=('9S*2![<F5T=7)N('9S.WTI.PT*"0D)"0D)8G)E
M;W< ;F5W($]P=&EO;D5R<F]R*&9O<FUA=" B)7, ;W!T:6]N(&5R<F]R('!A
M<G-I;F< =F%L=64M<W1R:6YG(%PB)7-<(B!A<R`E<SH )7,B+"!O+"!V+"!O
M9$]P=&EO;G,I('L-" D)"7!R:6YT2&5L<" I.PT*"0D)97AI=" P*3L-" D)
M?0T*"0EI9B`H(G9E<G-I;VXB(&EN(&9O=6YD3W!T:6]N<RD >PT*"0D)<')I
M;6%N9&%T;W)Y(&]P=&EO;G, 87)E(&EN(&9O=6YD3W!T:6]N<PT*"0EF;W)E
M86YD871O<GDI('L-" D)"0EB;V]L(&9O=6YD.PT*"0D)"69O<F5A8V *$)A
M<V5/<'1I;VX 9F\[(&9O=6YD3W!T:6]N<RD-" D)"0D):68 *&9O(&ES(&\I
M=&AR;W< ;F5W($]P=&EO;D5R<F]R*&9O<FUA=" B)7, ;W!T:6]N(&ES(&UA
M969L;B B)7,N<&%R<V4H*2!D;VYE+B(L('1H:7,I.PT*"0EA<F=S(#T ;&5F
M=&]V97)!<F=S.PT*"0ER971U<FX 9F]U;F1/<'1I;VYS.PT*"7T-" T*"79O
M;VAL(#X ,C$I('L-" D)"0EC:&%R6UT <F5T(#T (EQN(CL-" D)"0EC:&%R
M6UT :6YD96YT(#T
M92YL96YG=& /B`W,BD >PT*"0D)"0D);&EN97, ?CT ;&EN93L-" D)"0D)
M;F=T:"D-" D)"0D);&EN97, ?CT ;&EN93L-" D)"0EF;W)E86-H("AC:&%R
M6UT ;#L
M"0ER971U<FX ;6%K94EN9&5N=" R-"`M(&]H;"D ?B!H.PT*"0D)?0T*"0E]
M<R`E<UQN(BP <')O9TYA;64L('5S86=E*3L-" D)?0T*"0EF;W)E86-H("A/
M<'1I;VY'<F]U<"!G<F]U<#L
M;VX ;SL 9W)O=7`N;W!T:6]N<RD >PT*"0D)"6-H87);72!O<'1(96QP(#T
M87(N;&5N9W1H*0T*"0D)"0D);W!T2&5L<"!^/2`B("( ?F\N;65T859A<CL-
M" D)"0D):68 *&\N;&]N9TYA;64N;&5N9W1H*0T*"0D)"0D);W!T2&5L<"!^
M/2`B+"`B.PT*"0D)"7T-" D)"0EI9B`H;RYL;VYG3F%M92YL96YG=& I('L-
M" D)"0D);W!T2&5L<"!^/2`B+2TB('X ;RYL;VYG3F%M93L-" D)"0D):68
M"6]P=$AE;'` ?CT 86QI9VY/<'1(96QP4W1R*&\N:&5L<"P ;W!T2&5L<"YL
M"7T-" D)=W)I=&5F*&AE;'`I.PT*"7T-" T*"79O:60 <')I;G1697)S:6]N
M:71E9FQN*"(E<SH 97)R;W(Z("5S7&XB+"!P<F]G3F%M92P ;7-G*3L-" D)
M9R!W<FET969L;B B)7,N<&%R<V5!<G)A>2$H)7,I*'9S/5PB)7-<(B!P87)S
M950])7,I(BP =&AI<RP ='EP96ED*%0I+"!V<RP <&%R<V54*3L-" D)5%M=
M:"`H8VAA<EM=(',[('-S*0T*"0D):68 *',N;&5N9W1H*0T*"0D)"6$ ?CT
M;F1E9"!T;R!B92!U<V5D('-O;65T:&EN9R!L:6ME. T*("H :68 *")O<'1I
M('1O(&%L;"!O<'1I;VYS(&%N9"!P<F]V:61E<R!T96UP;&%T92!F;W(-"B`J
M(')E=')I979I;F< ;W!T:6]N('9A;'5E<R!A<R!T:&4 8V]R<F5C="!T>7!E
M" EC:&%R6UT <VAO<G1.86UE+"!L;VYG3F%M93L-" EC:&%R6UT :&5L<"P
M;65T859A<CL-" EB;V]L(&UA;F1A=&]R>3L-" E3=7!P;W)T9614>7!E<R!T
M;W)T9614>7!E<R!T+"!4>7!E26YF;R!T:2P 8VAA<EM=('-.86UE+"!C:&%R
M<V5R="`H=&D (3T](&YU;&PI.PT*"0EA<W-E<G0 *'-.86UE+FQE;F=T:"!\
M"5]T>7!E(#T
M92`](&Q.86UE.PT*"0EH96QP(#T :#L-
M"61E8G5G('=R:71E9FQN*"(E<RYT:&ES*"D 9&]N92`M+2!T>7!E(#T )60
M(%]T>7!E(#T
M("` ("` ("` ("` ("` 268 =&AE('=R;VYG('1Y<&4 :7, 871T96UP=&5D
M+"!/<'1087)S945R<F]R(&ES('1H<F]W;BX-" D *B\-" ET96UP;&%T92!G
M<&4 /3T 4W5P<&]R=&5D5'EP97,N3F]686QU92D-" D)"71H<F]W(&YE=R!/
M<'1087)S945R<F]R*&9O<FUA=" B)7, ;W!T:6]N(&1O97, ;F]T(&AA=F4
M82!V86QU92!T;R!R971R:65V92(L('1H:7,I*3L-" T*"0ET<GD >PT*"0D)
M:68 *&=E=%-4(2A4*2`A/2!T>7!E*0T*"0D)"71H<F]W(&YE=R!/<'1087)S
M945R<F]R*&9O<FUA=" B)7, ;W!T:6]N(&UU<W0 8F4 <F5T<FEE=F5D(&%S
M('1Y<&4 )7,L(&YO="!T>7!E("5S(BP =&AI<RP 7W1Y<&4L('1Y<&5I9"A4
M*0T*"0D)=&AR;W< ;F5W($]P=%!A<G-E17)R;W(H9F]R;6%T*"(E<R!O<'1I
M;VX 8V%N(&YO="!B92!R971R:65V960 87, =6YS=7!P;W)T960 ='EP92`E
M(%!A<F%M971E<FEZ960 8GD 82!T>7!E('1O('-P96-I9FEY(&$ =F%L=64-
M"B`J(&ES(&5X<&5C=&5D(&%N9"!W:&%T('1Y<&4L(&]R($YO5F%L=64 =&\
M"B`J+PT*<')I=F%T92!C;&%S<R!/<'1I;VX *%0I(#H 0F%S94]P=&EO; T*
M('T-" T*"71H:7, *&-H87);72!S:&]R=$YA;64L(&-H87);72!L;VYG3F%M
M92P 8VAA<EM=(&AE;'`L(&-H87);72!M971A5F%R*0T*"7L-" D)=')Y('L-
M" D)"7-U<&5R*&=E=%-4(2A4*2P ='EP96ED*%0I+"!S:&]R=$YA;64L(&QO
M;F=.86UE+"!H96QP+"!M971A5F%R*3L-" D)?0T*"0EC871C:"`H56Y3=7!P
M;W)T9614>7!E17)R;W( =7-T92D >PT*"0D)=&AR;W< ;F5W($]P=%!A<G-E
M17)R;W(H9F]R;6%T*"(E<R!O<'1I;VX 8V%N(&YO="!B92!U;G-U<'!O<G1E
M9"!T>7!E("5S(BP ;W!T5&]3=')I;F<H<VAO<G1.86UE+&QO;F=.86UE*2P
M96)U9R!W<FET969L;B B8F5G:6X )7, =6YI='1E<W0B+"!?7T9)3$5?7RD[
M>PT*"0EO<'1I;VY087)S97( /2!N97< 3W!T:6]N4&%R<V5R*%]?1DE,15]?
M6S`N+B0M,ETL(");;W!T:6]N(%MV86QU95U=(BP (C`N,"(I.PT*"0EO<'1I
M;VY087)S97(N861D3W!T:6]N(2 I*")V(BP (G9E<F)O<V4B*3L-" D);W!T
M:6]N4&%R<V5R+F%D9$]P=&EO;B$H9FQO870I*")F(BP (F9O;R(L(&YU;&PL
M(&YU;&PL(&YU;&PL('1R=64I.PT*"0EO<'1I;VY087)S97(N861D3W!T:6]N
M(2AI;G0I*")X(BP (GAE;F\B+"`B9&]E<R!T:&ES(&%N9"!T:&%T(BP (E1(
M24Y'(BP ,3(S*3L-" D);W!T:6]N4&%R<V5R+F%D9$]P=&EO;B$H:6YT6UTI
M*")A(BP (F%P<&QE(BP (FUA:V4 87!P;&5S875C92(L(&YU;&PI.PT*"0EO
M<'1I;VY087)S97(N861D3W!T:6]N(2AL;VYG*2 B;"(L(")L;VYG(BP (F)E
M*&1O=6)L92DH(F0B+"`B9&]U8FQE(BP ;G5L;"P (D1/54),12(I.PT*"0EO
M<'1I;VY087)S97(N861D3W!T:6]N(2AU:6YT6UTI*")U:2(L(")U:6YT(BP
M(FYU;6)E<B!O<'1I;VYS(BP (F8B+"`B>"(L(")A(BP (FPB+"`B9"(L(")U
M:2(I.PT*"0EO<'1I;VY087)S97(N861D3W!T:6]N(2AC:&%R6UTI*&YU;&PL
M(")B87(B+"`B;6%K92!I="!H87!P96XB+"`B0DQ/0B(L(")D969A=6QT+79A
M<V(B+"`B<VAA8F%N9R(L(")B;&]W('5P(BP (DE4(BP <VAA8F%N9T1F;'0I
M.PT*"0EO<'1I;VY087)S97(N;6%K94=R;W5P*")S=')I;F< ;W!T:6]N<R(L
M*")M>6%P<"!L86QA("UV("TM9F]O/3DX-RXV-2`M+6)A<B!B87(M<W1R:6YG
M.PT*"7-T871I8R!C:&%R6UU;72!L969T;W9E<B`](%LB;&%L82(L(FAO:&\B
M<G0 *")V97)B;W-E(B!I;B!O<'1I;VYS("8F(")V(B!I;B!O<'1I;VYS*3L-
M" EA<W-E<G0 *")F;V\B(&EN(&]P=&EO;G, )B8 (F8B(&EN(&]P=&EO;G,I
M.PT*"6%S<V5R="`H;W!T:6]N<ULB9F]O(ETN9V5T5F%L=64A*&9L;V%T*2`]
M<V5R="`H;W!T:6]N<ULB8F%R(ETN9V5T5F%L=64A*&-H87);72D /3T (F)A
M<BUS=')I;F<B*3L-" EA<W-E<G0 *")A<'!L92( :6X ;W!T:6]N<R`F)B`B
M6UTI(#T](&%P<&QE24$I.PT*"6%S<V5R="`H(G-H86)A;F<B(&EN(&]P=&EO
M="`H;W!T:6]N<ULB<VAA8F%N9R)=+F=E=%9A;'5E(2AC:&%R6UU;72D /3T
M<W!L:70H(FUY87!P("TM=F5R8F]S92`M+6%P<&QE/2P ;&%L82!H;VAO(&%S
M9&8 +2US:&%B86YG(&]N;'E/;F4 +68M,"XY,S%E+34B*3L-" EO<'1I;VYS
M(#T ;W!T:6]N4&%R<V5R+G!A<G-E*&%R9W,I.PT*"6%S<V5R="`H87)G<R`]
M<W-E<G0 *&]P=&EO;G-;(F8B72YG971686QU92$H9FQO870I(#T]("TP+CDS
M,64M-68I.PT*"6%S<V5R="`H(F$B(&EN(&]P=&EO;G,I.PT*"2\O(&EF('EO
M=2!R96%L;'D =V%N="!T;R!G:79E(&$ ;G5L;"!V86QU92UA<G)A>2P >6]U
M(&-A;B!G:79E(&IU<W0 82`G+"<-" EA<W-E<G0 *&]P=&EO;G-;(F%P<&QE
M(ETN9V5T5F%L=64A*&EN=%M=*2`]/2!N=6QL*3L-" EA<W-E<G0 *")S:&%B
M86YG(B!I;B!O<'1I;VYS*3L-" ES=&%T:6, 8VAA<EM=6UT <VAA8F%N9T-!
M03( /2!;(F]N;'E/;F4B73L-" EA<W-E<G0 *&]P=&EO;G-;(G-B(ETN9V5T
M;VY087)S97(H*3L-" EA<F=S(#T
M/3DY+"PB*3L-" EO<'1I;VYS(#T ;W!T:6]N4&%R<V5R+G!A<G-E*&%R9W,I
M.PT*"6%S<V5R="`H(G-H86)A;F<B(&EN(&]P=&EO;G, )B8 (G-B(B!I;B!O
M<'1I;VYS*3L-" EA<W-E<G0 *&]P=&EO;G-;(G-B(ETN9V5T5F%L=64A*&-H
M6R)X96YO(ETN9V5T5F%L=64A*&EN="D /3T ,3(S*3L-" EA<W-E<G0 *")B
M87(B(&EN(&]P=&EO;G,I.PT*"6%S<V5R="`H;W!T:6]N<ULB8F%R(ETN9V5T
M5F%L=64A*&-H87);72D /3T (F1E9F%U;'0M=F%L=64B*3L-" EA<W-E<G0
M*")L;VYG(B!I;B!O<'1I;VYS("8F(")L(B!I;B!O<'1I;VYS*3L-" EA<W-E
M<G0 *&]P=&EO;G-;(FQO;F<B72YG971686QU92$H;&]N9RD /3T +3$Q-3(Y
M;&4B72YG971686QU92$H9&]U8FQE*2`]/2`Q+C<Y-S8P92LR.3$I.PT*"7-T
M871I8R!U:6YT6UT =6EA(#T
M;W!T:6]N<R`F)B`B=6DB(&EN(&]P=&EO;G,I.PT*"6%S<V5R="`H;W!T:6]N
M8VL 3W!T:6]N17)R;W( *'1H97-E(&-A=7-E('!R;V-E<W, =&\ 97AI="P
M("` ("` ("` ($D 8VAE8VME9"!T:&5M(&%L;"!O;F4 8GD ;VYE*0T*"2\O
M9W, /2!S<&QI=" B;7EA<'` +2UB87(B*3L-" EO<'1I;VYS(#T ;W!T:6]N
M("TM8F%R/2(I.PT*"6]P=&EO;G, /2!O<'1I;VY087)S97(N<&%R<V4H87)G
M<RD[*R\-" DO+R!N;R!S=6-H(&]P=&EO; T*"2\K87)G<R`]('-P;&ET*")M
M+R]A<F=S(#T
M;VYS(#T ;W!T:6]N4&%R<V5R+G!A<G-E*&%R9W,I.PT*"2\K87)G<R`]('-P
M<BYP87)S92AA<F=S*3LK+PT*"2\K87)G<R`]('-P;&ET*")M>6%P<"`M+75I
M;G0 -34L,C,L+3$R+#DY
M87)S92AA<F=S*3LK+PT*"2\O(&UI<W-I;F< ;6%N9&%T;W)Y(&]P=&EO;B`M
M+69O;PT*"2\K87)G<R`]('-P;&ET*")M>6%P<"(I.PT*"6]P=&EO;G, /2!O
M<GD >PT*"0D)+R]D96)U9R!W<FET969L;B B9F%I;', 86)O=70 =&\ 8V%L
M87)S945R<F]R(&]P92D >PT*"0D)9F%I;&5D(#T =')U93L-" D)"61E8G5G
M<F5T=7)N(&9A:6QE9#L-
M;W(-" DO+R!$340 8G5G('=I=& ;F5S=&5D(&1E;&5G871E<R!T:')O=VEN
M9R]C871C:&EN9R!P<F5V96YT<R!F86EL<R I(&9R;VT =V]R:VEN9RP-" DO
M+R!S;R!U;G1I;"!T:&%T)W, 9FEX960L(&)E;&]W(&%R92!N;W0 87-S97)T
M*&9A:6QS*"XN+BDI('-O($D 8V]U;&0 =&5S="!T:&5M(&5A8V -" EN97=/
M<W-E<G0 *&9A:6QS*&1E;&5G871E('9O:60 *"D >V]P=&EO;E!A<G-E<BYA
M9&1/<'1I;VXA*&-H87);72DH(G B*3M]*2D[("\O($1-1"!B=6<Z('1H92!/
M<'1087)S945R<F]R(&ES;B=T(&-A=6=H="!B>2!F86EL<PT*"2\O;W!T:6]N
M4&%R<V5R+F%D9$]P=&EO;B$H8VAA<EM=*2 B>"(I.PT*"2\O('5N<W5P<&]R
M=&5D('1Y<&4-" DO+V]P=&EO;E!A<G-E<BYA9&1/<'1I;VXA*&-D;W5B;&4I
M<&4-" DO+V]P=&EO;E!A<G-E<BYA9&1/<'1I;VXA*&-H87);72DH(GHB+&YU
M" DO+V]P=&EO;E!A<G-E<BYA9&1/<'1I;VXA*&EN="DH(GHB+&YU;&PL;G5L
M875L="!V86QU90T*"2\O;W!T:6]N4&%R<V5R+F%D9$]P=&EO;B$H*2 B>B(L
M;G5L;"QN=6QL+&YU;&PL,3(S*3L-" DO+R!.;U9A;'5E(&1E9F%U;'1686QU
M92!M=7-T(#T](&YU;&P =VAE;B!M86YD871O<GD-" DO+V]P=&EO;E!A<G-E
M87!P("UV(&%S9&8 +2UX96YO/34T,S(Q('AY>B`M9C`N.3DB*3L-" DO+V]P
M92`](&]P=&EO;G-;(G9E<F)O<V4B72YG971686QU92$H:6YT*3L-" DO+V%S
M<V5R="`H9F%I;',H9&5L96=A=&4 =F]I9"`H*2![(&]P=&EO;G-;(G9E<F)O
M<V4B72YG971686QU92$H8F]O;"D[('TI*3L ("\O(&-A=7-E<R!$340 8G5G
M($D 8V%N)W0 <F5P<F]D=6-E('-I;7!L97(L(&EF(&)O;VP 8B`]('-T871M
M97(N;6%K94=R;W5P*")C<F%P(&]P=&EO;G,B+"`B;6ES<VEN9R(I.PT*"2\O
M<'1I;VY087)S97(N861D3W!T:6]N(2 I*&YU;&PL(&YU;&PL(")W:&%T(&%M
M($D 9&]I;F<_(2(I.PT*"2\O(&UI<W-I;F< 9W)O=7` =&ET;&4-" DO+V]P
M=&EO;E!A<G-E<BYM86ME1W)O=7`H;G5L;"P (G9E<F)O<V4B*3L-" DO+R!W
M<VEO;B`H3W!T4&%R<V5-86EN*0T*>PT*"2\J* T*"2`J(%=O<FMI;F< 97AA
M;7!L92!U<V%G92X-" D *B\-" EI;G0 ;6%I;B`H8VAA<EM=6UT 87)G<RD-
M:&%R6UU;72!F:6QE<SL-" T*"0DO+R!C;VYS=')U8W1O<B!A<F=S(&%R92!U
M<V5D(&EN('!R:6YT:6YG(&AE;'`-" D)+R\ ;W!T:6]N("UH("\ +2UH96QP
M(&ES(&%L=V%Y<R!A9&1E9"!B>2!D969A=6QT(&%N9"!U<V5S('!R;V=R86TM
M;F%M92!A;F0 =7-A9V4-" D)+R\ ;W!T:6]N("TM=F5R<VEO;B`H;F\ <VAO
M<G0 ;F%M92D :7, 861D960 8GD 9&5F875L="!I9B!V97)S:6]N(&ES(&=I
M<F]G<F%M+6YA;64 ("` ("` ("` ("` ("!U<V%G92` ("` ("` ("` ("`
M97(H7U]&24Q%7U];,"XN)"TR72P (EMO<'1I;VYS72`M+69I;&5S/68Q+&9.
M(%MO=71F:6QE72(L("(P+C,B*3L-" T*"0DO+R!I;G0L('-H;W)T(&%N9"!L
M;VYG+"!H96QP+"!M971A=F%R+"!N;R!D969A=6QT+"!N;W0 ;6%N9&%T;W)Y
M<F4 86YD(&UO<F4 86YD(&UO<F4 86YD(&UO<F4 86YD(&UO<F4 86YD(&UO
M<F4 86YD(&UO<F4 =F5R8F]S92XB+"`B3$5614PB*3L-" D)+R\ 8V]M;6$M
M<V5P87)A=&5D('-T<FEN9R!L:7-T+"!S:&]R="!A;F0 ;&]N9RP :&5L<"P
M;B$H8VAA<EM=6UTI*")F<R(L(")F:6QE<R(L(")&:6QE<R!T;R!P<F]C97-S
M+"!A;F0 ;6%K92!T:&ES(&$ <F5A;&QY(&QO;F< :&5L<"!S=')I;F< 87,
M=V5L;"!T;R!T97-T(&%L:6=N:6YG+B(L(")&24Q%+$9)3$4L+BXN(BP ;G5L
M87(L(&1E9F%U;'0L(&YO="!M86YD871O<GD-" D);W`N861D3W!T:6]N(2AF
M;&]A="DH;G5L;"P (G1H:6YG(BP (D1O(&ET('=I=& =&AI<RXB+"`B1DQ/
M050B+"`M-"XR.3=E,C%F*3L-" D)+R\ ;F\M=F%L=64L('-H;W)T+6]N;'DL
M('=I=& :&5L<"P ;F\ ;65T879A<BP ;F\ 9&5F875L="P ;F]T(&UA;F1A
M=&]R>0T*"0EO<"YA9&1/<'1I;VXA*"DH(F$B+"!N=6QL+"`B57-E(&%L=&5R
M:6YE(&%R9W5M96YT<RP :6YC;'5D:6YG(&%R9W-;,%T <')O9W)A;2UN86UE
M("AI="=S('-K:7!P960I+ T*"0DO+R!!<F=S('=I;&P 8F4 <F5S970 =&\
M=&AE(')E;6%I;FEN9R!N;VXM;W!T:6]N(&-O;6UA;F0M;&EN90T*"0DO+R!A
M(&]P=&EO;B!W87, 9VEV96X ;VX =&AE(&-O;6UA;F0M;&EN90T*"0DO+R!B
M>2!U<VEN9R`H8VAA<EM=(&EN($]P=&EO;G,I+ T*"0DO+R!)9B!T:&4 ;W!T
M:6]N(&AA<R!B;W1H('-H;W)T(&%N9"!L;VYG(&YA;65S+"!E:71H97( 8V%N
M($EF(&]P=&EO;B!W87, 9VEV96X 86YD(&ET(&AA<R!A('9A;'5E+`T*"0D)
M+R\ <F5T<FEE=F4 :70 8GD :6YD97AI;F< 3W!T:6]N<R!W:71H('-H;W)T
M+R!A;F0 9&\ 9V5T5F%L=64A*%9A;'5E5'EP92D-" D)"79E<F)O<VET>2`]
M(&]P=&EO;G-;(G9E<F)O<V4B72YG971686QU92$H:6YT*3L-" T*"0EI9B`H
M=F5R8F]S:71Y(#X ,"D-" D)"7=R:71E9FQN*")))VQL('-A>2!A(&QI='1L
M;"!S87D 82!L;W0 ;6]R92XB*3L-" T*"0DO+R!A<F=S('=A<R!R97-E="!B
M>2!P87)S92!T;R!T:&4 <F5M86EN:6YG(&YO;BUO<'1I;VX 8V]M;6%N9"UL
M:6YE(&%R9W5M96YT<PT*"0EI9B`H87)G<RYL96YG=& /3T ,2D-" D)"2\O
M('5S92!T:&4 9FER<W0 ;F]N+6]P=&EO;B!A<F=U;65N=`T*"0D);W5T9FEL
M"2\O($]P=&EO;D5R<F]R+F5R<F]R17AI=" B;65S<V%G92(I(&-A;B!B92!U
M<V5D('1O('!R:6YT(&AE;'` 86YD(&5X:70 <')O8V5S<SL-" D)"2\O('5S
M<"YE<G)O<D5X:70H(FUO<F4 =&AA;B!O;F4 ;W5T<'5T(&9I;&4 <W!E8VEF
M960 =&\ 8F4 =&AE<F4 869T97( <&%R<V4H87)G<RD-" D)87-S97)T(" B
M9FEL97,B(&EN(&]P=&EO;G,I.PT*"0EF:6QE<R`](&]P=&EO;G-;(F9I;&5S
M(ETN9V5T5F%L=64A*&-H87);75M=*3L-" D):68 *&9I;&5S+FQE;F=T:"`]
M/2`P*0T*"0D);W`N97)R;W)%>&ET*")N965D('1O('-P96-I9FEY(&%T(&QE
M;&XH(FUY('1H:6YG(&ES.B`B+"!O<'1I;VYS6R)T:&EN9R)=+F=E=%9A;'5E
M<R!U<VEN9R!A;'1E<FYA=&4 ;65T:&]D.B(I.PT*"0D)96QS90T*"0D)"7=R
M:71E9FQN*"))('=O=6QD('!R;V-E<W, 9FEL97, =7-I;F< ;F]R;6%L(&UE
M=&AO9#HB*3L-" D)"69O<F5A8V *&-H87);72!F.R!F:6QE<RD-" D)"0EW
M<FET969L;B B7'0B+&8I.PT*"0D)=W)I=&5F;&XH(F%N9"!O=71P=70 =&\
M(BP ;W5T9FEL92YL96YG=& /R!O=71F:6QE(#H
:"7T-" T*"0ER971U<FX ,#L-
`
end
Jun 01 2005
Cool, Derick!
What about using box values there?
Having them and use TypeList instead of
optionParser = new OptionParser(__FILE__[0..$-2], "[option [value]]",
"0.0");
optionParser.addOption!()("v","verbose");
optionParser.addOption!(float)("f","foo",null,null,null,true);
optionParser.addOption!(int)("x","xeno","does this and that","THING",123);
will allow to build such declarations in compile time - statically.
Just hypothesis....
Andrew.
<derick_eddington nospam.yashmoo.com> wrote in message
news:d7g5nd$3i3$1 digitaldaemon.com...
I've made a command-line option helper similar to Python's optparse. It
allows
you to specify what D-type you want the option as, short name, long name,
help,
and more. It automatically creates a formatted help message and prints it
on
errors. It checks that clients' usage of the module is proper; and it
checks
that the command-line arguments meet what was specified. It has a
compehensive
unittest that demonstrates more. The source is attached.
: /**
: * Example usage:
: */
: int main (char[][] args)
: {
: int verbosity;
: char[] outfile;
: char[][] files;
:
: // Constructor parameters are used in printing help.
: // -h / --help is always added by default
: // and uses program-name and usage.
: // --version (no short name) is added by
: // default if version is given.
: // program-name
: OptionParser op = new OptionParser(__FILE__[0..$-2],
: // usage version
: "[options] --files=f1,fN [outfile]", "0.2");
:
: // int, short and long, help, metavar,
: // no default, not mandatory
: op.addOption!(int)("v", "verbose",
: "Be more and more and more and more and more "
: "and more and more verbose.", "LEVEL");
: // comma-separated string list, short and long, help,
: // metavar, no default, mandatory
: op.addOption!(char[][])("fs", "files",
: "Files to process, and make this a really long help "
: "string as well to test aligning.", "FILE,FILE,...",
: null, true);
: // float, long-only, help, metavar, default, not mandatory
: op.addOption!(float)(null, "thing", "Do it with this.",
: "FLOAT", -4.297e21f);
: // no-value, short-only, with help, no metavar,
: // no default, not mandatory
: op.addOption!()("a", null, "Use alternate method.");
:
: // Parse command-line arguments, including args[0]
: // program-name (it's skipped).
: // args will be reset to the remaining non-option
: // command-line arguments in the order they appeared.
: Options options = op.parse(args);
:
: // Check if option was given on the command-line
: // by using (char[] in Options).
: // If the option has both short and long names,
: // either can be used.
: if ("verbose" in options)
: // If option was given and it has a value,
: // retrieve it by indexing Options with short
: // or long name (or only one if only one)
: // and do getValue!(T)
: verbosity = options["verbose"].getValue!(int);
:
: if (verbosity > 0)
: writefln("I'll say a little.");
: if (verbosity > 1)
: writefln("I'll say a lot more.");
:
: // args was reset by parse to the remaining
: // non-option command-line arguments
: if (args.length == 1)
: // use the first non-option argument
: outfile = args[0];
: else if (args.length > 1)
: // OptionError.errorExit("message") can be used to
: // print help and exit process;
: // useful when checking non-option arguments
: op.errorExit("more than one output file specified");
:
: // mandatory options can be assumed to be
: // there after successful parse
: assert ("files" in options);
: files = options["files"].getValue!(char[][]);
: if (files.length == 0)
: op.errorExit("need to specifiy at least one input file");
:
: if (verbosity > 0)
: {
: if ("thing" in options)
: writefln("my thing is: ",
: options["thing"].getValue!(float));
:
: // no-value options are simply tested for being in Options
: if ("a" in options)
: writefln("I would process files using alternate method:");
: else
: writefln("I would process files using normal method:");
: foreach (char[] f; files)
: writefln("\t",f);
: writefln("and output to ",
: outfile.length ? outfile : "<stdout>");
: }
:
: return 0;
: }
Example command-line output of above program:
---------------------------------------------------------------
$ ./example -h
usage: optparse [options] --files=f1,fN [outfile]
options:
-h, --help Show this help message and exit.
--version Show program's version number and exit.
-vLEVEL, --verbose=LEVEL
Be more and more and more and more and more and more
and more verbose.
-fsFILE,FILE,..., --files=FILE,FILE,...
Files to process, and make this a really long help
string as well to test aligning.
--thing=FLOAT Do it with this.
-a Use alternate method.
---------------------------------------------------------------
$ ./example -v2 --files=somefile,anotherfile,nextfile --thing -4.23e-6 -a
outputfile
I'll say a little.
I'll say a lot more.
my thing is: -4.23e-06
I would process files using alternate method:
somefile
anotherfile
nextfile
and output to outputfile
---------------------------------------------------------------
$ ./example --asdf
optparse: error: no such option: --asdf
[help]
---------------------------------------------------------------
$ ./example
optparse: error: -fs / --files option is mandatory
[help]
May 31 2005
If it could be setup statically at compile-time and have the same conciseness,
flexibility, and ease of checking for options and retrieving their values, that
would be awesome, but I don't follow what you mean about box values and
TypeList. Could you elaborate?
The only way to parameterize something at compile-time is with templates, right?
But they can only take integral values, not char[] for option names or arbitrary
types for default values. Statically-initialized structs could be used but then
they still have to be given to an OptionParser and variables for them would also
need to be declared. I don't think it can be done and retain the same degree of
simpleness of use.
In article <d7iifp$2jhh$1 digitaldaemon.com>, Andrew Fedoniouk says...
Cool, Derick!
What about using box values there?
Having them and use TypeList instead of
optionParser = new OptionParser(__FILE__[0..$-2], "[option [value]]",
"0.0");
optionParser.addOption!()("v","verbose");
optionParser.addOption!(float)("f","foo",null,null,null,true);
optionParser.addOption!(int)("x","xeno","does this and that","THING",123);
will allow to build such declarations in compile time - statically.
Just hypothesis....
Andrew.
Jun 01 2005
<derick_eddington nospam.yashmoo.com> wrote in message news:d7jvl1$1420$1 digitaldaemon.com...If it could be setup statically at compile-time and have the same conciseness, flexibility, and ease of checking for options and retrieving their values, that would be awesome, but I don't follow what you mean about box values and TypeList. Could you elaborate? The only way to parameterize something at compile-time is with templates, right? But they can only take integral values, not char[] for option names or arbitrary types for default values. Statically-initialized structs could be used but then they still have to be given to an OptionParser and variables for them would also need to be declared. I don't think it can be done and retain the same degree of simpleness of use.Yep. You are right. I was thinking about simple implementation of something close to boost::spirit http://spirit.sourceforge.net/ but it seems like even simple implementation is an overkill for such task. Andrew.In article <d7iifp$2jhh$1 digitaldaemon.com>, Andrew Fedoniouk says...Cool, Derick! What about using box values there? Having them and use TypeList instead of optionParser = new OptionParser(__FILE__[0..$-2], "[option [value]]", "0.0"); optionParser.addOption!()("v","verbose"); optionParser.addOption!(float)("f","foo",null,null,null,true); optionParser.addOption!(int)("x","xeno","does this and that","THING",123); will allow to build such declarations in compile time - statically. Just hypothesis....Andrew.
Jun 01 2005









derick_eddington nospam.yashmoo.com 