liboptcfg

annotate example/example.c @ 2:9c73004c7af3

works
author John Tsiombikas <nuclear@member.fsf.org>
date Fri, 20 Nov 2015 17:05:39 +0200
parents 8fd2858c6a29
children f971dfa66076
rev   line source
nuclear@1 1 #include <stdio.h>
nuclear@1 2 #include <stdlib.h>
nuclear@1 3 #include <optcfg.h>
nuclear@1 4
nuclear@1 5 enum {
nuclear@1 6 OPT_FOO,
nuclear@1 7 OPT_BAR,
nuclear@1 8 OPT_XYZZY,
nuclear@1 9 OPT_HELP
nuclear@1 10 };
nuclear@1 11
nuclear@1 12 struct optcfg_option options[] = {
nuclear@1 13 /* short, long, id, description */
nuclear@1 14 {'f', "foo", OPT_FOO, "foo does nothing really"},
nuclear@1 15 {'b', "bar", OPT_BAR, "bar also does nothing"},
nuclear@1 16 {0, "xyzzy", OPT_XYZZY, "xyzzy doesn't have a short option"},
nuclear@1 17 {'h', "help", OPT_HELP, "print usage and exit"},
nuclear@1 18 {0, 0, -1, 0} /* terminate with id=-1 */
nuclear@1 19 };
nuclear@1 20
nuclear@1 21 int foo, bar;
nuclear@1 22 int xyzzy;
nuclear@1 23
nuclear@1 24 int opt_handler(struct optcfg *oc, int opt, void *cls);
nuclear@1 25
nuclear@1 26 int main(int argc, char **argv)
nuclear@1 27 {
nuclear@1 28 /* pass the options array to initialize the optcfg object */
nuclear@1 29 struct optcfg *oc = optcfg_init(options);
nuclear@1 30 /* set the option callback function */
nuclear@1 31 optcfg_set_opt_callback(oc, opt_handler, 0);
nuclear@1 32 /* first let's load options from a config file */
nuclear@1 33 printf("parsing config file: example.conf\n");
nuclear@1 34 if(optcfg_parse_config_file(oc, "example.conf") == -1) {
nuclear@1 35 return 1;
nuclear@1 36 }
nuclear@1 37 /* then let's override those with commandline options */
nuclear@1 38 printf("parsing commandline arguments\n");
nuclear@1 39 if(optcfg_parse_args(oc, argc, argv) == -1) {
nuclear@1 40 return 1;
nuclear@1 41 }
nuclear@1 42
nuclear@1 43 printf("\nfoo: %s\n", foo ? "true" : "false");
nuclear@1 44 printf("bar: %s\n", bar ? "true" : "false");
nuclear@1 45 printf("xyzzy: %d\n", xyzzy);
nuclear@1 46
nuclear@1 47 optcfg_destroy(oc);
nuclear@1 48 return 0;
nuclear@1 49 }
nuclear@1 50
nuclear@1 51 int opt_handler(struct optcfg *oc, int opt, void *cls)
nuclear@1 52 {
nuclear@1 53 char *val;
nuclear@1 54
nuclear@1 55 switch(opt) {
nuclear@1 56 case OPT_FOO:
nuclear@2 57 optcfg_enabled_value(oc, &foo);
nuclear@1 58 break;
nuclear@1 59 case OPT_BAR:
nuclear@2 60 optcfg_enabled_value(oc, &bar);
nuclear@1 61 break;
nuclear@1 62 case OPT_XYZZY:
nuclear@1 63 /* this option needs an integer value */
nuclear@1 64 if(!(val = optcfg_next_value(oc)) || optcfg_int_value(val, &xyzzy) == -1) {
nuclear@1 65 fprintf(stderr, "xyzzy must be followed by a number\n");
nuclear@1 66 return -1;
nuclear@1 67 }
nuclear@1 68 break;
nuclear@1 69 case OPT_HELP:
nuclear@1 70 /* print usage and exit */
nuclear@1 71 printf("Usage: example [options]\n");
nuclear@1 72 printf("Options:\n");
nuclear@1 73 optcfg_print_options(oc);
nuclear@1 74 exit(0);
nuclear@1 75 }
nuclear@1 76 return 0;
nuclear@1 77 }