Blame arg.inc.c

ea5919
ea5919
struct ArgDesc;
ea5919
typedef int (*ArgFunc)(const struct ArgDesc *desc, const char *arg);
ea5919
ea5919
typedef struct ArgDesc {
ea5919
  char c;
ea5919
  void *data;
ea5919
  ArgFunc func;
ea5919
  const char *desc;
ea5919
} ArgDesc;
ea5919
ea5919
ea5919
int pargInt(const ArgDesc *desc, const char *arg)
ea5919
  { *(int*)desc->data = atof(arg); return TRUE; }
ea5919
int pargDouble(const ArgDesc *desc, const char *arg)
ea5919
  { *(double*)desc->data = atoi(arg); return TRUE; }
ea5919
int pargString(const ArgDesc *desc, const char *arg)
ea5919
  { *(const char**)desc->data = arg; return TRUE; }
ea5919
ea5919
ea5919
int parseArgs(const ArgDesc *descs, int argc, char **argv) {
ea5919
  for(; argc; --argc, ++argv) {
ea5919
    int found = FALSE;
ea5919
    for(const ArgDesc *desc = descs; desc->c && desc->data; ++desc) {
ea5919
      if ((*argv)[0] == '-' && (*argv)[1] == desc->c && !(*argv)[2]) {
ea5919
        if (desc->func) {
ea5919
          --argc; ++argv;
ea5919
          if (!argc || !desc->func(desc, *argv)) {
ea5919
            fprintf(stderr, "Wrong argument for -%c: %s\n", desc->c, *argv);
ea5919
            fflush(stderr);
ea5919
            return FALSE;
ea5919
          }
ea5919
        } else {
ea5919
          *((int*)desc->data) = TRUE;
ea5919
        }
ea5919
        found = TRUE;
ea5919
        break;
ea5919
      }
ea5919
    }
ea5919
    if (!found) {
ea5919
      fprintf(stderr, "Unknown arg: %s\n", *argv);
ea5919
      fflush(stderr);
ea5919
      return FALSE;
ea5919
    }
ea5919
  }
ea5919
  return TRUE;
ea5919
}
ea5919
ea5919
ea5919
void printUsage(const ArgDesc *descs) {
ea5919
  printf("Available command-line arguments:\n");
ea5919
  for(const ArgDesc *desc = descs; desc->c && desc->data; ++desc)
ea5919
    printf("   -%c %s - %s\n", desc->c, desc->func ? "<arg>" : "     ", desc->desc);</arg>
ea5919
  fflush(stdout);
ea5919
}
ea5919