Math-ematica

 view release on metacpan or  search on metacpan

ematica.xs  view on Meta::CPAN

double
MLGetDouble(link)
	MLINK	link
CODE:   
	if (!MLGetDouble(link, &RETVAL)) XSRETURN_UNDEF;
OUTPUT: 
	RETVAL

kcharp_ct
MLGetString(link)
	MLINK	link
CODE:   
	if (!MLGetString(link, &RETVAL)) XSRETURN_UNDEF;
OUTPUT: 
	RETVAL
CLEANUP:
        MLDisownString(link, RETVAL);

SV *
MLGetByteString(link, ...)
	MLINK	link
CODE:
        {         
            long                 spec = 0;
            const unsigned char *s;
            long                 n;
            if (items > 1) {
              spec = SvNV(ST(1));
            }
            if (!MLGetByteString(link, &s, &n, spec)) {
              XSRETURN_UNDEF;
            } else {
              RETVAL = newSVpvn(s, n);
              MLDisownByteString(link, s, n);
            }
        }
OUTPUT: 
        RETVAL

SV *
MLGetSymbol(link)
	MLINK	link
PREINIT:
	kcharp_ct symname;
CODE:   
	if (!MLGetSymbol(link, &symname)) XSRETURN_UNDEF;
        RETVAL = make_symbol((char *)symname);
OUTPUT: 
	RETVAL
CLEANUP:
        MLDisownSymbol(link, symname);


void
MLGetFunction(link)
	MLINK	link
PREINIT:
	char *    name;
	long_st   nargs;
        SV *      symbol;
PPCODE:
        if (!MLGetFunction(link, (kcharpp_ct) &name, &nargs)) {
          XSRETURN_UNDEF;
        }
        symbol = make_symbol(name);
        MLDisownSymbol(link, name);
        XPUSHs(sv_2mortal(symbol));
        if (GIMME_V == G_ARRAY) {
          XPUSHs(sv_2mortal(newSViv(nargs)));
          XSRETURN(2);
        } else {
          XSRETURN(1);
        }

void
MLGetRealList(link)
	MLINK	link
PREINIT:
	doublep_nt	array;
	long_st         len;
        long_st         i;
PPCODE:
        if (!MLGetRealList(link, &array, &len)) {
          XSRETURN_UNDEF;
        }
        EXTEND(sp, len);
        for (i=0;i<len;i++) {
          PUSHs(sv_2mortal(newSVnv(array[i])));
        }
        MLDisownRealList(link, array, len);
        XSRETURN(len);

void
symbol(name)
	SV *	name
PPCODE:
        ST(0) = sv_2mortal(newRV_noinc(newSVsv(name)));
        sv_bless(ST(0), gv_stashpv(SYMNAME,1));
	XSRETURN(1);

mlapi_result
PutToken(link, elem, ...)
	MLINK	link
	SV *	elem
CODE:
	if (SvROK(elem)) {
          if (sv_isobject(elem) && sv_isa(elem, SYMNAME)) {
            if (items > 2) {
              RETVAL = MLPutFunction(link, SvPV(SvRV(elem), PL_na), SvIV(ST(2)));
            } else {
              RETVAL = MLPutSymbol(link, SvPV(SvRV(elem), PL_na));
            }
          } else {
            warn( "Math::ematica::PutScalar() -- elem is not a Math::ematica::symbol" );
            XSRETURN_UNDEF;
          }
        } else if (SvIOKp(elem)) {
          RETVAL = MLPutInteger(link, SvIV(elem));
        } else if (SvNOKp(elem)) {
          RETVAL = MLPutDouble(link, SvNV(elem));
        } else if (SvPOKp(elem)) {
          RETVAL = MLPutString(link, SvPV(elem, PL_na));
        } else {
          RETVAL = 0;
        }
OUTPUT:
	RETVAL

SV *
read_packet(link)
	MLINK	link
CODE:
	if ((RETVAL = read_packet(link)) == NULL) {
          XSRETURN_UNDEF;
        }
OUTPUT:
	RETVAL

        



( run in 2.113 seconds using v1.01-cache-2.11-cpan-71847e10f99 )