[ Back to the overview Matrix ]

Test case : Prime Numbers using ANSI/ISO C

Lines used: 54
#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;
}
Contributed by Arthur J. O'Dwyer, ajo at nospam.andrew.cmu.edu