/* This file has been modified to use the standard gfortran calling
   convention, rather than the f2c calling convention.

   It does not require -ff2c when compiled with gfortran.
*/

/* complexdots.f -- translated by f2c (version 20100827).
   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 "datatypes.h"

complex cdotc_(integer *n, complex *cx, integer *incx, complex *cy, integer *incy) {
  complex res;
  extern /* Subroutine */ void cdotcw_(integer *, complex *, integer *, complex *, integer *, complex *);

  /* Parameter adjustments */
  --cy;
  --cx;

  /* Function Body */
  cdotcw_(n, &cx[1], incx, &cy[1], incy, &res);
  return res;
} /* cdotc_ */

complex cdotu_(integer *n, complex *cx, integer *incx, complex *cy, integer *incy) {
  complex res;
  extern /* Subroutine */ void cdotuw_(integer *, complex *, integer *, complex *, integer *, complex *);

  /* Parameter adjustments */
  --cy;
  --cx;

  /* Function Body */
  cdotuw_(n, &cx[1], incx, &cy[1], incy, &res);
  return res;
} /* cdotu_ */

doublecomplex zdotc_(integer *n, doublecomplex *cx, integer *incx, doublecomplex *cy, integer *incy) {
  doublecomplex res;
  extern /* Subroutine */ void zdotcw_(integer *, doublecomplex *, integer *, doublecomplex *, integer *,
                                       doublecomplex *);

  /* Parameter adjustments */
  --cy;
  --cx;

  /* Function Body */
  zdotcw_(n, &cx[1], incx, &cy[1], incy, &res);
  return res;
} /* zdotc_ */

doublecomplex zdotu_(integer *n, doublecomplex *cx, integer *incx, doublecomplex *cy, integer *incy) {
  doublecomplex res;
  extern /* Subroutine */ void zdotuw_(integer *, doublecomplex *, integer *, doublecomplex *, integer *,
                                       doublecomplex *);

  /* Parameter adjustments */
  --cy;
  --cx;

  /* Function Body */
  zdotuw_(n, &cx[1], incx, &cy[1], incy, &res);
  return res;
} /* zdotu_ */
