summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Gediminas Jakutis <gediminas@varciai.lt> 2020-02-13 21:44:27 +0200
committerGravatar Gediminas Jakutis <gediminas@varciai.lt> 2020-02-13 21:44:27 +0200
commitf8a4fbeeb230157f73789dc860ffbe84f76d0002 (patch)
tree7b750ebb4264c0afd0724089e3913dfe85c98a38
downloadalgos-ld1-f8a4fbeeb230157f73789dc860ffbe84f76d0002.tar.gz
algos-ld1-f8a4fbeeb230157f73789dc860ffbe84f76d0002.tar.bz2
algos-ld1-f8a4fbeeb230157f73789dc860ffbe84f76d0002.zip
initial commit.
Signed-off-by: Gediminas Jakutis <gediminas@varciai.lt>
-rw-r--r--.gitignore3
-rw-r--r--meson.build9
-rw-r--r--src/main.c101
-rw-r--r--src/meson.build5
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)