/*Translated by FOR_C, v3.4.2 (-), on 07/09/115 at 08:30:11 */
/*FOR_C Options SET: ftn=u io=c no=p op=aimnv s=dbov str=l x=f - prototypes */
#include <math.h>
#include "fcrt.h"
#include "srotmg.h"
#include <stdlib.h>
void /*FUNCTION*/ srotmg(
float *d1,
float *d2,
float *x1,
float y1,
float param[])
{
	float h11, h12, h21, h22, p1, p2, pflag, q1, q2, temp, u;
	static float gam = 4096.e0;
	static float gamsq = 16777216.e0;
	static float rgamsq = 5.9604645e-8;
		/* OFFSET Vectors w/subscript range: 1 to dimension */
	float *const Param = &param[0] - 1;
		/* end of OFFSET VECTORS */
 
	/* Copyright (c) 1996 California Institute of Technology, Pasadena, CA.
	 * ALL RIGHTS RESERVED.
	 * Based on Government Sponsored Research NAS7-03001.
	 *>> 2006-06-07 SROTMG Krogh  Removed arithmetic ifs
	 *>> 1999-12-30 SROTMG Krogh  Big reorg., no more assigned goto's.
	 *>> 1999-12-22 SROTMG Krogh  Declared IGO.
	 *>> 1994-10-20 SROTMG Krogh  Changes to use M77CON
	 *>> 1994-04-19 SROTMG Krogh   Converted to use generic intrinsics.
	 *>> 1985-08-02 SROTMG Lawson  Initial code.
	 *--S replaces "?": ?ROTMG
	 *
	 *     CONSTRUCT THE MODIFIED GIVENS TRANSFORMATION MATRIX H WHICH ZEROS
	 *     THE SECOND COMPONENT OF THE 2-VECTOR  (SQRT(D1)*X1,SQRT(D2)*
	 *     Y1)**T.
	 *     WITH PARAM(1)=PFLAG, H HAS ONE OF THE FOLLOWING FORMS..
	 *
	 *     PFLAG=-1.E0     PFLAG=0.E0        PFLAG=1.E0     PFLAG=-2.E0
	 *
	 *       (H11  H12)    (1.E0  H12)    (H11  1.E0)    (1.E0  0.E0)
	 *     H=(        )    (         )    (         )    (          )
	 *       (H21  H22),   (H21  1.E0),   (-1.E0 H22),   (0.E0  1.E0).
	 *     LOCATIONS 2-5 OF PARAM CONTAIN H11, H21, H12, AND H22
	 *     RESPECTIVELY. (VALUES OF 1.E0, -1.E0, OR 0.E0 IMPLIED BY THE
	 *     VALUE OF PARAM(1) ARE NOT STORED IN PARAM.)
	 *
	 *     THE VALUES OF GAMSQ AND RGAMSQ SET IN THE DATA STATEMENT MAY BE
	 *     INEXACT.  THIS IS OK AS THEY ARE ONLY USED FOR TESTING THE SIZE
	 *     OF D1 AND D2.  ALL ACTUAL SCALING OF DATA IS DONE USING GAM.
	 * */
 
	if (*d1 < 0.e0)
		goto L_210;
	p2 = *d2*y1;
	if (p2 == 0.e0)
	{
		pflag = -2.e0;
		goto L_260;
	}
	/*     Regular case */
	p1 = *d1**x1;
	q2 = p2*y1;
	q1 = p1**x1;
	if (fabsf( q1 ) > fabsf( q2 ))
	{
		h21 = -y1/ *x1;
		h12 = p2/p1;
		u = 1.e0 - h12*h21;
		if (u <= 0.e0)
			goto L_210;
		pflag = 0.e0;
		*d1 /= u;
		*d2 /= u;
		*x1 *= u;
	}
	else
	{
		if (q2 < 0.e0)
			goto L_210;
		pflag = 1.e0;
		h11 = p1/p2;
		h22 = *x1/y1;
		u = 1.e0 + h11*h22;
		temp = *d2/u;
		*d2 = *d1/u;
		*d1 = temp;
		*x1 = y1*u;
	}
 
	/*     Scale Check */
L_100:
	if (*d1 <= *d2)
	{
		if (*d1 <= rgamsq)
		{
			if (*d1 != 0.e0)
			{
				if (pflag >= 0.e0)
					goto L_150;
				*d1 *= SQ(gam);
				*x1 /= gam;
				h11 /= gam;
				h12 /= gam;
				goto L_100;
			}
		}
		if (fabsf( *d2 ) < gamsq)
			goto L_220;
		if (pflag >= 0.e0)
			goto L_150;
		*d2 = *d2/SQ(gam);
		h21 *= gam;
		h22 *= gam;
		goto L_100;
	}
	else
	{
		if (fabsf( *d2 ) <= rgamsq)
		{
			if (pflag >= 0.e0)
				goto L_150;
			*d2 *= SQ(gam);
			h21 /= gam;
			h22 /= gam;
			goto L_100;
		}
		if (*d1 < gamsq)
			goto L_220;
		if (pflag >= 0.e0)
			goto L_150;
		*d1 = *d1/SQ(gam);
		*x1 *= gam;
		h11 *= gam;
		h12 *= gam;
		goto L_100;
	}
 
	/*     Fix H */
L_150:
	if (pflag == 0.e0)
	{
		h11 = 1.e0;
		h22 = 1.e0;
	}
	else
	{
		h21 = -1.e0;
		h12 = 1.e0;
	}
	pflag = -1.e0;
	goto L_100;
 
	/*     Zero H, D, and X1 */
L_210:
	pflag = -1.e0;
	h11 = 0.e0;
	h12 = 0.e0;
	h21 = 0.e0;
	h22 = 0.e0;
 
	*d1 = 0.e0;
	*d2 = 0.e0;
	*x1 = 0.e0;
 
	/*     Return */
L_220:
	;
	if (pflag == 0.e0)
	{
		Param[3] = h21;
		Param[4] = h12;
	}
	else if (pflag > 0.e0)
	{
 
		Param[2] = h11;
		Param[5] = h22;
	}
	else
	{
		Param[2] = h11;
		Param[3] = h21;
		Param[4] = h12;
		Param[5] = h22;
	}
L_260:
	Param[1] = pflag;
	return;
} /* end of function */