How do the features here compare to what you get for structs from h2xs or swig? Are 
these a superset of features they provide? I just went through the process of learning 
about h2xs, swig, and inline, then choosing inline for the module I'm working on. 
However, there were some nice things in h2xs & swig that aren't obvious to me how to 
do with inline. #defines, enums, etc.

One bug I found in h2xs was handling a typedef'd enum embedded in a struct. Chokes 
trying to generate the typemap unless the embedded enum is anonymous. Is there any 
provision for enums in Inline::Struct?

On that topic, how about an 'h2inline'?  Would be extremely handy for writing perl 
modules to wrap C libraries - parse a header, and emit a <module>.pm file full of 
Inline::c and Inline::Struct, plus lots of boilerplate POD. Optionally expose 
functions, structs, enums, #defines, constants, etc.

-David



On Tue, 27 March 2001, Neil Watkiss wrote:

> 
> Here is an update on the status of Inline::Struct.
> 
> The first working version is finished, but will not be available until
> Brian returns, because it requires a patch to Inline.pm. That patch is
> included at the bottom for the more curious inliners.
> 
> Inline::Struct will probably be distributed with the core Inline package.
> 
> SYNOPSIS:
>   use Inline C => <<'END', STRUCTS => ['Foo'];
> 
>   struct Foo {
>     int inum;
>     double dnum;
>     char *str;
>   };
>   typedef struct Foo Foo;
> 
>   END
> 
>   my $o = new Inline::Struct::Foo;
>   $o->inum(10);
>   $o->dnum(3.1415);
>   $o->str('Wazzup?');
> 
>   my %fields = %{$o->_HASH};
>   my @keys = @{$o->_KEYS};
>   my @fields = @{$o->_ARRAY};
> 
>   package Inline::Struct::Foo;
>   sub Print {
>     my $o = shift;
>     print "Foo {\n", (join "\n", map { $o->$_() } $o->_KEYS), "}\n";
>   }
> 
> FEATURES
>  o Adds two new configuration options to C and C++:
>    STRUCTS:
>     Takes either the name of a struct, or an array ref containing a list
>     of structs to bind.
>    NOSTRUCTS:
>     Suppresses binding of structs to Perl.
>  o In the absence of STRUCTS and NOSTRUCTS, any structs will automatically
>    be bound to Perl. They will be put in Inline::Struct::<struct name>.
>  o Automatically generates three things for bound structs:
>    - a Perl class with the following autogenerated methods:
>      new -- if no arguments, creates a zero'd struct.
>          -- elsif the arguments equal the number of fields, assigns the
>             arguments to the fields in the struct order.
>          -- elsif the number of args is divisible by 2, assume it's a
>             "hash" assignment: new Foo(str => 'neil', inum => 10). Any
>             unassigned items remain zero'd.
>          -- else croak.
>      DESTROY -- frees the C structure, iff it was allocated by Perl.
>      _HASH -- returns a hash ref containing the field/value pairs.
>      _ARRAY -- returns an array ref containing the field values. Struct
>                order.
>      _KEYS -- returns an array ref containing the field names. Struct
>               order.
>      In addition, each field generates a method of the same name. If you
>      pass it no arguments, it returns the value of that field. If you pass
>      it an argument, it sets that field and returns the object, so that
>      you can chain such assignments: $o->inum(10)->dnum(3.1415);
>    - typemaps: For each struct, it generates a typemap so that you can
>      pass struct objects back into Perl from C functions, or vice versa.
>    - convenience macros:
>      INLINE_STRUCT_NEW(target, type) -- allocate a new <type>
>      INLINE_STRUCT_FIELDS(type) -- returns number of fields in <type>
>      INLINE_STRUCT_INIT_LIST(target, type) -- inits the target from ST()
>      INLINE_STRUCT_INIT_HASH(target, type) -- inits the target from ST()
>      INLINE_STRUCT_ARRAY(src, targ, type) -- creates an array from src
>      INLINE_STRUCT_HASH(src, targ, type) -- creates a hash from src
>      INLINE_STRUCT_KEYS(src, targ, type) -- creates a key list from src
>      INLINE_STRUCT_GIVE(src, type) -- "give" a C struct to Perl for memory
>        handling. Once this is done, you are forbidden from freeing the
>        memory used by the struct, since Perl will also try to free it. If
>        you do not give the struct to Perl, you can still pass the struct
>        to Perl subs, but you will be responsible for cleaning it up
>        yourself. Note that there is no corresponding INLINE_STRUCT_TAKE(),
>        because that could leave Perl scalars lying around which still
>        think they refer to a valid C struct, but that struct has been
>        deleted by the overzealous C programmer. This macro may be
>        introduced in the future.
> 
> Feature requests? Interface enhancements or suggestions? Let me know!
> 
> Later,
> Neil
> 
> --8<--Patch to Inline.pm--8<--
> @@ -428,7 +428,7 @@
>             next if $mod eq 'Files';
>             ($mod) = $mod =~ /(.*)/ if UNTAINT;
>             eval "require
> Inline::$mod;\$register=&Inline::${mod}::register";
> -           croak usage_register($mod, $@) if $@;
> +           next if $@;
>             my $language = $register->{language}
>             or croak usage_register($mod);
>             for (@{$register->{aliases}}) {
> 
> Reason for patch:
> 
> Inline.pm currently croaks whenever it finds an Inline module which does
> not support the Inline API. Inline::Struct and Inline::Files are two such
> modules. Note that Inline::Files has been special cased. This is not
> correct behaviour, which is to ignore non-Inline modules, rather than
> croak.
> --8<--End of patch--8<--

Reply via email to