#include	<u.h>
#include	<libc.h>
#include	<bio.h>

#define	ptsiz	(sizeof(pt)/sizeof(pt[0]))
#define	whsiz	(sizeof(wheel)/sizeof(wheel[0]))
#define	tabsiz	(sizeof(table)/sizeof(table[0]))
#define	tsiz8	(tabsiz*8)

double	big = 9.007199254740992e15;

int	pt[] =
{
	  2,  3,  5,  7, 11, 13, 17, 19, 23, 29,
	 31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
	 73, 79, 83, 89, 97,101,103,107,109,113,
	127,131,137,139,149,151,157,163,167,173,
	179,181,191,193,197,199,211,223,227,229,
};
double	wheel[] =
{
	10, 2, 4, 2, 4, 6, 2, 6, 4, 2,
	 4, 6, 6, 2, 6, 4, 2, 6, 4, 6,
	 8, 4, 2, 4, 2, 4, 8, 6, 4, 6,
	 2, 4, 6, 2, 6, 6, 4, 2, 4, 6,
	 2, 6, 4, 2, 4, 2,10, 2,
};
uchar	table[1000];
uchar	bittab[] =
{
	1, 2, 4, 8, 16, 32, 64, 128,
};

void	mark(double nn, long k);
void	ouch(void);
Biobuf bout;

void
main(int argc, char *argp[])
{
	int i;
	double k, temp, v, limit, nn;

	Binit(&bout, 1, OWRITE);

	if(argc <= 1) {
		fprint(2, "usage: primes starting [ending]\n");
		exits("usage");
	}
	nn = atof(argp[1]);
	limit = big;
	if(argc > 2) {
		limit = atof(argp[2]);
		if(limit < nn)
			exits(0);
		if(limit > big)
			ouch();
	}
	if(nn < 0 || nn > big)
		ouch();
	if(nn == 0)
		nn = 1;

	if(nn < 230) {
		for(i=0; i<ptsiz; i++) {
			if(pt[i] < nn)
				continue;
			if(pt[i] > limit)
				exits(0);
			print("%d\n", pt[i]);
			if(limit >= big)
				exits(0);
		}
		nn = 230;
	}

	modf(nn/2, &temp);
	nn = 2.*temp + 1;
/*
 *	clear the sieve table.
 */
	for(;;) {
		for(i=0; i<tabsiz; i++)
			table[i] = 0;
/*
 *	run the sieve.
 */
		v = sqrt(nn+tsiz8);
		mark(nn, 3);
		mark(nn, 5);
		mark(nn, 7);
		for(i=0,k=11; k<=v; k+=wheel[i]) {
			mark(nn, k);
			i++;
			if(i >= whsiz)
				i = 0;
		}
/*
 *	now get the primes from the table
 *	and print them.
 */
		for(i=0; i<tsiz8; i+=2) {
			if(table[i>>3] & bittab[i&07])
				continue;
			temp = nn + i;
			if(temp > limit)
				exits(0);
			Bprint(&bout, "%lld\n", (long long)temp);
			if(limit >= big)
				exits(0);
		}
		nn += tsiz8;
	}
}

void
mark(double nn, long k)
{
	double t1;
	long j;

	modf(nn/k, &t1);
	j = k*t1 - nn;
	if(j < 0)
		j += k;
	for(; j<tsiz8; j+=k)
		table[j>>3] |= bittab[j&07];
}

void
ouch(void)
{
	fprint(2, "limits exceeded\n");
	exits("limits");
}
