#include #include #include #include #include #include #include "io.h" static struct settings_s { size_t fetchpos; size_t fetchto; char *filein; char *fileout; int mode; } settings = {0}; static struct stream file_in = {.fd = -1}; static struct stream file_out = {.fd = -1}; 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; } file_in.name = settings.filein; file_in.stride = 0; /* TODO */ if ((ret = openstream(&file_in))) { goto out; } file_out.name = settings.fileout ? settings.fileout : settings.filein; file_out.out = 1; file_out.n = file_in.n; file_out.stride = 0; /* TODO */ if ((ret = openstream(&file_out))) { goto out; } out: close(file_in.fd); close(file_out.fd); 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 &= ~1; } 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]; } if (!s.fileout) { s.fileout = s.filein; } s.fetchto = s.fetchpos + s.fetchto; *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= fetch element from position \n" " --num= of elements to fetch\n" " --out= write output to file\n" "\n" "In case more than one same option is provided, the last one take precedence\n" "\n", name); return; }