#ifndef __COMPLEX__
#define __COMPLEX__

#ifndef __MATH
#include <math.h>
#endif /* __MATH */

#ifndef __CPORTAB
#include "cportab.h"
#endif /* __CPORTAB */

/*
 * --------------------- Typdefinitionen ---------------------------------
 */
typedef struct 
{
	double re;
	double im;
} Tcomplex;

/*
 * --------------------- Defines -----------------------------------------
 */
#define CX_CPY( d, s)       {(d).re=(s).re;(d).im=(s).im;}
#define CX_RE( z)           ((z).re)
#define CX_IM( z)           ((z).im)
#define CX_DEF( z, r, i)    {(z).re=r;(z).im=i;}
#define CX_EQ( z1, z2)      (((z1).re==(z2).re) && ((z1).im==(z2).im))
#define CX_ADD( s, z1, z2)  {(s).re=(z1).re+(z2).re; \
                             (s).im=(z1).im+(z2).im;}
#define CX_SUB( d, z1, z2)  {(d).re=(z1).re-(z2).re; \
                             (d).im=(z1).im-(z2).im;}
#define CX_NEG( z)          {(z).re=-(z).re;(z).im=-(z).im;}
#define CX_MULT( p, z1, z2) {(p).re=(z1).re*(z2).re-(z1).im*(z2).im; \
                             (p).im=(z1).re*(z2).im+(z1).im*(z2).re;}
#define CX_KONJ( z)         ((z).im=-(z).im)
#define CX_BTRGQ( z)        (SQR((z).re)+SQR((z).im))
#define CX_BTRG( z)         (sqrt(CX_BTRGQ(z)))
#define CX_SQR( q, z)       {(q).re=((z).re+(z).im)*((z).re-(z).im); \
                             (q).im=2*(z).re*(z).im;}

/*
 * --------------------- Prototypen --------------------------------------
 */
GLOBAL Tcomplex cx_add _((Tcomplex z1, Tcomplex z2));
GLOBAL Tcomplex cx_sub _((Tcomplex z1, Tcomplex z2));
GLOBAL Tcomplex cx_mult _((Tcomplex z1, Tcomplex z2));
GLOBAL Tcomplex cx_div _((Tcomplex z1, Tcomplex z2));
GLOBAL Tcomplex cx_konj _((Tcomplex z));
GLOBAL Tcomplex cx_sgn _((Tcomplex z));
GLOBAL Tcomplex cx_inv _((Tcomplex z));
GLOBAL Tcomplex cx_sqr _((Tcomplex z));
GLOBAL Tcomplex cx_sqrt _((Tcomplex z));
GLOBAL Tcomplex cx_npow _((Tcomplex z, LONG n));
GLOBAL double cx_btrgq _((Tcomplex z));
GLOBAL double cx_btrg _((Tcomplex z));
GLOBAL double cx_arg _((Tcomplex z));
GLOBAL Tcomplex cx_poltocart _((double b, double a));
GLOBAL void cx_riemann _((double *x1, double *x2, double *x3, Tcomplex z));
GLOBAL Tcomplex cx_criem _((double x1, double x2, double x3));
GLOBAL Tcomplex cx_exp _((Tcomplex z));
GLOBAL Tcomplex cx_ln _((Tcomplex z));
GLOBAL Tcomplex cx_sin _((Tcomplex z));
GLOBAL Tcomplex cx_cos _((Tcomplex z));
GLOBAL Tcomplex cx_tan _((Tcomplex z));
GLOBAL Tcomplex cx_sinh _((Tcomplex z));
GLOBAL Tcomplex cx_cosh _((Tcomplex z));
GLOBAL Tcomplex cx_tanh _((Tcomplex z));
GLOBAL Tcomplex cx_arcsin _((Tcomplex z));
GLOBAL Tcomplex cx_arccos _((Tcomplex z));
GLOBAL Tcomplex cx_arctan _((Tcomplex z));
GLOBAL Tcomplex cx_arsinh _((Tcomplex z));
GLOBAL Tcomplex cx_arcosh _((Tcomplex z));
GLOBAL Tcomplex cx_artanh _((Tcomplex z));

#endif /* __COMPLEX__ */
