Eshu
view release on metacpan or search on metacpan
include/eshu_xs.h view on Meta::CPAN
static int eshu_xs_is_module_line(const char *content, const char *eol) {
const char *p = content;
if (eol - p < 8) return 0;
if (memcmp(p, "MODULE", 6) != 0) return 0;
p += 6;
while (p < eol && (*p == ' ' || *p == '\t')) p++;
return (p < eol && *p == '=');
}
/* XS labels: CODE, INIT, OUTPUT, PREINIT, CLEANUP, POSTCALL,
* PPCODE, BOOT, CASE, INTERFACE, INTERFACE_MACRO, PROTOTYPES,
* VERSIONCHECK, INCLUDE, FALLBACK, OVERLOAD, ALIAS, ATTRS */
static int eshu_xs_is_label(const char *content, const char *eol,
int *is_boot) {
const char *p = content;
const char *start;
int len;
*is_boot = 0;
/* must start with alpha */
include/eshu_xs.h view on Meta::CPAN
/* it also must not be a :: (package separator) */
if (p + 1 < eol && *(p + 1) == ':') return 0;
/* Known XS labels */
if ((len == 4 && memcmp(start, "CODE", 4) == 0) ||
(len == 4 && memcmp(start, "INIT", 4) == 0) ||
(len == 6 && memcmp(start, "OUTPUT", 6) == 0) ||
(len == 7 && memcmp(start, "PREINIT", 7) == 0) ||
(len == 7 && memcmp(start, "CLEANUP", 7) == 0) ||
(len == 8 && memcmp(start, "POSTCALL", 8) == 0) ||
(len == 6 && memcmp(start, "PPCODE", 6) == 0) ||
(len == 4 && memcmp(start, "CASE", 4) == 0) ||
(len == 9 && memcmp(start, "INTERFACE", 9) == 0) ||
(len == 15 && memcmp(start, "INTERFACE_MACRO", 15) == 0) ||
(len == 10 && memcmp(start, "PROTOTYPES", 10) == 0) ||
(len == 12 && memcmp(start, "VERSIONCHECK", 12) == 0) ||
(len == 7 && memcmp(start, "INCLUDE", 7) == 0) ||
(len == 8 && memcmp(start, "FALLBACK", 8) == 0) ||
(len == 8 && memcmp(start, "OVERLOAD", 8) == 0) ||
(len == 5 && memcmp(start, "ALIAS", 5) == 0) ||
(len == 5 && memcmp(start, "ATTRS", 5) == 0)) {
t/22-xs-labels.t view on Meta::CPAN
OUTPUT:
RETVAL
CLEANUP:
free(val);
END
my $got = Eshu->indent_xs($input);
is($got, $expected, 'CLEANUP label at depth 1');
}
# PPCODE label
{
my $input = <<'END';
MODULE = Foo PACKAGE = Foo
void
get_pair()
PPCODE:
XPUSHs(sv_2mortal(newSViv(1)));
XPUSHs(sv_2mortal(newSViv(2)));
XSRETURN(2);
END
my $expected = <<'END';
MODULE = Foo PACKAGE = Foo
void
get_pair()
PPCODE:
XPUSHs(sv_2mortal(newSViv(1)));
XPUSHs(sv_2mortal(newSViv(2)));
XSRETURN(2);
END
my $got = Eshu->indent_xs($input);
is($got, $expected, 'PPCODE label at depth 1');
}
# INIT label (inside XSUB, not the Perl INIT{} block)
{
my $input = <<'END';
MODULE = Foo PACKAGE = Foo
int
sum(a, b)
int a
t/26-xs-advanced.t view on Meta::CPAN
}
RETVAL = count;
OUTPUT:
RETVAL
END
my $got = Eshu->indent_xs($input);
is($got, $expected, 'XSUB with nested C control flow in CODE');
}
# XSUB with PPCODE (list context)
{
my $input = <<'END';
MODULE = Foo PACKAGE = Foo
void
get_pair(self)
SV * self
PPCODE:
XPUSHs(sv_2mortal(newSVpvs("key")));
XPUSHs(sv_2mortal(newSViv(42)));
END
my $expected = <<'END';
MODULE = Foo PACKAGE = Foo
void
get_pair(self)
SV * self
PPCODE:
XPUSHs(sv_2mortal(newSVpvs("key")));
XPUSHs(sv_2mortal(newSViv(42)));
END
my $got = Eshu->indent_xs($input);
is($got, $expected, 'XSUB with PPCODE for list context');
}
done_testing();
( run in 0.681 second using v1.01-cache-2.11-cpan-5511b514fd6 )