# $Id: structprocs.pm,v 1.6 1997/04/30 04:30:09 jake Exp $ # Copyright 1997 Jake Donham # You may distribute under the terms of either the GNU General # Public License or the Artistic License, as specified in the README # file. # structprocs takes a module name and a filehandle reference and prints XS # stubs for structure accessors to the filehandle. sub RPCL::Syntax::structprocs {} sub RPCL::StructDef::structprocs { my ($self, $mod, $fh) = @_; my $ident = $self->ident; my $ctype = $self->ctype; my $type = $self->perltype($mod); my $ftype = $type; $ftype =~ s/::/__/; print $fh <destructor($mod); foreach $decl (@{$self->decls}) { $decl->type->getter($mod, $self, $decl->ident, $fh); $decl->type->setter($mod, $self, $decl->ident, $fh); } } sub RPCL::Type::getter { my ($self, $mod, $struct, $field, $fh, $u) = @_; my $ret = $self->perltype($mod); my $arg = $struct->perltype($mod); print $fh <${u}$field; OUTPUT: RETVAL EOF } sub RPCL::Type::setter { my ($self, $mod, $struct, $field, $fh, $u) = @_; my $ret = $self->perltype($mod); my $arg = $struct->perltype($mod); print $fh <${u}$field = val; EOF } sub RPCL::TypedefDef::getter { die "typedef" } sub RPCL::TypedefDef::setter { die "typedef" } sub RPCL::TypeFixedArr::setter { my ($self, $mod, $struct, $field, $fh, $u) = @_; my $ret = $self->perltype($mod); my $arg = $struct->perltype($mod); my $size = $self->size->value; my $ctype = $self->type->ctype; print $fh <${u}$field), $size, $ctype); EOF } sub RPCL::TypeFixedOpq::setter { my ($self, $mod, $struct, $field, $fh, $u) = @_; my $ret = $self->perltype($mod); my $arg = $struct->perltype($mod); my $size = $self->size->value; print $fh <${u}$field), $size, char); EOF } *{RPCL::TypeFixedStr::setter} = \&RPCL::TypeFixedOpq::setter; sub RPCL::TypeVarArr::getter { my ($self, $mod, $struct, $field, $fh, $u) = @_; my $ret = $self->perltype($mod); my $arg = $struct->perltype($mod); print $fh <${u}${field}.${field}_val; RETVAL.len = arg->${u}${field}.${field}_len; } OUTPUT: RETVAL EOF } sub RPCL::TypeVarArr::setter { my ($self, $mod, $struct, $field, $fh, $u) = @_; my $ret = $self->perltype($mod); my $arg = $struct->perltype($mod); print $fh <${u}${field}.${field}_val = val.val; arg->${u}${field}.${field}_len = val.len; } EOF } sub RPCL::TypeVarOpq::getter { my ($self, $mod, $struct, $field, $fh, $u) = @_; my $ret = $self->perltype($mod); my $arg = $struct->perltype($mod); print $fh <${u}${field}.${field}_val; RETVAL.len = arg->${u}${field}.${field}_len; } OUTPUT: RETVAL EOF } sub RPCL::TypeVarOpq::setter { my ($self, $mod, $struct, $field, $fh, $u) = @_; my $ret = $self->perltype($mod); my $arg = $struct->perltype($mod); print $fh <${u}${field}.${field}_val = val.val; arg->${u}${field}.${field}_len = val.len; } EOF } sub RPCL::TypeVarStr::getter { my ($self, $mod, $struct, $field, $fh, $u) = @_; my $ret = $self->perltype($mod); my $arg = $struct->perltype($mod); print $fh <${u}${field}; OUTPUT: RETVAL EOF } sub RPCL::TypeVarStr::setter { my ($self, $mod, $struct, $field, $fh, $u) = @_; my $ret = $self->perltype($mod); my $arg = $struct->perltype($mod); print $fh <${u}${field} = val; EOF } sub RPCL::StructDef::setter { my ($self, $mod, $struct, $field, $fh, $u) = @_; my $ret = $self->perltype($mod); my $arg = $struct->perltype($mod); print $fh <${u}$field = *val; EOF } sub RPCL::StructDef::getter { my ($self, $mod, $struct, $field, $fh, $u) = @_; my $ret = $self->perltype($mod); my $arg = $struct->perltype($mod); print $fh <${u}$field); OUTPUT: RETVAL EOF } *{RPCL::StructPDef::setter} = \&RPCL::Type::setter; *{RPCL::StructPDef::getter} = \&RPCL::Type::getter; sub RPCL::UnionDef::structprocs { my ($self, $mod, $fh) = @_; my $ident = $self->ident; my $ctype = $self->ctype; my $type = $self->perltype($mod); print $fh <destructor($mod); $self->decl->type->getter($mod, $self, $self->decl->ident, $fh); $self->decl->type->setter($mod, $self, $self->decl->ident, $fh); my $u = $ident . '_u.'; foreach $case (@{$self->cases}) { next if $case->decl->type->isa(RPCL::TypeVoid); $case->decl->type->getter($mod, $self, $case->decl->ident, $fh, $u); $case->decl->type->setter($mod, $self, $case->decl->ident, $fh, $u); } } sub constructor { my ($type, $ctype) = @_; my $ftype = $type; $ftype =~ s/::/__/; return <${u}$ident);\n" } sub RPCL::TypeVarOpq::destruct_field { my ($self, $ident, $u) = @_; return " safefree(arg->${u}$ident.${ident}_val);\n" } sub RPCL::StructDef::destructor { my ($self, $mod) = @_; my $type = $self->perltype($mod); my $ctype = $self->ctype; my $des; $des = <decls}) { $des .= $decl->type->destruct_field($decl->ident); } $des .= <perltype($mod); my $ctype = $self->ctype; my $ident = $self->ident; my $des; $des = <cases}) { $des .= $case->decl->type->destruct_field($case->decl->ident, $u); } $des .= <