/* 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 */ int 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 */ int 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 */ int 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 */ int 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_ */
