/* args.c : parses argc,argv arguments * PUBLIC DOMAIN - March 31, 2009 - Jon Mayo */ #include #include #include #include "args.h" /* default function that displays the usage */ static void fallback_usage(const char *program_name, const struct arginfo *ai, size_t nr_args) { /* TODO: process args */ size_t i; fprintf(stderr, "usage: %s\n", program_name); for(i=0;i=argc) { fprintf(stderr, "Error: option '%s' takes an argument.\n", ai[j].name); goto usage; } opt=ai[j].has_parameter?argv[++i]:NULL; if(ai[j].func_cb) { if(!ai[j].func_cb(ai[j].name, opt, ai[j].p, q)) { fprintf(stderr, "Error: failed with option '%s'.\n", ai[j].name); goto usage; } } goto success; /* we processed a parameter successfully */ } } /* display an error message if we got here when the option wasn't -help */ if(strcasecmp(argv[i], "-help")) { fprintf(stderr, "Error: unknown command-line option '%s'.\n", argv[i]); } usage: usage(program_name, ai, nr_args); exit(EXIT_FAILURE); success: ; } return 1; /* success */ } /* use the void *p to set an int through (int*) */ int args_cbset_intptr(const char *name, const char *param, void *p, void *q) { char *endptr; int *intp=p; if(intp) { *intp=strtol(param, &endptr, 0); if(endptr!=param && !*endptr) { return 1; /* success */ } } return 0; /* failure */ } /* use the void *p to set a long through (long*) */ int args_cbset_longptr(const char *name, const char *param, void *p, void *q) { char *endptr; long *longp=p; if(longp) { *longp=strtol(param, &endptr, 0); if(endptr!=param && !*endptr) { return 1; /* success */ } } return 0; /* failure */ } /* use the void *p to set a string through (const char**) */ int args_cbset_charptrptr(const char *name, const char *param, void *p, void *q) { const char **strptr=p; if(strptr) { *strptr=param; return 1; /* success */ } return 0; /* empty */ }