Thread "Hallo Welt" in XS (18 answers)
Opened by hlubenow at 2020-01-08 18:32

hlubenow
 2020-01-08 18:32
#191072 #191072
User since
2009-02-22
875 Artikel
BenutzerIn
[default_avatar]
Hallo,

mit diesem Artikel

https://www.heise.de/ix/artikel/Durch-die-Hintertu...

konnte ich erstmals ein einfaches C-Modul für Perl zum Laufen bringen.
Das ging so:

1. In der Shell
Code: (dl )
h2xs -n cstruct

ausgeführt erzeugt ein Verzeichnis "cstruct" mit einigen Dateien.

2. In dem Verzeichnis die Datei "cstruct.xs" editieren. Die sollte so aussehen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"

#include "const-c.inc"

/* Your C-Code goes here: */

typedef struct __CStruct {
char *name;
int num;
} CStruct;

void setName(CStruct *s, char *n) {
if (s != NULL) {
if (s->name != NULL) {
free(s->name);
}
s->name = (n != NULL) ? strdup(n) : NULL;
}
}

/* End of C-Code */

MODULE = cstruct PACKAGE = cstruct

# XS-Code:

CStruct *createStruct(name, num)
char* name
int num
CODE:
CStruct *s = (CStruct*) malloc(sizeof(CStruct));
s->name = NULL;
setName(s, name);
s->num = num;
RETVAL = s;
OUTPUT:
RETVAL

void
deleteStruct(s)
CStruct* s
CODE:
if (s != NULL) {
if (s->name != NULL) {
free(s->name);
}
free(s);
}

void
setName(s, name)
CStruct* s
char* name

char*
getName(s)
CStruct* s
CODE:
if (s != NULL) {
RETVAL = s->name;
} else {
RETVAL = "";
}
OUTPUT:
RETVAL

# End of XS-Code

INCLUDE: const-xs.inc


3. Dann braucht man dort noch eine Datei "typemap" mit dem Inhalt:
Code: (dl )
1
2
TYPEMAP 
CStruct* T_PTROBJ


4. Dann kann man in dem Verzeichnis ausführen:
Code: (dl )
1
2
perl Makefile.PL
make

Das erzeugt einige Dateien.

5. Man erstellt woanders ein anderes Verzeichnis "test". In dem Verzeichnis "cstruct" und den Unterverzeichnissen sucht man die folgenden Dateien:
Code: (dl )
1
2
3
cstruct.pm
cstruct.so
autosplit.ix

"autosplit.ix" kopiert man nach "../test/auto/cstruct/autosplit.ix".
Dann schreibt man noch eine Datei "test.pl" mit dem Inhalt:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/perl

use warnings;
use strict;

use cstruct;

my $exmp = cstruct::createStruct("abc", 999);
print cstruct::getName($exmp) . "\n";
cstruct::deleteStruct($exmp);

Nun müßte es möglich sein, "./test.pl" auszuführen.

Natürlich sollte man den verlinkten Artikel lesen und sich ansehen, wie "cstruct.xs" aufgebaut ist.
Last edited: 2020-01-08 18:43:06 +0100 (CET)

View full thread "Hallo Welt" in XS