Primesieve

 view release on metacpan or  search on metacpan

Primesieve.xs  view on Meta::CPAN

#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"

#include <stdlib.h>
#include <primesieve.h>

typedef primesieve_iterator *Primesieve;


MODULE = Primesieve		PACKAGE = Primesieve

PROTOTYPES: ENABLE

void
generate_primes (start, stop)
        UV start
        UV stop
PREINIT:
        size_t i;
        size_t size;
        UV *ret;
PPCODE:
        ret = primesieve_generate_primes (start, stop, &size, UINT64_PRIMES);
        if (!size) {
                XSRETURN_EMPTY;
        }
        if (GIMME_V == G_ARRAY) {
                EXTEND (SP, size);
                for (i = 0; i < size; i++) {
                        mPUSHu (ret[i]);
                }
        } else {
                AV *av;
                av = newAV ();
                sv_2mortal ((SV*) av);
                av_extend (av, size);
                XPUSHs (newRV_noinc ((SV*)av));
                for (i = 0; i < size; i++) {
                        av_push (av, newSVuv (ret[i]));
                }
        }
        primesieve_free (ret);
        


void
generate_n_primes (n, start)
        UV n
        UV start
PREINIT:
        size_t i;
        UV *ret;
PPCODE:
        if (!n) {
                XSRETURN_EMPTY;
        }
        ret = (UV*) primesieve_generate_n_primes (n, start, UINT64_PRIMES);
        if (GIMME_V == G_ARRAY) {
                EXTEND (SP, n);
                for (i = 0; i < n; i++) {
                            mPUSHu (ret[i]);
                }
        } else {
                AV *av;
                av = newAV ();
                sv_2mortal ((SV*) av);
                av_extend (av, n);
                XPUSHs (newRV_noinc ((SV*)av));
                for (i = 0; i < n; i++) {
                        av_push (av, newSVuv (ret[i]));
                }
        }
        primesieve_free (ret);


UV
nth_prime (n, start=0)
    IV n
    UV start
CODE:
        RETVAL = primesieve_nth_prime (n, start);
OUTPUT:
        RETVAL

UV
count_primes (start, stop)
        UV start
        UV stop
ALIAS:
        count_twins = 1
        count_triplets = 2
        count_quadruplets = 3
        count_quintuplets = 4
        count_sextuplets = 5
CODE:
        switch (ix) {
            case 0: RETVAL = primesieve_count_primes (start, stop); break;
            case 1: RETVAL = primesieve_count_twins (start, stop); break;
            case 2: RETVAL = primesieve_count_triplets (start, stop); break;
            case 3: RETVAL = primesieve_count_quadruplets (start, stop); break;
            case 4: RETVAL = primesieve_count_quintuplets (start, stop); break;
            case 5: RETVAL = primesieve_count_sextuplets (start, stop); break;
            default: /* can't happen, just to stop -Wall  */
                    RETVAL = 0; break;
        }
OUTPUT:
        RETVAL

void
print_primes (start, stop)
        UV start
        UV stop
ALIAS:



( run in 1.090 second using v1.01-cache-2.11-cpan-5511b514fd6 )