#use Inline C => Config => CCFLAGS => '' => CC => 'cl';
use Inline C;

my $v = ($ARGV[0]) ? $ARGV[0] : 500;

my @a = (1, 2, 3, 5);
my %a;
$a{a} = '3';

#my $ret = Double(3.5);
#my $ret = String('aaa');
#my $ret = Hash(\%a);
#my $ret = Array2(\@a);
#my $ret = Array(\@a);
my $ret = PrimeNumber($v);
#my $ret = Factorize($v);
print "\nret=$ret\n";
exit;

__DATA__
__C__
#include <math.h>

int Double(double f) {
	printf("f=%g\n", f);
	return 1;
}

int String(char* s) {
	printf("s=%s\n", s);
	return 1;
}

int Hash(HV* hash) {
	SV** svp;
	char *s;
	int i;
	
	svp = hv_fetch(hash, "a", 1, FALSE);
	i = svp ? SvIV(*svp) : 0;
	s = svp ? SvPV_nolen(*svp) : 0;
	printf("i=%d\n", i);
	printf("s=%s\n", s);

	return 1;
}

int Array2(AV* array) {
	int n;
	int i;
	SV** base;
	SV* elem;

	n = av_len(array) + 1;
	base = AvARRAY(array);
	printf("n=%d\n", n);

	for(i = 0 ; i < n ; i++) {
		elem = base[i];
		sv_setiv(elem, SvIV(elem) + 1);
		printf("a[%d]=%d\n", i, SvIV(base[i]));
	}
}

int Array(SV* sv) {
	int i, n;
	SV** elem_p;
	SV* elem;
	AV* array;
	SV** base;

	if(SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVAV) {
		array = (AV*)SvREFCNT_inc(SvRV(sv));
	}
	n = av_len(array) + 1;
	printf("n=%d\n", n);

	base = AvARRAY(array);
	for(i = 0 ; i < n ; i++) {
		elem = base[i];
		if(elem) {
			sv_setiv(elem, SvIV(elem) + 1);
			printf("a[%d]=%d\n", i, SvIV(elem));
		}
/*
		elem_p = av_fetch(array, i, 0);
		if(elem_p) {
			elem = *elem_p;
			printf("a[%d]=%d\n", i, SvIV(elem));
		}
*/
	}

	SvREFCNT_dec(SvRV(sv));
	return n;
}

int PrimeNumber(int Maxn) {
	char *n  = malloc(sizeof(char) * Maxn);
	int  *pv = malloc(sizeof(int)  * Maxn);
	int npv = 0;
	int i, j;
	int sqr;

	printf("Maxn=%d\n", Maxn);
	sqr = (int)(sqrt(Maxn) + 0.001);
	printf("sqr=%d\n", sqr);

	for(i = 0 ; i < Maxn ; i++) n[i] = 0;
	pv[npv++] = 1;
	pv[npv++] = 2;
	printf("1 2");

	for(i = 3 ; i < Maxn ; i += 2) {
		if(n[i] > 0) continue;
		sqr = (int)(sqrt(i) + 0.001);
		for(j = 1 ; j < npv && j <= sqr ; j++) {
			if(i % pv[j] == 0) {
/*printf("\n%d %% %d == 0\n", i, pv[j]);*/
				n[i] = 1;
				break;
			}
		}

		if(n[i] == 0) {
			pv[npv++] = i;
			printf(" %d", i);
			for(j = 1 ; j <= (int)(Maxn / i) ; j++) {
				n[i*j] = 1;
			}
		}
	}

	free(pv);
	free(n);

	return 1;
}

int Factorize(int v) {
	int pv = v;
	int sqr;
	char *a = malloc(sizeof(char) * v);
	int c = 0;
	int i, j, k;

	printf("Maxn=%d\n", v);
	sqr = (int)(sqrt(v) + 0.001);
	printf("sqr=%d\n", sqr);

	for(i = 0 ; i < v ; i++) a[i] = 0;

	for(i = 2 ; i <= sqr ; ) {
		if(i >= sqr) break;
		if(a[i] > 0) {
			i++;
			continue;
		}

		if(pv % i == 0) {
			if(c == 0) 	printf("%d", i);
			else printf(" * %d", i);
			pv /= i;
			sqr = (int)(sqrt(pv) + 0.001);
			for(j = 2 ; j <= sqr ; j++) {
				k = i * j;
				a[k] = 1;
			}
			c++;
			if(pv % i == 0) continue;
			a[i] = 1;
		}
		i++;
	}
	(c == 0) ? printf("%d\n", pv) : printf(" * %d\n", pv);

	free(a);
	
	return sqr;
}
