[2882] in BarnOwl Developers

home help back first fref pref prev next nref lref last post

Re: [PATCH] RFC: Use Glib's GOptionContext to parse command-line options

daemon@ATHENA.MIT.EDU (Karl Ramm)
Sat Feb 5 14:05:02 2011

From: Karl Ramm <kcr@1ts.org>
To: Nelson Elhage <nelhage@nelhage.com>
Cc: David Benjamin <davidben@mit.edu>, barnowl-dev@mit.edu
Date: Sat, 05 Feb 2011 14:04:58 -0500
In-Reply-To: <20110205000722.GB27552@mit.edu> (Nelson Elhage's message of
	"Fri, 4 Feb 2011 19:07:22 -0500")

It looks to be less code, though.  And barnowl is already heavily invested
in glib.

kcr

Nelson Elhage <nelhage@nelhage.com> writes:

> I don't have strong opinions here. --help autogeneration is nice, and this is a
> bit more succinct, but it involves a new API that people are less likely to know
> than geptopt. And personally I like my --help output to look like --help output,
> instead of a manpage :)
>
> - Nelson
>
> On Fri, Feb 04, 2011 at 06:22:49PM -0500, David Benjamin wrote:
>> I'm not really sure if we want to use this instead of getopt_long. What
>> do folks think? GOptionContext makes --help output and whatnot for us,
>> which is kinda nice. It also makes us more consistent with, uh, all the
>> other GOptionContext-using command-line programs. All two of them.
>> 
>> Also kill --remove-debug because it doesn't do anything anymore.
>> 
>> For reference, here's the old --help:
>> 
>>     Barnowl version 1.8dev-34-g4d24650
>>     Usage: barnowl [-n] [-d] [-D] [-v] [-h] [-c <configfile>] [-s <confdir>] [-t <ttyname>]
>>       -n,--no-subs        don't load zephyr subscriptions
>>       -d,--debug          enable debugging
>>       -D,--remove-debug   enable debugging and delete previous debug file
>>       -v,--version        print the Barnowl version number and exit
>>       -h,--help           print this help message
>>       -c,--config-file    specify an alternate config file
>>       -s,--config-dir     specify an alternate config dir (default ~/.owl)
>>       -t,--tty            set the tty name
>> 
>> And here's the GOptionContext one:
>> 
>>     Usage:
>>       barnowl [OPTION...]
>> 
>>     BarnOwl version 1.8dev-37-gfea0c4e
>> 
>>     Help Options:
>>       -h, --help                 Show help options
>> 
>>     Application Options:
>>       -v, --version              Print the BarnOwl version number and exit
>>       -n, --no-subs              Don't load zephyr subscriptions
>>       -d, --debug                Enable debugging
>>       -c, --config-file=FILE     Specify an alternate config file
>>       -s, --config-dir=DIR       Specify an alternative config dir (default ~/.owl)
>>       -t, --tty=TTY              Set the tty name
>> ---
>>  owl.c |   98 ++++++++++++++++++++++------------------------------------------
>>  1 files changed, 34 insertions(+), 64 deletions(-)
>> 
>> diff --git a/owl.c b/owl.c
>> index dd06f67..b758d7a 100644
>> --- a/owl.c
>> +++ b/owl.c
>> @@ -8,7 +8,6 @@
>>  
>>  #include <stdio.h>
>>  #include <unistd.h>
>> -#include <getopt.h>
>>  #include <stdlib.h>
>>  #include <string.h>
>>  #include <signal.h>
>> @@ -37,72 +36,45 @@ int stderr_replace(void);
>>  owl_global g;
>>  
>>  typedef struct _owl_options {
>> -  bool load_initial_subs;
>> +  gboolean no_subs;
>>    char *configfile;
>>    char *tty;
>>    char *confdir;
>> -  bool debug;
>> -  bool rm_debug;
>> +  gboolean debug;
>>  } owl_options;
>>  
>> -void usage(void)
>> -{
>> -  fprintf(stderr, "Barnowl version %s\n", OWL_VERSION_STRING);
>> -  fprintf(stderr, "Usage: barnowl [-n] [-d] [-D] [-v] [-h] [-c <configfile>] [-s <confdir>] [-t <ttyname>]\n");
>> -  fprintf(stderr, "  -n,--no-subs        don't load zephyr subscriptions\n");
>> -  fprintf(stderr, "  -d,--debug          enable debugging\n");
>> -  fprintf(stderr, "  -D,--remove-debug   enable debugging and delete previous debug file\n");
>> -  fprintf(stderr, "  -v,--version        print the Barnowl version number and exit\n");
>> -  fprintf(stderr, "  -h,--help           print this help message\n");
>> -  fprintf(stderr, "  -c,--config-file    specify an alternate config file\n");
>> -  fprintf(stderr, "  -s,--config-dir     specify an alternate config dir (default ~/.owl)\n");
>> -  fprintf(stderr, "  -t,--tty            set the tty name\n");
>> -}
>> -
>> -/* TODO: free owl_options after init is done? */
>> -void owl_parse_options(int argc, char *argv[], owl_options *opts) {
>> -  static const struct option long_options[] = {
>> -    { "no-subs",         0, 0, 'n' },
>> -    { "config-file",     1, 0, 'c' },
>> -    { "config-dir",      1, 0, 's' },
>> -    { "tty",             1, 0, 't' },
>> -    { "debug",           0, 0, 'd' },
>> -    { "remove-debug",    0, 0, 'D' },
>> -    { "version",         0, 0, 'v' },
>> -    { "help",            0, 0, 'h' },
>> -    { NULL, 0, NULL, 0}
>> +static void owl_parse_options(int argc, char *argv[], owl_options *opts) {
>> +  gboolean version = false;
>> +  GOptionEntry entries[] = {
>> +    { "version",     'v', 0, G_OPTION_ARG_NONE,     &version,
>> +      "Print the BarnOwl version number and exit", NULL },
>> +    { "no-subs",     'n', 0, G_OPTION_ARG_NONE,     &opts->no_subs,
>> +      "Don't load zephyr subscriptions", NULL },
>> +    { "debug",       'd', 0, G_OPTION_ARG_NONE,     &opts->debug,
>> +      "Enable debugging", NULL },
>> +    { "config-file", 'c', 0, G_OPTION_ARG_FILENAME, &opts->configfile,
>> +      "Specify an alternate config file", "FILE" },
>> +    { "config-dir",  's', 0, G_OPTION_ARG_FILENAME, &opts->confdir,
>> +      "Specify an alternative config dir (default ~/.owl)", "DIR" },
>> +    { "tty",         't', 0, G_OPTION_ARG_FILENAME, &opts->tty,
>> +      "Set the tty name", "TTY" },
>> +    { NULL }
>>    };
>> -  char c;
>> -
>> -  while((c = getopt_long(argc, argv, "nc:t:s:dDvh",
>> -                         long_options, NULL)) != -1) {
>> -    switch(c) {
>> -    case 'n':
>> -      opts->load_initial_subs = 0;
>> -      break;
>> -    case 'c':
>> -      opts->configfile = owl_strdup(optarg);
>> -      break;
>> -    case 's':
>> -      opts->confdir = owl_strdup(optarg);
>> -      break;
>> -    case 't':
>> -      opts->tty = owl_strdup(optarg);
>> -      break;
>> -    case 'D':
>> -      opts->rm_debug = 1;
>> -      /* fallthrough */
>> -    case 'd':
>> -      opts->debug = 1;
>> -      break;
>> -    case 'v':
>> -      printf("This is barnowl version %s\n", OWL_VERSION_STRING);
>> -      exit(0);
>> -    case 'h':
>> -    default:
>> -      usage();
>> -      exit(1);
>> -    }
>> +  GError *error = NULL;
>> +  GOptionContext *context;
>> +
>> +  context = g_option_context_new("");
>> +  g_option_context_add_main_entries(context, entries, NULL);
>> +  g_option_context_set_summary(context, "BarnOwl version " OWL_VERSION_STRING);
>> +
>> +  if (!g_option_context_parse(context, &argc, &argv, &error)) {
>> +    fprintf(stderr, "Option parsing failed: %s\n", error->message);
>> +    exit(1);
>> +  }
>> +
>> +  if (version) {
>> +    printf("BarnOwl %s\n", OWL_VERSION_STRING);
>> +    exit(0);
>>    }
>>  }
>>  
>> @@ -482,16 +454,14 @@ int main(int argc, char **argv, char **env)
>>    setlocale(LC_ALL, "");
>>  
>>    memset(&opts, 0, sizeof opts);
>> -  opts.load_initial_subs = 1;
>>    owl_parse_options(argc, argv, &opts);
>> -  g.load_initial_subs = opts.load_initial_subs;
>> +  g.load_initial_subs = !opts.no_subs;
>>  
>>    owl_register_signal_handlers();
>>    owl_start_curses();
>>  
>>    /* owl global init */
>>    owl_global_init(&g);
>> -  if (opts.rm_debug) unlink(OWL_DEBUG_FILE);
>>    if (opts.debug) owl_global_set_debug_on(&g);
>>    if (opts.confdir) owl_global_set_confdir(&g, opts.confdir);
>>    owl_function_debugmsg("startup: first available debugging message");
>> -- 
>> 1.7.3.3.399.g06ddf
>> 

home help back first fref pref prev next nref lref last post