diff options
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 60 |
1 files changed, 41 insertions, 19 deletions
@@ -5,16 +5,24 @@ #include <string.h> #include "io.h" -static const unsigned int OPERATING_MODE = (1 << 0); -static const unsigned int DATA_FORMAT = (1 << 1); -static const unsigned int DATA_ACCESS = (1 << 2); +enum opmode { + mode_normal, + mode_fetch, + mode_generate +}; + +static const unsigned int FLAG_DATA_FORMAT = (1 << 0); +static const unsigned int FLAG_DATA_ACCESS = (1 << 1); + +static char randfile[] = "/dev/urandom"; static struct settings_s { - size_t fetchpos; - size_t fetchto; + size_t ss; + size_t to; char *filein; char *fileout; - unsigned int mode; + unsigned int flags; + enum opmode opmode; } settings = {0}; static struct stream file_in = {.last_idx = -1, .fd = -1}; @@ -31,14 +39,20 @@ int main(int argc, char **argv) goto out; } - file_in.name = settings.filein; - file_in.stride = settings.mode & DATA_FORMAT ? sizeof(struct entry_l) : sizeof(struct entry_a); + if (settings.opmode == mode_generate) { + file_in.name = randfile; + file_in.out = -1; + } else { + file_in.name = settings.filein; + } + + file_out.name = settings.fileout ? settings.fileout : settings.filein; + file_in.stride = settings.opmode & FLAG_DATA_FORMAT ? sizeof(struct entry_l) : sizeof(struct entry_a); if ((ret = stream_open(&file_in))) { goto out; } - file_out.name = settings.fileout ? settings.fileout : settings.filein; file_out.n = file_in.n; file_out.stride = file_in.stride; @@ -64,26 +78,28 @@ static int parseargs(int argc, char **argv, struct settings_s * settings) for (i = 1; i < argc - 1; ++i) { if (!(strcmp(argv[i], "--sort"))) { - s.mode &= ~OPERATING_MODE; + s.opmode = mode_normal; } else if (!(strcmp(argv[i], "--fetch"))) { - s.mode |= OPERATING_MODE; + s.opmode = mode_fetch; + } else if (!(strcmp(argv[i], "--generate"))) { + s.opmode = mode_generate; } else if (!(strcmp(argv[i], "--array"))) { - s.mode &= ~DATA_FORMAT; + s.opmode &= ~FLAG_DATA_FORMAT; } else if (!(strcmp(argv[i], "--list"))) { - s.mode |= DATA_FORMAT; + s.opmode |= FLAG_DATA_FORMAT; } else if (!(strcmp(argv[i], "--cache"))) { - s.mode &= ~DATA_ACCESS; + s.opmode &= ~FLAG_DATA_ACCESS; } else if (!(strcmp(argv[i], "--no-cache"))) { - s.mode |= DATA_ACCESS; + s.opmode |= FLAG_DATA_ACCESS; } else if (!(strncmp(argv[i], "--position=", 11))) { if (strlen(argv[i]) > 11) { - s.fetchpos = strtoul(argv[i] + 11, NULL, 10); + s.ss = 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); + s.to = strtoul(argv[i] + 11, NULL, 10); } else { goto err; } @@ -108,7 +124,12 @@ static int parseargs(int argc, char **argv, struct settings_s * settings) s.fileout = s.filein; } - s.fetchto = s.fetchpos + s.fetchto; + s.to = s.ss + s.to; + + /* we always generate in-memory for speed */ + if (s.opmode == mode_generate) { + s.opmode &= ~FLAG_DATA_ACCESS; + } *settings = s; @@ -130,11 +151,12 @@ void printhelp(const char * const name) "Options:\n" " --sort sort mode (default)\n" " --fetch do not sort, fetch element(s) instead\n" + " --generate generate an input dataset\n" " --array use an array data format (default)\n" " --list use a linked list data format\n" " --[no]-cache cache data in memory (default) or process data in-place\n" " --position=<num> fetch element from position <num>\n" - " --num=<num> <num> of elements to fetch\n" + " --num=<num> <num> of elements to fetch/generate\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" |