#! perl -slw use strict; use Inline C => Config => BUILD_NOISY => 1; use Inline C => <<'END_C', NAME => 'junk1_IC', CLEAN_AFTER_BUILD => 0; IV initSieve( int size ) { int *sieve; Newxz( sieve, size, int ); if( !sieve ) croak( "ints_per_bucket: Couldn't allocate memory.\n" ); return (IV)sieve; } void sieve( IV psieve, int val ) { int *sieve = (int*)psieve; ++sieve[ val ]; return; } void sieveStats( IV psieve, int size ) { Inline_Stack_Vars; int *sieve = (int*)psieve; int i; Inline_Stack_Reset; for( i = 0; i < size; ++i ) { Inline_Stack_Push( sv_2mortal( newSViv( sieve[ i ] ) ) ); } Inline_Stack_Done; } void freeSieve( IV psieve ) { int *sieve = (int*)psieve; if( sieve ) Safefree( sieve ); return; } END_C use Data::Dump qw [ pp ]; my $sieve = initSieve( 999 ); sieve( $sieve, 0+$_ ) while <>; my @res = sieveStats( $sieve, 999 ); pp \@res; freeSieve( $sieve );