summaryrefslogtreecommitdiffstats
path: root/src/main.c
diff options
context:
space:
mode:
authorGravatar Gediminas Jakutis <gediminas@varciai.lt> 2020-02-19 14:55:34 +0200
committerGravatar Gediminas Jakutis <gediminas@varciai.lt> 2020-02-19 14:55:34 +0200
commit1bcfe887515845678f8f648c6dfecffd01813b0f (patch)
tree8f3fbb04211f5fbb21e8dd48e2c823f29a30f99f /src/main.c
parent790d6dcfc531005a5d7ca2f79460d593d61bb1a0 (diff)
downloadalgos-ld1-1bcfe887515845678f8f648c6dfecffd01813b0f.tar.gz
algos-ld1-1bcfe887515845678f8f648c6dfecffd01813b0f.tar.bz2
algos-ld1-1bcfe887515845678f8f648c6dfecffd01813b0f.zip
now with a special generation mode!
Signed-off-by: Gediminas Jakutis <gediminas@varciai.lt>
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c60
1 files changed, 41 insertions, 19 deletions
diff --git a/src/main.c b/src/main.c
index 29283a6..ee0ad52 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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"