User Tools

Site Tools


Differences

This shows you the differences between two versions of the page.

Link to this comparison view

perl:perl-and-c-oop [2020-02-15 00:57] (current)
Line 1: Line 1:
 +======Perl OOP in pure C  ======
 +
 +<code | Makefile.PL>​
 +use 5.008009;
 +use ExtUtils::​MakeMaker;​
 +
 +WriteMakefile(
 +    NAME              => '​GPS',​
 +    VERSION_FROM ​     => '​GPS.pm',​
 +    PREREQ_PM ​        => {},
 +    ABSTRACT_FROM ​ => '​GPS.pm',​
 +    AUTHOR ​        => 'Ziggi Stardust',​
 +    LIBS              => [''​],​
 +    DEFINE ​           => '',​
 +    INC               => '',​
 +    # OBJECT ​           => '​$(O_FILES)',​
 +);
 +</​code>​
 +
 +<code Perl| GPS.pm>
 +package GPS;
 +use strict;
 +use Carp;
 +
 +use vars qw ($VERSION @ISA @EXPORT @EXPORT_OK $AUTOLOAD);
 +
 +require DynaLoader;
 +use AutoLoader '​AUTOLOAD';​
 +
 +@ISA = qw(DynaLoader);​
 +
 +$VERSION = '​0.01';​
 +bootstrap GPS $VERSION;
 +
 +BEGIN { }
 +1;
 +__END__
 +</​code>​
 +
 +<code c GPS.xs>
 +
 +#include "​EXTERN.h"​
 +#include "​perl.h"​
 +#include "​XSUB.h"​
 +
 +typedef struct data {
 +   char *date;
 +   char *serial;
 +} DATA;
 +
 +typedef DATA* GPS;
 +
 +MODULE = GPS PACKAGE = GPS
 +
 +PROTOTYPES: DISABLE
 +
 +GPS
 +new(class)
 +        SV  *class;
 +    PREINIT:
 +        DATA* data;
 +    CODE:
 +        if ((data = malloc(sizeof(DATA))) == NULL) {
 +            croak("​GPS new");
 +        }
 +        data->​serial = "";​
 +        data->​date = "";​
 +        RETVAL = data;
 +  OUTPUT:
 +        RETVAL
 +
 +void*
 +set_serial(class,​ serial_SV)
 +        GPS class;
 +        SV* serial_SV;
 +    CODE:
 +        class->​serial = SvPV_nolen(serial_SV);​
 +
 +char*
 +get_serial(class)
 +        GPS class;
 +    CODE:
 +        RETVAL = class->​serial;​
 +  OUTPUT:
 +        RETVAL
 +
 +
 +void*
 +set_date(class,​ date_SV)
 +        GPS class;
 +        SV* date_SV;
 +    CODE:
 +        class->​date = SvPV_nolen(date_SV);​
 +
 +char*
 +get_date(class)
 +        GPS class;
 +    CODE:
 +        RETVAL = class->​date;​
 +  OUTPUT:
 +        RETVAL
 +
 +
 +SV *
 +get_data(class);​
 +        GPS class;
 +    PREINIT:
 +        HV *hash;
 +        char *date_label = "​date";​
 +        char *serial_label = "​serial";​
 +
 +    CODE:
 +        hash = newHV();
 +        hv_store(hash,​ date_label, strlen(date_label),​ newSVpv(class->​date,​ strlen(class->​date)),​ 0);
 +        hv_store(hash,​ serial_label,​ strlen(serial_label),​ newSVpv(class->​serial,​ strlen(class->​serial)),​ 0);
 +        RETVAL = newRV_noinc((SV*)hash);​
 +    OUTPUT:
 +        RETVAL
 +</​code>​
 +
 +<code | typemap >
 +GPS T_PTROBJ
 +</​code>​
 +
 +<code | gps.pl>
 +#​!/​usr/​local/​bin/​perl
 +use strict;
 +use Mojo::Util qw(dumper);
 +
 +my $b = GPS->​new;​
 +$b->​set_serial('​0x123'​);​
 +$b->​set_date('​1970-11-01'​);​
 +print dumper $b->​get_data;​
 +</​code>​
 +
 +<code json>
 +# perl Makefile.PL
 +# make
 +# make install
 +# ./gps.pl
 +
 +{
 +  "​date"​ => "",​
 +  "​serial"​ => ""​
 +}
 +{
 +  "​date"​ => "​1970-11-01",​
 +  "​serial"​ => "​0x123"​
 +}
 +
 +</​code>​