Farid Hajji: Perl - Einführung, Anwendungen, Referenz
2., aktualisierte und erweiterte Auflage
Addison-Wesley Longman, ISBN 3-8273-1535-2
ST/Xten/Xten.c
/*
* This file was generated automatically by xsubpp version 1.9507 from the
* contents of Xten.xs. Do not edit this file, edit Xten.xs instead.
*
* ANY CHANGES MADE HERE WILL BE LOST!
*
*/
#line 1 "Xten.xs"
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include <math.h>
#define max(x,y) (((x)>(y)) ? (x) : (y))
#line 18 "Xten.c"
XS(XS_ST__Xten_t_norm1)
{
dXSARGS;
if (items != 3)
croak("Usage: ST::Xten::t_norm1(x,y,z)");
{
double x = (double)SvNV(ST(0));
double y = (double)SvNV(ST(1));
double z = (double)SvNV(ST(2));
double RETVAL;
#line 24 "Xten.xs"
RETVAL = fabs(x) + fabs(y) + fabs(z);
#line 31 "Xten.c"
ST(0) = sv_newmortal();
sv_setnv(ST(0), (double)RETVAL);
}
XSRETURN(1);
}
XS(XS_ST__Xten_t_norm2)
{
dXSARGS;
if (items != 3)
croak("Usage: ST::Xten::t_norm2(x,y,z)");
{
double x = (double)SvNV(ST(0));
double y = (double)SvNV(ST(1));
double z = (double)SvNV(ST(2));
double RETVAL;
#line 37 "Xten.xs"
RETVAL = sqrt(x*x + y*y + z*z);
#line 50 "Xten.c"
ST(0) = sv_newmortal();
sv_setnv(ST(0), (double)RETVAL);
}
XSRETURN(1);
}
XS(XS_ST__Xten_t_norminf)
{
dXSARGS;
if (items != 3)
croak("Usage: ST::Xten::t_norminf(x,y,z)");
{
double x = (double)SvNV(ST(0));
double y = (double)SvNV(ST(1));
double z = (double)SvNV(ST(2));
double RETVAL;
#line 50 "Xten.xs"
RETVAL = max(max(fabs(x),fabs(y)),fabs(z));
#line 69 "Xten.c"
ST(0) = sv_newmortal();
sv_setnv(ST(0), (double)RETVAL);
}
XSRETURN(1);
}
XS(XS_ST__Xten_v_norm1)
{
dXSARGS;
if (items < 1)
croak("Usage: ST::Xten::v_norm1(x1, ...)");
{
double x1 = (double)SvNV(ST(0));
#line 60 "Xten.xs"
unsigned int i;
double result;
#line 86 "Xten.c"
double RETVAL;
#line 63 "Xten.xs"
result = fabs(x1);
for (i=1; i<items; i++) {
result += fabs((double)SvNV(ST(i)));
}
RETVAL = result;
#line 94 "Xten.c"
ST(0) = sv_newmortal();
sv_setnv(ST(0), (double)RETVAL);
}
XSRETURN(1);
}
XS(XS_ST__Xten_v_norm2)
{
dXSARGS;
if (items < 1)
croak("Usage: ST::Xten::v_norm2(x1, ...)");
{
double x1 = (double)SvNV(ST(0));
#line 77 "Xten.xs"
unsigned int i;
double result;
#line 111 "Xten.c"
double RETVAL;
#line 80 "Xten.xs"
result = x1*x1;
for (i=1; i<items; i++) {
/* VORSICHT! Das kann sehr gross werden! */
result += (double)(SvNV(ST(i))) * (double)(SvNV(ST(i)));
}
result = sqrt(result);
RETVAL = result;
#line 121 "Xten.c"
ST(0) = sv_newmortal();
sv_setnv(ST(0), (double)RETVAL);
}
XSRETURN(1);
}
XS(XS_ST__Xten_v_norminf)
{
dXSARGS;
if (items < 1)
croak("Usage: ST::Xten::v_norminf(x1, ...)");
{
double x1 = (double)SvNV(ST(0));
#line 96 "Xten.xs"
unsigned int i;
double result;
#line 138 "Xten.c"
double RETVAL;
#line 99 "Xten.xs"
result = x1;
for (i=1; i<items; i++) {
result = max(result, fabs((double)SvNV(ST(i))));
}
RETVAL = result;
#line 146 "Xten.c"
ST(0) = sv_newmortal();
sv_setnv(ST(0), (double)RETVAL);
}
XSRETURN(1);
}
XS(XS_ST__Xten_v_normalize)
{
dXSARGS;
if (items < 1)
croak("Usage: ST::Xten::v_normalize(x1, ...)");
SP -= items;
{
double x1 = (double)SvNV(ST(0));
#line 116 "Xten.xs"
unsigned int i;
double * normvect;
double norm2;
#line 165 "Xten.c"
double * RETVAL;
#line 121 "Xten.xs"
/* Erst die euklidische Norm ausrechnen. */
/* Wir koennen leider nicht v_norm2() aufrufen! */
norm2 = x1*x1;
for (i=1; i<items; i++) {
/* VORSICHT! Das kann sehr gross werden! */
norm2 += (double)(SvNV(ST(i))) * (double)(SvNV(ST(i)));
}
norm2 = sqrt(norm2);
if (!norm2) croak("can't normalize with 0 norm!\n");
/* Nun koennen wir normalisieren. */
/* Hinweis: New() ist das malloc() von Perl */
New(0, normvect, items, double);
normvect[0] = x1/norm2;
for (i=1; i<items; i++) {
normvect[i] = (double)(SvNV(ST(i)))/norm2;
}
/* Wir pushen die Ergebniswerte auf den Stack */
for (i=0; i<items; i++) {
XPUSHs(sv_2mortal(newSVnv(normvect[i])));
}
/* Und wir raeumen unseren Zwischenvektor wieder auf */
/* Hinweis: Safefree() ist das free() von Perl */
Safefree(normvect);
XSRETURN(items);
#line 195 "Xten.c"
PUTBACK;
return;
}
}
#ifdef __cplusplus
extern "C"
#endif
XS(boot_ST__Xten)
{
dXSARGS;
char* file = __FILE__;
XS_VERSION_BOOTCHECK ;
newXS("ST::Xten::t_norm1", XS_ST__Xten_t_norm1, file);
newXS("ST::Xten::t_norm2", XS_ST__Xten_t_norm2, file);
newXS("ST::Xten::t_norminf", XS_ST__Xten_t_norminf, file);
newXS("ST::Xten::v_norm1", XS_ST__Xten_v_norm1, file);
newXS("ST::Xten::v_norm2", XS_ST__Xten_v_norm2, file);
newXS("ST::Xten::v_norminf", XS_ST__Xten_v_norminf, file);
newXS("ST::Xten::v_normalize", XS_ST__Xten_v_normalize, file);
/* Initialisation Section */
#line 14 "Xten.xs"
printf("Initializing the ST::Xten Library (faking...)\n");
#line 224 "Xten.c"
/* End of Initialisation Section */
XSRETURN_YES;
}
[Prev] [Up] [Relevant Chapter] [Next]
[Alte Quelle]
| Last modified: $Date: 2006/05/18 12:56:12 $ FH. Search :: Sitemap :: Disclaimer :: Copyright :: Privacy |
|