summaryrefslogtreecommitdiff
path: root/src/flags.c
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2023-12-15 23:02:45 -0500
committerFreya Murphy <freya@freyacat.org>2023-12-15 23:02:45 -0500
commit42d1c82a0bfa615b832f5ecc2652edc290bf6e9c (patch)
tree09223f3ca9b54fc3cd5a7cb45180542cc3a8a1ba /src/flags.c
parentfix printing arrays (diff)
downloadnbtvis-42d1c82a0bfa615b832f5ecc2652edc290bf6e9c.tar.gz
nbtvis-42d1c82a0bfa615b832f5ecc2652edc290bf6e9c.tar.bz2
nbtvis-42d1c82a0bfa615b832f5ecc2652edc290bf6e9c.zip
add json support and other things
Diffstat (limited to 'src/flags.c')
-rw-r--r--src/flags.c155
1 files changed, 155 insertions, 0 deletions
diff --git a/src/flags.c b/src/flags.c
new file mode 100644
index 0000000..58311ac
--- /dev/null
+++ b/src/flags.c
@@ -0,0 +1,155 @@
+#include "flags.h"
+#include "lib.h"
+#include "stream.h"
+
+#include <strings.h>
+
+static format_t get_file_extension(char *path) {
+ char *filename = strrchr(path, '/');
+ if (filename == NULL)
+ return NBT;
+ char *extension = strrchr(filename, '.');
+ if (extension == NULL)
+ return NBT;
+ else if (strcasecmp(extension, "json") == 0)
+ return JSON;
+ else if (strcasecmp(extension, "snbt") == 0)
+ return SNBT;
+ return NBT;
+}
+
+void parse_long_arg(flags_t *flags, char *arg) {
+
+ char *key = arg + 2;
+ char *value = strchr(key, '=');
+ if (value != NULL) {
+ *value = '\0';
+ value++;
+ }
+
+ if (strcmp(key, "help") == 0) {
+ flags->help = true;
+ return;
+ }
+
+ else if (strcmp(key, "version") == 0) {
+ flags->version = true;
+ return;
+ }
+
+ else if (strcmp(key, "in") == 0) {
+ if (value == NULL)
+ error_and_die("--in requires a value\n");
+ flags->in = stream_open(value, "r");
+ if (flags->__set_fin == false)
+ flags->fin = get_file_extension(value);
+ }
+
+ else if (strcmp(key, "out") == 0) {
+ if (value == NULL)
+ error_and_die("--out requires a value\n");
+ flags->out = stream_open(value, "w");
+ if (flags->__set_fout == false)
+ flags->fout = get_file_extension(value);
+ }
+
+ else {
+ error_and_die("invalid argument '--%s'\n", key);
+ }
+
+}
+
+void parse_short_args(flags_t *flags, char *arg, int len) {
+ for (int i = 1; i < len; i++) {
+ char c = arg[i];
+ switch(c) {
+ case 'j':
+ flags->fin = JSON;
+ flags->__set_fin = true;
+ break;
+ case 'J':
+ flags->fout = JSON;
+ flags->__set_fout = true;
+ break;
+ case 's':
+ flags->fin = SNBT;
+ break;
+ case 'S':
+ flags->fout = SNBT;
+ break;
+ case 'n':
+ flags->fin = NBT;
+ break;
+ case 'N':
+ flags->fout = NBT;
+ break;
+ case 'h':
+ flags->help = true;
+ break;
+ case 'v':
+ flags->version = true;
+ break;
+ default:
+ error_and_die("invalid argument: '-%c'\n", c);
+ }
+ }
+}
+
+void parse_arg(flags_t *flags, char *arg, int len) {
+ if (len < 2) {
+ error_and_die("invalid argument: '%s'\n", arg);
+ } else if (arg[1] == '-') {
+ parse_long_arg(flags, arg);
+ } else {
+ parse_short_args(flags, arg, len);
+ }
+}
+
+void parse_flags(flags_t *flags, int argc, char **argv) {
+
+ flags->__set_fin = false;
+ flags->__set_fout = false;
+ flags->help = false;
+ flags->version = false;
+ flags->in.__file = stdin;
+ flags->in.__alloc = false;
+ flags->out.__file = stdout;
+ flags->out.__alloc = false;
+ flags->fin = NBT;
+ flags->fout = NBT;
+
+ int i;
+
+ for (i = 1; i < argc; i++) {
+ char *arg = argv[i];
+ int len = strlen(arg);
+
+ if (len == 2 && arg[0] == '-' && arg[1] == '-') {
+ break;
+ } else if (arg[0] != '-') {
+ i--;
+ break;
+ } else {
+ parse_arg(flags, arg, len);
+ }
+ }
+
+ if (i + 1 < argc) {
+ char *arg = argv[i + 1];
+ flags->in = stream_open(arg, "r");
+ if (flags->__set_fin == false)
+ flags->fin = get_file_extension(arg);
+ }
+
+ if (i + 2 < argc) {
+ char *arg = argv[i + 2];
+ flags->out = stream_open(arg, "w");
+ if (flags->__set_fout == false)
+ flags->fout = get_file_extension(arg);
+ }
+
+ if (i + 3 < argc) {
+ error_and_die("too many arguments passed\n");
+ }
+
+}