/*
 * $Id: p_header,v 1.4 2000/11/27 01:57:01 keiko Exp $
 */

#include <stdio.h>
#include "ruby.h"
#include "libtinyf2c.h"
#include "narray.h"

#define DFLT_SIZE 32

extern char    *dcl_obj2ccharary(VALUE, int, int);
extern integer *dcl_obj2cintegerary(VALUE);
extern real    *dcl_obj2crealary(VALUE);
extern complex *dcl_obj2ccomplexary(VALUE);
extern logical *dcl_obj2clogicalary(VALUE);

extern VALUE dcl_ccharary2obj(char *, int, int);
extern VALUE dcl_cintegerary2obj(integer *, int, int, int *);
extern VALUE dcl_crealary2obj(real *, int, int, int *);
extern VALUE dcl_ccomplexary2obj(complex *, int, char *);
extern VALUE dcl_clogicalary2obj(logical *, int, int, int *);

extern void dcl_freeccharary(char *);
extern void dcl_freecintegerary(integer *);
extern void dcl_freecrealary(real *);
extern void dcl_freeccomplexary(complex *);
extern void dcl_freeclogicalary(logical *);

/* for functions which return doublereal */
/* fnclib */
extern doublereal rd2r_(real *);
extern doublereal rr2d_(real *);
extern doublereal rexp_(real *, integer *, integer *);
extern doublereal rfpi_(void);
extern doublereal rmod_(real *, real *);
/* gnmlib */
extern doublereal rgnlt_(real *);
extern doublereal rgnle_(real *);
extern doublereal rgngt_(real *);
extern doublereal rgnge_(real *);
/* rfalib */
extern doublereal rmax_(real *, integer *, integer *);
extern doublereal rmin_(real *, integer *, integer *);
extern doublereal rsum_(real *, integer *, integer *);
extern doublereal rave_(real *, integer *, integer *);
extern doublereal rvar_(real *, integer *, integer *);
extern doublereal rstd_(real *, integer *, integer *);
extern doublereal rrms_(real *, integer *, integer *);
extern doublereal ramp_(real *, integer *, integer *);
/* rfblib */
extern doublereal rprd_(real *, real *, integer *, integer *, integer *);
extern doublereal rcov_(real *, real *, integer *, integer *, integer *);
extern doublereal rcor_(real *, real *, integer *, integer *, integer *);


extern VALUE mDCL;

#if DCLVER >= 53

static VALUE
dcl_g2fbli(obj, p, q, z00, z10, z01, z11)
    VALUE obj, p, q, z00, z10, z01, z11;
{
    real i_p;
    real i_q;
    real i_z00;
    real i_z10;
    real i_z01;
    real i_z11;
    real o_z;
    VALUE z;

    if (TYPE(p) != T_FLOAT) {
      p = rb_funcall(p, rb_intern("to_f"), 0);
    }
    if (TYPE(q) != T_FLOAT) {
      q = rb_funcall(q, rb_intern("to_f"), 0);
    }
    if (TYPE(z00) != T_FLOAT) {
      z00 = rb_funcall(z00, rb_intern("to_f"), 0);
    }
    if (TYPE(z10) != T_FLOAT) {
      z10 = rb_funcall(z10, rb_intern("to_f"), 0);
    }
    if (TYPE(z01) != T_FLOAT) {
      z01 = rb_funcall(z01, rb_intern("to_f"), 0);
    }
    if (TYPE(z11) != T_FLOAT) {
      z11 = rb_funcall(z11, rb_intern("to_f"), 0);
    }

    i_p = (real)NUM2DBL(p);
    i_q = (real)NUM2DBL(q);
    i_z00 = (real)NUM2DBL(z00);
    i_z10 = (real)NUM2DBL(z10);
    i_z01 = (real)NUM2DBL(z01);
    i_z11 = (real)NUM2DBL(z11);


    g2fbli_(&i_p, &i_q, &i_z00, &i_z10, &i_z01, &i_z11, &o_z);

    z = rb_float_new((double)o_z);


    return z;

}

static VALUE
dcl_g2fbl2(obj, p, q, x00, x10, x01, x11, y00, y10, y01, y11)
    VALUE obj, p, q, x00, x10, x01, x11, y00, y10, y01, y11;
{
    real i_p;
    real i_q;
    real i_x00;
    real i_x10;
    real i_x01;
    real i_x11;
    real i_y00;
    real i_y10;
    real i_y01;
    real i_y11;
    real o_x;
    real o_y;
    VALUE x;
    VALUE y;

    if (TYPE(p) != T_FLOAT) {
      p = rb_funcall(p, rb_intern("to_f"), 0);
    }
    if (TYPE(q) != T_FLOAT) {
      q = rb_funcall(q, rb_intern("to_f"), 0);
    }
    if (TYPE(x00) != T_FLOAT) {
      x00 = rb_funcall(x00, rb_intern("to_f"), 0);
    }
    if (TYPE(x10) != T_FLOAT) {
      x10 = rb_funcall(x10, rb_intern("to_f"), 0);
    }
    if (TYPE(x01) != T_FLOAT) {
      x01 = rb_funcall(x01, rb_intern("to_f"), 0);
    }
    if (TYPE(x11) != T_FLOAT) {
      x11 = rb_funcall(x11, rb_intern("to_f"), 0);
    }
    if (TYPE(y00) != T_FLOAT) {
      y00 = rb_funcall(y00, rb_intern("to_f"), 0);
    }
    if (TYPE(y10) != T_FLOAT) {
      y10 = rb_funcall(y10, rb_intern("to_f"), 0);
    }
    if (TYPE(y01) != T_FLOAT) {
      y01 = rb_funcall(y01, rb_intern("to_f"), 0);
    }
    if (TYPE(y11) != T_FLOAT) {
      y11 = rb_funcall(y11, rb_intern("to_f"), 0);
    }

    i_p = (real)NUM2DBL(p);
    i_q = (real)NUM2DBL(q);
    i_x00 = (real)NUM2DBL(x00);
    i_x10 = (real)NUM2DBL(x10);
    i_x01 = (real)NUM2DBL(x01);
    i_x11 = (real)NUM2DBL(x11);
    i_y00 = (real)NUM2DBL(y00);
    i_y10 = (real)NUM2DBL(y10);
    i_y01 = (real)NUM2DBL(y01);
    i_y11 = (real)NUM2DBL(y11);


    g2fbl2_(&i_p, &i_q, &i_x00, &i_x10, &i_x01, &i_x11, &i_y00, &i_y10, &i_y01, &i_y11, &o_x, &o_y);

    x = rb_float_new((double)o_x);
    y = rb_float_new((double)o_y);


    return rb_ary_new3(2, x, y);

}

static VALUE
dcl_g2ibl2(obj, x, y, x00, x10, x01, x11, y00, y10, y01, y11)
    VALUE obj, x, y, x00, x10, x01, x11, y00, y10, y01, y11;
{
    real i_x;
    real i_y;
    real i_x00;
    real i_x10;
    real i_x01;
    real i_x11;
    real i_y00;
    real i_y10;
    real i_y01;
    real i_y11;
    real o_p;
    real o_q;
    VALUE p;
    VALUE q;

    if (TYPE(x) != T_FLOAT) {
      x = rb_funcall(x, rb_intern("to_f"), 0);
    }
    if (TYPE(y) != T_FLOAT) {
      y = rb_funcall(y, rb_intern("to_f"), 0);
    }
    if (TYPE(x00) != T_FLOAT) {
      x00 = rb_funcall(x00, rb_intern("to_f"), 0);
    }
    if (TYPE(x10) != T_FLOAT) {
      x10 = rb_funcall(x10, rb_intern("to_f"), 0);
    }
    if (TYPE(x01) != T_FLOAT) {
      x01 = rb_funcall(x01, rb_intern("to_f"), 0);
    }
    if (TYPE(x11) != T_FLOAT) {
      x11 = rb_funcall(x11, rb_intern("to_f"), 0);
    }
    if (TYPE(y00) != T_FLOAT) {
      y00 = rb_funcall(y00, rb_intern("to_f"), 0);
    }
    if (TYPE(y10) != T_FLOAT) {
      y10 = rb_funcall(y10, rb_intern("to_f"), 0);
    }
    if (TYPE(y01) != T_FLOAT) {
      y01 = rb_funcall(y01, rb_intern("to_f"), 0);
    }
    if (TYPE(y11) != T_FLOAT) {
      y11 = rb_funcall(y11, rb_intern("to_f"), 0);
    }

    i_x = (real)NUM2DBL(x);
    i_y = (real)NUM2DBL(y);
    i_x00 = (real)NUM2DBL(x00);
    i_x10 = (real)NUM2DBL(x10);
    i_x01 = (real)NUM2DBL(x01);
    i_x11 = (real)NUM2DBL(x11);
    i_y00 = (real)NUM2DBL(y00);
    i_y10 = (real)NUM2DBL(y10);
    i_y01 = (real)NUM2DBL(y01);
    i_y11 = (real)NUM2DBL(y11);


    g2ibl2_(&i_x, &i_y, &i_x00, &i_x10, &i_x01, &i_x11, &i_y00, &i_y10, &i_y01, &i_y11, &o_p, &o_q);

    p = rb_float_new((double)o_p);
    q = rb_float_new((double)o_q);


    return rb_ary_new3(2, p, q);

}

static VALUE
dcl_g2fctr(obj, ux, uy)
    VALUE obj, ux, uy;
{
    real i_ux;
    real i_uy;
    real o_cx;
    real o_cy;
    VALUE cx;
    VALUE cy;

    if (TYPE(ux) != T_FLOAT) {
      ux = rb_funcall(ux, rb_intern("to_f"), 0);
    }
    if (TYPE(uy) != T_FLOAT) {
      uy = rb_funcall(uy, rb_intern("to_f"), 0);
    }

    i_ux = (real)NUM2DBL(ux);
    i_uy = (real)NUM2DBL(uy);


    g2fctr_(&i_ux, &i_uy, &o_cx, &o_cy);

    cx = rb_float_new((double)o_cx);
    cy = rb_float_new((double)o_cy);


    return rb_ary_new3(2, cx, cy);

}

static VALUE
dcl_g2ictr(obj, cx, cy)
    VALUE obj, cx, cy;
{
    real i_cx;
    real i_cy;
    real o_ux;
    real o_uy;
    VALUE ux;
    VALUE uy;

    if (TYPE(cx) != T_FLOAT) {
      cx = rb_funcall(cx, rb_intern("to_f"), 0);
    }
    if (TYPE(cy) != T_FLOAT) {
      cy = rb_funcall(cy, rb_intern("to_f"), 0);
    }

    i_cx = (real)NUM2DBL(cx);
    i_cy = (real)NUM2DBL(cy);


    g2ictr_(&i_cx, &i_cy, &o_ux, &o_uy);

    ux = rb_float_new((double)o_ux);
    uy = rb_float_new((double)o_uy);


    return rb_ary_new3(2, ux, uy);

}

static VALUE
dcl_g2qcti(obj)
    VALUE obj;
{
    logical o_lini;
    VALUE lini;

    g2qcti_(&o_lini);

    lini = (o_lini == FALSE_) ? Qfalse : Qtrue;


    return lini;

}

static VALUE
dcl_g2qctm(obj)
    VALUE obj;
{
    real o_cxmine;
    real o_cxmaxe;
    real o_cymine;
    real o_cymaxe;
    VALUE cxmine;
    VALUE cxmaxe;
    VALUE cymine;
    VALUE cymaxe;

    g2qctm_(&o_cxmine, &o_cxmaxe, &o_cymine, &o_cymaxe);

    cxmine = rb_float_new((double)o_cxmine);
    cxmaxe = rb_float_new((double)o_cxmaxe);
    cymine = rb_float_new((double)o_cymine);
    cymaxe = rb_float_new((double)o_cymaxe);


    return rb_ary_new3(4, cxmine, cxmaxe, cymine, cymaxe);

}

static VALUE
dcl_g2sctr(obj, nx, ny, uxa, uya, cxa, cya)
    VALUE obj, nx, ny, uxa, uya, cxa, cya;
{
    integer i_nx;
    integer i_ny;
    real *i_uxa;
    real *i_uya;
    real *i_cxa;
    real *i_cya;

    if ((TYPE(nx) != T_BIGNUM) || (TYPE(nx) != T_FIXNUM)) {
      nx = rb_funcall(nx, rb_intern("to_i"), 0);
    }
    if ((TYPE(ny) != T_BIGNUM) || (TYPE(ny) != T_FIXNUM)) {
      ny = rb_funcall(ny, rb_intern("to_i"), 0);
    }
    if (TYPE(uxa) == T_FLOAT) {
      uxa = rb_Array(uxa);
    }
    /* if ((TYPE(uxa) != T_ARRAY) && 
           (rb_obj_is_kind_of(uxa, cNArray) != Qtrue)) {
         rb_raise(rb_eTypeError, "invalid type");
       }  -- no check since obj2c*ary will do that */
    if (TYPE(uya) == T_FLOAT) {
      uya = rb_Array(uya);
    }
    /* if ((TYPE(uya) != T_ARRAY) && 
           (rb_obj_is_kind_of(uya, cNArray) != Qtrue)) {
         rb_raise(rb_eTypeError, "invalid type");
       }  -- no check since obj2c*ary will do that */
    if (TYPE(cxa) == T_FLOAT) {
      cxa = rb_Array(cxa);
    }
    /* if ((TYPE(cxa) != T_ARRAY) && 
           (rb_obj_is_kind_of(cxa, cNArray) != Qtrue)) {
         rb_raise(rb_eTypeError, "invalid type");
       }  -- no check since obj2c*ary will do that */
    if (TYPE(cya) == T_FLOAT) {
      cya = rb_Array(cya);
    }
    /* if ((TYPE(cya) != T_ARRAY) && 
           (rb_obj_is_kind_of(cya, cNArray) != Qtrue)) {
         rb_raise(rb_eTypeError, "invalid type");
       }  -- no check since obj2c*ary will do that */

    i_nx = NUM2INT(nx);
    i_ny = NUM2INT(ny);
    i_uxa = dcl_obj2crealary(uxa);
    i_uya = dcl_obj2crealary(uya);
    i_cxa = dcl_obj2crealary(cxa);
    i_cya = dcl_obj2crealary(cya);


    g2sctr_(&i_nx, &i_ny, i_uxa, i_uya, i_cxa, i_cya);

    dcl_freecrealary(i_uxa);
    dcl_freecrealary(i_uya);
    dcl_freecrealary(i_cxa);
    dcl_freecrealary(i_cya);

    return Qnil;

}

static VALUE
dcl_lg2inq(obj, cx, cy, cx00, cx10, cx01, cx11, cy00, cy10, cy01, cy11)
    VALUE obj, cx, cy, cx00, cx10, cx01, cx11, cy00, cy10, cy01, cy11;
{
    real i_cx;
    real i_cy;
    real i_cx00;
    real i_cx10;
    real i_cx01;
    real i_cx11;
    real i_cy00;
    real i_cy10;
    real i_cy01;
    real i_cy11;
    logical o_rtn_val;
    VALUE rtn_val;

    if (TYPE(cx) != T_FLOAT) {
      cx = rb_funcall(cx, rb_intern("to_f"), 0);
    }
    if (TYPE(cy) != T_FLOAT) {
      cy = rb_funcall(cy, rb_intern("to_f"), 0);
    }
    if (TYPE(cx00) != T_FLOAT) {
      cx00 = rb_funcall(cx00, rb_intern("to_f"), 0);
    }
    if (TYPE(cx10) != T_FLOAT) {
      cx10 = rb_funcall(cx10, rb_intern("to_f"), 0);
    }
    if (TYPE(cx01) != T_FLOAT) {
      cx01 = rb_funcall(cx01, rb_intern("to_f"), 0);
    }
    if (TYPE(cx11) != T_FLOAT) {
      cx11 = rb_funcall(cx11, rb_intern("to_f"), 0);
    }
    if (TYPE(cy00) != T_FLOAT) {
      cy00 = rb_funcall(cy00, rb_intern("to_f"), 0);
    }
    if (TYPE(cy10) != T_FLOAT) {
      cy10 = rb_funcall(cy10, rb_intern("to_f"), 0);
    }
    if (TYPE(cy01) != T_FLOAT) {
      cy01 = rb_funcall(cy01, rb_intern("to_f"), 0);
    }
    if (TYPE(cy11) != T_FLOAT) {
      cy11 = rb_funcall(cy11, rb_intern("to_f"), 0);
    }

    i_cx = (real)NUM2DBL(cx);
    i_cy = (real)NUM2DBL(cy);
    i_cx00 = (real)NUM2DBL(cx00);
    i_cx10 = (real)NUM2DBL(cx10);
    i_cx01 = (real)NUM2DBL(cx01);
    i_cx11 = (real)NUM2DBL(cx11);
    i_cy00 = (real)NUM2DBL(cy00);
    i_cy10 = (real)NUM2DBL(cy10);
    i_cy01 = (real)NUM2DBL(cy01);
    i_cy11 = (real)NUM2DBL(cy11);


    o_rtn_val = lg2inq_(&i_cx, &i_cy, &i_cx00, &i_cx10, &i_cx01, &i_cx11, &i_cy00, &i_cy10, &i_cy01, &i_cy11);

    rtn_val = (o_rtn_val == FALSE_) ? Qfalse : Qtrue;


    return rtn_val;

}

#endif
void
init_math1_gt2dlib(mDCL)
VALUE mDCL;
{
#if DCLVER >= 53
    rb_define_module_function(mDCL, "g2fbli", dcl_g2fbli, 6);
    rb_define_module_function(mDCL, "g2fbl2", dcl_g2fbl2, 10);
    rb_define_module_function(mDCL, "g2ibl2", dcl_g2ibl2, 10);
    rb_define_module_function(mDCL, "g2fctr", dcl_g2fctr, 2);
    rb_define_module_function(mDCL, "g2ictr", dcl_g2ictr, 2);
    rb_define_module_function(mDCL, "g2qcti", dcl_g2qcti, 0);
    rb_define_module_function(mDCL, "g2qctm", dcl_g2qctm, 0);
    rb_define_module_function(mDCL, "g2sctr", dcl_g2sctr, 6);
    rb_define_module_function(mDCL, "lg2inq", dcl_lg2inq, 10);
#endif
}


syntax highlighted by Code2HTML, v. 0.9.1