/* zladiv.f -- translated by f2c (version 20061008).
   You must link the resulting object file with libf2c:
        on Microsoft Windows system, link with libf2c.lib;
        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
        or, if you install libf2c.a in a standard place, with -lf2c -lm
        -- in that order, at the end of the command line, as in
                cc *.o -lf2c -lm
        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,

                http://www.netlib.org/f2c/libf2c.zip
*/

#include "blaswrap.h"
#include "lapack_datatypes.h"

/* Double Complex */ void zladiv_(doublecomplex *ret_val, doublecomplex *x, doublecomplex *y) {
  /* System generated locals */
  doublereal d__1, d__2, d__3, d__4;
  doublecomplex z__1;

  /* Local variables */
  doublereal zi, zr;
  extern /* Subroutine */ void dladiv_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *,
                                       doublereal *);

  /*  -- LAPACK auxiliary routine (version 3.2) -- */
  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
  /*     November 2006 */

  /*     .. Scalar Arguments .. */
  /*     .. */

  /*  Purpose */
  /*  ======= */

  /*  ZLADIV := X / Y, where X and Y are complex.  The computation of X / Y */
  /*  will not overflow on an intermediary step unless the results */
  /*  overflows. */

  /*  Arguments */
  /*  ========= */

  /*  X       (input) COMPLEX*16 */
  /*  Y       (input) COMPLEX*16 */
  /*          The complex scalars X and Y. */

  /*  ===================================================================== */

  /*     .. Local Scalars .. */
  /*     .. */
  /*     .. External Subroutines .. */
  /*     .. */
  /*     .. Intrinsic Functions .. */
  /*     .. */
  /*     .. Executable Statements .. */

  d__1 = x->r;
  d__2 = x->i;
  d__3 = y->r;
  d__4 = y->i;
  dladiv_(&d__1, &d__2, &d__3, &d__4, &zr, &zi);
  z__1.r = zr, z__1.i = zi;
  ret_val->r = z__1.r, ret_val->i = z__1.i;

  /*     End of ZLADIV */

} /* zladiv_ */
