1/*
2 * cblas_chbmv.c
3 * The program is a C interface to chbmv
4 *
5 * Keita Teranishi  5/18/98
6 *
7 */
8#include "cblas.h"
9#include "cblas_f77.h"
10#include <stdio.h>
11#include <stdlib.h>
12void cblas_chbmv(const enum CBLAS_ORDER order,
13                 const enum CBLAS_UPLO Uplo,const int N,const int K,
14                 const void *alpha, const void  *A, const int lda,
15                 const void  *X, const int incX, const void *beta,
16                 void  *Y, const int incY)
17{
18   char UL;
19#ifdef F77_CHAR
20   F77_CHAR F77_UL;
21#else
22   #define F77_UL &UL
23#endif
24#ifdef F77_INT
25   F77_INT F77_N=N, F77_K=K, F77_lda=lda, F77_incX=incX, F77_incY=incY;
26#else
27   #define F77_N N
28   #define F77_K K
29   #define F77_lda lda
30   #define F77_incX incx
31   #define F77_incY incY
32#endif
33   int n, i=0, incx=incX;
34   const float *xx= (float *)X, *alp= (float *)alpha, *bet = (float *)beta;
35   float ALPHA[2],BETA[2];
36   int tincY, tincx;
37   float *x=(float *)X, *y=(float *)Y, *st=0, *tx;
38   extern int CBLAS_CallFromC;
39   extern int RowMajorStrg;
40   RowMajorStrg = 0;
41
42   CBLAS_CallFromC = 1;
43   if (order == CblasColMajor)
44   {
45      if (Uplo == CblasLower) UL = 'L';
46      else if (Uplo == CblasUpper) UL = 'U';
47      else
48      {
49         cblas_xerbla(2, "cblas_chbmv","Illegal Uplo setting, %d\n",Uplo );
50         CBLAS_CallFromC = 0;
51         RowMajorStrg = 0;
52         return;
53      }
54      #ifdef F77_CHAR
55         F77_UL = C2F_CHAR(&UL);
56      #endif
57      F77_chbmv(F77_UL, &F77_N, &F77_K, alpha, A, &F77_lda, X,
58                     &F77_incX, beta, Y, &F77_incY);
59   }
60   else if (order == CblasRowMajor)
61   {
62      RowMajorStrg = 1;
63      ALPHA[0]= *alp;
64      ALPHA[1]= -alp[1];
65      BETA[0]= *bet;
66      BETA[1]= -bet[1];
67
68      if (N > 0)
69      {
70         n = N << 1;
71         x = malloc(n*sizeof(float));
72
73         tx = x;
74         if( incX > 0 ) {
75           i = incX << 1 ;
76           tincx = 2;
77           st= x+n;
78         } else {
79           i = incX *(-2);
80           tincx = -2;
81           st = x-2;
82           x +=(n-2);
83         }
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
96         #ifdef F77_INT
97            F77_incX = 1;
98         #else
99            incx = 1;
100         #endif
101
102         if(incY > 0)
103           tincY = incY;
104         else
105           tincY = -incY;
106         y++;
107
108         i = tincY << 1;
109         n = i * N ;
110         st = y + n;
111         do {
112            *y = -(*y);
113            y += i;
114         } while(y != st);
115         y -= n;
116      }  else
117         x = (float *) X;
118
119      if (Uplo == CblasUpper) UL = 'L';
120      else if (Uplo == CblasLower) UL = 'U';
121      else
122      {
123         cblas_xerbla(2, "cblas_chbmv","Illegal Uplo setting, %d\n", Uplo);
124         CBLAS_CallFromC = 0;
125         RowMajorStrg = 0;
126         return;
127      }
128      #ifdef F77_CHAR
129         F77_UL = C2F_CHAR(&UL);
130      #endif
131      F77_chbmv(F77_UL, &F77_N, &F77_K, ALPHA,
132                     A ,&F77_lda, x,&F77_incX, BETA, Y, &F77_incY);
133   }
134   else
135   {
136      cblas_xerbla(1, "cblas_chbmv","Illegal Order setting, %d\n", order);
137      CBLAS_CallFromC = 0;
138      RowMajorStrg = 0;
139      return;
140   }
141   if ( order == CblasRowMajor )
142   {
143      RowMajorStrg = 1;
144      if(X!=x)
145         free(x);
146      if (N > 0)
147      {
148         do
149         {
150            *y = -(*y);
151            y += i;
152         }
153         while (y != st);
154      }
155   }
156   CBLAS_CallFromC = 0;
157   RowMajorStrg = 0;
158   return;
159}
160