diff --git a/.gitignore b/.gitignore index 86efa15..2ea0042 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ build tests +tmp diff --git a/main.c b/main.c index 9ffaf41..63c3ef7 100644 --- a/main.c +++ b/main.c @@ -3,9 +3,13 @@ #include #include #include +#include +#include #include #include +#define DEFAULT_FILE "tests/1.in" +#define DEFAULT_DIR "tmp" #define DEFAULT_NN 100000 #define DEFAULT_N 101 #define DEFAULT_B 10 @@ -16,17 +20,20 @@ void print_usage() { printf("Options:\n"); - printf(" -f [filename]\tRead/Generate records from [filename]\n"); - printf(" -r\t randomly generate N records, and process them\n"); + printf(" -f [filename]\tRead/Generate records from [filename], default %s\n", DEFAULT_FILE); + printf(" -d [dirname]\tSet the directory used for temporary files, default %s\n", DEFAULT_DIR); printf(" -N [count]\tSet total number of records, default %d\n", DEFAULT_NN); printf(" -n [count]\tSet blocking factor, default %d\n", DEFAULT_N); printf(" -b [count]\tSet number of buffers, default %d\n", DEFAULT_B); + printf(" -r\t randomly generate N records\n"); printf(" -h\tShow this help message\n"); } typedef struct { FILE* input; + char* filename; + char* dirname; bool generate_data; bool manual_input; int N; // number of records in a file @@ -41,17 +48,21 @@ int process_args(int argc, char** argv, options* opts) return ERROR; } opts->input = stdin; + opts->filename = DEFAULT_FILE; + opts->dirname = DEFAULT_DIR; opts->generate_data = false; opts->manual_input = false; opts->N = DEFAULT_NN; opts->n = DEFAULT_N; opts->b = DEFAULT_B; - char* filename = NULL; int opt; - while ((opt = getopt(argc, argv, "f:N:n:b:rhm")) != -1) { + while ((opt = getopt(argc, argv, "f:d:N:n:b:rhm")) != -1) { switch (opt) { case 'f': - filename = optarg; + opts->filename = optarg; + break; + case 'd': + opts->dirname = optarg; break; case 'r': opts->generate_data = true; @@ -67,6 +78,7 @@ int process_args(int argc, char** argv, options* opts) break; case 'm': opts->manual_input = true; + break; case 'h': print_usage(); return END_PROGRAM; @@ -79,18 +91,18 @@ int process_args(int argc, char** argv, options* opts) fprintf(stderr, "Incompatible arguments: mr, aborting\n"); return ERROR; } - if (filename == NULL) { - fprintf(stderr, "No file specified, aborting\n"); - return ERROR; - } - opts->input = fopen(filename, "r+"); + opts->input = fopen(opts->filename, "r+"); if (!opts->input) { - opts->input = fopen(filename, "w+"); + opts->input = fopen(opts->filename, "w+"); } if (!opts->input) { - fprintf(stderr, "Error: Cannot open file '%s'\n", filename); + fprintf(stderr, "Error: Cannot open file '%s'\n", opts->filename); return ERROR; } + struct stat st = { 0 }; + if (stat(opts->dirname, &st) == -1) { + mkdir(opts->dirname, 0777); + } return SUCCESS; } @@ -159,6 +171,7 @@ int main(int argc, char** argv) } if (opts.generate_data) { generate_file(&opts); + return SUCCESS; } if (opts.manual_input) { write_file(&opts); diff --git a/makefile b/makefile index cea2963..481378c 100644 --- a/makefile +++ b/makefile @@ -16,7 +16,7 @@ tests: mkdir -p tests clean: - rm -rf build tests + rm -rf build tests tmp run: build/main tests/1.in build/main -f tests/1.in | less