main () { short len, rc; len = sizeof verbuf; /* first, read the version message object file */ if ((FILE *) NULL == (fp = fopenb (VERFILE, "r"))) { printf ("ERROR -- Unable to open \"%s\" for reading (errno = %d)\n", VERFILE, errno); exit (1); } rewind (fp); if (1 != (rc = fread (&verbuf, len, 1, fp))) { printf ("ERROR -- Unable to read \"%s\" (rc = %d, errno = %d)\n", VERFILE, rc, errno); if (ferror (fp)) printf (" File system ERROR.\n"); else if (feof (fp)) printf (" Premature EOF.\n"); else printf (" Neither ERROR or EOF set -- very odd\n"); fclose (fp); exit (1); } /* close the file, print the version message, and exit */ fclose (fp); printf ("Current version: %s\n", verbuf.ver); exit (0); }
int prime_test(const char *store, long num) { long shift = num >> 2; if (!shift) { if (num == 2) { puts("p(1) = 2"); } else if (num == 3) { puts("p(2) = 3"); } else { puts("composite"); } return 0; } FILEb * file = fopenb(store, "r"); if (!file) { fprintf(stderr, "could not open file for reading: %s\n", store); return 2; } int bits = 1; long cnum = fgetb(file, 2); long primeAt = 3; shift >>= 1; while (shift) { fseekb(file, cnum * bits, SEEK_CUR); primeAt += cnum; bits++; shift >>= 1; cnum = fgetb(file, bits + 1); if (cnum <= 0) { fprintf(stderr, "the store doesn't go that high\n"); fcloseb(file); return 3; } } // get the base from which to seek long base = ftellb(file); long lOffset = 0; long lVal = (2L << bits) + (fgetb(file, bits) << 1) + 1L; if (num <= lVal) { if (num == lVal) { printf("p(%ld) = %ld\n", primeAt, num); } else { puts("composite"); } fcloseb(file); return 0; } fseekb(file, (cnum - 2) * bits, SEEK_CUR); long rOffset = cnum - 1; long rVal = (2L << bits) + (fgetb(file, bits) << 1) + 1L; long cOffset, cVal; // see if we have all the primes of this bit length if (rVal <= num) { if (rVal == num) { printf("p(%ld) = %ld\n", primeAt + rOffset, num); fcloseb(file); return 0; } cnum = fgetb(file, bits + 2); if (cnum <= 0) { fprintf(stderr, "the store doesn't go that high\n"); fcloseb(file); return 1; } else { puts("composite"); fcloseb(file); return 0; } } while (lOffset + 1 < rOffset) { cOffset = (lOffset + rOffset) / 2; fseekb(file, base + cOffset * bits, SEEK_SET); cVal = (2L << bits) + (fgetb(file, bits) << 1) + 1L; if (cVal == num) { printf("p(%ld) = %ld\n", primeAt + cOffset, num); fcloseb(file); return 0; } else if (cVal < num) { lOffset = cOffset; lVal = cVal; } else { rOffset = cOffset; rVal = cVal; } } puts("composite"); fcloseb(file); return 0; }