*/
/* rename user's main routine so GC is auto-initialized and options parsed */
-extern int usermain(int argc, char** argv);
-#define main usermain
+extern int user_main(int argc, char** argv);
+#define main user_main
+
+extern void opts_setoption(int sname, char* lname, char* arg);
+
/*
Garbage Collector Interface
#include <liba.h>
+extern void opts_setoption(int sname, char* lname, char* arg)
+{
+ if (sname == 'h')
+ {
+ opts_printhelp();
+ exit(1);
+ }
+ else
+ {
+ printf(" --%s=%s\n", lname, arg);
+ }
+}
+
+
static OptionDescriptor_T* lookup_opt(int optc, OptionDescriptor_T* optv, char* flag)
{
OptionDescriptor_T* opt = NULL;
}
}
printf("handled option: '--%s=%s'\n", flag, arg);
+ opts_setoption(od->sname, od->lname, arg);
}
/* now repair the split if we made one */
static void parse_shortopt(int optc, OptionDescriptor_T* optv, int* currp, char** argv)
{
- (void)optc, (void)optv;
- printf("short: %s\n", argv[*currp]);
+ char* argstr = argv[*currp]+1;
+ char flag[] = "\0\0";
+ for (; *argstr; argstr++)
+ {
+ /* get the flag and the possible argument */
+ flag[0] = *argstr;
+ OptionDescriptor_T* od = lookup_opt(optc, optv, flag);
+ if (!od)
+ {
+ fatal("unknown option: '%s'", flag);
+ }
+ else if (od->hasarg)
+ {
+ char* arg = argstr+1;
+ if (*arg != '\0')
+ {
+ arg += (*arg == '=' ? 1 : 0);
+ opts_setoption(od->sname, od->lname, arg);
+ break;
+ }
+ else if (!*arg)
+ {
+ arg = argv[*currp + 1];
+ if (!arg)
+ {
+ fatal("expected argument for option: '%s'", flag);
+ }
+ opts_setoption(od->sname, od->lname, arg);
+ *currp += 1;
+ break;
+ }
+ else
+ {
+ fatal("expected argument for option: '%s'", flag);
+ }
+ }
+ else
+ {
+ opts_setoption(od->sname, od->lname, NULL);
+ }
+ }
*currp += 1;
}