#require "test_2.cc"
#define Foo Bar
#define BAR(X) ((X)*(X))
#include "test.h"


/*	print "Hello world"
*/
print("Hello world\n", "Running some tests.\n");

/*	a loop:
*/
for(int i=0; i<100; i++)
{
	print(i," ");
}
print("\n");

/*	define a type:
*/
type Foo =
{
	int a,b;
	float c;
	str s;
	char[] ca;
	float bar(int x) { return BAR(X); }
}

/*	define a function
*/
uint square(int n)
{
	uint m = abs(n);
	return m * m;
}

/*	calculate root of uint:
*/
uint root(uint x)
{
	uint lo = 0;
	uint hi = min(x,0x10000);

	do
	{
	    uint n = (hi+lo)/2;
		if(n*n > x) { until(hi==n); hi = n; }
	    else  		{ until(lo==n); lo = n; }
	}
	return lo;
}
assert(root(0)==0);
assert(root(1)==1);
assert(root(2)==1);
assert(root(3)==1);
assert(root(4)==2);
assert(root(8)==2);
assert(root(9)==3);
assert(root(15)==3);
assert(root(16)==4);
assert(root(24)==4);
assert(root(25)==5);

/*	sieve primes:
*/
bool[] isprime = new bool[50000];
for(uint i=2; i<isprime.count; i++) isprime[i] = yes;

for(uint i=2, imax=(isprime.count+1)/2; i<=imax; i++)
{
	if(!isprime[i]) next;

	for(uint n=i+i; n<isprime.count; n+=i)
	{
		isprime[n] = no;
	}
}

print("Primes in range 0 to ", isprime.count-1, "\n");
for(uint i=0;i<isprime.count;i++)
{
	if(isprime[i]) print(i," ");
}
print("\n");

/*	test whether number is a prime:
*/
bool isPrime(uint n)
{
	if(n<3 || n%2==0) return n==2;

	uint imax = root(n);
	for(uint i=3; i<=imax; i+=2)
	{
		if(n/i*i == n) return no;
	}
	return yes;
}


(

print("Validating the primes:\n");
uint numerrors=0;
for(uint i=0;i<isprime.count;i++)
{
	if(isprime[i] != isPrime(i))
	{
		numerrors++;
		print("error for number ",i,"\n");
	}
}
if(numerrors) print(numerrors," errors\n");
else		  print("no errors\n");


#undef Foo



