/* srotm.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"

/* Subroutine */ void srotm_(integer *n, real *sx, integer *incx, real *sy, integer *incy, real *sparam) {
  /* Initialized data */

  static real zero = 0.f;
  static real two = 2.f;

  /* System generated locals */
  integer i__1, i__2;

  /* Local variables */
  integer i__;
  real w, z__;
  integer kx, ky;
  real sh11, sh12, sh21, sh22, sflag;
  integer nsteps;

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

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

  /*     APPLY THE MODIFIED GIVENS TRANSFORMATION, H, TO THE 2 BY N MATRIX */

  /*     (SX**T) , WHERE **T INDICATES TRANSPOSE. THE ELEMENTS OF SX ARE IN */
  /*     (DX**T) */

  /*     SX(LX+I*INCX), I = 0 TO N-1, WHERE LX = 1 IF INCX .GE. 0, ELSE */
  /*     LX = (-INCX)*N, AND SIMILARLY FOR SY USING USING LY AND INCY. */
  /*     WITH SPARAM(1)=SFLAG, H HAS ONE OF THE FOLLOWING FORMS.. */

  /*     SFLAG=-1.E0     SFLAG=0.E0        SFLAG=1.E0     SFLAG=-2.E0 */

  /*       (SH11  SH12)    (1.E0  SH12)    (SH11  1.E0)    (1.E0  0.E0) */
  /*     H=(          )    (          )    (          )    (          ) */
  /*       (SH21  SH22),   (SH21  1.E0),   (-1.E0 SH22),   (0.E0  1.E0). */
  /*     SEE  SROTMG FOR A DESCRIPTION OF DATA STORAGE IN SPARAM. */

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

  /*  N      (input) INTEGER */
  /*         number of elements in input vector(s) */

  /*  SX     (input/output) REAL array, dimension N */
  /*         double precision vector with N elements */

  /*  INCX   (input) INTEGER */
  /*         storage spacing between elements of SX */

  /*  SY     (input/output) REAL array, dimension N */
  /*         double precision vector with N elements */

  /*  INCY   (input) INTEGER */
  /*         storage spacing between elements of SY */

  /*  SPARAM (input/output)  REAL array, dimension 5 */
  /*     SPARAM(1)=SFLAG */
  /*     SPARAM(2)=SH11 */
  /*     SPARAM(3)=SH21 */
  /*     SPARAM(4)=SH12 */
  /*     SPARAM(5)=SH22 */

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

  /*     .. Local Scalars .. */
  /*     .. */
  /*     .. Data statements .. */
  /* Parameter adjustments */
  --sparam;
  --sy;
  --sx;

  /* Function Body */
  /*     .. */

  sflag = sparam[1];
  if (*n <= 0 || sflag + two == zero) {
    goto L140;
  }
  if (!(*incx == *incy && *incx > 0)) {
    goto L70;
  }

  nsteps = *n * *incx;
  if (sflag < 0.f) {
    goto L50;
  } else if (sflag == 0) {
    goto L10;
  } else {
    goto L30;
  }
L10:
  sh12 = sparam[4];
  sh21 = sparam[3];
  i__1 = nsteps;
  i__2 = *incx;
  for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) {
    w = sx[i__];
    z__ = sy[i__];
    sx[i__] = w + z__ * sh12;
    sy[i__] = w * sh21 + z__;
    /* L20: */
  }
  goto L140;
L30:
  sh11 = sparam[2];
  sh22 = sparam[5];
  i__2 = nsteps;
  i__1 = *incx;
  for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) {
    w = sx[i__];
    z__ = sy[i__];
    sx[i__] = w * sh11 + z__;
    sy[i__] = -w + sh22 * z__;
    /* L40: */
  }
  goto L140;
L50:
  sh11 = sparam[2];
  sh12 = sparam[4];
  sh21 = sparam[3];
  sh22 = sparam[5];
  i__1 = nsteps;
  i__2 = *incx;
  for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) {
    w = sx[i__];
    z__ = sy[i__];
    sx[i__] = w * sh11 + z__ * sh12;
    sy[i__] = w * sh21 + z__ * sh22;
    /* L60: */
  }
  goto L140;
L70:
  kx = 1;
  ky = 1;
  if (*incx < 0) {
    kx = (1 - *n) * *incx + 1;
  }
  if (*incy < 0) {
    ky = (1 - *n) * *incy + 1;
  }

  if (sflag < 0.f) {
    goto L120;
  } else if (sflag == 0) {
    goto L80;
  } else {
    goto L100;
  }
L80:
  sh12 = sparam[4];
  sh21 = sparam[3];
  i__2 = *n;
  for (i__ = 1; i__ <= i__2; ++i__) {
    w = sx[kx];
    z__ = sy[ky];
    sx[kx] = w + z__ * sh12;
    sy[ky] = w * sh21 + z__;
    kx += *incx;
    ky += *incy;
    /* L90: */
  }
  goto L140;
L100:
  sh11 = sparam[2];
  sh22 = sparam[5];
  i__2 = *n;
  for (i__ = 1; i__ <= i__2; ++i__) {
    w = sx[kx];
    z__ = sy[ky];
    sx[kx] = w * sh11 + z__;
    sy[ky] = -w + sh22 * z__;
    kx += *incx;
    ky += *incy;
    /* L110: */
  }
  goto L140;
L120:
  sh11 = sparam[2];
  sh12 = sparam[4];
  sh21 = sparam[3];
  sh22 = sparam[5];
  i__2 = *n;
  for (i__ = 1; i__ <= i__2; ++i__) {
    w = sx[kx];
    z__ = sy[ky];
    sx[kx] = w * sh11 + z__ * sh12;
    sy[ky] = w * sh21 + z__ * sh22;
    kx += *incx;
    ky += *incy;
    /* L130: */
  }
L140:
  return;
} /* srotm_ */
