#include "flags.h" #include "lib.h" #include "stream.h" #include #include 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; flags->__set_fin = true; break; case 'S': flags->fout = SNBT; flags->__set_fout = true; break; case 'n': flags->fin = NBT; flags->__set_fin = true; break; case 'N': flags->fout = NBT; flags->__set_fout = true; 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"); } }