Affix

 view release on metacpan or  search on metacpan

Build.PL  view on Meta::CPAN

# =========================================================================

use 5.008_001;
use strict;

use Module::Build::Tiny 0.035;

use Devel::CheckBin;

check_bin('perl');
use lib '.';use builder::Affix; builder::Affix::Build_PL();
exit;('1');

Build_PL();

builder/Affix.pm  view on Meta::CPAN

        for grep {defined} @opt{qw/install_base destdir prefix/}, values %{ $opt{install_path} };
    @opt{ 'config', 'meta' } = ( ExtUtils::Config->new( $opt{config} ), get_meta() );
    exit $actions{$action}->(
        %opt, install_paths => ExtUtils::InstallPaths->new( %opt, dist_name => $opt{meta}->name )
    );
}

sub Build_PL {
    my $meta = get_meta();
    printf "Creating new 'Build' script for '%s' version '%s'\n", $meta->name, $meta->version;
    my $dir = $meta->name eq 'Module-Build-Tiny' ? "use lib '../lib';" : '';
    write_file( 'Build', "#!$^X\n$dir\nuse lib '.';use " . __PACKAGE__ . ";\nBuild();\n" );
    make_executable('Build');
    my @env = defined $ENV{PERL_MB_OPT} ? split_like_shell( $ENV{PERL_MB_OPT} ) : ();
    write_file( '_build_params', encode_json( [ \@env, \@ARGV ] ) );
    $meta->save(@$_) for ['MYMETA.json'], [ 'MYMETA.yml' => { version => 1.4 } ];
}

sub unzip {
    my ( $file, $dest ) = @_;
    my $retval;
    my $u = IO::Uncompress::Unzip->new($file) or die "Cannot open $file: $UnzipError";

eg/benchmark.pl  view on Meta::CPAN

use strict;
use warnings;
use lib '../lib', '../blib/arch', '../blib/lib', 'blib/arch', 'blib/lib';
use Affix     qw[:all];
use Dyn::Load qw[:all];
use Dyn::Call qw[/dc/];
use FFI::Platypus 1.58;
use Config;
use Benchmark qw[cmpthese timethese :hireswallclock];

# arbitrary benchmarks
$|++;
our $libfile

eg/unix_math.pl  view on Meta::CPAN

use strict;
use warnings;
use lib '../lib', '../blib/arch', '../blib/lib';
use Affix;
use Config;
$|++;
my $libfile
    = $^O eq 'MSWin32' ? 'ntdll.dll' :
    $^O eq 'darwin'    ? '/usr/lib/libm.dylib' :
    $^O eq 'bsd'       ? '/usr/lib/libm.so' :
    $Config{archname} =~ /64/ ?
    -e '/lib64/libm.so.6' ?
    '/lib64/libm.so.6' :

eg/win32_screenres.pl  view on Meta::CPAN

use strict;
use warnings;
use lib '../lib', '../blib/arch', '../blib/lib';
use Affix;
$|++;
#
sub GetSystemMetrics : Native('C:\Windows\System32\user32.dll') : Signature([Int]=>Int);
#
CORE::say 'width = ' . GetSystemMetrics(0);
CORE::say 'height = ' . GetSystemMetrics(1);
CORE::say 'number of monitors = ' . GetSystemMetrics(80);

minil.toml  view on Meta::CPAN

name = "Affix"
badges = ["github-actions/linux.yaml", "github-actions/windows.yaml", "github-actions/osx.yaml", "github-actions/freebsd.yaml", "metacpan"]
authority = "cpan:SANKO"
module_maker = "ModuleBuildTiny"
static_install = "auto"
license = "artistic_2"
requires_external_bin=["perl');\nuse lib '.';use builder::Affix; builder::Affix::Build_PL();\nexit;('1"]
markdown_maker = "Pod::Markdown::Github"

[release]
hook=[
    'tidyall -a'
]

[Metadata]
X_No_Archive = 'Yes'

t/00_compile.t  view on Meta::CPAN

use strict;
use Test::More 0.98;
use lib '../lib', 'lib';
use_ok $_ for qw[Affix];
#
diag 'supported features:';
diag '    syscall: ' . ( Affix::Feature::Syscall()   ? 'yes' : 'no' );
diag '  aggrbyval: ' . ( Affix::Feature::AggrByVal() ? 'yes' : 'no' );
#
done_testing;

t/01_types_and_pointers.t  view on Meta::CPAN

use strict;
use Test::More 0.98;
use lib '../lib', 'lib';
use Affix;
#
subtest 'coderef' => sub {
    my $ptr = Affix::sv2ptr( sub { pass 'coderef called'; return 'Okay' }, CodeRef [ [] => Str ] );
    isa_ok $ptr, 'Affix::Pointer';
    my $cv = Affix::ptr2sv( $ptr, CodeRef [ [] => Str ] );
    isa_ok $cv, 'CODE';
    is $cv->(), 'Okay', 'return value from coderef';
    subtest 'inside struct' => sub {
        my $type = Struct [ cb => CodeRef [ [Str] => Str ] ];

t/02_affix_wrap_sin.t  view on Meta::CPAN

use strict;
use warnings;
use lib '../lib', '../blib/arch', '../blib/lib', 'blib/arch', 'blib/lib';
use Affix qw[:all];
use Test::More;
use Config;
$|++;
#
my $libfile
    = Affix::locate_lib( $^O eq 'MSWin32' ? 'msvcrt' :
        $^O eq 'darwin' ? '/usr/lib/libm.dylib' :
        $^O eq 'bsd'    ? '/usr/lib/libm.so' :
        $Config{archname} =~ /64/ ?

t/06_affix_synopsis.t  view on Meta::CPAN

use strict;
use Test::More 0.98;
BEGIN { chdir '../' if !-d 't'; }
use lib '../lib', 'lib', '../blib/arch', '../blib/lib', 'blib/arch', 'blib/lib', '../../', '.';
use Affix;
#
sub pow : Native(get_lib) : Signature([Double, Double]=>Double);
plan skip_all => 'I know nothing about macOS' if $^O eq 'darwin';
is pow( 2, 10 ), 1024, 'pow( 2, 10 ) == 1024';
done_testing;

sub get_lib {
    return 'ntdll'                    if $^O eq 'MSWin32';
    return '/usr/lib/libSystem.dylib' if $^O eq 'darwin';

t/07_affix_locate_lib.t  view on Meta::CPAN

use strict;
use Test::More 0.98;
BEGIN { chdir '../' if !-d 't'; }
use lib '../lib', 'lib', '../blib/arch', '../blib/lib', 'blib/arch', 'blib/lib', '../../', '.';
use Affix;
#
subtest 'Library Paths and Names' => sub {
    diag '.dll located on Win32: ' . Affix::locate_lib('ntdll')      if $^O eq 'MSWin32';
    diag '.dynlib/.bundle located on OSX: ' . Affix::locate_lib('m') if $^O eq 'darwin';
    if ( $^O eq 'linux' ) {
        diag 'libc located on Linux: ' .    ( Affix::locate_lib('c') // 'error' );
        diag 'libm v6 located on Linux: ' . ( Affix::locate_lib( 'm', 6 ) // 'error' );
        diag 'libm v4 located on Linux: ' . ( Affix::locate_lib( 'm', 4 ) // 'error' );
    }

t/41_affix_argless.t  view on Meta::CPAN

use strict;
use Test::More 0.98;
BEGIN { chdir '../' if !-d 't'; }
use lib '../lib', '../blib/arch', '../blib/lib', 'blib/arch', 'blib/lib', '../../', '.';
use Affix qw[:all];
use File::Spec;
use t::lib::nativecall;
#
compile_test_lib('41_argless');
#
sub Nothing : Native('t/src/41_argless');
sub Argless : Native('t/src/41_argless') : Signature([]=>Int);
sub ArglessChar : Native('t/src/41_argless') : Signature([]=>Char);
sub ArglessLongLong : Native('t/src/41_argless') : Signature([]=>LongLong);

t/42_affix_simple_args.t  view on Meta::CPAN

use strict;
use Test::More 0.98;
BEGIN { chdir '../' if !-d 't'; }
use lib '../lib', '../blib/arch', '../blib/lib', 'blib/arch', 'blib/lib', '../../', '.';
use Affix qw[:all];
use File::Spec;
use t::lib::nativecall;
use experimental 'signatures';
$|++;
#
compile_test_lib('42_simple_args');

# Int related
sub TakeInt : Native('t/src/42_simple_args') : Signature([Int]=>Int);

t/43_affix_simple_returns.t  view on Meta::CPAN

use strict;
no warnings 'portable';
use Test::More 0.98;
BEGIN { chdir '../' if !-d 't'; }
use lib '../lib', '../blib/arch', '../blib/lib', 'blib/arch', 'blib/lib', '../../', '.';
use Affix qw[:all];
use File::Spec;
use t::lib::nativecall;
use experimental 'signatures';
$|++;
#
compile_test_lib('43_simple_returns');
#
sub ReturnVoid : Signature([Int]=>Void) : Native('t/src/43_simple_returns');
is ReturnVoid(4), undef, 'returning void works';

t/44_affix_aggr_args.t  view on Meta::CPAN

use strict;
use Test::More 0.98;
BEGIN { chdir '../' if !-d 't'; }
use lib '../lib', '../blib/arch', '../blib/lib', 'blib/arch', 'blib/lib', '../../', '.';
use Affix qw[:all];
use File::Spec;
use t::lib::nativecall;
use experimental 'signatures';
$|++;
plan skip_all => 'no support for aggregates by value' unless Affix::Feature::AggrByVal();
#
compile_test_lib('44_affix_aggr_args');

# Int related

t/50_affix_pointers.t  view on Meta::CPAN

use strict;
no warnings 'portable';
use Affix qw[:all];
use Test::More 0.98;
BEGIN { chdir '../' if !-d 't'; }
use lib '../lib', '../blib/arch', '../blib/lib', 'blib/arch', 'blib/lib', '../../', '.';
use File::Spec;
use t::lib::nativecall;
use Config;
$|++;
#
plan skip_all => 'no support for aggregates by value' unless Affix::Feature::AggrByVal();
diag __LINE__;
compile_test_lib('50_affix_pointers');
#
diag __LINE__;

t/51_affix_sizeof_offsetof.t  view on Meta::CPAN

use strict;
use Test::More 0.98;
BEGIN { chdir '../' if !-d 't'; }
use lib '../lib', 'lib', '../blib/arch', '../blib/lib', 'blib/arch', 'blib/lib', '../../', '.';
use Affix;
use Config;
$|++;
#
use t::lib::nativecall;
#
my $lib = compile_test_lib('51_affix_sizeof_offsetof');
subtest 'fundamental types' => sub {

    #diag sizeof(Double);

t/54_affix_callbacks.t  view on Meta::CPAN

use strict;
use Test::More 0.98;
BEGIN { chdir '../' if !-d 't'; }
use lib '../lib', 'lib', '../blib/arch', '../blib/lib', 'blib/arch', 'blib/lib', '../../', '.';
use Affix;
use Config;
$|++;
#
use t::lib::nativecall;
#
plan skip_all => 'no support for aggregates by value' unless Affix::Feature::AggrByVal();
#
my $lib = compile_test_lib('54_affix_callbacks');
diag $lib;

t/55_affix_enum.t  view on Meta::CPAN

use strict;
use Test::More 0.98;
BEGIN { chdir '../' if !-d 't'; }
use lib '../lib', 'lib', '../blib/arch', '../blib/lib', 'blib/arch', 'blib/lib', '../../', '.';
use Affix;
$|++;
use t::lib::nativecall;
#
compile_test_lib('55_affix_enum');
#
{
    my $ab = IntEnum [ 'alpha', 'beta' ];
    isa_ok $ab, 'Affix::Type::Enum';
    is_deeply $ab->{values}, [ 'alpha', 'beta' ], qq![ 'alpha', 'beta' ] values!;

t/56_affix_arrayref.t  view on Meta::CPAN

use strict;
use Test::More 0.98;
BEGIN { chdir '../' if !-d 't'; }
use lib '../lib', 'lib', '../blib/arch', '../blib/lib', 'blib/arch', 'blib/lib', '../../', '.';
use Affix;
$|++;
use t::lib::nativecall;

# Cribbed from FFI::Platypus example
my $lib = compile_test_lib('56_affix_arrayref');
#
affix $lib, array_reverse   => [ ArrayRef [Int], Int ], Int;
affix $lib, array_reverse10 => [ ArrayRef [ Int, 10 ] ], Int;
affix $lib, array_sum       => [ ArrayRef [Int] ], Int;

t/58_affix_import_vars.t  view on Meta::CPAN

use strict;
use Test::More 0.98;
BEGIN { chdir '../' if !-d 't'; }
use lib '../lib', '../blib/arch', '../blib/lib', 'blib/arch', 'blib/lib', '../../', '.';
use Affix qw[:all];
use File::Spec;
use t::lib::nativecall;
use experimental 'signatures';
$|++;
#
compile_test_lib('58_affix_import_vars');
sub get_integer : Native('t/src/58_affix_import_vars') : Signature([]=>Int);
sub get_string : Native('t/src/58_affix_import_vars') : Signature([]=>Str);
subtest 'integer' => sub {

t/63_affix_raw_pointer.t  view on Meta::CPAN

use strict;
use Test::More 0.98;
BEGIN { chdir '../' if !-d 't'; }
use lib '../lib', '../blib/arch', '../blib/lib', 'blib/arch', 'blib/lib', '../../', '.';
use Affix qw[:memory];
$|++;
#
#plan skip_all => q[You use *BSD. You don't like nice things.] if $^O =~ /bsd/i;
#
subtest 'memchr' => sub {
    my $str = malloc(7);
    memcpy( $str, 'ABCDEFG', 7 );
    my @chars = qw[D d];
    is memchr( $str, 'D', 7 )->raw(4), 'DEFG', 'D (68) found';

t/64_affix_wchar_t.t  view on Meta::CPAN

use strict;
use utf8;
use Test::More 0.98;
BEGIN { chdir '../' if !-d 't'; }
use lib '../lib', '../blib/arch', '../blib/lib', 'blib/arch', 'blib/lib', '../../', '.';
use Affix qw[:all];
use File::Spec;
use t::lib::nativecall;
$|++;

# https://www.gnu.org/software/libunistring/manual/html_node/The-wchar_005ft-mess.html
plan skip_all => 'wchar * is broken on *BSD and Solaris' if $^O =~ /(?:bsd|solaris)/i;
#
compile_test_lib('64_affix_wchar_t');
sub check_string : Native('t/src/64_affix_wchar_t') : Signature([WStr]=>Int);

t/70_affix_varargs.t  view on Meta::CPAN

use strict;
use Test::More 0.98;
BEGIN { chdir '../' if !-d 't'; }
use lib '../lib', 'lib', '../blib/arch', '../blib/lib', 'blib/arch', 'blib/lib', '../../', '.';
use Affix;
use Config;
$|++;
#
use t::lib::nativecall;
#
my $lib = compile_test_lib('70_affix_varargs');
#
#int min(int arg_count, ...)
subtest 'ellipsis varargs' => sub {

t/82_affix_mangle_itanium.t  view on Meta::CPAN

use strict;
use utf8;
use Test::More 0.98;
BEGIN { chdir '../' if !-d 't'; }
use lib '../lib', '../blib/arch', '../blib/lib', 'blib/arch', 'blib/lib', '../../', '.';
use Affix qw[:all];
use t::lib::nativecall;
use experimental 'signatures';
$|++;
#
my $lib = compile_test_lib('82_affix_mangle_itanium');

#~ system 'nm -D ' . $lib;
#
typedef 'MyClass' => Struct [ myNum => Int, myString => Str ];

t/85_affix_mangle_rust.t  view on Meta::CPAN

use strict;
use utf8;
use Test::More 0.98;
BEGIN { chdir '../' if !-d 't'; }
use lib '../lib', '../blib/arch', '../blib/lib', 'blib/arch', 'blib/lib', '../../', '.';
use Affix qw[:all];
use t::lib::nativecall;
use experimental 'signatures';
use Devel::CheckBin;
use Config;
$|++;
#
#~ my $lib = 't/src/85_affix_mangle_rust/target/release/' .
#~ ( $^O eq 'MSWin32' ? '' : 'lib' ) . 'affix_rust.' . $Config{so};
#~ warn $lib;

t/99_valgrind.t  view on Meta::CPAN

use strict;
use Test::More 0.98;
BEGIN { chdir '../' if !-d 't'; }
use lib '../lib', 'lib', '../blib/arch', '../blib/lib', 'blib/arch', 'blib/lib', '../../', '.';
use Config;
use Affix;
$|++;
#
use t::lib::nativecall;
#
plan skip_all => 'Only run valgrind tests locally' unless -e 't/' . __FILE__;
plan skip_all => 'Test::Valgrind is required to test your distribution with valgrind'
    unless require Test::Valgrind;
#



( run in 0.499 second using v1.01-cache-2.11-cpan-87723dcf8b7 )