www.farid-hajji.net banner

Farid Hajji

Perl: Einführung, Anwendungen, Referenz (2/e) [Support-Site]

Farid Hajji: Perl - Einführung, Anwendungen, Referenz
2., aktualisierte und erweiterte Auflage
Addison-Wesley Longman, ISBN 3-8273-1535-2

Beispielprogramm

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
FreeBSD Logo