diff options
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..ee80826 --- /dev/null +++ b/src/main.c @@ -0,0 +1,101 @@ +#include <errno.h> +#include <stddef.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +static struct settings_s { + size_t fetchpos; + size_t fetchto; + char *filein; + char *fileout; + int mode; +} settings = {0}; + +static int parseargs(int argc, char **argv, struct settings_s * settings); +void printhelp(const char * const name); + +int main(int argc, char **argv) +{ + int ret = 0; + + if ((ret = parseargs(argc, argv, &settings))) { + goto out; + } + +out: + return ret; +} + +static int parseargs(int argc, char **argv, struct settings_s * settings) +{ + struct settings_s s = {0}; + ssize_t i; + int ret = 0; + + if (argc < 2) { + goto err; + } + + for (i = 1; i < argc - 1; ++i) { + if (!(strcmp(argv[i], "--sort"))) { + s.mode = 0; + } else if (!(strcmp(argv[i], "--fetch"))) { + s.mode = 1; + } else if (!(strncmp(argv[i], "--position=", 11))) { + if (strlen(argv[i]) > 11) { + s.fetchpos = strtoul(argv[i] + 11, NULL, 10); + } else { + goto err; + } + } else if (!(strncmp(argv[i], "--num=", 6))) { + if (strlen(argv[i]) > 6) { + s.fetchto = strtoul(argv[i] + 11, NULL, 10); + } else { + goto err; + } + } else if (!(strncmp(argv[i], "--out=", 6))) { + if (strlen(argv[i]) > 6) { + s.fileout = argv[i] + 6; + } else { + goto err; + } + } else { + goto err; + } + } + + if (!strncmp(argv[i], "--", 2)) { + goto err; + } else { + s.filein = argv[i]; + } + + *settings = s; + if (0) { +err: + ret = EINVAL; + printhelp(*argv); + } + + return ret; +} + +void printhelp(const char * const name) +{ + printf( "This is a mergesort program and such\n" + "\n" + "usage:\t%s [options]\n FILE" + "\n" + "Options:\n" + " --sort sort mode (default)\n" + " --fetch fetch element\n" + " --position=<num> fetch element from position <num>\n" + " --num=<num> <num> of elements to fetch\n" + " --out=<name> write output to <name> file\n" + "\n" + "In case more than one same option is provided, the last one take precedence\n" + "\n", + name); + return; +} |