#include <stdio.h>
#include <stdlib.h>
struct intlist {
int *a;
size_t len;
size_t cap;
};
int intlist_add(struct intlist *p, int next)
{
if (p->len >= p->cap) {
void *t;
p->cap = p->cap*2 + 5;
t = realloc(p->a, p->cap * sizeof *p->a);
if (t == NULL)
exit(EXIT_FAILURE);
p->a = t;
}
p->a[p->len++] = next;
return next;
}
int checkPrime(int i, struct intlist list)
{
if (list.len == 0) return 1;
if (i % list.a[0]) {
struct intlist list2 = {list.a+1, list.len-1, list.cap};
return checkPrime(i, list2);
}
return 0;
}
int next_prime(int go)
{
static struct intlist list = {0};
if (go == 0) {
free(list.a);
return 0;
}
if (list.a == NULL)
return intlist_add(&list, 2);
else {
int first = list.a[list.len - 1];
int i;
for (i = first+1; !checkPrime(i, list); ++i)
;
return intlist_add(&list, i);
}
}
int main(void)
{
int i;
for (i=0; i < 1000; ++i)
printf("%d ", next_prime(1));
printf("\n");
next_prime(0);
return 0;
}