Listing 1 (mkprmc.)

/*
(C) Copyright 1990 Ron Burk
All Rights Reserved

mkprm.c - Generate htabp.c, a list of prime numbers.

   This program generates a logarithmic table of prime numbers. The
table is stored as source code that can be compiled into another program.

*/

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

typedef unsigned long   ulong;

class outfile
   {
   FILE     *fout;      // handle to output file
   int      nprimes;
   void     printhead();
   void     printtail();
public:
   outfile()  : fout(NULL), nprimes(0) { };
   outfile()                   { close(); }
   void     open(const char *fname);
   void     close()             { printtail(); fclose(fout); }
   void     prime(ulong);       // format prime # into C initialized array
   };


//     PERCENTAGE specifies the allowable percentage discrepancy between
// the desired table size and the nearest prime number in the table.

const PERCENTAGE = 20;


//     MAX_PRIME limits the range of numbers which will be searched for
// primes. Note that USHRT_MAX is guaranteed to be >= 65,535

const unsigned MAX_PRIME = USHRT_MAX;


const MAX_NPRIMES = 100 + MAX_PRIME / 10;

const char OUTFILE[] = "htabp.c";

int     main(int /*argc*/, char /***argv*/)
   {
   unsigned previous = 0, log = 10;
   static unsigned primes[MAX_NPRIMES];
   int  nprimes = 1;
   int  nprint  = 0;
   outfile fout;

   fout.open(OUTFILE);
   primes[0]  = 2;
   for(unsigned num = 3; num < MAX_PRIME-log && nprimes < MAX_NPRIMES; num+=2)
       {
       for(int i = 0; i < nprimes; ++i)
           if(!(num%primes [i]))
               break;
           else if(num/primes[i] <= primes[i])
               {
               primes [nprimes++]  = num;
               if(num > previous + log)
                   {
                   ++nprint;
                   previous  = num;
                   log     = num / (100 / PERCENTAGE);
                   fout.prime(num);
                   printf( "%u\n", num );
                   }
               break;
               }
       }
   num     = primes [nprimes-1];
   if(num != previous)
       {
       fout.prime(num);
       printf( "%u\n", num );
       ++nprint;
       }
   printf( "nprimes = %d nprint = %d\n", nprimes, nprint );
   }

void     outfile::open(const char * fname)
   {
   fout     = fopen(fname, "w");

   if(fout == NULL)
       }
       fprintf(stderr, "Can't open output file '%s' for writing.\n",
           fname);
       exit(EXIT_FAILURE);
       }
   }

void    outfile::prime(ulong p)
   {
   int boundary = !(nprimes%4);

   if(nprimes == 0)
       printhead();
   if(nprimes)
       {
       fprintf(fout, ",");
       if(boundary)
           fprintf(fout, "\n");
       }
   if(boundary)
       fprintf(fout, "  ");
   fprintf(fout, "%12lu", p);
   ++nprimes;
   }

void     outfile::printhead()
   {
   char *type;

   fprintf(fout,

"// machine generated; DO NOT EDIT\n"
"static unsigned short Primes [] = \n"
"    {\n"

   );
   }

void    outfile::printtail()
   {
   fprintf(fout,

"\n"
"    };\n"
"const NPRIMES = %d;\n",

       nprimes
       );
   }

/* End of File */