1/*
2 * cblas_cgerc.c
3 * The program is a C interface to cgerc.
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"
12void cblas_cgerc(const enum CBLAS_ORDER order, const int M, const int N,
13                 const void *alpha, const void *X, const int incX,
14                 const void *Y, const int incY, void *A, const int lda)
15{
16#ifdef F77_INT
17   F77_INT F77_M=M, F77_N=N, F77_lda=lda, F77_incX=incX, F77_incY=incY;
18#else
19   #define F77_M M
20   #define F77_N N
21   #define F77_incX incX
22   #define F77_incY incy
23   #define F77_lda lda
24#endif
25
26   int n, i, tincy, incy=incY;
27   float *y=(float *)Y, *yy=(float *)Y, *ty, *st;
28
29   extern int CBLAS_CallFromC;
30   extern int RowMajorStrg;
31   RowMajorStrg = 0;
32
33   CBLAS_CallFromC = 1;
34   if (order == CblasColMajor)
35   {
36      F77_cgerc( &F77_M, &F77_N, alpha, X, &F77_incX, Y, &F77_incY, A,
37                      &F77_lda);
38   }  else if (order == CblasRowMajor)
39   {
40      RowMajorStrg = 1;
41      if (N > 0)
42      {
43         n = N << 1;
44         y = malloc(n*sizeof(float));
45
46         ty = y;
47         if( incY > 0 ) {
48            i = incY << 1;
49            tincy = 2;
50            st= y+n;
51         } else {
52            i = incY *(-2);
53            tincy = -2;
54            st = y-2;
55            y +=(n-2);
56         }
57         do
58         {
59            *y = *yy;
60            y[1] = -yy[1];
61            y += tincy ;
62            yy += i;
63         }
64         while (y != st);
65         y = ty;
66
67         #ifdef F77_INT
68            F77_incY = 1;
69         #else
70            incy = 1;
71         #endif
72      }
73      else y = (float *) Y;
74
75      F77_cgeru( &F77_N, &F77_M, alpha, y, &F77_incY, X, &F77_incX, A,
76                      &F77_lda);
77      if(Y!=y)
78         free(y);
79
80   } else cblas_xerbla(1, "cblas_cgerc", "Illegal Order setting, %d\n", order);
81   CBLAS_CallFromC = 0;
82   RowMajorStrg = 0;
83   return;
84}
85