[2879] in BarnOwl Developers
[PATCH] RFC: Use Glib's GOptionContext to parse command-line options
daemon@ATHENA.MIT.EDU (David Benjamin)
Fri Feb 4 18:23:52 2011
From: David Benjamin <davidben@MIT.EDU>
To: barnowl-dev@mit.edu
Date: Fri, 4 Feb 2011 18:22:49 -0500
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