.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.43) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" ======================================================================== .\" .IX Title "FFI::C::Def 3pm" .TH FFI::C::Def 3pm "2023-02-06" "perl v5.36.0" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" FFI::C::Def \- Data definition for FFI .SH "VERSION" .IX Header "VERSION" version 0.15 .SH "SYNOPSIS" .IX Header "SYNOPSIS" In your C code: .PP .Vb 2 \& #include \& #include \& \& typedef struct { \& uint8_t red; \& uint8_t green; \& uint8_t blue; \& } color_t; \& \& void \& print_color(color_t *c) \& { \& printf("[%02x %02x %02x]\en", \& c\->red, \& c\->green, \& c\->blue \& ); \& } .Ve .PP In your Perl code: .PP .Vb 2 \& use FFI::Platypus 1.00; \& use FFI::C::StructDef; \& \& my $ffi = FFI::Platypus\->new( api => 1 ); \& # See FFI::Platypus::Bundle for how bundle works. \& $ffi\->bundle; \& \& my $def = FFI::C::StructDef\->new( \& $ffi, \& name => \*(Aqcolor_t\*(Aq, \& class => \*(AqColor\*(Aq, \& members => [ \& red => \*(Aquint8\*(Aq, \& green => \*(Aquint8\*(Aq, \& blue => \*(Aquint8\*(Aq, \& ], \& ); \& \& my $red = Color\->new({ red => 255 }); \& \& my $green = Color\->new({ green => 255 }); \& \& $ffi\->attach( print_color => [\*(Aqcolor_t\*(Aq] ); \& \& print_color($red); # [ff 00 00] \& print_color($green); # [00 ff 00] \& \& # that red is a tad bright! \& $red\->red( 200 ); \& \& print_color($red); # [c8 00 00] .Ve .SH "DESCRIPTION" .IX Header "DESCRIPTION" This class is the base class for all def classes in the \s-1FFI::C\s0 collection. The def classes are for defining C \f(CW\*(C`struct\*(C'\fR, \f(CW\*(C`union\*(C'\fR and array types that can be used from Perl and passed to C via FFI::Platypus. .PP You don't create an instance of this class directly, rather one of the subclasses: FFI::C::StructDef, FFI::C::UnionDef, FFI::C::ArrayDef. .SH "CONSTRUCTOR" .IX Header "CONSTRUCTOR" .SS "new" .IX Subsection "new" .Vb 6 \& my $def = FFI::C::StructDef\->new(%opts); \& my $def = FFI::C::StructDef\->new($ffi, %opts); \& my $def = FFI::C::UnionDef\->new(%opts); \& my $def = FFI::C::UnionDef\->new($ffi, %opts); \& my $def = FFI::C::ArrayDef\->new(%opts); \& my $def = FFI::C::ArrayDef\->new($ffi, %opts); .Ve .PP The constructor for this class shouldn't be invoked directly. If you try and exception will be thrown. .PP For subclasses, the first argument should be the FFI::Platypus instance that you want to use with the def. If you do not provide it, then one will be created internally for you. All def classes accept these standard options: .IP "name" 4 .IX Item "name" The FFI::Platypus alias for this def. This name can be used in function signatures when creating or attaching functions in FFI::Platypus. .IP "class" 4 .IX Item "class" The Perl class for this def. The Perl class can be used to create an instance of this def instead of invoking the \f(CW\*(C`create\*(C'\fR method below. .IP "members" 4 .IX Item "members" This is an array reference, which specifies the member fields for the def. How exactly it works depends on the subclass, so see the documentation for the specific def class that you are using. .IP "nullable" 4 .IX Item "nullable" If true, then the type can be \f(CW\*(C`undef\*(C'\fR when passed into C. \f(CW\*(C`undef\*(C'\fR will be translated to \f(CW\*(C`NULL\*(C'\fR. .SH "METHODS" .IX Header "METHODS" .SS "ffi" .IX Subsection "ffi" .Vb 1 \& my $ffi = $def\->ffi; .Ve .PP Returns the FFI::Platypus instance used by this def. .SS "name" .IX Subsection "name" .Vb 1 \& my $name = $def\->name; .Ve .PP Return the FFI::Platypus alias for this def. This name can be used in function signatures when creating or attaching functions in FFI::Platypus. .SS "class" .IX Subsection "class" .Vb 1 \& my $class = $def\->class; .Ve .PP Returns the Perl class for this def, if one was specified. The Perl class can be used to create an instance of this def instead of invoking the \&\f(CW\*(C`create\*(C'\fR method below. .SS "size" .IX Subsection "size" .Vb 1 \& my $size = $def\->size; .Ve .PP Returns the size of the def in bytes. .SS "align" .IX Subsection "align" .Vb 1 \& my $align = $def\->align; .Ve .PP Returns the alignment in bytes of the def. .SS "nullable" .IX Subsection "nullable" .Vb 1 \& my $bool = $def\->nullable; .Ve .PP Returns true if \f(CW\*(C`undef\*(C'\fR is allowed to be passed in to C functions. \f(CW\*(C`undef\*(C'\fR will be translated to \f(CW\*(C`NULL\*(C'\fR. .SS "create" .IX Subsection "create" .Vb 2 \& my $instance = $def\->create; \& my $instance = $def\->class\->new; # if class was specified .Ve .PP Creates an instance of the def. .SH "SEE ALSO" .IX Header "SEE ALSO" .IP "\s-1FFI::C\s0" 4 .IX Item "FFI::C" .PD 0 .IP "FFI::C::Array" 4 .IX Item "FFI::C::Array" .IP "FFI::C::ArrayDef" 4 .IX Item "FFI::C::ArrayDef" .IP "FFI::C::Def" 4 .IX Item "FFI::C::Def" .IP "FFI::C::File" 4 .IX Item "FFI::C::File" .IP "FFI::C::PosixFile" 4 .IX Item "FFI::C::PosixFile" .IP "FFI::C::Struct" 4 .IX Item "FFI::C::Struct" .IP "FFI::C::StructDef" 4 .IX Item "FFI::C::StructDef" .IP "FFI::C::Union" 4 .IX Item "FFI::C::Union" .IP "FFI::C::UnionDef" 4 .IX Item "FFI::C::UnionDef" .IP "FFI::C::Util" 4 .IX Item "FFI::C::Util" .IP "FFI::Platypus::Record" 4 .IX Item "FFI::Platypus::Record" .PD .SH "AUTHOR" .IX Header "AUTHOR" Graham Ollis .SH "COPYRIGHT AND LICENSE" .IX Header "COPYRIGHT AND LICENSE" This software is copyright (c) 2020\-2022 by Graham Ollis. .PP This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.