加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl XS

发布时间:2020-12-15 23:57:46 所属栏目:大数据 来源:网络整理
导读:h2xs -A FloatCalc 然后改写FloatCalc.xs,以下提供3种有别于标准写法的方式。 方式一: #define PERL_NO_GET_CONTEXT#include "EXTERN.h"#include "perl.h"#include "XSUB.h"#include stdio.hXS(XS_FloatCalc_pow){ dXSARGS; if (items != 2) croak("usage:

h2xs -A FloatCalc

然后改写FloatCalc.xs,以下提供3种有别于标准写法的方式。

方式一:

#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include <stdio.h>

XS(XS_FloatCalc_pow)
{
    dXSARGS;
    if (items != 2)
       croak("usage:FloatCalc::pow(x,y)");
    {
		double	RETVAL;
		dXSTARG;
		RETVAL = pow(SvNV(ST(0)),SvNV(ST(1)) );
		XSprePUSH; 
		PUSHn(RETVAL);
    }
    XSRETURN(1);
}

XS(boot_FloatCalc)
{
    dXSARGS;
    const char* file = __FILE__;
	newXS("FloatCalc::pow",XS_FloatCalc_pow,file);

	if (PL_unitcheckav)
		call_list(PL_scopestack_ix,PL_unitcheckav);
    XSRETURN_YES;
}


方式二:

#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include <stdio.h>

XS(XS_FloatCalc_pow)
{
    dXSARGS;
    if (items != 2)
       croak("usage:FloatCalc::pow(x,y)");
    {
		double result;
		sp = mark;
		result = pow(SvNV(ST(0)),SvNV(ST(1)) );
		XPUSHs(sv_2mortal(newSVnv(result)));
    }
    XSRETURN(1);
}

XS(boot_FloatCalc)
{
    dXSARGS;
    const char* file = __FILE__;
	newXS("FloatCalc::pow",PL_unitcheckav);
    XSRETURN_YES;
}


方式三:

#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include <stdio.h>


XS(XS_FloatCalc_pow)
{
    dSP; 			//得到sp
    dAXMARK; 		//得到mark
    dITEMS;			//得到items = sp - mark
    if (items != 2)
       croak("usage:FloatCalc::pow(x,y)");
    {
		double result;
		sp = mark;	//回到起始位置
		result = pow(SvNV(ST(0)),SvNV(ST(1)) );
		XPUSHs(sv_2mortal(newSVnv(result)));
    }
    PL_stack_sp = sp;	//返回栈帧
	return;	
}

XS(boot_FloatCalc)
{
    dXSARGS;
    const char* file = __FILE__;
	newXS("FloatCalc::pow",PL_unitcheckav);
    XSRETURN_YES;
}

方式四:

#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include <stdio.h>

XS(XS_FloatCalc_pow)
{
    dXSARGS;
    double result;
    if (items != 2)
    {
       croak("usage:FloatCalc::pow(x,y)");
       XSRETURN_EMPTY;
    }
    result = pow(SvNV(ST(0)),SvNV(ST(1)) );
    XSRETURN_NV(result);
}

XS(boot_FloatCalc)
{
    I32 ax = POPMARK;		//仅需要ax
    const char* file = __FILE__;
    newXS("FloatCalc::pow",file);

    if (PL_unitcheckav)
        call_list(PL_scopestack_ix,PL_unitcheckav);
    XSRETURN_YES;
}

?方式五:

#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include <stdio.h>

XS(XS_FloatCalc_pow)
{
    SV **mark = PL_stack_base + (*PL_markstack_ptr--);
    int items = PL_stack_sp - mark;
    double	result;
    if (items != 2)
    {
       croak("usage:FloatCalc::pow(x,y)");
       PL_stack_sp = mark;
       return;
    }
	result = pow(SvNV(mark[1+0]),SvNV(mark[1+1]) );
	mark[1+0] = sv_2mortal(newSVnv(result));
	PL_stack_sp = mark +1;
	return;
}

XS(boot_FloatCalc)
{
    I32 ax = POPMARK;		//仅需要ax
    const char* file = __FILE__;
	newXS("FloatCalc::pow",PL_unitcheckav);
    XSRETURN_YES;
}


?

测试:

#!/usr/bin/perl
use FloatCalc;
my $result = pow(2.0,4.0);
print "pow(2.0,4.0) = $resultn";

my $result = pow(2.0);  # 会有用法提示

<>;

结果:

C:UsersG-SpiderFloatCalc>test.pl
pow(2.0,4.0) = 16
usage:FloatCalc::pow(x,y) at C:UsersG-SpiderDesktophello.pl line 6.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读