www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Allowing string value with getopt without requiring it

reply "Ithy" <n n.n> writes:
Hello. I'm just getting into D (literally writing my first 
program), and I can't figure out how to do this with getopt:

I want to have the option --log, which will enable logging (set a 
bool variable to true). However, I want the program to also 
accept --log=filename to allow the user to define custom log 
file. If --log is used without filename, a default file will be 
used.

I tried this:

getopt(args,
     "log", &log,
     "log", &logFile);

Passing just --log to the program works fine, the boolean is set 
to true. However, using --log=test.log throws an exception, and 
seemingly getopt expects either true or false.

How would I go about implementing this without creating another 
option like --log-file for custom file name?
Dec 12 2013
parent reply "John Colvin" <john.loughran.colvin gmail.com> writes:
On Friday, 13 December 2013 at 01:51:25 UTC, Ithy wrote:
 Hello. I'm just getting into D (literally writing my first 
 program), and I can't figure out how to do this with getopt:

 I want to have the option --log, which will enable logging (set 
 a bool variable to true). However, I want the program to also 
 accept --log=filename to allow the user to define custom log 
 file. If --log is used without filename, a default file will be 
 used.

 I tried this:

 getopt(args,
     "log", &log,
     "log", &logFile);

 Passing just --log to the program works fine, the boolean is 
 set to true. However, using --log=test.log throws an exception, 
 and seemingly getopt expects either true or false.

 How would I go about implementing this without creating another 
 option like --log-file for custom file name?
That doesn't seem possible with getopt. I would use std.getopt.config.passThrough and then deal with the "log" option manually afterwards.
Dec 13 2013
parent "H. S. Teoh" <hsteoh quickfur.ath.cx> writes:
On Fri, Dec 13, 2013 at 10:46:57AM +0100, John Colvin wrote:
 On Friday, 13 December 2013 at 01:51:25 UTC, Ithy wrote:
Hello. I'm just getting into D (literally writing my first
program), and I can't figure out how to do this with getopt:

I want to have the option --log, which will enable logging (set a
bool variable to true). However, I want the program to also accept
--log=filename to allow the user to define custom log file. If
--log is used without filename, a default file will be used.

I tried this:

getopt(args,
    "log", &log,
    "log", &logFile);

Passing just --log to the program works fine, the boolean is set
to true. However, using --log=test.log throws an exception, and
seemingly getopt expects either true or false.

How would I go about implementing this without creating another
option like --log-file for custom file name?
That doesn't seem possible with getopt. I would use std.getopt.config.passThrough and then deal with the "log" option manually afterwards.
I would file an enhancement request in the bugtracker. This is a pretty common idiom in command-line parsing. http://d.puremagic.com/issues/ T -- We are in class, we are supposed to be learning, we have a teacher... Is it too much that I expect him to teach me??? -- RL
Dec 13 2013