1 /*
2 * cblas_cher.c
3 * The program is a C interface to cher.
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_cher(const enum CBLAS_ORDER order,const enum CBLAS_UPLO Uplo,const int N,const float alpha,const void * X,const int incX,void * A,const int lda)12 void cblas_cher(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
13 const int N, const float alpha, const void *X, const int incX
14 ,void *A, const int lda)
15 {
16 char UL;
17 #ifdef F77_CHAR
18 F77_CHAR F77_UL;
19 #else
20 #define F77_UL &UL
21 #endif
22
23 #ifdef F77_INT
24 F77_INT F77_N=N, F77_lda=lda, F77_incX=incX;
25 #else
26 #define F77_N N
27 #define F77_lda lda
28 #define F77_incX incx
29 #endif
30 int n, i, tincx, incx=incX;
31 float *x=(float *)X, *xx=(float *)X, *tx, *st;
32
33 extern int CBLAS_CallFromC;
34 extern int RowMajorStrg;
35 RowMajorStrg = 0;
36
37 CBLAS_CallFromC = 1;
38 if (order == CblasColMajor)
39 {
40 if (Uplo == CblasLower) UL = 'L';
41 else if (Uplo == CblasUpper) UL = 'U';
42 else
43 {
44 cblas_xerbla(2, "cblas_cher","Illegal Uplo setting, %d\n",Uplo );
45 CBLAS_CallFromC = 0;
46 RowMajorStrg = 0;
47 return;
48 }
49 #ifdef F77_CHAR
50 F77_UL = C2F_CHAR(&UL);
51 #endif
52
53 F77_cher(F77_UL, &F77_N, &alpha, X, &F77_incX, A, &F77_lda);
54
55 } else if (order == CblasRowMajor)
56 {
57 RowMajorStrg = 1;
58 if (Uplo == CblasUpper) UL = 'L';
59 else if (Uplo == CblasLower) UL = 'U';
60 else
61 {
62 cblas_xerbla(2, "cblas_cher","Illegal Uplo setting, %d\n", Uplo);
63 CBLAS_CallFromC = 0;
64 RowMajorStrg = 0;
65 return;
66 }
67 #ifdef F77_CHAR
68 F77_UL = C2F_CHAR(&UL);
69 #endif
70 if (N > 0)
71 {
72 n = N << 1;
73 x = malloc(n*sizeof(float));
74 tx = x;
75 if( incX > 0 ) {
76 i = incX << 1 ;
77 tincx = 2;
78 st= x+n;
79 } else {
80 i = incX *(-2);
81 tincx = -2;
82 st = x-2;
83 x +=(n-2);
84 }
85 do
86 {
87 *x = *xx;
88 x[1] = -xx[1];
89 x += tincx ;
90 xx += i;
91 }
92 while (x != st);
93 x=tx;
94
95 #ifdef F77_INT
96 F77_incX = 1;
97 #else
98 incx = 1;
99 #endif
100 }
101 else x = (float *) X;
102 F77_cher(F77_UL, &F77_N, &alpha, x, &F77_incX, A, &F77_lda);
103 } else
104 {
105 cblas_xerbla(1, "cblas_cher","Illegal Order setting, %d\n", order);
106 CBLAS_CallFromC = 0;
107 RowMajorStrg = 0;
108 return;
109 }
110 if(X!=x)
111 free(x);
112
113 CBLAS_CallFromC = 0;
114 RowMajorStrg = 0;
115 return;
116 }
117