view release on metacpan or search on metacpan
AppleEvents/AppleEvents.xs view on Meta::CPAN
if ( defined $Desc ) {
# do something productive
}
=cut
void
AEGetNthDesc(theAEDescList, index, desiredType=typeWildCard)
AEDesc &theAEDescList
long index
OSType desiredType
PPCODE:
{
OSType kw;
AEDesc desc;
AEFail(AEGetNthDesc(&theAEDescList, index, desiredType, &kw, &desc));
XS_XPUSH(AEDesc, desc);
if (GIMME == G_ARRAY && kw != typeWildCard) {
XS_XPUSH(OSType, kw);
}
}
AppleEvents/AppleEvents.xs view on Meta::CPAN
the specified class and event.
($proc, $refcon) = AEGetEventHandler("aevt", "oapp");
=cut
void
AEGetEventHandler(theAEEventClass, theAEEventID, isSysHandler=0)
OSType theAEEventClass
OSType theAEEventID
Boolean isSysHandler
PPCODE:
{
SV * handler = sv_newmortal();
SV * refCon = sv_newmortal();
AEFail(
PAEGetEventHandler(
theAEEventClass, theAEEventID, handler, refCon, isSysHandler));
XPUSHs(handler);
if (GIMME == G_ARRAY) {
XPUSHs(refCon);
AppleEvents/AppleEvents.xs view on Meta::CPAN
B<Mac OS only.>
Returns the item INDEX of the subdescriptor and its type if the subdescriptor
represented a record and not a list.
=cut
void
AEGetNthSubDesc(subdesc,index)
AESubDesc &subdesc
long index
PPCODE:
{
#ifndef MACOS_TRADITIONAL
croak("Usage: Mac::AppleEvents::AEGetNthSubDesc unsupported in Carbon");
#else
OSType kw;
AESubDesc sub;
AEFail(AEGetNthSubDesc(&subdesc, index, &kw, &sub));
XS_XPUSH(AESubDesc, sub);
if (GIMME == G_ARRAY && kw != typeWildCard) {
Components/Components.xs view on Meta::CPAN
GetComponentInfo($Component);
=cut
void
GetComponentInfo(aComponent)
Component aComponent
PREINIT:
ComponentDescription desc;
Handle name;
Handle info;
PPCODE:
name = NewEmptyHandle();
info = NewEmptyHandle();
gMacPerl_OSErr = GetComponentInfo(aComponent, &desc, name, info, nil);
HLock(name);
HLock(info);
if (!gMacPerl_OSErr)
if (GIMME != G_ARRAY) {
if (*name == NULL) {
XS_XPUSH(Str255, "");
} else {
Files/Files.xs view on Meta::CPAN
=item ResolveAlias ALIAS
Resolves an alias. In scalar context, returns the path to the resolved file.
In list context, also returns whether the alias was changed when resolving.
=cut
void
ResolveAlias(alias)
Handle alias
PPCODE:
{
FSSpec target;
Boolean changed;
gMacPerl_OSErr = ResolveAlias(nil, (AliasHandle) alias, &target, &changed);
if (gMacPerl_OSErr) {
XSRETURN_EMPTY;
}
XS_XPUSH(FSSpec, target);
Files/Files.xs view on Meta::CPAN
Resolves an alias relative to a file. In scalar context, returns the path to the
resolved file. In list context, also returns whether the alias was changed when
resolving.
=cut
void
ResolveAliasRelative(from, alias)
FSSpec &from
Handle alias
PPCODE:
{
FSSpec target;
Boolean changed;
gMacPerl_OSErr = ResolveAlias(&from, (AliasHandle) alias, &target, &changed);
if (gMacPerl_OSErr) {
XSRETURN_EMPTY;
}
XS_XPUSH(FSSpec, target);
InternetConfig/InternetConfig.xs view on Meta::CPAN
=cut
void
ICGetPref(inst, key)
ICInstance inst;
Str255 key;
PREINIT:
ICAttr attr;
Handle pref;
PPCODE:
pref = NewHandle(0);
gMacPerl_OSErr = ICFindPrefHandle(inst, key, &attr, pref);
if (!gMacPerl_OSErr)
if (GIMME != G_ARRAY) {
XPUSHs(sv_2mortal(MakeHndSV(pref)));
} else {
XPUSHs(sv_2mortal(MakeHndSV(pref)));
XPUSHs(sv_2mortal(newSViv(attr)));
}
DisposeHandle(pref);
InternetConfig/InternetConfig.xs view on Meta::CPAN
ICParseURL(ic, hint, sv, start=-1, end=-1)
ICInstance ic;
Str255 hint;
SV * sv;
long start;
long end;
PREINIT:
STRLEN len;
Ptr data;
Handle url;
PPCODE:
url = NewHandle(0);
data = (Ptr) SvPV(sv, len);
if (start == -1) {
start = 0;
end = len;
} else if (end == -1)
end = start;
gMacPerl_OSErr = ICParseURL(ic, hint, data, len, &start, &end, url);
if (!gMacPerl_OSErr)
if (GIMME != G_ARRAY) {
InternetConfig/InternetConfig.xs view on Meta::CPAN
void
ICLaunchURL(ic, hint, sv, start=-1, end=-1)
ICInstance ic;
Str255 hint;
SV * sv;
long start;
long end;
PREINIT:
STRLEN len;
Ptr data;
PPCODE:
data = (Ptr) SvPV(sv, len);
if (start == -1) {
start = 0;
end = len;
} else if (end == -1)
end = start;
gMacPerl_OSErr = ICLaunchURL(ic, hint, data, len, &start, &end);
if (!gMacPerl_OSErr)
if (GIMME != G_ARRAY) {
XPUSHs(sv_2mortal(newSViv(1)));
InternetConfig/InternetConfig.xs view on Meta::CPAN
$map = ICGetIndMapEntry $inst, $entries, 5;
($pos, $map) = ICGetIndMapEntry $inst, $entries, 5;
=cut
void
ICGetIndMapEntry(inst, entries, ndx)
ICInstance inst
Handle entries
long ndx
PPCODE:
{
long pos;
ICMapEntry entry;
if (gMacPerl_OSErr = ICGetIndMapEntry(inst, entries, ndx, &pos, &entry)) {
XSRETURN_EMPTY;
}
XS_XPUSH(long, pos);
XS_XPUSH(ICMapEntry, entry);
}
MacPerl/MacPerl.xs view on Meta::CPAN
CODE:
{
int i;
for (i=2; i<items; i++)
fsetfileinfo((char *) SvPV_nolen(ST(i)), creator, type);
}
void
MP_GetFileInfo(path)
char * path
PPCODE:
{
OSType creator;
OSType type;
errno = 0;
fgetfileinfo(path, &creator, &type);
if (errno) {
if (GIMME != G_ARRAY)
MacPerl/MacPerl.xs view on Meta::CPAN
if (choose(domain, type, prompt, constraint, flags, gMacPerlScratch, &len) < 0 || !len)
ST(0) = &PL_sv_undef;
else
ST(0) = sv_2mortal(newSVpv(gMacPerlScratch, len));
}
#endif
void
MP_Pick(prompt, ...)
char * prompt
PPCODE:
#ifndef MACOS_TRADITIONAL
croak("Usage: MacPerl::Pick unsupported in Carbon");
#else
{
short itemHit;
STRLEN len;
Boolean done;
DialogPtr dlg;
Cell mycell;
short mytype;
MacPerl/MacPerl.xs view on Meta::CPAN
gMacPerl_ErrorFormat = SvIV(ST(0));
RETVAL = gMacPerl_ErrorFormat;
#endif
OUTPUT:
RETVAL
void
MP_FAccess(file, cmd, ...)
char * file
unsigned cmd
PPCODE:
{
#ifndef MACOS_TRADITIONAL
croak("Usage: MacPerl::FAccess unsupported in Carbon");
#else
unsigned uarg;
Rect rarg;
SelectionRecord sarg;
char * name;
switch (cmd) {
MacPerl/MacPerl.xs view on Meta::CPAN
FSSpec spec;
if (GUSIPath2FSp(path, &spec))
ST(0) = &PL_sv_undef;
else
ST(0) = sv_2mortal(MP_GUSIFSp2FullPath(&spec, newSVpvn("", 0)));
}
void
MP_Volumes()
PPCODE:
{
FSSpec spec;
if (GIMME != G_ARRAY) {
GUSISpecial2FSp('macs', kOnSystemDisk, &spec);
GetVolInfo(spec.vRefNum, false, &spec);
XPUSHs(sv_2mortal(MP_GUSIFSp2Encoding(&spec, newSVpvn("", 0))));
} else {
short index;
Memory/Memory.xs view on Meta::CPAN
($SIZE, $GROW) = &MaxMem;
MaxMemSys does the purge and compact of the system heap zone, and the $GROW value
is set to zero.
=cut
void
MaxMem()
PPCODE:
{
long grow;
XS_PUSH(long, MaxMem(&grow));
if (GIMME == G_ARRAY) {
XS_PUSH(long, grow);
}
}
void
MaxMemSys()
PPCODE:
{
#ifndef MACOS_TRADITIONAL
croak("Usage: Mac::Memory::MaxMemSys unsupported in Carbon");
#else
long grow;
XS_PUSH(long, MaxMemSys(&grow));
if (GIMME == G_ARRAY) {
XS_PUSH(long, grow);
}
Memory/Memory.xs view on Meta::CPAN
Determine the total amount of free memory and the size of the largest allocatable
block after a purge of the heap.
($Total, $Contiguous) = &PurgeSpace;
=cut
void
PurgeSpace()
PPCODE:
{
long total;
long contig;
PurgeSpace(&total, &contig);
EXTEND(sp, 2);
PUSHs(sv_2mortal(newSViv(total)));
PUSHs(sv_2mortal(newSViv(contig)));
}
function returns the equivalent component-specific script ID and the component
instance that created that script ID as an array.
=cut
void
OSAGenericToRealID(genericScriptingComponent, genericScriptID)
ComponentInstance genericScriptingComponent
OSAID genericScriptID
PREINIT:
ComponentInstance exactScriptingComponent;
PPCODE:
if (gMacPerl_OSErr = (short) OSAGenericToRealID(genericScriptingComponent, &genericScriptID, &exactScriptingComponent)) {
XSRETURN_EMPTY;
}
XS_XPUSH(OSAID, genericScriptID);
XS_XPUSH(ComponentInstance, exactScriptingComponent);
=item OSARealToGenericID GENERICSCRIPTINGCOMPONENT, THESCRIPTID, THEEXACTCOMPONENT
The OSARealToGenericID function performs the reverse of the task performed by
Resources/Resources.xs view on Meta::CPAN
($id, $type, $name) = GetResInfo($HANDLE);
if ( defined $id ) {
# proceed
}
=cut
void
GetResInfo(theResource)
Handle theResource
PPCODE:
{
short theID;
OSType theType;
Str255 name;
GetResInfo(theResource, &theID, &theType, name);
ResErrorCheck;
EXTEND(sp, 3);
XS_PUSH(short, theID);
Sound/Sound.xs view on Meta::CPAN
MACEVersion()
#endif
void
Comp3to1(inBuffer, inState=NO_INIT, numChannels=1, whichChannel=1)
SV * inBuffer
StateBlock inState
unsigned long numChannels
unsigned long whichChannel
PPCODE:
{
#ifndef MACOS_TRADITIONAL
croak("Usage: Mac::Sound::Comp3to1 unsupported in Carbon");
#else
unsigned long cnt = SvCUR(inBuffer);
SV * outBuffer = newSVpv("", cnt / 3);
StateBlock outState;
Comp3to1(
SvPV_nolen(inBuffer), SvPV_nolen(outBuffer), cnt,
(items > 1) ? &inState : nil, &outState, numChannels, whichChannel);
Sound/Sound.xs view on Meta::CPAN
}
#endif
}
void
Exp1to3(inBuffer, inState=NO_INIT, numChannels=1, whichChannel=1)
SV * inBuffer
StateBlock inState
unsigned long numChannels
unsigned long whichChannel
PPCODE:
{
#ifndef MACOS_TRADITIONAL
croak("Usage: Mac::Sound::Exp1to3 unsupported in Carbon");
#else
unsigned long cnt = SvCUR(inBuffer) / 2;
SV * outBuffer = newSVpv("", cnt*6);
StateBlock outState;
Exp1to3(
SvPV_nolen(inBuffer), SvPV_nolen(outBuffer), cnt,
(items > 1) ? &inState : nil, &outState, numChannels, whichChannel);
Sound/Sound.xs view on Meta::CPAN
}
#endif
}
void
Comp6to1(inBuffer, inState=NO_INIT, numChannels=1, whichChannel=1)
SV * inBuffer
StateBlock inState
unsigned long numChannels
unsigned long whichChannel
PPCODE:
{
#ifndef MACOS_TRADITIONAL
croak("Usage: Mac::Sound::Comp6to1 unsupported in Carbon");
#else
unsigned long cnt = SvCUR(inBuffer);
SV * outBuffer = newSVpv("", cnt / 6);
StateBlock outState;
Comp6to1(
SvPV_nolen(inBuffer), SvPV_nolen(outBuffer), cnt,
(items > 1) ? &inState : nil, &outState, numChannels, whichChannel);
Sound/Sound.xs view on Meta::CPAN
}
#endif
}
void
Exp1to6(inBuffer, inState=NO_INIT, numChannels=1, whichChannel=1)
SV * inBuffer
StateBlock inState
unsigned long numChannels
unsigned long whichChannel
PPCODE:
{
#ifndef MACOS_TRADITIONAL
croak("Usage: Mac::Sound::Exp1to6 unsupported in Carbon");
#else
unsigned long cnt = SvCUR(inBuffer);
SV * outBuffer = newSVpv("", cnt * 6);
StateBlock outState;
Exp1to6(
SvPV_nolen(inBuffer), SvPV_nolen(outBuffer), cnt,
(items > 1) ? &inState : nil, &outState, numChannels, whichChannel);
Sound/Sound.xs view on Meta::CPAN
short deviceRefNum
Str255 deviceName
MacOSRet
SPBSignOutDevice(deviceRefNum)
short deviceRefNum
void
SPBGetIndexedDevice(count)
short count
PPCODE:
{
Str255 name;
Handle icon;
if (gMacPerl_OSErr = SPBGetIndexedDevice(count, name, &icon)) {
XSRETURN_UNDEF;
}
XS_PUSH(Str255, name);
if (GIMME == G_ARRAY) {
XS_XPUSH(Handle, icon);
Sound/Sound.xs view on Meta::CPAN
SPBResumeRecording(inRefNum)
long inRefNum
MacOSRet
SPBStopRecording(inRefNum)
long inRefNum
void
SPBGetRecordingStatus(inRefNum)
long inRefNum
PPCODE:
{
short recordingStatus;
short meterLevel;
unsigned long totalSamplesToRecord;
unsigned long numberOfSamplesRecorded;
unsigned long totalMsecsToRecord;
unsigned long numberOfMsecsRecorded;
if (gMacPerl_OSErr =
SPBGetRecordingStatus(
xsubpps/xsubpp-5.6.1 view on Meta::CPAN
( (??{ $size }) )? # Possible sizeof set-from
\) \s* ; \s* $
]x);
$targetable{$key} = [$t, $with_size, $arg, $sarg] if $t;
}
$END = "!End!\n\n"; # "impossible" keyword (multiple newline)
# Match an XS keyword
$BLOCK_re= '\s*(' . join('|', qw(
REQUIRE BOOT CASE PREINIT INPUT INIT CODE PPCODE OUTPUT
CLEANUP ALIAS ATTRS PROTOTYPES PROTOTYPE VERSIONCHECK INCLUDE
SCOPE INTERFACE INTERFACE_MACRO C_ARGS POSTCALL
)) . "|$END)\\s*:";
# Input: ($_, @line) == unparsed input.
# Output: ($_, @line) == (rest of line, following lines).
# Return: the matched keyword if found, otherwise 0
sub check_keyword {
$_ = shift(@line) while !/\S/ && @line;
s/^(\s*)($_[0])\s*:\s*(?:#.*)?/$1/s && $2;
xsubpps/xsubpp-5.6.1 view on Meta::CPAN
$report_args =~ s/^,\s+//;
my @func_args = @args;
shift @func_args if defined($class);
for (@func_args) {
s/^/&/ if $in_out{$_};
}
$func_args = join(", ", @func_args);
@args_match{@args} = @args_num;
$PPCODE = grep(/^\s*PPCODE\s*:/, @line);
$CODE = grep(/^\s*CODE\s*:/, @line);
# Detect CODE: blocks which use ST(n)= or XST_m*(n,v)
# to set explicit return values.
$EXPLICIT_RETURN = ($CODE &&
("@line" =~ /(\bST\s*\([^;]*=) | (\bXST_m\w+\s*\()/x ));
$ALIAS = grep(/^\s*ALIAS\s*:/, @line);
$INTERFACE = grep(/^\s*INTERFACE\s*:/, @line);
$xsreturn = 1 if $EXPLICIT_RETURN;
xsubpps/xsubpp-5.6.1 view on Meta::CPAN
{ print Q<<"EOF" if $cond }
# if ($cond)
# Perl_croak(aTHX_ "Usage: %s($report_args)", GvNAME(CvGV(cv)));
EOF
else
{ print Q<<"EOF" if $cond }
# if ($cond)
# Perl_croak(aTHX_ "Usage: $pname($report_args)");
EOF
print Q<<"EOF" if $PPCODE;
# SP -= items;
EOF
# Now do a block of some sort.
$condnum = 0;
$cond = ''; # last CASE: condidional
push(@line, "$END:");
push(@line_no, $line_no[-1]);
$_ = '';
xsubpps/xsubpp-5.6.1 view on Meta::CPAN
if (@arg_with_types) {
unshift @line, @arg_with_types, $_;
$_ = "";
$processing_arg_with_types = 1;
INPUT_handler() ;
}
XS_process($deferred);
process_keyword("INIT|ALIAS|ATTRS|PROTOTYPE|INTERFACE_MACRO|INTERFACE|C_ARGS") ;
if (check_keyword("PPCODE")) {
print_section();
death ("PPCODE must be last thing") if @line;
print "\tLEAVE;\n" if $ScopeThisXSUB;
print "\tPUTBACK;\n\treturn;\n";
} elsif (check_keyword("CODE")) {
print_section() ;
} elsif (defined($class) and $func_name eq "DESTROY") {
print "\n\t";
print "delete THIS;\n";
} else {
print "\n\t";
if ($ret_type ne "void") {
xsubpps/xsubpp-5.6.1 view on Meta::CPAN
print "\tEXTEND(SP,$c);\n" if $c;
$xsreturn += $c;
generate_output($var_types{$_}, $num++, $_, 0, 1) for @outlist;
# do cleanup
process_keyword("CLEANUP|ALIAS|ATTRS|PROTOTYPE") ;
print Q<<"EOF" if $ScopeThisXSUB;
# ]]
EOF
print Q<<"EOF" if $ScopeThisXSUB and not $PPCODE;
# LEAVE;
EOF
# print function trailer
print Q<<EOF;
# ]]
EOF
print Q<<EOF if $except;
# BEGHANDLERS
# CATCHALL
xsubpps/xsubpp-5.6.1 view on Meta::CPAN
last if $_ eq "$END:";
death(/^$BLOCK_re/o ? "Misplaced `$1:'" : "Junk at end of function");
}
print Q<<EOF if $except;
# if (errbuf[0])
# Perl_croak(aTHX_ errbuf);
EOF
if ($xsreturn) {
print Q<<EOF unless $PPCODE;
# XSRETURN($xsreturn);
EOF
} else {
print Q<<EOF unless $PPCODE;
# XSRETURN_EMPTY;
EOF
}
print Q<<EOF;
#]]
#
EOF
my $newXS = "newXS" ;
xsubpps/xsubpp-5.8.0 view on Meta::CPAN
( (??{ $size }) )? # Possible sizeof set-from
\) \s* ; \s* $
]x);
$targetable{$key} = [$t, $with_size, $arg, $sarg] if $t;
}
$END = "!End!\n\n"; # "impossible" keyword (multiple newline)
# Match an XS keyword
$BLOCK_re= '\s*(' . join('|', qw(
REQUIRE BOOT CASE PREINIT INPUT INIT CODE PPCODE OUTPUT
CLEANUP ALIAS ATTRS PROTOTYPES PROTOTYPE VERSIONCHECK INCLUDE
SCOPE INTERFACE INTERFACE_MACRO C_ARGS POSTCALL OVERLOAD
)) . "|$END)\\s*:";
# Input: ($_, @line) == unparsed input.
# Output: ($_, @line) == (rest of line, following lines).
# Return: the matched keyword if found, otherwise 0
sub check_keyword {
$_ = shift(@line) while !/\S/ && @line;
s/^(\s*)($_[0])\s*:\s*(?:#.*)?/$1/s && $2;
xsubpps/xsubpp-5.8.0 view on Meta::CPAN
$report_args =~ s/^,\s+//;
my @func_args = @args;
shift @func_args if defined($class);
for (@func_args) {
s/^/&/ if $in_out{$_};
}
$func_args = join(", ", @func_args);
@args_match{@args} = @args_num;
$PPCODE = grep(/^\s*PPCODE\s*:/, @line);
$CODE = grep(/^\s*CODE\s*:/, @line);
# Detect CODE: blocks which use ST(n)= or XST_m*(n,v)
# to set explicit return values.
$EXPLICIT_RETURN = ($CODE &&
("@line" =~ /(\bST\s*\([^;]*=) | (\bXST_m\w+\s*\()/x ));
$ALIAS = grep(/^\s*ALIAS\s*:/, @line);
$INTERFACE = grep(/^\s*INTERFACE\s*:/, @line);
$xsreturn = 1 if $EXPLICIT_RETURN;
xsubpps/xsubpp-5.8.0 view on Meta::CPAN
{ print Q<<"EOF" if $cond }
# if ($cond)
# Perl_croak(aTHX_ "Usage: %s($report_args)", GvNAME(CvGV(cv)));
EOF
else
{ print Q<<"EOF" if $cond }
# if ($cond)
# Perl_croak(aTHX_ "Usage: $pname($report_args)");
EOF
#gcc -Wall: if an xsub has no arguments and PPCODE is used
#it is likely none of ST, XSRETURN or XSprePUSH macros are used
#hence `ax' (setup by dXSARGS) is unused
#XXX: could breakup the dXSARGS; into dSP;dMARK;dITEMS
#but such a move could break third-party extensions
print Q<<"EOF" if $PPCODE and $num_args == 0;
# PERL_UNUSED_VAR(ax); /* -Wall */
EOF
print Q<<"EOF" if $PPCODE;
# SP -= items;
EOF
# Now do a block of some sort.
$condnum = 0;
$cond = ''; # last CASE: condidional
push(@line, "$END:");
push(@line_no, $line_no[-1]);
$_ = '';
xsubpps/xsubpp-5.8.0 view on Meta::CPAN
if (@fake_INPUT or @fake_INPUT_pre) {
unshift @line, @fake_INPUT_pre, @fake_INPUT, $_;
$_ = "";
$processing_arg_with_types = 1;
INPUT_handler() ;
}
XS_process($deferred);
process_keyword("INIT|ALIAS|ATTRS|PROTOTYPE|INTERFACE_MACRO|INTERFACE|C_ARGS|OVERLOAD") ;
if (check_keyword("PPCODE")) {
print_section();
death ("PPCODE must be last thing") if @line;
print "\tLEAVE;\n" if $ScopeThisXSUB;
print "\tPUTBACK;\n\treturn;\n";
} elsif (check_keyword("CODE")) {
print_section() ;
} elsif (defined($class) and $func_name eq "DESTROY") {
print "\n\t";
print "delete THIS;\n";
} else {
print "\n\t";
if ($ret_type ne "void") {
xsubpps/xsubpp-5.8.0 view on Meta::CPAN
print "\tEXTEND(SP,$c);\n" if $c;
$xsreturn += $c;
generate_output($var_types{$_}, $num++, $_, 0, 1) for @outlist;
# do cleanup
process_keyword("CLEANUP|ALIAS|ATTRS|PROTOTYPE|OVERLOAD") ;
print Q<<"EOF" if $ScopeThisXSUB;
# ]]
EOF
print Q<<"EOF" if $ScopeThisXSUB and not $PPCODE;
# LEAVE;
EOF
# print function trailer
print Q<<EOF;
# ]]
EOF
print Q<<EOF if $except;
# BEGHANDLERS
# CATCHALL
xsubpps/xsubpp-5.8.0 view on Meta::CPAN
last if $_ eq "$END:";
death(/^$BLOCK_re/o ? "Misplaced `$1:'" : "Junk at end of function");
}
print Q<<EOF if $except;
# if (errbuf[0])
# Perl_croak(aTHX_ errbuf);
EOF
if ($xsreturn) {
print Q<<EOF unless $PPCODE;
# XSRETURN($xsreturn);
EOF
} else {
print Q<<EOF unless $PPCODE;
# XSRETURN_EMPTY;
EOF
}
print Q<<EOF;
#]]
#
EOF
my $newXS = "newXS" ;