1 /*
2 * cblas_zhpr2.c
3 * The program is a C interface to zhpr2.
4 *
5 * Keita Teranishi 5/20/98
6 *
7 */
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include "cblas.h"
11 #include "cblas_f77.h"
cblas_zhpr2(const CBLAS_LAYOUT layout,const CBLAS_UPLO Uplo,const CBLAS_INDEX N,const void * alpha,const void * X,const CBLAS_INDEX incX,const void * Y,const CBLAS_INDEX incY,void * Ap)12 void cblas_zhpr2(const CBLAS_LAYOUT layout, const CBLAS_UPLO Uplo,
13 const CBLAS_INDEX N,const void *alpha, const void *X,
14 const CBLAS_INDEX incX,const void *Y, const CBLAS_INDEX incY, void *Ap)
15
16 {
17 char UL;
18 #ifdef F77_CHAR
19 F77_CHAR F77_UL;
20 #else
21 #define F77_UL &UL
22 #endif
23
24 #ifdef F77_INT
25 F77_INT F77_N=N, F77_incX=incX, F77_incY=incY;
26 #else
27 #define F77_N N
28 #define F77_incX incx
29 #define F77_incY incy
30 #endif
31 CBLAS_INDEX n, i, j, incx=incX, incy=incY;
32 double *x=(double *)X, *xx=(double *)X, *y=(double *)Y,
33 *yy=(double *)Y, *stx, *sty;
34
35 extern int CBLAS_CallFromC;
36 extern int RowMajorStrg;
37 RowMajorStrg = 0;
38
39 CBLAS_CallFromC = 1;
40 if (layout == CblasColMajor)
41 {
42 if (Uplo == CblasLower) UL = 'L';
43 else if (Uplo == CblasUpper) UL = 'U';
44 else
45 {
46 cblas_xerbla(2, "cblas_zhpr2","Illegal Uplo setting, %d\n",Uplo );
47 CBLAS_CallFromC = 0;
48 RowMajorStrg = 0;
49 return;
50 }
51 #ifdef F77_CHAR
52 F77_UL = C2F_CHAR(&UL);
53 #endif
54
55 F77_zhpr2(F77_UL, &F77_N, alpha, X, &F77_incX, Y, &F77_incY, Ap);
56
57 } else if (layout == CblasRowMajor)
58 {
59 RowMajorStrg = 1;
60 if (Uplo == CblasUpper) UL = 'L';
61 else if (Uplo == CblasLower) UL = 'U';
62 else
63 {
64 cblas_xerbla(2, "cblas_zhpr2","Illegal Uplo setting, %d\n", Uplo);
65 CBLAS_CallFromC = 0;
66 RowMajorStrg = 0;
67 return;
68 }
69 #ifdef F77_CHAR
70 F77_UL = C2F_CHAR(&UL);
71 #endif
72 if (N > 0)
73 {
74 n = N << 1;
75 x = malloc(n*sizeof(double));
76 y = malloc(n*sizeof(double));
77 stx = x + n;
78 sty = y + n;
79 if( incX > 0 )
80 i = incX << 1;
81 else
82 i = incX *(-2);
83
84 if( incY > 0 )
85 j = incY << 1;
86 else
87 j = incY *(-2);
88 do
89 {
90 *x = *xx;
91 x[1] = -xx[1];
92 x += 2;
93 xx += i;
94 } while (x != stx);
95 do
96 {
97 *y = *yy;
98 y[1] = -yy[1];
99 y += 2;
100 yy += j;
101 }
102 while (y != sty);
103 x -= n;
104 y -= n;
105
106 #ifdef F77_INT
107 if(incX > 0 )
108 F77_incX = 1;
109 else
110 F77_incX = -1;
111
112 if(incY > 0 )
113 F77_incY = 1;
114 else
115 F77_incY = -1;
116
117 #else
118 if(incX > 0 )
119 incx = 1;
120 else
121 incx = -1;
122
123 if(incY > 0 )
124 incy = 1;
125 else
126 incy = -1;
127 #endif
128
129 } else
130 {
131 x = (double *) X;
132 y = (void *) Y;
133 }
134 F77_zhpr2(F77_UL, &F77_N, alpha, y, &F77_incY, x, &F77_incX, Ap);
135 }
136 else
137 {
138 cblas_xerbla(1, "cblas_zhpr2","Illegal layout setting, %d\n", layout);
139 CBLAS_CallFromC = 0;
140 RowMajorStrg = 0;
141 return;
142 }
143 if(X!=x)
144 free(x);
145 if(Y!=y)
146 free(y);
147 CBLAS_CallFromC = 0;
148 RowMajorStrg = 0;
149 return;
150 }
151