diff options
-rw-r--r-- | .gitignore | 3 | ||||
-rw-r--r-- | meson.build | 9 | ||||
-rw-r--r-- | src/main.c | 101 | ||||
-rw-r--r-- | src/meson.build | 5 |
4 files changed, 118 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3979737 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +a.out +*.o +build/ diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..4419e05 --- /dev/null +++ b/meson.build @@ -0,0 +1,9 @@ +project('usurpation', 'c', + license : 'LGPL2.1', + default_options : ['c_std=gnu11', 'buildtype=release', 'warning_level=2']) + +progname = 'alg' + +subdir('src') + +executable(progname, sources, install : true) 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; +} diff --git a/src/meson.build b/src/meson.build new file mode 100644 index 0000000..d639f02 --- /dev/null +++ b/src/meson.build @@ -0,0 +1,5 @@ +source_files = [ + 'main.c', +] + +sources = files(source_files) |