diff --git a/src/main.c b/src/main.c index 342c529..8de0c3b 100644 --- a/src/main.c +++ b/src/main.c @@ -7,7 +7,7 @@ #include "list.h" -#define VERSION "v0.7" +#define VERSION "v1.0" static bool run; @@ -20,11 +20,12 @@ int main(int argc, char *argv[]) { f_version = false, f_quiet = false; int base = 10; - char *file = NULL; + char *ofile = NULL; + char *ifile = NULL; // Parse commandline arguments int c; - while((c = getopt(argc, argv, "hvqb:f:")) != -1) { + while((c = getopt(argc, argv, "hvqb:o:i:")) != -1) { switch(c) { case 'h': f_help = true; @@ -39,13 +40,16 @@ int main(int argc, char *argv[]) { base = atoi(optarg); if(base < 2 || base > 62) { fprintf(stderr, - "Invalid base `%d'. Base must be between 2 and 62\n", + "Invalid base `%d'. Base must be between 2 and 62.\n", base); exit(1); } break; - case 'f': - file = optarg; + case 'o': + ofile = optarg; + break; + case 'i': + ifile = optarg; break; default: printUsage(argv[0]); @@ -60,7 +64,8 @@ int main(int argc, char *argv[]) { puts(" -v print version number of program"); puts(" -q quiet mode"); puts(" -b base in which to print primes between 2 and 62 (default 10)"); - puts(" -f file to save primes to"); + puts(" -o file to save primes to"); + puts(" -i file to read primes from a previous session"); return 0; } else if(f_version) { printf("Indivisible %s\n", VERSION); @@ -83,17 +88,34 @@ int main(int argc, char *argv[]) { mpz_t num; mpz_init(num); - // Add 2, a known prime to this list - mpz_set_ui(num, 2); - addToList(&primes, num); - if(!f_quiet) { - if(mpz_out_str(stdout, base, num) == 0) { - fprintf(stderr, "Could not print to `stdout'!\n"); + if(ifile == NULL) { + // Add 2, a known prime to this list + mpz_set_ui(num, 2); + addToList(&primes, num); + if(!f_quiet) { + if(mpz_out_str(stdout, base, num) == 0) { + fprintf(stderr, "Could not print to `stdout'!\n"); + goto releaseMemory; + } + printf("\n"); + } + mpz_add_ui(num, num, 1); + } else { + // Load primes from file + FILE *pFile = fopen(ifile, "r"); + if(pFile == NULL) { + fprintf(stderr, "Failed to open primes file `%s'.\n", ifile); goto releaseMemory; } - printf("\n"); + while(mpz_inp_str(num, pFile, base) != 0) { + addToList(&primes, num); + } + if(fclose(pFile) != 0) { + fprintf(stderr, "Failed to close file `%s'.\n", ifile); + goto releaseMemory; + } + printf("Loaded %zu primes.\n", primes.end); } - mpz_add_ui(num, num, 1); // Variable for half `num' mpz_t halfNum; @@ -132,17 +154,17 @@ nextPrime: mpz_clear(halfNum); mpz_clear(num); - if(file != NULL) { - FILE *outFile = fopen(file, "w+"); + if(ofile != NULL) { + FILE *outFile = fopen(ofile, "w+"); if(outFile == NULL) { - fprintf(stderr, "Failed create file `%s'.\n", file); + fprintf(stderr, "Failed create file `%s'.\n", ofile); goto releaseMemory; } - printf("Writing primes to `%s'...\n", file); + printf("Writing primes to `%s'...\n", ofile); puts("0%"); for(size_t i = 0; i < primes.end; ++i) { if(mpz_out_str(outFile, base, primes.list[i]) == 0) { - fprintf(stderr, "Error occurred while writing to file `%s'.\n", file); + fprintf(stderr, "Error occurred while writing to file `%s'.\n", ofile); goto releaseMemory; } fprintf(outFile, "\n"); @@ -151,7 +173,7 @@ nextPrime: else if(i == primes.end * 3 / 4) puts("75%"); } if(fclose(outFile) != 0) { - fprintf(stderr, "Failed to close file `%s'.\n", file); + fprintf(stderr, "Failed to close file `%s'.\n", ofile); goto releaseMemory; } puts("100%"); @@ -168,7 +190,7 @@ releaseMemory: } void printUsage(char *progName) { - printf("%s [options...]\n", progName); + printf("%s [OPTIONS]\n", progName); } void leave() { run = false; }