Example #1
0
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);
}
Example #2
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;
}