diff options
author | Freya Murphy <freya@freyacat.org> | 2023-12-15 23:02:45 -0500 |
---|---|---|
committer | Freya Murphy <freya@freyacat.org> | 2023-12-15 23:02:45 -0500 |
commit | 42d1c82a0bfa615b832f5ecc2652edc290bf6e9c (patch) | |
tree | 09223f3ca9b54fc3cd5a7cb45180542cc3a8a1ba /src/flags.c | |
parent | fix printing arrays (diff) | |
download | nbtvis-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.c | 155 |
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"); + } + +} |