#include <errno.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <afblib/shared_rts.h>

bool convert_val(const char* str, unsigned long long* resp) {
   char* endptr;
   errno = 0;
   unsigned long long val = strtoull(str, &endptr, 0);
   if (errno) return false;
   if (*endptr) return false;
   *resp = val;
   return true;
}

char* cmdname;
void usage() {
   fprintf(stderr,
      "Usage: %s "
      "[-bufsize bufsize] "
      "[-extra extra_bytes] "
      "[-np nofprocesses] "
      "cmd args...\n",
      cmdname);
   exit(1);
}

int main(int argc, char** argv) {
   cmdname = *argv++; --argc;
   unsigned int nofprocesses = 2; size_t bufsize = 1024;
   size_t extra_space_size = 0;
   while (argc > 1 && **argv == '-') {
      if (strcmp(*argv, "-np") == 0) {
	 ++argv; --argc;
	 unsigned long long val;
	 if (!convert_val(*argv, &val)) usage();
	 nofprocesses = val;
      } else if (strcmp(*argv, "-bufsize") == 0) {
	 ++argv; --argc;
	 unsigned long long val;
	 if (!convert_val(*argv, &val)) usage();
	 bufsize = val;
      } else if (strcmp(*argv, "-extra") == 0) {
	 ++argv; --argc;
	 unsigned long long val;
	 if (!convert_val(*argv, &val)) usage();
	 extra_space_size = val;
      } else {
	 usage();
      }
      ++argv; --argc;
   }
   if (argc == 0) usage();
   if (shared_rts_run(nofprocesses, bufsize, extra_space_size, *argv, argv)) {
      exit(0);
   } else {
      fprintf(stderr, "%s: execution failed\n", cmdname);
      exit(1);
   }
}
