diff --git a/blas/f2c/scabs1.c b/blas/f2c/scabs1.c
index 61e4ac8..5b4e71d 100644
--- a/blas/f2c/scabs1.c
+++ b/blas/f2c/scabs1.c
@@ -1,15 +1,12 @@
 #include "datatypes.h"
 
-doublereal scabs1_(complex *z__)
-{
-    /* System generated locals */
-    real ret_val, r__1, r__2;
-    /* Builtin functions */
-    double r_imag(complex *);
-/*  Purpose
-    =======
-    SCABS1 computes absolute value of a complex number */
-    ret_val = (r__1 = z__->r, dabs(r__1)) + (r__2 = r_imag(z__), dabs(r__2));
-    return ret_val;
-} /* scabs1_ */
+doublereal scabs1_(complex *z__) {
+  /* System generated locals */
+  real ret_val, r__1, r__2;
 
+  /*  Purpose
+      =======
+      SCABS1 computes absolute value of a complex number */
+  ret_val = (r__1 = z__->r, dabs(r__1)) + (r__2 = z__->i, dabs(r__2));
+  return ret_val;
+} /* scabs1_ */
diff --git a/lapack/clacgv.c b/lapack/clacgv.c
index 31fa8ff..896d313 100644
--- a/lapack/clacgv.c
+++ b/lapack/clacgv.c
@@ -1,95 +1,94 @@
 /* clacgv.f -- translated by f2c (version 20061008).
    You must link the resulting object file with libf2c:
-	on Microsoft Windows system, link with libf2c.lib;
-	on Linux or Unix systems, link with .../path/to/libf2c.a -lm
-	or, if you install libf2c.a in a standard place, with -lf2c -lm
-	-- in that order, at the end of the command line, as in
-		cc *.o -lf2c -lm
-	Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
+        on Microsoft Windows system, link with libf2c.lib;
+        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
+        or, if you install libf2c.a in a standard place, with -lf2c -lm
+        -- in that order, at the end of the command line, as in
+                cc *.o -lf2c -lm
+        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
 
-		http://www.netlib.org/f2c/libf2c.zip
+                http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
-/* Subroutine */ int clacgv_(integer *n, complex *x, integer *incx)
-{
-    /* System generated locals */
-    integer i__1, i__2;
-    complex q__1;
+static inline void r_cnjg(complex *r, complex *z) {
+  r->r = z->r;
+  r->i = -(z->i);
+}
 
-    /* Builtin functions */
-    void r_cnjg(complex *, complex *);
+/* Subroutine */ void clacgv_(integer *n, complex *x, integer *incx) {
+  /* System generated locals */
+  integer i__1, i__2;
+  complex q__1;
 
-    /* Local variables */
-    integer i__, ioff;
+  /* Local variables */
+  integer i__, ioff;
 
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*     .. Scalar Arguments .. */
+  /*     .. */
+  /*     .. Array Arguments .. */
+  /*     .. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
-/*     .. Array Arguments .. */
-/*     .. */
+  /*  Purpose */
+  /*  ======= */
 
-/*  Purpose */
-/*  ======= */
+  /*  CLACGV conjugates a complex vector of length N. */
 
-/*  CLACGV conjugates a complex vector of length N. */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Arguments */
-/*  ========= */
+  /*  N       (input) INTEGER */
+  /*          The length of the vector X.  N >= 0. */
 
-/*  N       (input) INTEGER */
-/*          The length of the vector X.  N >= 0. */
+  /*  X       (input/output) COMPLEX array, dimension */
+  /*                         (1+(N-1)*abs(INCX)) */
+  /*          On entry, the vector of length N to be conjugated. */
+  /*          On exit, X is overwritten with conjg(X). */
 
-/*  X       (input/output) COMPLEX array, dimension */
-/*                         (1+(N-1)*abs(INCX)) */
-/*          On entry, the vector of length N to be conjugated. */
-/*          On exit, X is overwritten with conjg(X). */
+  /*  INCX    (input) INTEGER */
+  /*          The spacing between successive elements of X. */
 
-/*  INCX    (input) INTEGER */
-/*          The spacing between successive elements of X. */
+  /* ===================================================================== */
 
-/* ===================================================================== */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. Intrinsic Functions .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. Intrinsic Functions .. */
-/*     .. */
-/*     .. Executable Statements .. */
+  /* Parameter adjustments */
+  --x;
 
-    /* Parameter adjustments */
-    --x;
-
-    /* Function Body */
-    if (*incx == 1) {
-	i__1 = *n;
-	for (i__ = 1; i__ <= i__1; ++i__) {
-	    i__2 = i__;
-	    r_cnjg(&q__1, &x[i__]);
-	    x[i__2].r = q__1.r, x[i__2].i = q__1.i;
-/* L10: */
-	}
-    } else {
-	ioff = 1;
-	if (*incx < 0) {
-	    ioff = 1 - (*n - 1) * *incx;
-	}
-	i__1 = *n;
-	for (i__ = 1; i__ <= i__1; ++i__) {
-	    i__2 = ioff;
-	    r_cnjg(&q__1, &x[ioff]);
-	    x[i__2].r = q__1.r, x[i__2].i = q__1.i;
-	    ioff += *incx;
-/* L20: */
-	}
+  /* Function Body */
+  if (*incx == 1) {
+    i__1 = *n;
+    for (i__ = 1; i__ <= i__1; ++i__) {
+      i__2 = i__;
+      r_cnjg(&q__1, &x[i__]);
+      x[i__2].r = q__1.r, x[i__2].i = q__1.i;
+      /* L10: */
     }
-    return 0;
+  } else {
+    ioff = 1;
+    if (*incx < 0) {
+      ioff = 1 - (*n - 1) * *incx;
+    }
+    i__1 = *n;
+    for (i__ = 1; i__ <= i__1; ++i__) {
+      i__2 = ioff;
+      r_cnjg(&q__1, &x[ioff]);
+      x[i__2].r = q__1.r, x[i__2].i = q__1.i;
+      ioff += *incx;
+      /* L20: */
+    }
+  }
 
-/*     End of CLACGV */
+  /*     End of CLACGV */
 
 } /* clacgv_ */
diff --git a/lapack/cladiv.c b/lapack/cladiv.c
index d10c959..e6a0b0d 100644
--- a/lapack/cladiv.c
+++ b/lapack/cladiv.c
@@ -1,74 +1,66 @@
 /* cladiv.f -- translated by f2c (version 20061008).
    You must link the resulting object file with libf2c:
-	on Microsoft Windows system, link with libf2c.lib;
-	on Linux or Unix systems, link with .../path/to/libf2c.a -lm
-	or, if you install libf2c.a in a standard place, with -lf2c -lm
-	-- in that order, at the end of the command line, as in
-		cc *.o -lf2c -lm
-	Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
+        on Microsoft Windows system, link with libf2c.lib;
+        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
+        or, if you install libf2c.a in a standard place, with -lf2c -lm
+        -- in that order, at the end of the command line, as in
+                cc *.o -lf2c -lm
+        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
 
-		http://www.netlib.org/f2c/libf2c.zip
+                http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
-/* Complex */ VOID cladiv_(complex * ret_val, complex *x, complex *y)
-{
-    /* System generated locals */
-    real r__1, r__2, r__3, r__4;
-    complex q__1;
+/* Complex */ void cladiv_(complex *ret_val, complex *x, complex *y) {
+  /* System generated locals */
+  real r__1, r__2, r__3, r__4;
+  complex q__1;
 
-    /* Builtin functions */
-    double r_imag(complex *);
+  /* Local variables */
+  real zi, zr;
+  extern /* Subroutine */ void sladiv_(real *, real *, real *, real *, real *, real *);
 
-    /* Local variables */
-    real zi, zr;
-    extern /* Subroutine */ int sladiv_(real *, real *, real *, real *, real *
-, real *);
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
+  /*     .. Scalar Arguments .. */
+  /*     .. */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*  Purpose */
+  /*  ======= */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
+  /*  CLADIV := X / Y, where X and Y are complex.  The computation of X / Y */
+  /*  will not overflow on an intermediary step unless the results */
+  /*  overflows. */
 
-/*  Purpose */
-/*  ======= */
+  /*  Arguments */
+  /*  ========= */
 
-/*  CLADIV := X / Y, where X and Y are complex.  The computation of X / Y */
-/*  will not overflow on an intermediary step unless the results */
-/*  overflows. */
+  /*  X       (input) COMPLEX */
+  /*  Y       (input) COMPLEX */
+  /*          The complex scalars X and Y. */
 
-/*  Arguments */
-/*  ========= */
+  /*  ===================================================================== */
 
-/*  X       (input) COMPLEX */
-/*  Y       (input) COMPLEX */
-/*          The complex scalars X and Y. */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Subroutines .. */
+  /*     .. */
+  /*     .. Intrinsic Functions .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*  ===================================================================== */
+  r__1 = x->r;
+  r__2 = x->i;
+  r__3 = y->r;
+  r__4 = y->i;
+  sladiv_(&r__1, &r__2, &r__3, &r__4, &zr, &zi);
+  q__1.r = zr, q__1.i = zi;
+  ret_val->r = q__1.r, ret_val->i = q__1.i;
 
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Subroutines .. */
-/*     .. */
-/*     .. Intrinsic Functions .. */
-/*     .. */
-/*     .. Executable Statements .. */
-
-    r__1 = x->r;
-    r__2 = r_imag(x);
-    r__3 = y->r;
-    r__4 = r_imag(y);
-    sladiv_(&r__1, &r__2, &r__3, &r__4, &zr, &zi);
-    q__1.r = zr, q__1.i = zi;
-     ret_val->r = q__1.r,  ret_val->i = q__1.i;
-
-    return ;
-
-/*     End of CLADIV */
+  /*     End of CLADIV */
 
 } /* cladiv_ */
diff --git a/lapack/clarf.c b/lapack/clarf.c
index 53da4d3..0be36cd 100644
--- a/lapack/clarf.c
+++ b/lapack/clarf.c
@@ -1,198 +1,185 @@
 /* clarf.f -- translated by f2c (version 20061008).
    You must link the resulting object file with libf2c:
-	on Microsoft Windows system, link with libf2c.lib;
-	on Linux or Unix systems, link with .../path/to/libf2c.a -lm
-	or, if you install libf2c.a in a standard place, with -lf2c -lm
-	-- in that order, at the end of the command line, as in
-		cc *.o -lf2c -lm
-	Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
+        on Microsoft Windows system, link with libf2c.lib;
+        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
+        or, if you install libf2c.a in a standard place, with -lf2c -lm
+        -- in that order, at the end of the command line, as in
+                cc *.o -lf2c -lm
+        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
 
-		http://www.netlib.org/f2c/libf2c.zip
+                http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
 /* Table of constant values */
 
-static complex c_b1 = {1.f,0.f};
-static complex c_b2 = {0.f,0.f};
+static complex c_b1 = {1.f, 0.f};
+static complex c_b2 = {0.f, 0.f};
 static integer c__1 = 1;
 
-/* Subroutine */ int clarf_(char *side, integer *m, integer *n, complex *v, 
-	integer *incv, complex *tau, complex *c__, integer *ldc, complex *
-	work)
-{
-    /* System generated locals */
-    integer c_dim1, c_offset, i__1;
-    complex q__1;
+/* Subroutine */ void clarf_(char *side, integer *m, integer *n, complex *v, integer *incv, complex *tau, complex *c__,
+                             integer *ldc, complex *work) {
+  /* System generated locals */
+  integer c_dim1, c_offset, i__1;
+  complex q__1;
 
-    /* Local variables */
-    integer i__;
-    logical applyleft;
-    extern /* Subroutine */ int cgerc_(integer *, integer *, complex *, 
-	    complex *, integer *, complex *, integer *, complex *, integer *),
-	     cgemv_(char *, integer *, integer *, complex *, complex *, 
-	    integer *, complex *, integer *, complex *, complex *, integer *);
-    extern logical lsame_(char *, char *);
-    integer lastc, lastv;
-    extern integer ilaclc_(integer *, integer *, complex *, integer *), 
-	    ilaclr_(integer *, integer *, complex *, integer *);
+  /* Local variables */
+  integer i__;
+  logical applyleft;
+  extern /* Subroutine */ void cgerc_(integer *, integer *, complex *, complex *, integer *, complex *, integer *,
+                                      complex *, integer *),
+      cgemv_(const char *, const integer *, const integer *, const complex *, const complex *, const integer *,
+             const complex *, const integer *, const complex *, complex *, const integer *);
+  extern logical lsame_(char *, char *);
+  integer lastc, lastv;
+  extern integer ilaclc_(integer *, integer *, complex *, integer *),
+      ilaclr_(integer *, integer *, complex *, integer *);
 
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*     .. Scalar Arguments .. */
+  /*     .. */
+  /*     .. Array Arguments .. */
+  /*     .. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
-/*     .. Array Arguments .. */
-/*     .. */
+  /*  Purpose */
+  /*  ======= */
 
-/*  Purpose */
-/*  ======= */
+  /*  CLARF applies a complex elementary reflector H to a complex M-by-N */
+  /*  matrix C, from either the left or the right. H is represented in the */
+  /*  form */
 
-/*  CLARF applies a complex elementary reflector H to a complex M-by-N */
-/*  matrix C, from either the left or the right. H is represented in the */
-/*  form */
+  /*        H = I - tau * v * v' */
 
-/*        H = I - tau * v * v' */
+  /*  where tau is a complex scalar and v is a complex vector. */
 
-/*  where tau is a complex scalar and v is a complex vector. */
+  /*  If tau = 0, then H is taken to be the unit matrix. */
 
-/*  If tau = 0, then H is taken to be the unit matrix. */
+  /*  To apply H' (the conjugate transpose of H), supply conjg(tau) instead */
+  /*  tau. */
 
-/*  To apply H' (the conjugate transpose of H), supply conjg(tau) instead */
-/*  tau. */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Arguments */
-/*  ========= */
+  /*  SIDE    (input) CHARACTER*1 */
+  /*          = 'L': form  H * C */
+  /*          = 'R': form  C * H */
 
-/*  SIDE    (input) CHARACTER*1 */
-/*          = 'L': form  H * C */
-/*          = 'R': form  C * H */
+  /*  M       (input) INTEGER */
+  /*          The number of rows of the matrix C. */
 
-/*  M       (input) INTEGER */
-/*          The number of rows of the matrix C. */
+  /*  N       (input) INTEGER */
+  /*          The number of columns of the matrix C. */
 
-/*  N       (input) INTEGER */
-/*          The number of columns of the matrix C. */
+  /*  V       (input) COMPLEX array, dimension */
+  /*                     (1 + (M-1)*abs(INCV)) if SIDE = 'L' */
+  /*                  or (1 + (N-1)*abs(INCV)) if SIDE = 'R' */
+  /*          The vector v in the representation of H. V is not used if */
+  /*          TAU = 0. */
 
-/*  V       (input) COMPLEX array, dimension */
-/*                     (1 + (M-1)*abs(INCV)) if SIDE = 'L' */
-/*                  or (1 + (N-1)*abs(INCV)) if SIDE = 'R' */
-/*          The vector v in the representation of H. V is not used if */
-/*          TAU = 0. */
+  /*  INCV    (input) INTEGER */
+  /*          The increment between elements of v. INCV <> 0. */
 
-/*  INCV    (input) INTEGER */
-/*          The increment between elements of v. INCV <> 0. */
+  /*  TAU     (input) COMPLEX */
+  /*          The value tau in the representation of H. */
 
-/*  TAU     (input) COMPLEX */
-/*          The value tau in the representation of H. */
+  /*  C       (input/output) COMPLEX array, dimension (LDC,N) */
+  /*          On entry, the M-by-N matrix C. */
+  /*          On exit, C is overwritten by the matrix H * C if SIDE = 'L', */
+  /*          or C * H if SIDE = 'R'. */
 
-/*  C       (input/output) COMPLEX array, dimension (LDC,N) */
-/*          On entry, the M-by-N matrix C. */
-/*          On exit, C is overwritten by the matrix H * C if SIDE = 'L', */
-/*          or C * H if SIDE = 'R'. */
+  /*  LDC     (input) INTEGER */
+  /*          The leading dimension of the array C. LDC >= max(1,M). */
 
-/*  LDC     (input) INTEGER */
-/*          The leading dimension of the array C. LDC >= max(1,M). */
+  /*  WORK    (workspace) COMPLEX array, dimension */
+  /*                         (N) if SIDE = 'L' */
+  /*                      or (M) if SIDE = 'R' */
 
-/*  WORK    (workspace) COMPLEX array, dimension */
-/*                         (N) if SIDE = 'L' */
-/*                      or (M) if SIDE = 'R' */
+  /*  ===================================================================== */
 
-/*  ===================================================================== */
+  /*     .. Parameters .. */
+  /*     .. */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Subroutines .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*     .. Parameters .. */
-/*     .. */
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Subroutines .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. Executable Statements .. */
+  /* Parameter adjustments */
+  --v;
+  c_dim1 = *ldc;
+  c_offset = 1 + c_dim1;
+  c__ -= c_offset;
+  --work;
 
-    /* Parameter adjustments */
-    --v;
-    c_dim1 = *ldc;
-    c_offset = 1 + c_dim1;
-    c__ -= c_offset;
-    --work;
-
-    /* Function Body */
-    applyleft = lsame_(side, "L");
-    lastv = 0;
-    lastc = 0;
-    if (tau->r != 0.f || tau->i != 0.f) {
-/*     Set up variables for scanning V.  LASTV begins pointing to the end */
-/*     of V. */
-	if (applyleft) {
-	    lastv = *m;
-	} else {
-	    lastv = *n;
-	}
-	if (*incv > 0) {
-	    i__ = (lastv - 1) * *incv + 1;
-	} else {
-	    i__ = 1;
-	}
-/*     Look for the last non-zero row in V. */
-	for(;;) { /* while(complicated condition) */
-	    i__1 = i__;
-	    if (!(lastv > 0 && (v[i__1].r == 0.f && v[i__1].i == 0.f)))
-	    	break;
-	    --lastv;
-	    i__ -= *incv;
-	}
-	if (applyleft) {
-/*     Scan for the last non-zero column in C(1:lastv,:). */
-	    lastc = ilaclc_(&lastv, n, &c__[c_offset], ldc);
-	} else {
-/*     Scan for the last non-zero row in C(:,1:lastv). */
-	    lastc = ilaclr_(m, &lastv, &c__[c_offset], ldc);
-	}
-    }
-/*     Note that lastc.eq.0 renders the BLAS operations null; no special */
-/*     case is needed at this level. */
+  /* Function Body */
+  applyleft = lsame_(side, "L");
+  lastv = 0;
+  lastc = 0;
+  if (tau->r != 0.f || tau->i != 0.f) {
+    /*     Set up variables for scanning V.  LASTV begins pointing to the end */
+    /*     of V. */
     if (applyleft) {
-
-/*        Form  H * C */
-
-	if (lastv > 0) {
-
-/*           w(1:lastc,1) := C(1:lastv,1:lastc)' * v(1:lastv,1) */
-
-	    cgemv_("Conjugate transpose", &lastv, &lastc, &c_b1, &c__[
-		    c_offset], ldc, &v[1], incv, &c_b2, &work[1], &c__1);
-
-/*           C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)' */
-
-	    q__1.r = -tau->r, q__1.i = -tau->i;
-	    cgerc_(&lastv, &lastc, &q__1, &v[1], incv, &work[1], &c__1, &c__[
-		    c_offset], ldc);
-	}
+      lastv = *m;
     } else {
-
-/*        Form  C * H */
-
-	if (lastv > 0) {
-
-/*           w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) */
-
-	    cgemv_("No transpose", &lastc, &lastv, &c_b1, &c__[c_offset], ldc, 
-		     &v[1], incv, &c_b2, &work[1], &c__1);
-
-/*           C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)' */
-
-	    q__1.r = -tau->r, q__1.i = -tau->i;
-	    cgerc_(&lastc, &lastv, &q__1, &work[1], &c__1, &v[1], incv, &c__[
-		    c_offset], ldc);
-	}
+      lastv = *n;
     }
-    return 0;
+    if (*incv > 0) {
+      i__ = (lastv - 1) * *incv + 1;
+    } else {
+      i__ = 1;
+    }
+    /*     Look for the last non-zero row in V. */
+    for (;;) { /* while(complicated condition) */
+      i__1 = i__;
+      if (!(lastv > 0 && (v[i__1].r == 0.f && v[i__1].i == 0.f))) break;
+      --lastv;
+      i__ -= *incv;
+    }
+    if (applyleft) {
+      /*     Scan for the last non-zero column in C(1:lastv,:). */
+      lastc = ilaclc_(&lastv, n, &c__[c_offset], ldc);
+    } else {
+      /*     Scan for the last non-zero row in C(:,1:lastv). */
+      lastc = ilaclr_(m, &lastv, &c__[c_offset], ldc);
+    }
+  }
+  /*     Note that lastc.eq.0 renders the BLAS operations null; no special */
+  /*     case is needed at this level. */
+  if (applyleft) {
+    /*        Form  H * C */
 
-/*     End of CLARF */
+    if (lastv > 0) {
+      /*           w(1:lastc,1) := C(1:lastv,1:lastc)' * v(1:lastv,1) */
+
+      cgemv_("Conjugate transpose", &lastv, &lastc, &c_b1, &c__[c_offset], ldc, &v[1], incv, &c_b2, &work[1], &c__1);
+
+      /*           C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)' */
+
+      q__1.r = -tau->r, q__1.i = -tau->i;
+      cgerc_(&lastv, &lastc, &q__1, &v[1], incv, &work[1], &c__1, &c__[c_offset], ldc);
+    }
+  } else {
+    /*        Form  C * H */
+
+    if (lastv > 0) {
+      /*           w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) */
+
+      cgemv_("No transpose", &lastc, &lastv, &c_b1, &c__[c_offset], ldc, &v[1], incv, &c_b2, &work[1], &c__1);
+
+      /*           C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)' */
+
+      q__1.r = -tau->r, q__1.i = -tau->i;
+      cgerc_(&lastc, &lastv, &q__1, &work[1], &c__1, &v[1], incv, &c__[c_offset], ldc);
+    }
+  }
+
+  /*     End of CLARF */
 
 } /* clarf_ */
diff --git a/lapack/clarfb.c b/lapack/clarfb.c
index 6b31aa1..72fd915 100644
--- a/lapack/clarfb.c
+++ b/lapack/clarfb.c
@@ -1,837 +1,736 @@
 /* clarfb.f -- translated by f2c (version 20061008).
    You must link the resulting object file with libf2c:
-	on Microsoft Windows system, link with libf2c.lib;
-	on Linux or Unix systems, link with .../path/to/libf2c.a -lm
-	or, if you install libf2c.a in a standard place, with -lf2c -lm
-	-- in that order, at the end of the command line, as in
-		cc *.o -lf2c -lm
-	Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
+        on Microsoft Windows system, link with libf2c.lib;
+        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
+        or, if you install libf2c.a in a standard place, with -lf2c -lm
+        -- in that order, at the end of the command line, as in
+                cc *.o -lf2c -lm
+        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
 
-		http://www.netlib.org/f2c/libf2c.zip
+                http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
+
+static inline void r_cnjg(complex *r, complex *z) {
+  r->r = z->r;
+  r->i = -(z->i);
+}
 
 /* Table of constant values */
 
-static complex c_b1 = {1.f,0.f};
+static complex c_b1 = {1.f, 0.f};
 static integer c__1 = 1;
 
-/* Subroutine */ int clarfb_(char *side, char *trans, char *direct, char *
-	storev, integer *m, integer *n, integer *k, complex *v, integer *ldv, 
-	complex *t, integer *ldt, complex *c__, integer *ldc, complex *work, 
-	integer *ldwork)
-{
-    /* System generated locals */
-    integer c_dim1, c_offset, t_dim1, t_offset, v_dim1, v_offset, work_dim1, 
-	    work_offset, i__1, i__2, i__3, i__4, i__5;
-    complex q__1, q__2;
+/* Subroutine */ void clarfb_(char *side, char *trans, char *direct, char *storev, integer *m, integer *n, integer *k,
+                              complex *v, integer *ldv, complex *t, integer *ldt, complex *c__, integer *ldc,
+                              complex *work, integer *ldwork) {
+  /* System generated locals */
+  integer c_dim1, c_offset, t_dim1, t_offset, v_dim1, v_offset, work_dim1, work_offset, i__1, i__2, i__3, i__4, i__5;
+  complex q__1, q__2;
 
-    /* Builtin functions */
-    void r_cnjg(complex *, complex *);
+  /* Local variables */
+  integer i__, j;
+  extern /* Subroutine */ void cgemm_(const char *, const char *, const integer *, const integer *, const integer *,
+                                      const complex *, const complex *, const integer *, const complex *,
+                                      const integer *, const complex *, complex *, const integer *);
+  extern logical lsame_(char *, char *);
+  integer lastc;
+  extern /* Subroutine */ void ccopy_(integer *, complex *, integer *, complex *, integer *),
+      ctrmm_(const char *, const char *, const char *, const char *, const integer *, const integer *, const complex *,
+             const complex *, const integer *, complex *, const integer *);
+  integer lastv;
+  extern integer ilaclc_(integer *, integer *, complex *, integer *);
+  extern /* Subroutine */ void clacgv_(integer *, complex *, integer *);
+  extern integer ilaclr_(integer *, integer *, complex *, integer *);
+  char transt[1];
 
-    /* Local variables */
-    integer i__, j;
-    extern /* Subroutine */ int cgemm_(char *, char *, integer *, integer *, 
-	    integer *, complex *, complex *, integer *, complex *, integer *, 
-	    complex *, complex *, integer *);
-    extern logical lsame_(char *, char *);
-    integer lastc;
-    extern /* Subroutine */ int ccopy_(integer *, complex *, integer *, 
-	    complex *, integer *), ctrmm_(char *, char *, char *, char *, 
-	    integer *, integer *, complex *, complex *, integer *, complex *, 
-	    integer *);
-    integer lastv;
-    extern integer ilaclc_(integer *, integer *, complex *, integer *);
-    extern /* Subroutine */ int clacgv_(integer *, complex *, integer *);
-    extern integer ilaclr_(integer *, integer *, complex *, integer *);
-    char transt[1];
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
+  /*     .. Scalar Arguments .. */
+  /*     .. */
+  /*     .. Array Arguments .. */
+  /*     .. */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*  Purpose */
+  /*  ======= */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
-/*     .. Array Arguments .. */
-/*     .. */
+  /*  CLARFB applies a complex block reflector H or its transpose H' to a */
+  /*  complex M-by-N matrix C, from either the left or the right. */
 
-/*  Purpose */
-/*  ======= */
+  /*  Arguments */
+  /*  ========= */
 
-/*  CLARFB applies a complex block reflector H or its transpose H' to a */
-/*  complex M-by-N matrix C, from either the left or the right. */
+  /*  SIDE    (input) CHARACTER*1 */
+  /*          = 'L': apply H or H' from the Left */
+  /*          = 'R': apply H or H' from the Right */
 
-/*  Arguments */
-/*  ========= */
+  /*  TRANS   (input) CHARACTER*1 */
+  /*          = 'N': apply H (No transpose) */
+  /*          = 'C': apply H' (Conjugate transpose) */
 
-/*  SIDE    (input) CHARACTER*1 */
-/*          = 'L': apply H or H' from the Left */
-/*          = 'R': apply H or H' from the Right */
+  /*  DIRECT  (input) CHARACTER*1 */
+  /*          Indicates how H is formed from a product of elementary */
+  /*          reflectors */
+  /*          = 'F': H = H(1) H(2) . . . H(k) (Forward) */
+  /*          = 'B': H = H(k) . . . H(2) H(1) (Backward) */
 
-/*  TRANS   (input) CHARACTER*1 */
-/*          = 'N': apply H (No transpose) */
-/*          = 'C': apply H' (Conjugate transpose) */
+  /*  STOREV  (input) CHARACTER*1 */
+  /*          Indicates how the vectors which define the elementary */
+  /*          reflectors are stored: */
+  /*          = 'C': Columnwise */
+  /*          = 'R': Rowwise */
 
-/*  DIRECT  (input) CHARACTER*1 */
-/*          Indicates how H is formed from a product of elementary */
-/*          reflectors */
-/*          = 'F': H = H(1) H(2) . . . H(k) (Forward) */
-/*          = 'B': H = H(k) . . . H(2) H(1) (Backward) */
+  /*  M       (input) INTEGER */
+  /*          The number of rows of the matrix C. */
 
-/*  STOREV  (input) CHARACTER*1 */
-/*          Indicates how the vectors which define the elementary */
-/*          reflectors are stored: */
-/*          = 'C': Columnwise */
-/*          = 'R': Rowwise */
+  /*  N       (input) INTEGER */
+  /*          The number of columns of the matrix C. */
 
-/*  M       (input) INTEGER */
-/*          The number of rows of the matrix C. */
+  /*  K       (input) INTEGER */
+  /*          The order of the matrix T (= the number of elementary */
+  /*          reflectors whose product defines the block reflector). */
 
-/*  N       (input) INTEGER */
-/*          The number of columns of the matrix C. */
+  /*  V       (input) COMPLEX array, dimension */
+  /*                                (LDV,K) if STOREV = 'C' */
+  /*                                (LDV,M) if STOREV = 'R' and SIDE = 'L' */
+  /*                                (LDV,N) if STOREV = 'R' and SIDE = 'R' */
+  /*          The matrix V. See further details. */
 
-/*  K       (input) INTEGER */
-/*          The order of the matrix T (= the number of elementary */
-/*          reflectors whose product defines the block reflector). */
+  /*  LDV     (input) INTEGER */
+  /*          The leading dimension of the array V. */
+  /*          If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); */
+  /*          if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); */
+  /*          if STOREV = 'R', LDV >= K. */
 
-/*  V       (input) COMPLEX array, dimension */
-/*                                (LDV,K) if STOREV = 'C' */
-/*                                (LDV,M) if STOREV = 'R' and SIDE = 'L' */
-/*                                (LDV,N) if STOREV = 'R' and SIDE = 'R' */
-/*          The matrix V. See further details. */
+  /*  T       (input) COMPLEX array, dimension (LDT,K) */
+  /*          The triangular K-by-K matrix T in the representation of the */
+  /*          block reflector. */
 
-/*  LDV     (input) INTEGER */
-/*          The leading dimension of the array V. */
-/*          If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); */
-/*          if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); */
-/*          if STOREV = 'R', LDV >= K. */
+  /*  LDT     (input) INTEGER */
+  /*          The leading dimension of the array T. LDT >= K. */
 
-/*  T       (input) COMPLEX array, dimension (LDT,K) */
-/*          The triangular K-by-K matrix T in the representation of the */
-/*          block reflector. */
+  /*  C       (input/output) COMPLEX array, dimension (LDC,N) */
+  /*          On entry, the M-by-N matrix C. */
+  /*          On exit, C is overwritten by H*C or H'*C or C*H or C*H'. */
 
-/*  LDT     (input) INTEGER */
-/*          The leading dimension of the array T. LDT >= K. */
+  /*  LDC     (input) INTEGER */
+  /*          The leading dimension of the array C. LDC >= max(1,M). */
 
-/*  C       (input/output) COMPLEX array, dimension (LDC,N) */
-/*          On entry, the M-by-N matrix C. */
-/*          On exit, C is overwritten by H*C or H'*C or C*H or C*H'. */
+  /*  WORK    (workspace) COMPLEX array, dimension (LDWORK,K) */
 
-/*  LDC     (input) INTEGER */
-/*          The leading dimension of the array C. LDC >= max(1,M). */
+  /*  LDWORK  (input) INTEGER */
+  /*          The leading dimension of the array WORK. */
+  /*          If SIDE = 'L', LDWORK >= max(1,N); */
+  /*          if SIDE = 'R', LDWORK >= max(1,M). */
 
-/*  WORK    (workspace) COMPLEX array, dimension (LDWORK,K) */
+  /*  ===================================================================== */
 
-/*  LDWORK  (input) INTEGER */
-/*          The leading dimension of the array WORK. */
-/*          If SIDE = 'L', LDWORK >= max(1,N); */
-/*          if SIDE = 'R', LDWORK >= max(1,M). */
+  /*     .. Parameters .. */
+  /*     .. */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. External Subroutines .. */
+  /*     .. */
+  /*     .. Intrinsic Functions .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*  ===================================================================== */
+  /*     Quick return if possible */
 
-/*     .. Parameters .. */
-/*     .. */
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. External Subroutines .. */
-/*     .. */
-/*     .. Intrinsic Functions .. */
-/*     .. */
-/*     .. Executable Statements .. */
+  /* Parameter adjustments */
+  v_dim1 = *ldv;
+  v_offset = 1 + v_dim1;
+  v -= v_offset;
+  t_dim1 = *ldt;
+  t_offset = 1 + t_dim1;
+  t -= t_offset;
+  c_dim1 = *ldc;
+  c_offset = 1 + c_dim1;
+  c__ -= c_offset;
+  work_dim1 = *ldwork;
+  work_offset = 1 + work_dim1;
+  work -= work_offset;
 
-/*     Quick return if possible */
+  /* Function Body */
+  if (*m <= 0 || *n <= 0) {
+    return;
+  }
 
-    /* Parameter adjustments */
-    v_dim1 = *ldv;
-    v_offset = 1 + v_dim1;
-    v -= v_offset;
-    t_dim1 = *ldt;
-    t_offset = 1 + t_dim1;
-    t -= t_offset;
-    c_dim1 = *ldc;
-    c_offset = 1 + c_dim1;
-    c__ -= c_offset;
-    work_dim1 = *ldwork;
-    work_offset = 1 + work_dim1;
-    work -= work_offset;
+  if (lsame_(trans, "N")) {
+    *(unsigned char *)transt = 'C';
+  } else {
+    *(unsigned char *)transt = 'N';
+  }
 
-    /* Function Body */
-    if (*m <= 0 || *n <= 0) {
-	return 0;
-    }
+  if (lsame_(storev, "C")) {
+    if (lsame_(direct, "F")) {
+      /*           Let  V =  ( V1 )    (first K rows) */
+      /*                     ( V2 ) */
+      /*           where  V1  is unit lower triangular. */
 
-    if (lsame_(trans, "N")) {
-	*(unsigned char *)transt = 'C';
+      if (lsame_(side, "L")) {
+        /*              Form  H * C  or  H' * C  where  C = ( C1 ) */
+        /*                                                  ( C2 ) */
+
+        /* Computing MAX */
+        i__1 = *k, i__2 = ilaclr_(m, k, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = ilaclc_(&lastv, n, &c__[c_offset], ldc);
+
+        /*              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK) */
+
+        /*              W := C1' */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          ccopy_(&lastc, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1);
+          clacgv_(&lastc, &work[j * work_dim1 + 1], &c__1);
+          /* L10: */
+        }
+
+        /*              W := W * V1 */
+
+        ctrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &c_b1, &v[v_offset], ldv, &work[work_offset],
+               ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C2'*V2 */
+
+          i__1 = lastv - *k;
+          cgemm_("Conjugate transpose", "No transpose", &lastc, k, &i__1, &c_b1, &c__[*k + 1 + c_dim1], ldc,
+                 &v[*k + 1 + v_dim1], ldv, &c_b1, &work[work_offset], ldwork);
+        }
+
+        /*              W := W * T'  or  W * T */
+
+        ctrmm_("Right", "Upper", transt, "Non-unit", &lastc, k, &c_b1, &t[t_offset], ldt, &work[work_offset], ldwork);
+
+        /*              C := C - V * W' */
+
+        if (*m > *k) {
+          /*                 C2 := C2 - V2 * W' */
+
+          i__1 = lastv - *k;
+          q__1.r = -1.f, q__1.i = -0.f;
+          cgemm_("No transpose", "Conjugate transpose", &i__1, &lastc, k, &q__1, &v[*k + 1 + v_dim1], ldv,
+                 &work[work_offset], ldwork, &c_b1, &c__[*k + 1 + c_dim1], ldc);
+        }
+
+        /*              W := W * V1' */
+
+        ctrmm_("Right", "Lower", "Conjugate transpose", "Unit", &lastc, k, &c_b1, &v[v_offset], ldv, &work[work_offset],
+               ldwork);
+
+        /*              C1 := C1 - W' */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            i__3 = j + i__ * c_dim1;
+            i__4 = j + i__ * c_dim1;
+            r_cnjg(&q__2, &work[i__ + j * work_dim1]);
+            q__1.r = c__[i__4].r - q__2.r, q__1.i = c__[i__4].i - q__2.i;
+            c__[i__3].r = q__1.r, c__[i__3].i = q__1.i;
+            /* L20: */
+          }
+          /* L30: */
+        }
+
+      } else if (lsame_(side, "R")) {
+        /*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
+
+        /* Computing MAX */
+        i__1 = *k, i__2 = ilaclr_(n, k, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = ilaclr_(m, &lastv, &c__[c_offset], ldc);
+
+        /*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK) */
+
+        /*              W := C1 */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          ccopy_(&lastc, &c__[j * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1);
+          /* L40: */
+        }
+
+        /*              W := W * V1 */
+
+        ctrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &c_b1, &v[v_offset], ldv, &work[work_offset],
+               ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C2 * V2 */
+
+          i__1 = lastv - *k;
+          cgemm_("No transpose", "No transpose", &lastc, k, &i__1, &c_b1, &c__[(*k + 1) * c_dim1 + 1], ldc,
+                 &v[*k + 1 + v_dim1], ldv, &c_b1, &work[work_offset], ldwork);
+        }
+
+        /*              W := W * T  or  W * T' */
+
+        ctrmm_("Right", "Upper", trans, "Non-unit", &lastc, k, &c_b1, &t[t_offset], ldt, &work[work_offset], ldwork);
+
+        /*              C := C - W * V' */
+
+        if (lastv > *k) {
+          /*                 C2 := C2 - W * V2' */
+
+          i__1 = lastv - *k;
+          q__1.r = -1.f, q__1.i = -0.f;
+          cgemm_("No transpose", "Conjugate transpose", &lastc, &i__1, k, &q__1, &work[work_offset], ldwork,
+                 &v[*k + 1 + v_dim1], ldv, &c_b1, &c__[(*k + 1) * c_dim1 + 1], ldc);
+        }
+
+        /*              W := W * V1' */
+
+        ctrmm_("Right", "Lower", "Conjugate transpose", "Unit", &lastc, k, &c_b1, &v[v_offset], ldv, &work[work_offset],
+               ldwork);
+
+        /*              C1 := C1 - W */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            i__3 = i__ + j * c_dim1;
+            i__4 = i__ + j * c_dim1;
+            i__5 = i__ + j * work_dim1;
+            q__1.r = c__[i__4].r - work[i__5].r, q__1.i = c__[i__4].i - work[i__5].i;
+            c__[i__3].r = q__1.r, c__[i__3].i = q__1.i;
+            /* L50: */
+          }
+          /* L60: */
+        }
+      }
+
     } else {
-	*(unsigned char *)transt = 'N';
+      /*           Let  V =  ( V1 ) */
+      /*                     ( V2 )    (last K rows) */
+      /*           where  V2  is unit upper triangular. */
+
+      if (lsame_(side, "L")) {
+        /*              Form  H * C  or  H' * C  where  C = ( C1 ) */
+        /*                                                  ( C2 ) */
+
+        /* Computing MAX */
+        i__1 = *k, i__2 = ilaclr_(m, k, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = ilaclc_(&lastv, n, &c__[c_offset], ldc);
+
+        /*              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK) */
+
+        /*              W := C2' */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          ccopy_(&lastc, &c__[lastv - *k + j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1);
+          clacgv_(&lastc, &work[j * work_dim1 + 1], &c__1);
+          /* L70: */
+        }
+
+        /*              W := W * V2 */
+
+        ctrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &c_b1, &v[lastv - *k + 1 + v_dim1], ldv,
+               &work[work_offset], ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C1'*V1 */
+
+          i__1 = lastv - *k;
+          cgemm_("Conjugate transpose", "No transpose", &lastc, k, &i__1, &c_b1, &c__[c_offset], ldc, &v[v_offset], ldv,
+                 &c_b1, &work[work_offset], ldwork);
+        }
+
+        /*              W := W * T'  or  W * T */
+
+        ctrmm_("Right", "Lower", transt, "Non-unit", &lastc, k, &c_b1, &t[t_offset], ldt, &work[work_offset], ldwork);
+
+        /*              C := C - V * W' */
+
+        if (lastv > *k) {
+          /*                 C1 := C1 - V1 * W' */
+
+          i__1 = lastv - *k;
+          q__1.r = -1.f, q__1.i = -0.f;
+          cgemm_("No transpose", "Conjugate transpose", &i__1, &lastc, k, &q__1, &v[v_offset], ldv, &work[work_offset],
+                 ldwork, &c_b1, &c__[c_offset], ldc);
+        }
+
+        /*              W := W * V2' */
+
+        ctrmm_("Right", "Upper", "Conjugate transpose", "Unit", &lastc, k, &c_b1, &v[lastv - *k + 1 + v_dim1], ldv,
+               &work[work_offset], ldwork);
+
+        /*              C2 := C2 - W' */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            i__3 = lastv - *k + j + i__ * c_dim1;
+            i__4 = lastv - *k + j + i__ * c_dim1;
+            r_cnjg(&q__2, &work[i__ + j * work_dim1]);
+            q__1.r = c__[i__4].r - q__2.r, q__1.i = c__[i__4].i - q__2.i;
+            c__[i__3].r = q__1.r, c__[i__3].i = q__1.i;
+            /* L80: */
+          }
+          /* L90: */
+        }
+
+      } else if (lsame_(side, "R")) {
+        /*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
+
+        /* Computing MAX */
+        i__1 = *k, i__2 = ilaclr_(n, k, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = ilaclr_(m, &lastv, &c__[c_offset], ldc);
+
+        /*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK) */
+
+        /*              W := C2 */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          ccopy_(&lastc, &c__[(lastv - *k + j) * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1);
+          /* L100: */
+        }
+
+        /*              W := W * V2 */
+
+        ctrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &c_b1, &v[lastv - *k + 1 + v_dim1], ldv,
+               &work[work_offset], ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C1 * V1 */
+
+          i__1 = lastv - *k;
+          cgemm_("No transpose", "No transpose", &lastc, k, &i__1, &c_b1, &c__[c_offset], ldc, &v[v_offset], ldv, &c_b1,
+                 &work[work_offset], ldwork);
+        }
+
+        /*              W := W * T  or  W * T' */
+
+        ctrmm_("Right", "Lower", trans, "Non-unit", &lastc, k, &c_b1, &t[t_offset], ldt, &work[work_offset], ldwork);
+
+        /*              C := C - W * V' */
+
+        if (lastv > *k) {
+          /*                 C1 := C1 - W * V1' */
+
+          i__1 = lastv - *k;
+          q__1.r = -1.f, q__1.i = -0.f;
+          cgemm_("No transpose", "Conjugate transpose", &lastc, &i__1, k, &q__1, &work[work_offset], ldwork,
+                 &v[v_offset], ldv, &c_b1, &c__[c_offset], ldc);
+        }
+
+        /*              W := W * V2' */
+
+        ctrmm_("Right", "Upper", "Conjugate transpose", "Unit", &lastc, k, &c_b1, &v[lastv - *k + 1 + v_dim1], ldv,
+               &work[work_offset], ldwork);
+
+        /*              C2 := C2 - W */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            i__3 = i__ + (lastv - *k + j) * c_dim1;
+            i__4 = i__ + (lastv - *k + j) * c_dim1;
+            i__5 = i__ + j * work_dim1;
+            q__1.r = c__[i__4].r - work[i__5].r, q__1.i = c__[i__4].i - work[i__5].i;
+            c__[i__3].r = q__1.r, c__[i__3].i = q__1.i;
+            /* L110: */
+          }
+          /* L120: */
+        }
+      }
     }
 
-    if (lsame_(storev, "C")) {
+  } else if (lsame_(storev, "R")) {
+    if (lsame_(direct, "F")) {
+      /*           Let  V =  ( V1  V2 )    (V1: first K columns) */
+      /*           where  V1  is unit upper triangular. */
 
-	if (lsame_(direct, "F")) {
+      if (lsame_(side, "L")) {
+        /*              Form  H * C  or  H' * C  where  C = ( C1 ) */
+        /*                                                  ( C2 ) */
 
-/*           Let  V =  ( V1 )    (first K rows) */
-/*                     ( V2 ) */
-/*           where  V1  is unit lower triangular. */
+        /* Computing MAX */
+        i__1 = *k, i__2 = ilaclc_(k, m, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = ilaclc_(&lastv, n, &c__[c_offset], ldc);
 
-	    if (lsame_(side, "L")) {
+        /*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK) */
 
-/*              Form  H * C  or  H' * C  where  C = ( C1 ) */
-/*                                                  ( C2 ) */
+        /*              W := C1' */
 
-/* Computing MAX */
-		i__1 = *k, i__2 = ilaclr_(m, k, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = ilaclc_(&lastv, n, &c__[c_offset], ldc);
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          ccopy_(&lastc, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1);
+          clacgv_(&lastc, &work[j * work_dim1 + 1], &c__1);
+          /* L130: */
+        }
 
-/*              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK) */
+        /*              W := W * V1' */
 
-/*              W := C1' */
+        ctrmm_("Right", "Upper", "Conjugate transpose", "Unit", &lastc, k, &c_b1, &v[v_offset], ldv, &work[work_offset],
+               ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C2'*V2' */
 
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    ccopy_(&lastc, &c__[j + c_dim1], ldc, &work[j * work_dim1 
-			    + 1], &c__1);
-		    clacgv_(&lastc, &work[j * work_dim1 + 1], &c__1);
-/* L10: */
-		}
+          i__1 = lastv - *k;
+          cgemm_("Conjugate transpose", "Conjugate transpose", &lastc, k, &i__1, &c_b1, &c__[*k + 1 + c_dim1], ldc,
+                 &v[(*k + 1) * v_dim1 + 1], ldv, &c_b1, &work[work_offset], ldwork);
+        }
 
-/*              W := W * V1 */
+        /*              W := W * T'  or  W * T */
 
-		ctrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &
-			c_b1, &v[v_offset], ldv, &work[work_offset], ldwork);
-		if (lastv > *k) {
+        ctrmm_("Right", "Upper", transt, "Non-unit", &lastc, k, &c_b1, &t[t_offset], ldt, &work[work_offset], ldwork);
 
-/*                 W := W + C2'*V2 */
+        /*              C := C - V' * W' */
 
-		    i__1 = lastv - *k;
-		    cgemm_("Conjugate transpose", "No transpose", &lastc, k, &
-			    i__1, &c_b1, &c__[*k + 1 + c_dim1], ldc, &v[*k + 
-			    1 + v_dim1], ldv, &c_b1, &work[work_offset], 
-			    ldwork);
-		}
+        if (lastv > *k) {
+          /*                 C2 := C2 - V2' * W' */
 
-/*              W := W * T'  or  W * T */
+          i__1 = lastv - *k;
+          q__1.r = -1.f, q__1.i = -0.f;
+          cgemm_("Conjugate transpose", "Conjugate transpose", &i__1, &lastc, k, &q__1, &v[(*k + 1) * v_dim1 + 1], ldv,
+                 &work[work_offset], ldwork, &c_b1, &c__[*k + 1 + c_dim1], ldc);
+        }
 
-		ctrmm_("Right", "Upper", transt, "Non-unit", &lastc, k, &c_b1, 
-			 &t[t_offset], ldt, &work[work_offset], ldwork);
+        /*              W := W * V1 */
 
-/*              C := C - V * W' */
+        ctrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &c_b1, &v[v_offset], ldv, &work[work_offset],
+               ldwork);
 
-		if (*m > *k) {
+        /*              C1 := C1 - W' */
 
-/*                 C2 := C2 - V2 * W' */
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            i__3 = j + i__ * c_dim1;
+            i__4 = j + i__ * c_dim1;
+            r_cnjg(&q__2, &work[i__ + j * work_dim1]);
+            q__1.r = c__[i__4].r - q__2.r, q__1.i = c__[i__4].i - q__2.i;
+            c__[i__3].r = q__1.r, c__[i__3].i = q__1.i;
+            /* L140: */
+          }
+          /* L150: */
+        }
 
-		    i__1 = lastv - *k;
-		    q__1.r = -1.f, q__1.i = -0.f;
-		    cgemm_("No transpose", "Conjugate transpose", &i__1, &
-			    lastc, k, &q__1, &v[*k + 1 + v_dim1], ldv, &work[
-			    work_offset], ldwork, &c_b1, &c__[*k + 1 + c_dim1]
-, ldc);
-		}
+      } else if (lsame_(side, "R")) {
+        /*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
 
-/*              W := W * V1' */
+        /* Computing MAX */
+        i__1 = *k, i__2 = ilaclc_(k, n, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = ilaclr_(m, &lastv, &c__[c_offset], ldc);
 
-		ctrmm_("Right", "Lower", "Conjugate transpose", "Unit", &
-			lastc, k, &c_b1, &v[v_offset], ldv, &work[work_offset]
-, ldwork)
-			;
+        /*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK) */
 
-/*              C1 := C1 - W' */
+        /*              W := C1 */
 
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			i__3 = j + i__ * c_dim1;
-			i__4 = j + i__ * c_dim1;
-			r_cnjg(&q__2, &work[i__ + j * work_dim1]);
-			q__1.r = c__[i__4].r - q__2.r, q__1.i = c__[i__4].i - 
-				q__2.i;
-			c__[i__3].r = q__1.r, c__[i__3].i = q__1.i;
-/* L20: */
-		    }
-/* L30: */
-		}
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          ccopy_(&lastc, &c__[j * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1);
+          /* L160: */
+        }
 
-	    } else if (lsame_(side, "R")) {
+        /*              W := W * V1' */
 
-/*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
+        ctrmm_("Right", "Upper", "Conjugate transpose", "Unit", &lastc, k, &c_b1, &v[v_offset], ldv, &work[work_offset],
+               ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C2 * V2' */
 
-/* Computing MAX */
-		i__1 = *k, i__2 = ilaclr_(n, k, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = ilaclr_(m, &lastv, &c__[c_offset], ldc);
+          i__1 = lastv - *k;
+          cgemm_("No transpose", "Conjugate transpose", &lastc, k, &i__1, &c_b1, &c__[(*k + 1) * c_dim1 + 1], ldc,
+                 &v[(*k + 1) * v_dim1 + 1], ldv, &c_b1, &work[work_offset], ldwork);
+        }
 
-/*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK) */
+        /*              W := W * T  or  W * T' */
 
-/*              W := C1 */
+        ctrmm_("Right", "Upper", trans, "Non-unit", &lastc, k, &c_b1, &t[t_offset], ldt, &work[work_offset], ldwork);
 
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    ccopy_(&lastc, &c__[j * c_dim1 + 1], &c__1, &work[j * 
-			    work_dim1 + 1], &c__1);
-/* L40: */
-		}
+        /*              C := C - W * V */
 
-/*              W := W * V1 */
+        if (lastv > *k) {
+          /*                 C2 := C2 - W * V2 */
 
-		ctrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &
-			c_b1, &v[v_offset], ldv, &work[work_offset], ldwork);
-		if (lastv > *k) {
+          i__1 = lastv - *k;
+          q__1.r = -1.f, q__1.i = -0.f;
+          cgemm_("No transpose", "No transpose", &lastc, &i__1, k, &q__1, &work[work_offset], ldwork,
+                 &v[(*k + 1) * v_dim1 + 1], ldv, &c_b1, &c__[(*k + 1) * c_dim1 + 1], ldc);
+        }
 
-/*                 W := W + C2 * V2 */
+        /*              W := W * V1 */
 
-		    i__1 = lastv - *k;
-		    cgemm_("No transpose", "No transpose", &lastc, k, &i__1, &
-			    c_b1, &c__[(*k + 1) * c_dim1 + 1], ldc, &v[*k + 1 
-			    + v_dim1], ldv, &c_b1, &work[work_offset], ldwork);
-		}
+        ctrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &c_b1, &v[v_offset], ldv, &work[work_offset],
+               ldwork);
 
-/*              W := W * T  or  W * T' */
+        /*              C1 := C1 - W */
 
-		ctrmm_("Right", "Upper", trans, "Non-unit", &lastc, k, &c_b1, 
-			&t[t_offset], ldt, &work[work_offset], ldwork);
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            i__3 = i__ + j * c_dim1;
+            i__4 = i__ + j * c_dim1;
+            i__5 = i__ + j * work_dim1;
+            q__1.r = c__[i__4].r - work[i__5].r, q__1.i = c__[i__4].i - work[i__5].i;
+            c__[i__3].r = q__1.r, c__[i__3].i = q__1.i;
+            /* L170: */
+          }
+          /* L180: */
+        }
+      }
 
-/*              C := C - W * V' */
+    } else {
+      /*           Let  V =  ( V1  V2 )    (V2: last K columns) */
+      /*           where  V2  is unit lower triangular. */
 
-		if (lastv > *k) {
+      if (lsame_(side, "L")) {
+        /*              Form  H * C  or  H' * C  where  C = ( C1 ) */
+        /*                                                  ( C2 ) */
 
-/*                 C2 := C2 - W * V2' */
+        /* Computing MAX */
+        i__1 = *k, i__2 = ilaclc_(k, m, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = ilaclc_(&lastv, n, &c__[c_offset], ldc);
 
-		    i__1 = lastv - *k;
-		    q__1.r = -1.f, q__1.i = -0.f;
-		    cgemm_("No transpose", "Conjugate transpose", &lastc, &
-			    i__1, k, &q__1, &work[work_offset], ldwork, &v[*k 
-			    + 1 + v_dim1], ldv, &c_b1, &c__[(*k + 1) * c_dim1 
-			    + 1], ldc);
-		}
+        /*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK) */
 
-/*              W := W * V1' */
+        /*              W := C2' */
 
-		ctrmm_("Right", "Lower", "Conjugate transpose", "Unit", &
-			lastc, k, &c_b1, &v[v_offset], ldv, &work[work_offset]
-, ldwork)
-			;
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          ccopy_(&lastc, &c__[lastv - *k + j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1);
+          clacgv_(&lastc, &work[j * work_dim1 + 1], &c__1);
+          /* L190: */
+        }
 
-/*              C1 := C1 - W */
+        /*              W := W * V2' */
 
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			i__3 = i__ + j * c_dim1;
-			i__4 = i__ + j * c_dim1;
-			i__5 = i__ + j * work_dim1;
-			q__1.r = c__[i__4].r - work[i__5].r, q__1.i = c__[
-				i__4].i - work[i__5].i;
-			c__[i__3].r = q__1.r, c__[i__3].i = q__1.i;
-/* L50: */
-		    }
-/* L60: */
-		}
-	    }
+        ctrmm_("Right", "Lower", "Conjugate transpose", "Unit", &lastc, k, &c_b1, &v[(lastv - *k + 1) * v_dim1 + 1],
+               ldv, &work[work_offset], ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C1'*V1' */
 
-	} else {
+          i__1 = lastv - *k;
+          cgemm_("Conjugate transpose", "Conjugate transpose", &lastc, k, &i__1, &c_b1, &c__[c_offset], ldc,
+                 &v[v_offset], ldv, &c_b1, &work[work_offset], ldwork);
+        }
 
-/*           Let  V =  ( V1 ) */
-/*                     ( V2 )    (last K rows) */
-/*           where  V2  is unit upper triangular. */
+        /*              W := W * T'  or  W * T */
 
-	    if (lsame_(side, "L")) {
+        ctrmm_("Right", "Lower", transt, "Non-unit", &lastc, k, &c_b1, &t[t_offset], ldt, &work[work_offset], ldwork);
 
-/*              Form  H * C  or  H' * C  where  C = ( C1 ) */
-/*                                                  ( C2 ) */
+        /*              C := C - V' * W' */
 
-/* Computing MAX */
-		i__1 = *k, i__2 = ilaclr_(m, k, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = ilaclc_(&lastv, n, &c__[c_offset], ldc);
+        if (lastv > *k) {
+          /*                 C1 := C1 - V1' * W' */
 
-/*              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK) */
+          i__1 = lastv - *k;
+          q__1.r = -1.f, q__1.i = -0.f;
+          cgemm_("Conjugate transpose", "Conjugate transpose", &i__1, &lastc, k, &q__1, &v[v_offset], ldv,
+                 &work[work_offset], ldwork, &c_b1, &c__[c_offset], ldc);
+        }
 
-/*              W := C2' */
+        /*              W := W * V2 */
 
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    ccopy_(&lastc, &c__[lastv - *k + j + c_dim1], ldc, &work[
-			    j * work_dim1 + 1], &c__1);
-		    clacgv_(&lastc, &work[j * work_dim1 + 1], &c__1);
-/* L70: */
-		}
+        ctrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &c_b1, &v[(lastv - *k + 1) * v_dim1 + 1], ldv,
+               &work[work_offset], ldwork);
 
-/*              W := W * V2 */
+        /*              C2 := C2 - W' */
 
-		ctrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &
-			c_b1, &v[lastv - *k + 1 + v_dim1], ldv, &work[
-			work_offset], ldwork);
-		if (lastv > *k) {
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            i__3 = lastv - *k + j + i__ * c_dim1;
+            i__4 = lastv - *k + j + i__ * c_dim1;
+            r_cnjg(&q__2, &work[i__ + j * work_dim1]);
+            q__1.r = c__[i__4].r - q__2.r, q__1.i = c__[i__4].i - q__2.i;
+            c__[i__3].r = q__1.r, c__[i__3].i = q__1.i;
+            /* L200: */
+          }
+          /* L210: */
+        }
 
-/*                 W := W + C1'*V1 */
+      } else if (lsame_(side, "R")) {
+        /*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
 
-		    i__1 = lastv - *k;
-		    cgemm_("Conjugate transpose", "No transpose", &lastc, k, &
-			    i__1, &c_b1, &c__[c_offset], ldc, &v[v_offset], 
-			    ldv, &c_b1, &work[work_offset], ldwork);
-		}
+        /* Computing MAX */
+        i__1 = *k, i__2 = ilaclc_(k, n, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = ilaclr_(m, &lastv, &c__[c_offset], ldc);
 
-/*              W := W * T'  or  W * T */
+        /*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK) */
 
-		ctrmm_("Right", "Lower", transt, "Non-unit", &lastc, k, &c_b1, 
-			 &t[t_offset], ldt, &work[work_offset], ldwork);
+        /*              W := C2 */
 
-/*              C := C - V * W' */
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          ccopy_(&lastc, &c__[(lastv - *k + j) * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1);
+          /* L220: */
+        }
 
-		if (lastv > *k) {
+        /*              W := W * V2' */
 
-/*                 C1 := C1 - V1 * W' */
+        ctrmm_("Right", "Lower", "Conjugate transpose", "Unit", &lastc, k, &c_b1, &v[(lastv - *k + 1) * v_dim1 + 1],
+               ldv, &work[work_offset], ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C1 * V1' */
 
-		    i__1 = lastv - *k;
-		    q__1.r = -1.f, q__1.i = -0.f;
-		    cgemm_("No transpose", "Conjugate transpose", &i__1, &
-			    lastc, k, &q__1, &v[v_offset], ldv, &work[
-			    work_offset], ldwork, &c_b1, &c__[c_offset], ldc);
-		}
+          i__1 = lastv - *k;
+          cgemm_("No transpose", "Conjugate transpose", &lastc, k, &i__1, &c_b1, &c__[c_offset], ldc, &v[v_offset], ldv,
+                 &c_b1, &work[work_offset], ldwork);
+        }
 
-/*              W := W * V2' */
+        /*              W := W * T  or  W * T' */
 
-		ctrmm_("Right", "Upper", "Conjugate transpose", "Unit", &
-			lastc, k, &c_b1, &v[lastv - *k + 1 + v_dim1], ldv, &
-			work[work_offset], ldwork);
+        ctrmm_("Right", "Lower", trans, "Non-unit", &lastc, k, &c_b1, &t[t_offset], ldt, &work[work_offset], ldwork);
 
-/*              C2 := C2 - W' */
+        /*              C := C - W * V */
 
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			i__3 = lastv - *k + j + i__ * c_dim1;
-			i__4 = lastv - *k + j + i__ * c_dim1;
-			r_cnjg(&q__2, &work[i__ + j * work_dim1]);
-			q__1.r = c__[i__4].r - q__2.r, q__1.i = c__[i__4].i - 
-				q__2.i;
-			c__[i__3].r = q__1.r, c__[i__3].i = q__1.i;
-/* L80: */
-		    }
-/* L90: */
-		}
+        if (lastv > *k) {
+          /*                 C1 := C1 - W * V1 */
 
-	    } else if (lsame_(side, "R")) {
+          i__1 = lastv - *k;
+          q__1.r = -1.f, q__1.i = -0.f;
+          cgemm_("No transpose", "No transpose", &lastc, &i__1, k, &q__1, &work[work_offset], ldwork, &v[v_offset], ldv,
+                 &c_b1, &c__[c_offset], ldc);
+        }
 
-/*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
+        /*              W := W * V2 */
 
-/* Computing MAX */
-		i__1 = *k, i__2 = ilaclr_(n, k, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = ilaclr_(m, &lastv, &c__[c_offset], ldc);
+        ctrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &c_b1, &v[(lastv - *k + 1) * v_dim1 + 1], ldv,
+               &work[work_offset], ldwork);
 
-/*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK) */
+        /*              C1 := C1 - W */
 
-/*              W := C2 */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    ccopy_(&lastc, &c__[(lastv - *k + j) * c_dim1 + 1], &c__1, 
-			     &work[j * work_dim1 + 1], &c__1);
-/* L100: */
-		}
-
-/*              W := W * V2 */
-
-		ctrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &
-			c_b1, &v[lastv - *k + 1 + v_dim1], ldv, &work[
-			work_offset], ldwork);
-		if (lastv > *k) {
-
-/*                 W := W + C1 * V1 */
-
-		    i__1 = lastv - *k;
-		    cgemm_("No transpose", "No transpose", &lastc, k, &i__1, &
-			    c_b1, &c__[c_offset], ldc, &v[v_offset], ldv, &
-			    c_b1, &work[work_offset], ldwork);
-		}
-
-/*              W := W * T  or  W * T' */
-
-		ctrmm_("Right", "Lower", trans, "Non-unit", &lastc, k, &c_b1, 
-			&t[t_offset], ldt, &work[work_offset], ldwork);
-
-/*              C := C - W * V' */
-
-		if (lastv > *k) {
-
-/*                 C1 := C1 - W * V1' */
-
-		    i__1 = lastv - *k;
-		    q__1.r = -1.f, q__1.i = -0.f;
-		    cgemm_("No transpose", "Conjugate transpose", &lastc, &
-			    i__1, k, &q__1, &work[work_offset], ldwork, &v[
-			    v_offset], ldv, &c_b1, &c__[c_offset], ldc);
-		}
-
-/*              W := W * V2' */
-
-		ctrmm_("Right", "Upper", "Conjugate transpose", "Unit", &
-			lastc, k, &c_b1, &v[lastv - *k + 1 + v_dim1], ldv, &
-			work[work_offset], ldwork);
-
-/*              C2 := C2 - W */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			i__3 = i__ + (lastv - *k + j) * c_dim1;
-			i__4 = i__ + (lastv - *k + j) * c_dim1;
-			i__5 = i__ + j * work_dim1;
-			q__1.r = c__[i__4].r - work[i__5].r, q__1.i = c__[
-				i__4].i - work[i__5].i;
-			c__[i__3].r = q__1.r, c__[i__3].i = q__1.i;
-/* L110: */
-		    }
-/* L120: */
-		}
-	    }
-	}
-
-    } else if (lsame_(storev, "R")) {
-
-	if (lsame_(direct, "F")) {
-
-/*           Let  V =  ( V1  V2 )    (V1: first K columns) */
-/*           where  V1  is unit upper triangular. */
-
-	    if (lsame_(side, "L")) {
-
-/*              Form  H * C  or  H' * C  where  C = ( C1 ) */
-/*                                                  ( C2 ) */
-
-/* Computing MAX */
-		i__1 = *k, i__2 = ilaclc_(k, m, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = ilaclc_(&lastv, n, &c__[c_offset], ldc);
-
-/*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK) */
-
-/*              W := C1' */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    ccopy_(&lastc, &c__[j + c_dim1], ldc, &work[j * work_dim1 
-			    + 1], &c__1);
-		    clacgv_(&lastc, &work[j * work_dim1 + 1], &c__1);
-/* L130: */
-		}
-
-/*              W := W * V1' */
-
-		ctrmm_("Right", "Upper", "Conjugate transpose", "Unit", &
-			lastc, k, &c_b1, &v[v_offset], ldv, &work[work_offset]
-, ldwork)
-			;
-		if (lastv > *k) {
-
-/*                 W := W + C2'*V2' */
-
-		    i__1 = lastv - *k;
-		    cgemm_("Conjugate transpose", "Conjugate transpose", &
-			    lastc, k, &i__1, &c_b1, &c__[*k + 1 + c_dim1], 
-			    ldc, &v[(*k + 1) * v_dim1 + 1], ldv, &c_b1, &work[
-			    work_offset], ldwork);
-		}
-
-/*              W := W * T'  or  W * T */
-
-		ctrmm_("Right", "Upper", transt, "Non-unit", &lastc, k, &c_b1, 
-			 &t[t_offset], ldt, &work[work_offset], ldwork);
-
-/*              C := C - V' * W' */
-
-		if (lastv > *k) {
-
-/*                 C2 := C2 - V2' * W' */
-
-		    i__1 = lastv - *k;
-		    q__1.r = -1.f, q__1.i = -0.f;
-		    cgemm_("Conjugate transpose", "Conjugate transpose", &
-			    i__1, &lastc, k, &q__1, &v[(*k + 1) * v_dim1 + 1], 
-			     ldv, &work[work_offset], ldwork, &c_b1, &c__[*k 
-			    + 1 + c_dim1], ldc);
-		}
-
-/*              W := W * V1 */
-
-		ctrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &
-			c_b1, &v[v_offset], ldv, &work[work_offset], ldwork);
-
-/*              C1 := C1 - W' */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			i__3 = j + i__ * c_dim1;
-			i__4 = j + i__ * c_dim1;
-			r_cnjg(&q__2, &work[i__ + j * work_dim1]);
-			q__1.r = c__[i__4].r - q__2.r, q__1.i = c__[i__4].i - 
-				q__2.i;
-			c__[i__3].r = q__1.r, c__[i__3].i = q__1.i;
-/* L140: */
-		    }
-/* L150: */
-		}
-
-	    } else if (lsame_(side, "R")) {
-
-/*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
-
-/* Computing MAX */
-		i__1 = *k, i__2 = ilaclc_(k, n, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = ilaclr_(m, &lastv, &c__[c_offset], ldc);
-
-/*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK) */
-
-/*              W := C1 */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    ccopy_(&lastc, &c__[j * c_dim1 + 1], &c__1, &work[j * 
-			    work_dim1 + 1], &c__1);
-/* L160: */
-		}
-
-/*              W := W * V1' */
-
-		ctrmm_("Right", "Upper", "Conjugate transpose", "Unit", &
-			lastc, k, &c_b1, &v[v_offset], ldv, &work[work_offset]
-, ldwork)
-			;
-		if (lastv > *k) {
-
-/*                 W := W + C2 * V2' */
-
-		    i__1 = lastv - *k;
-		    cgemm_("No transpose", "Conjugate transpose", &lastc, k, &
-			    i__1, &c_b1, &c__[(*k + 1) * c_dim1 + 1], ldc, &v[
-			    (*k + 1) * v_dim1 + 1], ldv, &c_b1, &work[
-			    work_offset], ldwork);
-		}
-
-/*              W := W * T  or  W * T' */
-
-		ctrmm_("Right", "Upper", trans, "Non-unit", &lastc, k, &c_b1, 
-			&t[t_offset], ldt, &work[work_offset], ldwork);
-
-/*              C := C - W * V */
-
-		if (lastv > *k) {
-
-/*                 C2 := C2 - W * V2 */
-
-		    i__1 = lastv - *k;
-		    q__1.r = -1.f, q__1.i = -0.f;
-		    cgemm_("No transpose", "No transpose", &lastc, &i__1, k, &
-			    q__1, &work[work_offset], ldwork, &v[(*k + 1) * 
-			    v_dim1 + 1], ldv, &c_b1, &c__[(*k + 1) * c_dim1 + 
-			    1], ldc);
-		}
-
-/*              W := W * V1 */
-
-		ctrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &
-			c_b1, &v[v_offset], ldv, &work[work_offset], ldwork);
-
-/*              C1 := C1 - W */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			i__3 = i__ + j * c_dim1;
-			i__4 = i__ + j * c_dim1;
-			i__5 = i__ + j * work_dim1;
-			q__1.r = c__[i__4].r - work[i__5].r, q__1.i = c__[
-				i__4].i - work[i__5].i;
-			c__[i__3].r = q__1.r, c__[i__3].i = q__1.i;
-/* L170: */
-		    }
-/* L180: */
-		}
-
-	    }
-
-	} else {
-
-/*           Let  V =  ( V1  V2 )    (V2: last K columns) */
-/*           where  V2  is unit lower triangular. */
-
-	    if (lsame_(side, "L")) {
-
-/*              Form  H * C  or  H' * C  where  C = ( C1 ) */
-/*                                                  ( C2 ) */
-
-/* Computing MAX */
-		i__1 = *k, i__2 = ilaclc_(k, m, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = ilaclc_(&lastv, n, &c__[c_offset], ldc);
-
-/*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK) */
-
-/*              W := C2' */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    ccopy_(&lastc, &c__[lastv - *k + j + c_dim1], ldc, &work[
-			    j * work_dim1 + 1], &c__1);
-		    clacgv_(&lastc, &work[j * work_dim1 + 1], &c__1);
-/* L190: */
-		}
-
-/*              W := W * V2' */
-
-		ctrmm_("Right", "Lower", "Conjugate transpose", "Unit", &
-			lastc, k, &c_b1, &v[(lastv - *k + 1) * v_dim1 + 1], 
-			ldv, &work[work_offset], ldwork);
-		if (lastv > *k) {
-
-/*                 W := W + C1'*V1' */
-
-		    i__1 = lastv - *k;
-		    cgemm_("Conjugate transpose", "Conjugate transpose", &
-			    lastc, k, &i__1, &c_b1, &c__[c_offset], ldc, &v[
-			    v_offset], ldv, &c_b1, &work[work_offset], ldwork);
-		}
-
-/*              W := W * T'  or  W * T */
-
-		ctrmm_("Right", "Lower", transt, "Non-unit", &lastc, k, &c_b1, 
-			 &t[t_offset], ldt, &work[work_offset], ldwork);
-
-/*              C := C - V' * W' */
-
-		if (lastv > *k) {
-
-/*                 C1 := C1 - V1' * W' */
-
-		    i__1 = lastv - *k;
-		    q__1.r = -1.f, q__1.i = -0.f;
-		    cgemm_("Conjugate transpose", "Conjugate transpose", &
-			    i__1, &lastc, k, &q__1, &v[v_offset], ldv, &work[
-			    work_offset], ldwork, &c_b1, &c__[c_offset], ldc);
-		}
-
-/*              W := W * V2 */
-
-		ctrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &
-			c_b1, &v[(lastv - *k + 1) * v_dim1 + 1], ldv, &work[
-			work_offset], ldwork);
-
-/*              C2 := C2 - W' */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			i__3 = lastv - *k + j + i__ * c_dim1;
-			i__4 = lastv - *k + j + i__ * c_dim1;
-			r_cnjg(&q__2, &work[i__ + j * work_dim1]);
-			q__1.r = c__[i__4].r - q__2.r, q__1.i = c__[i__4].i - 
-				q__2.i;
-			c__[i__3].r = q__1.r, c__[i__3].i = q__1.i;
-/* L200: */
-		    }
-/* L210: */
-		}
-
-	    } else if (lsame_(side, "R")) {
-
-/*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
-
-/* Computing MAX */
-		i__1 = *k, i__2 = ilaclc_(k, n, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = ilaclr_(m, &lastv, &c__[c_offset], ldc);
-
-/*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK) */
-
-/*              W := C2 */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    ccopy_(&lastc, &c__[(lastv - *k + j) * c_dim1 + 1], &c__1, 
-			     &work[j * work_dim1 + 1], &c__1);
-/* L220: */
-		}
-
-/*              W := W * V2' */
-
-		ctrmm_("Right", "Lower", "Conjugate transpose", "Unit", &
-			lastc, k, &c_b1, &v[(lastv - *k + 1) * v_dim1 + 1], 
-			ldv, &work[work_offset], ldwork);
-		if (lastv > *k) {
-
-/*                 W := W + C1 * V1' */
-
-		    i__1 = lastv - *k;
-		    cgemm_("No transpose", "Conjugate transpose", &lastc, k, &
-			    i__1, &c_b1, &c__[c_offset], ldc, &v[v_offset], 
-			    ldv, &c_b1, &work[work_offset], ldwork);
-		}
-
-/*              W := W * T  or  W * T' */
-
-		ctrmm_("Right", "Lower", trans, "Non-unit", &lastc, k, &c_b1, 
-			&t[t_offset], ldt, &work[work_offset], ldwork);
-
-/*              C := C - W * V */
-
-		if (lastv > *k) {
-
-/*                 C1 := C1 - W * V1 */
-
-		    i__1 = lastv - *k;
-		    q__1.r = -1.f, q__1.i = -0.f;
-		    cgemm_("No transpose", "No transpose", &lastc, &i__1, k, &
-			    q__1, &work[work_offset], ldwork, &v[v_offset], 
-			    ldv, &c_b1, &c__[c_offset], ldc);
-		}
-
-/*              W := W * V2 */
-
-		ctrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &
-			c_b1, &v[(lastv - *k + 1) * v_dim1 + 1], ldv, &work[
-			work_offset], ldwork);
-
-/*              C1 := C1 - W */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			i__3 = i__ + (lastv - *k + j) * c_dim1;
-			i__4 = i__ + (lastv - *k + j) * c_dim1;
-			i__5 = i__ + j * work_dim1;
-			q__1.r = c__[i__4].r - work[i__5].r, q__1.i = c__[
-				i__4].i - work[i__5].i;
-			c__[i__3].r = q__1.r, c__[i__3].i = q__1.i;
-/* L230: */
-		    }
-/* L240: */
-		}
-
-	    }
-
-	}
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            i__3 = i__ + (lastv - *k + j) * c_dim1;
+            i__4 = i__ + (lastv - *k + j) * c_dim1;
+            i__5 = i__ + j * work_dim1;
+            q__1.r = c__[i__4].r - work[i__5].r, q__1.i = c__[i__4].i - work[i__5].i;
+            c__[i__3].r = q__1.r, c__[i__3].i = q__1.i;
+            /* L230: */
+          }
+          /* L240: */
+        }
+      }
     }
+  }
 
-    return 0;
-
-/*     End of CLARFB */
+  /*     End of CLARFB */
 
 } /* clarfb_ */
diff --git a/lapack/clarfg.c b/lapack/clarfg.c
index 2a2c3eb..69bfd94 100644
--- a/lapack/clarfg.c
+++ b/lapack/clarfg.c
@@ -1,190 +1,182 @@
 /* clarfg.f -- translated by f2c (version 20061008).
    You must link the resulting object file with libf2c:
-	on Microsoft Windows system, link with libf2c.lib;
-	on Linux or Unix systems, link with .../path/to/libf2c.a -lm
-	or, if you install libf2c.a in a standard place, with -lf2c -lm
-	-- in that order, at the end of the command line, as in
-		cc *.o -lf2c -lm
-	Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
+        on Microsoft Windows system, link with libf2c.lib;
+        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
+        or, if you install libf2c.a in a standard place, with -lf2c -lm
+        -- in that order, at the end of the command line, as in
+                cc *.o -lf2c -lm
+        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
 
-		http://www.netlib.org/f2c/libf2c.zip
+                http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
+
+static inline real r_sign(real *a, real *b) {
+  real x;
+  x = (*a >= 0 ? *a : -*a);
+  return (*b >= 0 ? x : -x);
+}
 
 /* Table of constant values */
 
-static complex c_b5 = {1.f,0.f};
+static complex c_b5 = {1.f, 0.f};
 
-/* Subroutine */ int clarfg_(integer *n, complex *alpha, complex *x, integer *
-	incx, complex *tau)
-{
-    /* System generated locals */
-    integer i__1;
-    real r__1, r__2;
-    complex q__1, q__2;
+/* Subroutine */ void clarfg_(integer *n, complex *alpha, complex *x, integer *incx, complex *tau) {
+  /* System generated locals */
+  integer i__1;
+  real r__1, r__2;
+  complex q__1, q__2;
 
-    /* Builtin functions */
-    double r_imag(complex *), r_sign(real *, real *);
+  /* Local variables */
+  integer j, knt;
+  real beta;
+  extern /* Subroutine */ void cscal_(integer *, complex *, complex *, integer *);
+  real alphi, alphr, xnorm;
+  extern real scnrm2_(integer *, complex *, integer *), slapy3_(real *, real *, real *);
+  extern /* Complex */ void cladiv_(complex *, complex *, complex *);
+  extern doublereal slamch_(char *);
+  extern /* Subroutine */ void csscal_(integer *, real *, complex *, integer *);
+  real safmin, rsafmn;
 
-    /* Local variables */
-    integer j, knt;
-    real beta;
-    extern /* Subroutine */ int cscal_(integer *, complex *, complex *, 
-	    integer *);
-    real alphi, alphr, xnorm;
-    extern doublereal scnrm2_(integer *, complex *, integer *), slapy3_(real *
-, real *, real *);
-    extern /* Complex */ VOID cladiv_(complex *, complex *, complex *);
-    extern doublereal slamch_(char *);
-    extern /* Subroutine */ int csscal_(integer *, real *, complex *, integer 
-	    *);
-    real safmin, rsafmn;
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
+  /*     .. Scalar Arguments .. */
+  /*     .. */
+  /*     .. Array Arguments .. */
+  /*     .. */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*  Purpose */
+  /*  ======= */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
-/*     .. Array Arguments .. */
-/*     .. */
+  /*  CLARFG generates a complex elementary reflector H of order n, such */
+  /*  that */
 
-/*  Purpose */
-/*  ======= */
+  /*        H' * ( alpha ) = ( beta ),   H' * H = I. */
+  /*             (   x   )   (   0  ) */
 
-/*  CLARFG generates a complex elementary reflector H of order n, such */
-/*  that */
+  /*  where alpha and beta are scalars, with beta real, and x is an */
+  /*  (n-1)-element complex vector. H is represented in the form */
 
-/*        H' * ( alpha ) = ( beta ),   H' * H = I. */
-/*             (   x   )   (   0  ) */
+  /*        H = I - tau * ( 1 ) * ( 1 v' ) , */
+  /*                      ( v ) */
 
-/*  where alpha and beta are scalars, with beta real, and x is an */
-/*  (n-1)-element complex vector. H is represented in the form */
+  /*  where tau is a complex scalar and v is a complex (n-1)-element */
+  /*  vector. Note that H is not hermitian. */
 
-/*        H = I - tau * ( 1 ) * ( 1 v' ) , */
-/*                      ( v ) */
+  /*  If the elements of x are all zero and alpha is real, then tau = 0 */
+  /*  and H is taken to be the unit matrix. */
 
-/*  where tau is a complex scalar and v is a complex (n-1)-element */
-/*  vector. Note that H is not hermitian. */
+  /*  Otherwise  1 <= real(tau) <= 2  and  abs(tau-1) <= 1 . */
 
-/*  If the elements of x are all zero and alpha is real, then tau = 0 */
-/*  and H is taken to be the unit matrix. */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Otherwise  1 <= real(tau) <= 2  and  abs(tau-1) <= 1 . */
+  /*  N       (input) INTEGER */
+  /*          The order of the elementary reflector. */
 
-/*  Arguments */
-/*  ========= */
+  /*  ALPHA   (input/output) COMPLEX */
+  /*          On entry, the value alpha. */
+  /*          On exit, it is overwritten with the value beta. */
 
-/*  N       (input) INTEGER */
-/*          The order of the elementary reflector. */
+  /*  X       (input/output) COMPLEX array, dimension */
+  /*                         (1+(N-2)*abs(INCX)) */
+  /*          On entry, the vector x. */
+  /*          On exit, it is overwritten with the vector v. */
 
-/*  ALPHA   (input/output) COMPLEX */
-/*          On entry, the value alpha. */
-/*          On exit, it is overwritten with the value beta. */
+  /*  INCX    (input) INTEGER */
+  /*          The increment between elements of X. INCX > 0. */
 
-/*  X       (input/output) COMPLEX array, dimension */
-/*                         (1+(N-2)*abs(INCX)) */
-/*          On entry, the vector x. */
-/*          On exit, it is overwritten with the vector v. */
+  /*  TAU     (output) COMPLEX */
+  /*          The value tau. */
 
-/*  INCX    (input) INTEGER */
-/*          The increment between elements of X. INCX > 0. */
+  /*  ===================================================================== */
 
-/*  TAU     (output) COMPLEX */
-/*          The value tau. */
+  /*     .. Parameters .. */
+  /*     .. */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. Intrinsic Functions .. */
+  /*     .. */
+  /*     .. External Subroutines .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*  ===================================================================== */
+  /* Parameter adjustments */
+  --x;
 
-/*     .. Parameters .. */
-/*     .. */
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. Intrinsic Functions .. */
-/*     .. */
-/*     .. External Subroutines .. */
-/*     .. */
-/*     .. Executable Statements .. */
+  /* Function Body */
+  if (*n <= 0) {
+    tau->r = 0.f, tau->i = 0.f;
+    return;
+  }
 
-    /* Parameter adjustments */
-    --x;
+  i__1 = *n - 1;
+  xnorm = scnrm2_(&i__1, &x[1], incx);
+  alphr = alpha->r;
+  alphi = alpha->i;
 
-    /* Function Body */
-    if (*n <= 0) {
-	tau->r = 0.f, tau->i = 0.f;
-	return 0;
+  if (xnorm == 0.f && alphi == 0.f) {
+    /*        H  =  I */
+
+    tau->r = 0.f, tau->i = 0.f;
+  } else {
+    /*        general case */
+
+    r__1 = slapy3_(&alphr, &alphi, &xnorm);
+    beta = -r_sign(&r__1, &alphr);
+    safmin = slamch_("S") / slamch_("E");
+    rsafmn = 1.f / safmin;
+
+    knt = 0;
+    if (dabs(beta) < safmin) {
+      /*           XNORM, BETA may be inaccurate; scale X and recompute them */
+
+    L10:
+      ++knt;
+      i__1 = *n - 1;
+      csscal_(&i__1, &rsafmn, &x[1], incx);
+      beta *= rsafmn;
+      alphi *= rsafmn;
+      alphr *= rsafmn;
+      if (dabs(beta) < safmin) {
+        goto L10;
+      }
+
+      /*           New BETA is at most 1, at least SAFMIN */
+
+      i__1 = *n - 1;
+      xnorm = scnrm2_(&i__1, &x[1], incx);
+      q__1.r = alphr, q__1.i = alphi;
+      alpha->r = q__1.r, alpha->i = q__1.i;
+      r__1 = slapy3_(&alphr, &alphi, &xnorm);
+      beta = -r_sign(&r__1, &alphr);
     }
-
+    r__1 = (beta - alphr) / beta;
+    r__2 = -alphi / beta;
+    q__1.r = r__1, q__1.i = r__2;
+    tau->r = q__1.r, tau->i = q__1.i;
+    q__2.r = alpha->r - beta, q__2.i = alpha->i;
+    cladiv_(&q__1, &c_b5, &q__2);
+    alpha->r = q__1.r, alpha->i = q__1.i;
     i__1 = *n - 1;
-    xnorm = scnrm2_(&i__1, &x[1], incx);
-    alphr = alpha->r;
-    alphi = r_imag(alpha);
+    cscal_(&i__1, alpha, &x[1], incx);
 
-    if (xnorm == 0.f && alphi == 0.f) {
+    /*        If ALPHA is subnormal, it may lose relative accuracy */
 
-/*        H  =  I */
-
-	tau->r = 0.f, tau->i = 0.f;
-    } else {
-
-/*        general case */
-
-	r__1 = slapy3_(&alphr, &alphi, &xnorm);
-	beta = -r_sign(&r__1, &alphr);
-	safmin = slamch_("S") / slamch_("E");
-	rsafmn = 1.f / safmin;
-
-	knt = 0;
-	if (dabs(beta) < safmin) {
-
-/*           XNORM, BETA may be inaccurate; scale X and recompute them */
-
-L10:
-	    ++knt;
-	    i__1 = *n - 1;
-	    csscal_(&i__1, &rsafmn, &x[1], incx);
-	    beta *= rsafmn;
-	    alphi *= rsafmn;
-	    alphr *= rsafmn;
-	    if (dabs(beta) < safmin) {
-		goto L10;
-	    }
-
-/*           New BETA is at most 1, at least SAFMIN */
-
-	    i__1 = *n - 1;
-	    xnorm = scnrm2_(&i__1, &x[1], incx);
-	    q__1.r = alphr, q__1.i = alphi;
-	    alpha->r = q__1.r, alpha->i = q__1.i;
-	    r__1 = slapy3_(&alphr, &alphi, &xnorm);
-	    beta = -r_sign(&r__1, &alphr);
-	}
-	r__1 = (beta - alphr) / beta;
-	r__2 = -alphi / beta;
-	q__1.r = r__1, q__1.i = r__2;
-	tau->r = q__1.r, tau->i = q__1.i;
-	q__2.r = alpha->r - beta, q__2.i = alpha->i;
-	cladiv_(&q__1, &c_b5, &q__2);
-	alpha->r = q__1.r, alpha->i = q__1.i;
-	i__1 = *n - 1;
-	cscal_(&i__1, alpha, &x[1], incx);
-
-/*        If ALPHA is subnormal, it may lose relative accuracy */
-
-	i__1 = knt;
-	for (j = 1; j <= i__1; ++j) {
-	    beta *= safmin;
-/* L20: */
-	}
-	alpha->r = beta, alpha->i = 0.f;
+    i__1 = knt;
+    for (j = 1; j <= i__1; ++j) {
+      beta *= safmin;
+      /* L20: */
     }
+    alpha->r = beta, alpha->i = 0.f;
+  }
 
-    return 0;
-
-/*     End of CLARFG */
+  /*     End of CLARFG */
 
 } /* clarfg_ */
diff --git a/lapack/clarft.c b/lapack/clarft.c
index ca573e4..3a5efd5 100644
--- a/lapack/clarft.c
+++ b/lapack/clarft.c
@@ -1,361 +1,347 @@
 /* clarft.f -- translated by f2c (version 20061008).
    You must link the resulting object file with libf2c:
-	on Microsoft Windows system, link with libf2c.lib;
-	on Linux or Unix systems, link with .../path/to/libf2c.a -lm
-	or, if you install libf2c.a in a standard place, with -lf2c -lm
-	-- in that order, at the end of the command line, as in
-		cc *.o -lf2c -lm
-	Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
+        on Microsoft Windows system, link with libf2c.lib;
+        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
+        or, if you install libf2c.a in a standard place, with -lf2c -lm
+        -- in that order, at the end of the command line, as in
+                cc *.o -lf2c -lm
+        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
 
-		http://www.netlib.org/f2c/libf2c.zip
+                http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
 /* Table of constant values */
 
-static complex c_b2 = {0.f,0.f};
+static complex c_b2 = {0.f, 0.f};
 static integer c__1 = 1;
 
-/* Subroutine */ int clarft_(char *direct, char *storev, integer *n, integer *
-	k, complex *v, integer *ldv, complex *tau, complex *t, integer *ldt)
-{
-    /* System generated locals */
-    integer t_dim1, t_offset, v_dim1, v_offset, i__1, i__2, i__3, i__4;
-    complex q__1;
+/* Subroutine */ void clarft_(char *direct, char *storev, integer *n, integer *k, complex *v, integer *ldv,
+                              complex *tau, complex *t, integer *ldt) {
+  /* System generated locals */
+  integer t_dim1, t_offset, v_dim1, v_offset, i__1, i__2, i__3, i__4;
+  complex q__1;
 
-    /* Local variables */
-    integer i__, j, prevlastv;
-    complex vii;
-    extern /* Subroutine */ int cgemv_(char *, integer *, integer *, complex *
-, complex *, integer *, complex *, integer *, complex *, complex *
-, integer *);
-    extern logical lsame_(char *, char *);
-    integer lastv;
-    extern /* Subroutine */ int ctrmv_(char *, char *, char *, integer *, 
-	    complex *, integer *, complex *, integer *), clacgv_(integer *, complex *, integer *);
+  /* Local variables */
+  integer i__, j, prevlastv;
+  complex vii;
+  extern /* Subroutine */ void cgemv_(const char *, const integer *, const integer *, const complex *, const complex *,
+                                      const integer *, const complex *, const integer *, const complex *, complex *,
+                                      const integer *);
+  extern logical lsame_(char *, char *);
+  integer lastv;
+  extern /* Subroutine */ void ctrmv_(const char *, const char *, const char *, const integer *, const complex *,
+                                      const integer *, complex *, const integer *),
+      clacgv_(integer *, complex *, integer *);
 
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*     .. Scalar Arguments .. */
+  /*     .. */
+  /*     .. Array Arguments .. */
+  /*     .. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
-/*     .. Array Arguments .. */
-/*     .. */
+  /*  Purpose */
+  /*  ======= */
 
-/*  Purpose */
-/*  ======= */
+  /*  CLARFT forms the triangular factor T of a complex block reflector H */
+  /*  of order n, which is defined as a product of k elementary reflectors. */
 
-/*  CLARFT forms the triangular factor T of a complex block reflector H */
-/*  of order n, which is defined as a product of k elementary reflectors. */
+  /*  If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; */
 
-/*  If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; */
+  /*  If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. */
 
-/*  If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. */
+  /*  If STOREV = 'C', the vector which defines the elementary reflector */
+  /*  H(i) is stored in the i-th column of the array V, and */
 
-/*  If STOREV = 'C', the vector which defines the elementary reflector */
-/*  H(i) is stored in the i-th column of the array V, and */
+  /*     H  =  I - V * T * V' */
 
-/*     H  =  I - V * T * V' */
+  /*  If STOREV = 'R', the vector which defines the elementary reflector */
+  /*  H(i) is stored in the i-th row of the array V, and */
 
-/*  If STOREV = 'R', the vector which defines the elementary reflector */
-/*  H(i) is stored in the i-th row of the array V, and */
+  /*     H  =  I - V' * T * V */
 
-/*     H  =  I - V' * T * V */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Arguments */
-/*  ========= */
+  /*  DIRECT  (input) CHARACTER*1 */
+  /*          Specifies the order in which the elementary reflectors are */
+  /*          multiplied to form the block reflector: */
+  /*          = 'F': H = H(1) H(2) . . . H(k) (Forward) */
+  /*          = 'B': H = H(k) . . . H(2) H(1) (Backward) */
 
-/*  DIRECT  (input) CHARACTER*1 */
-/*          Specifies the order in which the elementary reflectors are */
-/*          multiplied to form the block reflector: */
-/*          = 'F': H = H(1) H(2) . . . H(k) (Forward) */
-/*          = 'B': H = H(k) . . . H(2) H(1) (Backward) */
+  /*  STOREV  (input) CHARACTER*1 */
+  /*          Specifies how the vectors which define the elementary */
+  /*          reflectors are stored (see also Further Details): */
+  /*          = 'C': columnwise */
+  /*          = 'R': rowwise */
 
-/*  STOREV  (input) CHARACTER*1 */
-/*          Specifies how the vectors which define the elementary */
-/*          reflectors are stored (see also Further Details): */
-/*          = 'C': columnwise */
-/*          = 'R': rowwise */
+  /*  N       (input) INTEGER */
+  /*          The order of the block reflector H. N >= 0. */
 
-/*  N       (input) INTEGER */
-/*          The order of the block reflector H. N >= 0. */
+  /*  K       (input) INTEGER */
+  /*          The order of the triangular factor T (= the number of */
+  /*          elementary reflectors). K >= 1. */
 
-/*  K       (input) INTEGER */
-/*          The order of the triangular factor T (= the number of */
-/*          elementary reflectors). K >= 1. */
+  /*  V       (input/output) COMPLEX array, dimension */
+  /*                               (LDV,K) if STOREV = 'C' */
+  /*                               (LDV,N) if STOREV = 'R' */
+  /*          The matrix V. See further details. */
 
-/*  V       (input/output) COMPLEX array, dimension */
-/*                               (LDV,K) if STOREV = 'C' */
-/*                               (LDV,N) if STOREV = 'R' */
-/*          The matrix V. See further details. */
+  /*  LDV     (input) INTEGER */
+  /*          The leading dimension of the array V. */
+  /*          If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. */
 
-/*  LDV     (input) INTEGER */
-/*          The leading dimension of the array V. */
-/*          If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. */
+  /*  TAU     (input) COMPLEX array, dimension (K) */
+  /*          TAU(i) must contain the scalar factor of the elementary */
+  /*          reflector H(i). */
 
-/*  TAU     (input) COMPLEX array, dimension (K) */
-/*          TAU(i) must contain the scalar factor of the elementary */
-/*          reflector H(i). */
+  /*  T       (output) COMPLEX array, dimension (LDT,K) */
+  /*          The k by k triangular factor T of the block reflector. */
+  /*          If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is */
+  /*          lower triangular. The rest of the array is not used. */
 
-/*  T       (output) COMPLEX array, dimension (LDT,K) */
-/*          The k by k triangular factor T of the block reflector. */
-/*          If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is */
-/*          lower triangular. The rest of the array is not used. */
+  /*  LDT     (input) INTEGER */
+  /*          The leading dimension of the array T. LDT >= K. */
 
-/*  LDT     (input) INTEGER */
-/*          The leading dimension of the array T. LDT >= K. */
+  /*  Further Details */
+  /*  =============== */
 
-/*  Further Details */
-/*  =============== */
+  /*  The shape of the matrix V and the storage of the vectors which define */
+  /*  the H(i) is best illustrated by the following example with n = 5 and */
+  /*  k = 3. The elements equal to 1 are not stored; the corresponding */
+  /*  array elements are modified but restored on exit. The rest of the */
+  /*  array is not used. */
 
-/*  The shape of the matrix V and the storage of the vectors which define */
-/*  the H(i) is best illustrated by the following example with n = 5 and */
-/*  k = 3. The elements equal to 1 are not stored; the corresponding */
-/*  array elements are modified but restored on exit. The rest of the */
-/*  array is not used. */
+  /*  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R': */
 
-/*  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R': */
+  /*               V = (  1       )                 V = (  1 v1 v1 v1 v1 ) */
+  /*                   ( v1  1    )                     (     1 v2 v2 v2 ) */
+  /*                   ( v1 v2  1 )                     (        1 v3 v3 ) */
+  /*                   ( v1 v2 v3 ) */
+  /*                   ( v1 v2 v3 ) */
 
-/*               V = (  1       )                 V = (  1 v1 v1 v1 v1 ) */
-/*                   ( v1  1    )                     (     1 v2 v2 v2 ) */
-/*                   ( v1 v2  1 )                     (        1 v3 v3 ) */
-/*                   ( v1 v2 v3 ) */
-/*                   ( v1 v2 v3 ) */
+  /*  DIRECT = 'B' and STOREV = 'C':         DIRECT = 'B' and STOREV = 'R': */
 
-/*  DIRECT = 'B' and STOREV = 'C':         DIRECT = 'B' and STOREV = 'R': */
+  /*               V = ( v1 v2 v3 )                 V = ( v1 v1  1       ) */
+  /*                   ( v1 v2 v3 )                     ( v2 v2 v2  1    ) */
+  /*                   (  1 v2 v3 )                     ( v3 v3 v3 v3  1 ) */
+  /*                   (     1 v3 ) */
+  /*                   (        1 ) */
 
-/*               V = ( v1 v2 v3 )                 V = ( v1 v1  1       ) */
-/*                   ( v1 v2 v3 )                     ( v2 v2 v2  1    ) */
-/*                   (  1 v2 v3 )                     ( v3 v3 v3 v3  1 ) */
-/*                   (     1 v3 ) */
-/*                   (        1 ) */
+  /*  ===================================================================== */
 
-/*  ===================================================================== */
+  /*     .. Parameters .. */
+  /*     .. */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Subroutines .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*     .. Parameters .. */
-/*     .. */
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Subroutines .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. Executable Statements .. */
+  /*     Quick return if possible */
 
-/*     Quick return if possible */
+  /* Parameter adjustments */
+  v_dim1 = *ldv;
+  v_offset = 1 + v_dim1;
+  v -= v_offset;
+  --tau;
+  t_dim1 = *ldt;
+  t_offset = 1 + t_dim1;
+  t -= t_offset;
 
-    /* Parameter adjustments */
-    v_dim1 = *ldv;
-    v_offset = 1 + v_dim1;
-    v -= v_offset;
-    --tau;
-    t_dim1 = *ldt;
-    t_offset = 1 + t_dim1;
-    t -= t_offset;
+  /* Function Body */
+  if (*n == 0) {
+    return;
+  }
 
-    /* Function Body */
-    if (*n == 0) {
-	return 0;
+  if (lsame_(direct, "F")) {
+    prevlastv = *n;
+    i__1 = *k;
+    for (i__ = 1; i__ <= i__1; ++i__) {
+      prevlastv = max(prevlastv, i__);
+      i__2 = i__;
+      if (tau[i__2].r == 0.f && tau[i__2].i == 0.f) {
+        /*              H(i)  =  I */
+
+        i__2 = i__;
+        for (j = 1; j <= i__2; ++j) {
+          i__3 = j + i__ * t_dim1;
+          t[i__3].r = 0.f, t[i__3].i = 0.f;
+          /* L10: */
+        }
+      } else {
+        /*              general case */
+
+        i__2 = i__ + i__ * v_dim1;
+        vii.r = v[i__2].r, vii.i = v[i__2].i;
+        i__2 = i__ + i__ * v_dim1;
+        v[i__2].r = 1.f, v[i__2].i = 0.f;
+        if (lsame_(storev, "C")) {
+          /*                 Skip any trailing zeros. */
+          i__2 = i__ + 1;
+          for (lastv = *n; lastv >= i__2; --lastv) {
+            i__3 = lastv + i__ * v_dim1;
+            if (v[i__3].r != 0.f || v[i__3].i != 0.f) {
+              break;
+            }
+          }
+          j = min(lastv, prevlastv);
+
+          /*                 T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)' * V(i:j,i) */
+
+          i__2 = j - i__ + 1;
+          i__3 = i__ - 1;
+          i__4 = i__;
+          q__1.r = -tau[i__4].r, q__1.i = -tau[i__4].i;
+          cgemv_("Conjugate transpose", &i__2, &i__3, &q__1, &v[i__ + v_dim1], ldv, &v[i__ + i__ * v_dim1], &c__1,
+                 &c_b2, &t[i__ * t_dim1 + 1], &c__1);
+        } else {
+          /*                 Skip any trailing zeros. */
+          i__2 = i__ + 1;
+          for (lastv = *n; lastv >= i__2; --lastv) {
+            i__3 = i__ + lastv * v_dim1;
+            if (v[i__3].r != 0.f || v[i__3].i != 0.f) {
+              break;
+            }
+          }
+          j = min(lastv, prevlastv);
+
+          /*                 T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)' */
+
+          if (i__ < j) {
+            i__2 = j - i__;
+            clacgv_(&i__2, &v[i__ + (i__ + 1) * v_dim1], ldv);
+          }
+          i__2 = i__ - 1;
+          i__3 = j - i__ + 1;
+          i__4 = i__;
+          q__1.r = -tau[i__4].r, q__1.i = -tau[i__4].i;
+          cgemv_("No transpose", &i__2, &i__3, &q__1, &v[i__ * v_dim1 + 1], ldv, &v[i__ + i__ * v_dim1], ldv, &c_b2,
+                 &t[i__ * t_dim1 + 1], &c__1);
+          if (i__ < j) {
+            i__2 = j - i__;
+            clacgv_(&i__2, &v[i__ + (i__ + 1) * v_dim1], ldv);
+          }
+        }
+        i__2 = i__ + i__ * v_dim1;
+        v[i__2].r = vii.r, v[i__2].i = vii.i;
+
+        /*              T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) */
+
+        i__2 = i__ - 1;
+        ctrmv_("Upper", "No transpose", "Non-unit", &i__2, &t[t_offset], ldt, &t[i__ * t_dim1 + 1], &c__1);
+        i__2 = i__ + i__ * t_dim1;
+        i__3 = i__;
+        t[i__2].r = tau[i__3].r, t[i__2].i = tau[i__3].i;
+        if (i__ > 1) {
+          prevlastv = max(prevlastv, lastv);
+        } else {
+          prevlastv = lastv;
+        }
+      }
+      /* L20: */
     }
+  } else {
+    prevlastv = 1;
+    for (i__ = *k; i__ >= 1; --i__) {
+      i__1 = i__;
+      if (tau[i__1].r == 0.f && tau[i__1].i == 0.f) {
+        /*              H(i)  =  I */
 
-    if (lsame_(direct, "F")) {
-	prevlastv = *n;
-	i__1 = *k;
-	for (i__ = 1; i__ <= i__1; ++i__) {
-	    prevlastv = max(prevlastv,i__);
-	    i__2 = i__;
-	    if (tau[i__2].r == 0.f && tau[i__2].i == 0.f) {
+        i__1 = *k;
+        for (j = i__; j <= i__1; ++j) {
+          i__2 = j + i__ * t_dim1;
+          t[i__2].r = 0.f, t[i__2].i = 0.f;
+          /* L30: */
+        }
+      } else {
+        /*              general case */
 
-/*              H(i)  =  I */
+        if (i__ < *k) {
+          if (lsame_(storev, "C")) {
+            i__1 = *n - *k + i__ + i__ * v_dim1;
+            vii.r = v[i__1].r, vii.i = v[i__1].i;
+            i__1 = *n - *k + i__ + i__ * v_dim1;
+            v[i__1].r = 1.f, v[i__1].i = 0.f;
+            /*                    Skip any leading zeros. */
+            i__1 = i__ - 1;
+            for (lastv = 1; lastv <= i__1; ++lastv) {
+              i__2 = lastv + i__ * v_dim1;
+              if (v[i__2].r != 0.f || v[i__2].i != 0.f) {
+                break;
+              }
+            }
+            j = max(lastv, prevlastv);
 
-		i__2 = i__;
-		for (j = 1; j <= i__2; ++j) {
-		    i__3 = j + i__ * t_dim1;
-		    t[i__3].r = 0.f, t[i__3].i = 0.f;
-/* L10: */
-		}
-	    } else {
+            /*                    T(i+1:k,i) := */
+            /*                            - tau(i) * V(j:n-k+i,i+1:k)' * V(j:n-k+i,i) */
 
-/*              general case */
+            i__1 = *n - *k + i__ - j + 1;
+            i__2 = *k - i__;
+            i__3 = i__;
+            q__1.r = -tau[i__3].r, q__1.i = -tau[i__3].i;
+            cgemv_("Conjugate transpose", &i__1, &i__2, &q__1, &v[j + (i__ + 1) * v_dim1], ldv, &v[j + i__ * v_dim1],
+                   &c__1, &c_b2, &t[i__ + 1 + i__ * t_dim1], &c__1);
+            i__1 = *n - *k + i__ + i__ * v_dim1;
+            v[i__1].r = vii.r, v[i__1].i = vii.i;
+          } else {
+            i__1 = i__ + (*n - *k + i__) * v_dim1;
+            vii.r = v[i__1].r, vii.i = v[i__1].i;
+            i__1 = i__ + (*n - *k + i__) * v_dim1;
+            v[i__1].r = 1.f, v[i__1].i = 0.f;
+            /*                    Skip any leading zeros. */
+            i__1 = i__ - 1;
+            for (lastv = 1; lastv <= i__1; ++lastv) {
+              i__2 = i__ + lastv * v_dim1;
+              if (v[i__2].r != 0.f || v[i__2].i != 0.f) {
+                break;
+              }
+            }
+            j = max(lastv, prevlastv);
 
-		i__2 = i__ + i__ * v_dim1;
-		vii.r = v[i__2].r, vii.i = v[i__2].i;
-		i__2 = i__ + i__ * v_dim1;
-		v[i__2].r = 1.f, v[i__2].i = 0.f;
-		if (lsame_(storev, "C")) {
-/*                 Skip any trailing zeros. */
-		    i__2 = i__ + 1;
-		    for (lastv = *n; lastv >= i__2; --lastv) {
-			i__3 = lastv + i__ * v_dim1;
-			if (v[i__3].r != 0.f || v[i__3].i != 0.f) {
-			    break;
-			}
-		    }
-		    j = min(lastv,prevlastv);
+            /*                    T(i+1:k,i) := */
+            /*                            - tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)' */
 
-/*                 T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)' * V(i:j,i) */
+            i__1 = *n - *k + i__ - 1 - j + 1;
+            clacgv_(&i__1, &v[i__ + j * v_dim1], ldv);
+            i__1 = *k - i__;
+            i__2 = *n - *k + i__ - j + 1;
+            i__3 = i__;
+            q__1.r = -tau[i__3].r, q__1.i = -tau[i__3].i;
+            cgemv_("No transpose", &i__1, &i__2, &q__1, &v[i__ + 1 + j * v_dim1], ldv, &v[i__ + j * v_dim1], ldv, &c_b2,
+                   &t[i__ + 1 + i__ * t_dim1], &c__1);
+            i__1 = *n - *k + i__ - 1 - j + 1;
+            clacgv_(&i__1, &v[i__ + j * v_dim1], ldv);
+            i__1 = i__ + (*n - *k + i__) * v_dim1;
+            v[i__1].r = vii.r, v[i__1].i = vii.i;
+          }
 
-		    i__2 = j - i__ + 1;
-		    i__3 = i__ - 1;
-		    i__4 = i__;
-		    q__1.r = -tau[i__4].r, q__1.i = -tau[i__4].i;
-		    cgemv_("Conjugate transpose", &i__2, &i__3, &q__1, &v[i__ 
-			    + v_dim1], ldv, &v[i__ + i__ * v_dim1], &c__1, &
-			    c_b2, &t[i__ * t_dim1 + 1], &c__1);
-		} else {
-/*                 Skip any trailing zeros. */
-		    i__2 = i__ + 1;
-		    for (lastv = *n; lastv >= i__2; --lastv) {
-			i__3 = i__ + lastv * v_dim1;
-			if (v[i__3].r != 0.f || v[i__3].i != 0.f) {
-			    break;
-			}
-		    }
-		    j = min(lastv,prevlastv);
+          /*                 T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) */
 
-/*                 T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)' */
-
-		    if (i__ < j) {
-			i__2 = j - i__;
-			clacgv_(&i__2, &v[i__ + (i__ + 1) * v_dim1], ldv);
-		    }
-		    i__2 = i__ - 1;
-		    i__3 = j - i__ + 1;
-		    i__4 = i__;
-		    q__1.r = -tau[i__4].r, q__1.i = -tau[i__4].i;
-		    cgemv_("No transpose", &i__2, &i__3, &q__1, &v[i__ * 
-			    v_dim1 + 1], ldv, &v[i__ + i__ * v_dim1], ldv, &
-			    c_b2, &t[i__ * t_dim1 + 1], &c__1);
-		    if (i__ < j) {
-			i__2 = j - i__;
-			clacgv_(&i__2, &v[i__ + (i__ + 1) * v_dim1], ldv);
-		    }
-		}
-		i__2 = i__ + i__ * v_dim1;
-		v[i__2].r = vii.r, v[i__2].i = vii.i;
-
-/*              T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) */
-
-		i__2 = i__ - 1;
-		ctrmv_("Upper", "No transpose", "Non-unit", &i__2, &t[
-			t_offset], ldt, &t[i__ * t_dim1 + 1], &c__1);
-		i__2 = i__ + i__ * t_dim1;
-		i__3 = i__;
-		t[i__2].r = tau[i__3].r, t[i__2].i = tau[i__3].i;
-		if (i__ > 1) {
-		    prevlastv = max(prevlastv,lastv);
-		} else {
-		    prevlastv = lastv;
-		}
-	    }
-/* L20: */
-	}
-    } else {
-	prevlastv = 1;
-	for (i__ = *k; i__ >= 1; --i__) {
-	    i__1 = i__;
-	    if (tau[i__1].r == 0.f && tau[i__1].i == 0.f) {
-
-/*              H(i)  =  I */
-
-		i__1 = *k;
-		for (j = i__; j <= i__1; ++j) {
-		    i__2 = j + i__ * t_dim1;
-		    t[i__2].r = 0.f, t[i__2].i = 0.f;
-/* L30: */
-		}
-	    } else {
-
-/*              general case */
-
-		if (i__ < *k) {
-		    if (lsame_(storev, "C")) {
-			i__1 = *n - *k + i__ + i__ * v_dim1;
-			vii.r = v[i__1].r, vii.i = v[i__1].i;
-			i__1 = *n - *k + i__ + i__ * v_dim1;
-			v[i__1].r = 1.f, v[i__1].i = 0.f;
-/*                    Skip any leading zeros. */
-			i__1 = i__ - 1;
-			for (lastv = 1; lastv <= i__1; ++lastv) {
-			    i__2 = lastv + i__ * v_dim1;
-			    if (v[i__2].r != 0.f || v[i__2].i != 0.f) {
-				break;
-			    }
-			}
-			j = max(lastv,prevlastv);
-
-/*                    T(i+1:k,i) := */
-/*                            - tau(i) * V(j:n-k+i,i+1:k)' * V(j:n-k+i,i) */
-
-			i__1 = *n - *k + i__ - j + 1;
-			i__2 = *k - i__;
-			i__3 = i__;
-			q__1.r = -tau[i__3].r, q__1.i = -tau[i__3].i;
-			cgemv_("Conjugate transpose", &i__1, &i__2, &q__1, &v[
-				j + (i__ + 1) * v_dim1], ldv, &v[j + i__ * 
-				v_dim1], &c__1, &c_b2, &t[i__ + 1 + i__ * 
-				t_dim1], &c__1);
-			i__1 = *n - *k + i__ + i__ * v_dim1;
-			v[i__1].r = vii.r, v[i__1].i = vii.i;
-		    } else {
-			i__1 = i__ + (*n - *k + i__) * v_dim1;
-			vii.r = v[i__1].r, vii.i = v[i__1].i;
-			i__1 = i__ + (*n - *k + i__) * v_dim1;
-			v[i__1].r = 1.f, v[i__1].i = 0.f;
-/*                    Skip any leading zeros. */
-			i__1 = i__ - 1;
-			for (lastv = 1; lastv <= i__1; ++lastv) {
-			    i__2 = i__ + lastv * v_dim1;
-			    if (v[i__2].r != 0.f || v[i__2].i != 0.f) {
-				break;
-			    }
-			}
-			j = max(lastv,prevlastv);
-
-/*                    T(i+1:k,i) := */
-/*                            - tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)' */
-
-			i__1 = *n - *k + i__ - 1 - j + 1;
-			clacgv_(&i__1, &v[i__ + j * v_dim1], ldv);
-			i__1 = *k - i__;
-			i__2 = *n - *k + i__ - j + 1;
-			i__3 = i__;
-			q__1.r = -tau[i__3].r, q__1.i = -tau[i__3].i;
-			cgemv_("No transpose", &i__1, &i__2, &q__1, &v[i__ + 
-				1 + j * v_dim1], ldv, &v[i__ + j * v_dim1], 
-				ldv, &c_b2, &t[i__ + 1 + i__ * t_dim1], &c__1);
-			i__1 = *n - *k + i__ - 1 - j + 1;
-			clacgv_(&i__1, &v[i__ + j * v_dim1], ldv);
-			i__1 = i__ + (*n - *k + i__) * v_dim1;
-			v[i__1].r = vii.r, v[i__1].i = vii.i;
-		    }
-
-/*                 T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) */
-
-		    i__1 = *k - i__;
-		    ctrmv_("Lower", "No transpose", "Non-unit", &i__1, &t[i__ 
-			    + 1 + (i__ + 1) * t_dim1], ldt, &t[i__ + 1 + i__ *
-			     t_dim1], &c__1)
-			    ;
-		    if (i__ > 1) {
-			prevlastv = min(prevlastv,lastv);
-		    } else {
-			prevlastv = lastv;
-		    }
-		}
-		i__1 = i__ + i__ * t_dim1;
-		i__2 = i__;
-		t[i__1].r = tau[i__2].r, t[i__1].i = tau[i__2].i;
-	    }
-/* L40: */
-	}
+          i__1 = *k - i__;
+          ctrmv_("Lower", "No transpose", "Non-unit", &i__1, &t[i__ + 1 + (i__ + 1) * t_dim1], ldt,
+                 &t[i__ + 1 + i__ * t_dim1], &c__1);
+          if (i__ > 1) {
+            prevlastv = min(prevlastv, lastv);
+          } else {
+            prevlastv = lastv;
+          }
+        }
+        i__1 = i__ + i__ * t_dim1;
+        i__2 = i__;
+        t[i__1].r = tau[i__2].r, t[i__1].i = tau[i__2].i;
+      }
+      /* L40: */
     }
-    return 0;
+  }
 
-/*     End of CLARFT */
+  /*     End of CLARFT */
 
 } /* clarft_ */
diff --git a/lapack/dladiv.c b/lapack/dladiv.c
index 20fbe6b..45c0183 100644
--- a/lapack/dladiv.c
+++ b/lapack/dladiv.c
@@ -1,78 +1,74 @@
 /* dladiv.f -- translated by f2c (version 20061008).
    You must link the resulting object file with libf2c:
-	on Microsoft Windows system, link with libf2c.lib;
-	on Linux or Unix systems, link with .../path/to/libf2c.a -lm
-	or, if you install libf2c.a in a standard place, with -lf2c -lm
-	-- in that order, at the end of the command line, as in
-		cc *.o -lf2c -lm
-	Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
+        on Microsoft Windows system, link with libf2c.lib;
+        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
+        or, if you install libf2c.a in a standard place, with -lf2c -lm
+        -- in that order, at the end of the command line, as in
+                cc *.o -lf2c -lm
+        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
 
-		http://www.netlib.org/f2c/libf2c.zip
+                http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
-/* Subroutine */ int dladiv_(doublereal *a, doublereal *b, doublereal *c__, 
-	doublereal *d__, doublereal *p, doublereal *q)
-{
-    doublereal e, f;
+/* Subroutine */ void dladiv_(doublereal *a, doublereal *b, doublereal *c__, doublereal *d__, doublereal *p,
+                              doublereal *q) {
+  doublereal e, f;
 
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*     .. Scalar Arguments .. */
+  /*     .. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
+  /*  Purpose */
+  /*  ======= */
 
-/*  Purpose */
-/*  ======= */
+  /*  DLADIV performs complex division in  real arithmetic */
 
-/*  DLADIV performs complex division in  real arithmetic */
+  /*                        a + i*b */
+  /*             p + i*q = --------- */
+  /*                        c + i*d */
 
-/*                        a + i*b */
-/*             p + i*q = --------- */
-/*                        c + i*d */
+  /*  The algorithm is due to Robert L. Smith and can be found */
+  /*  in D. Knuth, The art of Computer Programming, Vol.2, p.195 */
 
-/*  The algorithm is due to Robert L. Smith and can be found */
-/*  in D. Knuth, The art of Computer Programming, Vol.2, p.195 */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Arguments */
-/*  ========= */
+  /*  A       (input) DOUBLE PRECISION */
+  /*  B       (input) DOUBLE PRECISION */
+  /*  C       (input) DOUBLE PRECISION */
+  /*  D       (input) DOUBLE PRECISION */
+  /*          The scalars a, b, c, and d in the above expression. */
 
-/*  A       (input) DOUBLE PRECISION */
-/*  B       (input) DOUBLE PRECISION */
-/*  C       (input) DOUBLE PRECISION */
-/*  D       (input) DOUBLE PRECISION */
-/*          The scalars a, b, c, and d in the above expression. */
+  /*  P       (output) DOUBLE PRECISION */
+  /*  Q       (output) DOUBLE PRECISION */
+  /*          The scalars p and q in the above expression. */
 
-/*  P       (output) DOUBLE PRECISION */
-/*  Q       (output) DOUBLE PRECISION */
-/*          The scalars p and q in the above expression. */
+  /*  ===================================================================== */
 
-/*  ===================================================================== */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. Intrinsic Functions .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. Intrinsic Functions .. */
-/*     .. */
-/*     .. Executable Statements .. */
+  if (abs(*d__) < abs(*c__)) {
+    e = *d__ / *c__;
+    f = *c__ + *d__ * e;
+    *p = (*a + *b * e) / f;
+    *q = (*b - *a * e) / f;
+  } else {
+    e = *c__ / *d__;
+    f = *d__ + *c__ * e;
+    *p = (*b + *a * e) / f;
+    *q = (-(*a) + *b * e) / f;
+  }
 
-    if (abs(*d__) < abs(*c__)) {
-	e = *d__ / *c__;
-	f = *c__ + *d__ * e;
-	*p = (*a + *b * e) / f;
-	*q = (*b - *a * e) / f;
-    } else {
-	e = *c__ / *d__;
-	f = *d__ + *c__ * e;
-	*p = (*b + *a * e) / f;
-	*q = (-(*a) + *b * e) / f;
-    }
-
-    return 0;
-
-/*     End of DLADIV */
+  /*     End of DLADIV */
 
 } /* dladiv_ */
diff --git a/lapack/dlamch.c b/lapack/dlamch.c
index e224439..71c4166 100644
--- a/lapack/dlamch.c
+++ b/lapack/dlamch.c
@@ -1,1001 +1,992 @@
 /* dlamch.f -- translated by f2c (version 20061008).
    You must link the resulting object file with libf2c:
-	on Microsoft Windows system, link with libf2c.lib;
-	on Linux or Unix systems, link with .../path/to/libf2c.a -lm
-	or, if you install libf2c.a in a standard place, with -lf2c -lm
-	-- in that order, at the end of the command line, as in
-		cc *.o -lf2c -lm
-	Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
+        on Microsoft Windows system, link with libf2c.lib;
+        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
+        or, if you install libf2c.a in a standard place, with -lf2c -lm
+        -- in that order, at the end of the command line, as in
+                cc *.o -lf2c -lm
+        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
 
-		http://www.netlib.org/f2c/libf2c.zip
+                http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
 /* Table of constant values */
 
-static integer c__1 = 1;
+/* static integer c__1 = 1; */
 static doublereal c_b32 = 0.;
 
-doublereal dlamch_(char *cmach)
-{
-    /* Initialized data */
+static inline doublereal pow_di(doublereal *ap, integer *bp) {
+  doublereal pow, x;
+  integer n;
+  unsigned long u;
 
-    static logical first = TRUE_;
+  pow = 1;
+  x = *ap;
+  n = *bp;
 
-    /* System generated locals */
-    integer i__1;
-    doublereal ret_val;
-
-    /* Builtin functions */
-    double pow_di(doublereal *, integer *);
-
-    /* Local variables */
-    static doublereal t;
-    integer it;
-    static doublereal rnd, eps, base;
-    integer beta;
-    static doublereal emin, prec, emax;
-    integer imin, imax;
-    logical lrnd = 0;
-    static doublereal rmin, rmax;
-    doublereal rmach = 0;
-    extern logical lsame_(char *, char *);
-    doublereal small;
-    static doublereal sfmin;
-    extern /* Subroutine */ int dlamc2_(integer *, integer *, logical *, 
-	    doublereal *, integer *, doublereal *, integer *, doublereal *);
-
-
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
-
-/*     .. Scalar Arguments .. */
-/*     .. */
-
-/*  Purpose */
-/*  ======= */
-
-/*  DLAMCH determines double precision machine parameters. */
-
-/*  Arguments */
-/*  ========= */
-
-/*  CMACH   (input) CHARACTER*1 */
-/*          Specifies the value to be returned by DLAMCH: */
-/*          = 'E' or 'e',   DLAMCH := eps */
-/*          = 'S' or 's ,   DLAMCH := sfmin */
-/*          = 'B' or 'b',   DLAMCH := base */
-/*          = 'P' or 'p',   DLAMCH := eps*base */
-/*          = 'N' or 'n',   DLAMCH := t */
-/*          = 'R' or 'r',   DLAMCH := rnd */
-/*          = 'M' or 'm',   DLAMCH := emin */
-/*          = 'U' or 'u',   DLAMCH := rmin */
-/*          = 'L' or 'l',   DLAMCH := emax */
-/*          = 'O' or 'o',   DLAMCH := rmax */
-
-/*          where */
-
-/*          eps   = relative machine precision */
-/*          sfmin = safe minimum, such that 1/sfmin does not overflow */
-/*          base  = base of the machine */
-/*          prec  = eps*base */
-/*          t     = number of (base) digits in the mantissa */
-/*          rnd   = 1.0 when rounding occurs in addition, 0.0 otherwise */
-/*          emin  = minimum exponent before (gradual) underflow */
-/*          rmin  = underflow threshold - base**(emin-1) */
-/*          emax  = largest exponent before overflow */
-/*          rmax  = overflow threshold  - (base**emax)*(1-eps) */
-
-/* ===================================================================== */
-
-/*     .. Parameters .. */
-/*     .. */
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. External Subroutines .. */
-/*     .. */
-/*     .. Save statement .. */
-/*     .. */
-/*     .. Data statements .. */
-/*     .. */
-/*     .. Executable Statements .. */
-
-    if (first) {
-	dlamc2_(&beta, &it, &lrnd, &eps, &imin, &rmin, &imax, &rmax);
-	base = (doublereal) beta;
-	t = (doublereal) it;
-	if (lrnd) {
-	    rnd = 1.;
-	    i__1 = 1 - it;
-	    eps = pow_di(&base, &i__1) / 2;
-	} else {
-	    rnd = 0.;
-	    i__1 = 1 - it;
-	    eps = pow_di(&base, &i__1);
-	}
-	prec = eps * base;
-	emin = (doublereal) imin;
-	emax = (doublereal) imax;
-	sfmin = rmin;
-	small = 1. / rmax;
-	if (small >= sfmin) {
-
-/*           Use SMALL plus a bit, to avoid the possibility of rounding */
-/*           causing overflow when computing  1/sfmin. */
-
-	    sfmin = small * (eps + 1.);
-	}
+  if (n != 0) {
+    if (n < 0) {
+      n = -n;
+      x = 1 / x;
     }
-
-    if (lsame_(cmach, "E")) {
-	rmach = eps;
-    } else if (lsame_(cmach, "S")) {
-	rmach = sfmin;
-    } else if (lsame_(cmach, "B")) {
-	rmach = base;
-    } else if (lsame_(cmach, "P")) {
-	rmach = prec;
-    } else if (lsame_(cmach, "N")) {
-	rmach = t;
-    } else if (lsame_(cmach, "R")) {
-	rmach = rnd;
-    } else if (lsame_(cmach, "M")) {
-	rmach = emin;
-    } else if (lsame_(cmach, "U")) {
-	rmach = rmin;
-    } else if (lsame_(cmach, "L")) {
-	rmach = emax;
-    } else if (lsame_(cmach, "O")) {
-	rmach = rmax;
+    for (u = n;;) {
+      if (u & 01) pow *= x;
+      if (u >>= 1)
+        x *= x;
+      else
+        break;
     }
+  }
+  return (pow);
+}
 
-    ret_val = rmach;
-    first = FALSE_;
-    return ret_val;
+doublereal dlamch_(char *cmach) {
+  /* Initialized data */
 
-/*     End of DLAMCH */
+  static logical first = TRUE_;
+
+  /* System generated locals */
+  integer i__1;
+  doublereal ret_val;
+
+  /* Local variables */
+  static doublereal t;
+  integer it;
+  static doublereal rnd, eps, base;
+  integer beta;
+  static doublereal emin, prec, emax;
+  integer imin, imax;
+  logical lrnd = 0;
+  static doublereal rmin, rmax;
+  doublereal rmach = 0;
+  extern logical lsame_(char *, char *);
+  doublereal small;
+  static doublereal sfmin;
+  extern /* Subroutine */ void dlamc2_(integer *, integer *, logical *, doublereal *, integer *, doublereal *,
+                                       integer *, doublereal *);
+
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
+
+  /*     .. Scalar Arguments .. */
+  /*     .. */
+
+  /*  Purpose */
+  /*  ======= */
+
+  /*  DLAMCH determines double precision machine parameters. */
+
+  /*  Arguments */
+  /*  ========= */
+
+  /*  CMACH   (input) CHARACTER*1 */
+  /*          Specifies the value to be returned by DLAMCH: */
+  /*          = 'E' or 'e',   DLAMCH := eps */
+  /*          = 'S' or 's ,   DLAMCH := sfmin */
+  /*          = 'B' or 'b',   DLAMCH := base */
+  /*          = 'P' or 'p',   DLAMCH := eps*base */
+  /*          = 'N' or 'n',   DLAMCH := t */
+  /*          = 'R' or 'r',   DLAMCH := rnd */
+  /*          = 'M' or 'm',   DLAMCH := emin */
+  /*          = 'U' or 'u',   DLAMCH := rmin */
+  /*          = 'L' or 'l',   DLAMCH := emax */
+  /*          = 'O' or 'o',   DLAMCH := rmax */
+
+  /*          where */
+
+  /*          eps   = relative machine precision */
+  /*          sfmin = safe minimum, such that 1/sfmin does not overflow */
+  /*          base  = base of the machine */
+  /*          prec  = eps*base */
+  /*          t     = number of (base) digits in the mantissa */
+  /*          rnd   = 1.0 when rounding occurs in addition, 0.0 otherwise */
+  /*          emin  = minimum exponent before (gradual) underflow */
+  /*          rmin  = underflow threshold - base**(emin-1) */
+  /*          emax  = largest exponent before overflow */
+  /*          rmax  = overflow threshold  - (base**emax)*(1-eps) */
+
+  /* ===================================================================== */
+
+  /*     .. Parameters .. */
+  /*     .. */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. External Subroutines .. */
+  /*     .. */
+  /*     .. Save statement .. */
+  /*     .. */
+  /*     .. Data statements .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
+
+  if (first) {
+    dlamc2_(&beta, &it, &lrnd, &eps, &imin, &rmin, &imax, &rmax);
+    base = (doublereal)beta;
+    t = (doublereal)it;
+    if (lrnd) {
+      rnd = 1.;
+      i__1 = 1 - it;
+      eps = pow_di(&base, &i__1) / 2;
+    } else {
+      rnd = 0.;
+      i__1 = 1 - it;
+      eps = pow_di(&base, &i__1);
+    }
+    prec = eps * base;
+    emin = (doublereal)imin;
+    emax = (doublereal)imax;
+    sfmin = rmin;
+    small = 1. / rmax;
+    if (small >= sfmin) {
+      /*           Use SMALL plus a bit, to avoid the possibility of rounding */
+      /*           causing overflow when computing  1/sfmin. */
+
+      sfmin = small * (eps + 1.);
+    }
+  }
+
+  if (lsame_(cmach, "E")) {
+    rmach = eps;
+  } else if (lsame_(cmach, "S")) {
+    rmach = sfmin;
+  } else if (lsame_(cmach, "B")) {
+    rmach = base;
+  } else if (lsame_(cmach, "P")) {
+    rmach = prec;
+  } else if (lsame_(cmach, "N")) {
+    rmach = t;
+  } else if (lsame_(cmach, "R")) {
+    rmach = rnd;
+  } else if (lsame_(cmach, "M")) {
+    rmach = emin;
+  } else if (lsame_(cmach, "U")) {
+    rmach = rmin;
+  } else if (lsame_(cmach, "L")) {
+    rmach = emax;
+  } else if (lsame_(cmach, "O")) {
+    rmach = rmax;
+  }
+
+  ret_val = rmach;
+  first = FALSE_;
+  return ret_val;
+
+  /*     End of DLAMCH */
 
 } /* dlamch_ */
 
-
 /* *********************************************************************** */
 
-/* Subroutine */ int dlamc1_(integer *beta, integer *t, logical *rnd, logical 
-	*ieee1)
-{
-    /* Initialized data */
+/* Subroutine */ void dlamc1_(integer *beta, integer *t, logical *rnd, logical *ieee1) {
+  /* Initialized data */
 
-    static logical first = TRUE_;
+  static logical first = TRUE_;
 
-    /* System generated locals */
-    doublereal d__1, d__2;
+  /* System generated locals */
+  doublereal d__1, d__2;
 
-    /* Local variables */
-    doublereal a, b, c__, f, t1, t2;
-    static integer lt;
-    doublereal one, qtr;
-    static logical lrnd;
-    static integer lbeta;
-    doublereal savec;
-    extern doublereal dlamc3_(doublereal *, doublereal *);
-    static logical lieee1;
+  /* Local variables */
+  doublereal a, b, c__, f, t1, t2;
+  static integer lt;
+  doublereal one, qtr;
+  static logical lrnd;
+  static integer lbeta;
+  doublereal savec;
+  extern doublereal dlamc3_(doublereal *, doublereal *);
+  static logical lieee1;
 
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*     .. Scalar Arguments .. */
+  /*     .. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
+  /*  Purpose */
+  /*  ======= */
 
-/*  Purpose */
-/*  ======= */
+  /*  DLAMC1 determines the machine parameters given by BETA, T, RND, and */
+  /*  IEEE1. */
 
-/*  DLAMC1 determines the machine parameters given by BETA, T, RND, and */
-/*  IEEE1. */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Arguments */
-/*  ========= */
+  /*  BETA    (output) INTEGER */
+  /*          The base of the machine. */
 
-/*  BETA    (output) INTEGER */
-/*          The base of the machine. */
+  /*  T       (output) INTEGER */
+  /*          The number of ( BETA ) digits in the mantissa. */
 
-/*  T       (output) INTEGER */
-/*          The number of ( BETA ) digits in the mantissa. */
+  /*  RND     (output) LOGICAL */
+  /*          Specifies whether proper rounding  ( RND = .TRUE. )  or */
+  /*          chopping  ( RND = .FALSE. )  occurs in addition. This may not */
+  /*          be a reliable guide to the way in which the machine performs */
+  /*          its arithmetic. */
 
-/*  RND     (output) LOGICAL */
-/*          Specifies whether proper rounding  ( RND = .TRUE. )  or */
-/*          chopping  ( RND = .FALSE. )  occurs in addition. This may not */
-/*          be a reliable guide to the way in which the machine performs */
-/*          its arithmetic. */
+  /*  IEEE1   (output) LOGICAL */
+  /*          Specifies whether rounding appears to be done in the IEEE */
+  /*          'round to nearest' style. */
 
-/*  IEEE1   (output) LOGICAL */
-/*          Specifies whether rounding appears to be done in the IEEE */
-/*          'round to nearest' style. */
+  /*  Further Details */
+  /*  =============== */
 
-/*  Further Details */
-/*  =============== */
+  /*  The routine is based on the routine  ENVRON  by Malcolm and */
+  /*  incorporates suggestions by Gentleman and Marovich. See */
 
-/*  The routine is based on the routine  ENVRON  by Malcolm and */
-/*  incorporates suggestions by Gentleman and Marovich. See */
+  /*     Malcolm M. A. (1972) Algorithms to reveal properties of */
+  /*        floating-point arithmetic. Comms. of the ACM, 15, 949-951. */
 
-/*     Malcolm M. A. (1972) Algorithms to reveal properties of */
-/*        floating-point arithmetic. Comms. of the ACM, 15, 949-951. */
+  /*     Gentleman W. M. and Marovich S. B. (1974) More on algorithms */
+  /*        that reveal properties of floating point arithmetic units. */
+  /*        Comms. of the ACM, 17, 276-277. */
 
-/*     Gentleman W. M. and Marovich S. B. (1974) More on algorithms */
-/*        that reveal properties of floating point arithmetic units. */
-/*        Comms. of the ACM, 17, 276-277. */
+  /* ===================================================================== */
 
-/* ===================================================================== */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. Save statement .. */
+  /*     .. */
+  /*     .. Data statements .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. Save statement .. */
-/*     .. */
-/*     .. Data statements .. */
-/*     .. */
-/*     .. Executable Statements .. */
+  if (first) {
+    one = 1.;
 
-    if (first) {
-	one = 1.;
+    /*        LBETA,  LIEEE1,  LT and  LRND  are the  local values  of  BETA, */
+    /*        IEEE1, T and RND. */
 
-/*        LBETA,  LIEEE1,  LT and  LRND  are the  local values  of  BETA, */
-/*        IEEE1, T and RND. */
+    /*        Throughout this routine  we use the function  DLAMC3  to ensure */
+    /*        that relevant values are  stored and not held in registers,  or */
+    /*        are not affected by optimizers. */
 
-/*        Throughout this routine  we use the function  DLAMC3  to ensure */
-/*        that relevant values are  stored and not held in registers,  or */
-/*        are not affected by optimizers. */
+    /*        Compute  a = 2.0**m  with the  smallest positive integer m such */
+    /*        that */
 
-/*        Compute  a = 2.0**m  with the  smallest positive integer m such */
-/*        that */
+    /*           fl( a + 1.0 ) = a. */
 
-/*           fl( a + 1.0 ) = a. */
+    a = 1.;
+    c__ = 1.;
 
-	a = 1.;
-	c__ = 1.;
+  /* +       WHILE( C.EQ.ONE )LOOP */
+  L10:
+    if (c__ == one) {
+      a *= 2;
+      c__ = dlamc3_(&a, &one);
+      d__1 = -a;
+      c__ = dlamc3_(&c__, &d__1);
+      goto L10;
+    }
+    /* +       END WHILE */
 
-/* +       WHILE( C.EQ.ONE )LOOP */
-L10:
-	if (c__ == one) {
-	    a *= 2;
-	    c__ = dlamc3_(&a, &one);
-	    d__1 = -a;
-	    c__ = dlamc3_(&c__, &d__1);
-	    goto L10;
-	}
-/* +       END WHILE */
+    /*        Now compute  b = 2.0**m  with the smallest positive integer m */
+    /*        such that */
 
-/*        Now compute  b = 2.0**m  with the smallest positive integer m */
-/*        such that */
+    /*           fl( a + b ) .gt. a. */
 
-/*           fl( a + b ) .gt. a. */
+    b = 1.;
+    c__ = dlamc3_(&a, &b);
 
-	b = 1.;
-	c__ = dlamc3_(&a, &b);
+  /* +       WHILE( C.EQ.A )LOOP */
+  L20:
+    if (c__ == a) {
+      b *= 2;
+      c__ = dlamc3_(&a, &b);
+      goto L20;
+    }
+    /* +       END WHILE */
 
-/* +       WHILE( C.EQ.A )LOOP */
-L20:
-	if (c__ == a) {
-	    b *= 2;
-	    c__ = dlamc3_(&a, &b);
-	    goto L20;
-	}
-/* +       END WHILE */
+    /*        Now compute the base.  a and c  are neighbouring floating point */
+    /*        numbers  in the  interval  ( beta**t, beta**( t + 1 ) )  and so */
+    /*        their difference is beta. Adding 0.25 to c is to ensure that it */
+    /*        is truncated to beta and not ( beta - 1 ). */
 
-/*        Now compute the base.  a and c  are neighbouring floating point */
-/*        numbers  in the  interval  ( beta**t, beta**( t + 1 ) )  and so */
-/*        their difference is beta. Adding 0.25 to c is to ensure that it */
-/*        is truncated to beta and not ( beta - 1 ). */
+    qtr = one / 4;
+    savec = c__;
+    d__1 = -a;
+    c__ = dlamc3_(&c__, &d__1);
+    lbeta = (integer)(c__ + qtr);
 
-	qtr = one / 4;
-	savec = c__;
-	d__1 = -a;
-	c__ = dlamc3_(&c__, &d__1);
-	lbeta = (integer) (c__ + qtr);
+    /*        Now determine whether rounding or chopping occurs,  by adding a */
+    /*        bit  less  than  beta/2  and a  bit  more  than  beta/2  to  a. */
 
-/*        Now determine whether rounding or chopping occurs,  by adding a */
-/*        bit  less  than  beta/2  and a  bit  more  than  beta/2  to  a. */
-
-	b = (doublereal) lbeta;
-	d__1 = b / 2;
-	d__2 = -b / 100;
-	f = dlamc3_(&d__1, &d__2);
-	c__ = dlamc3_(&f, &a);
-	if (c__ == a) {
-	    lrnd = TRUE_;
-	} else {
-	    lrnd = FALSE_;
-	}
-	d__1 = b / 2;
-	d__2 = b / 100;
-	f = dlamc3_(&d__1, &d__2);
-	c__ = dlamc3_(&f, &a);
-	if (lrnd && c__ == a) {
-	    lrnd = FALSE_;
-	}
-
-/*        Try and decide whether rounding is done in the  IEEE  'round to */
-/*        nearest' style. B/2 is half a unit in the last place of the two */
-/*        numbers A and SAVEC. Furthermore, A is even, i.e. has last  bit */
-/*        zero, and SAVEC is odd. Thus adding B/2 to A should not  change */
-/*        A, but adding B/2 to SAVEC should change SAVEC. */
-
-	d__1 = b / 2;
-	t1 = dlamc3_(&d__1, &a);
-	d__1 = b / 2;
-	t2 = dlamc3_(&d__1, &savec);
-	lieee1 = t1 == a && t2 > savec && lrnd;
-
-/*        Now find  the  mantissa, t.  It should  be the  integer part of */
-/*        log to the base beta of a,  however it is safer to determine  t */
-/*        by powering.  So we find t as the smallest positive integer for */
-/*        which */
-
-/*           fl( beta**t + 1.0 ) = 1.0. */
-
-	lt = 0;
-	a = 1.;
-	c__ = 1.;
-
-/* +       WHILE( C.EQ.ONE )LOOP */
-L30:
-	if (c__ == one) {
-	    ++lt;
-	    a *= lbeta;
-	    c__ = dlamc3_(&a, &one);
-	    d__1 = -a;
-	    c__ = dlamc3_(&c__, &d__1);
-	    goto L30;
-	}
-/* +       END WHILE */
-
+    b = (doublereal)lbeta;
+    d__1 = b / 2;
+    d__2 = -b / 100;
+    f = dlamc3_(&d__1, &d__2);
+    c__ = dlamc3_(&f, &a);
+    if (c__ == a) {
+      lrnd = TRUE_;
+    } else {
+      lrnd = FALSE_;
+    }
+    d__1 = b / 2;
+    d__2 = b / 100;
+    f = dlamc3_(&d__1, &d__2);
+    c__ = dlamc3_(&f, &a);
+    if (lrnd && c__ == a) {
+      lrnd = FALSE_;
     }
 
-    *beta = lbeta;
-    *t = lt;
-    *rnd = lrnd;
-    *ieee1 = lieee1;
-    first = FALSE_;
-    return 0;
+    /*        Try and decide whether rounding is done in the  IEEE  'round to */
+    /*        nearest' style. B/2 is half a unit in the last place of the two */
+    /*        numbers A and SAVEC. Furthermore, A is even, i.e. has last  bit */
+    /*        zero, and SAVEC is odd. Thus adding B/2 to A should not  change */
+    /*        A, but adding B/2 to SAVEC should change SAVEC. */
 
-/*     End of DLAMC1 */
+    d__1 = b / 2;
+    t1 = dlamc3_(&d__1, &a);
+    d__1 = b / 2;
+    t2 = dlamc3_(&d__1, &savec);
+    lieee1 = t1 == a && t2 > savec && lrnd;
+
+    /*        Now find  the  mantissa, t.  It should  be the  integer part of */
+    /*        log to the base beta of a,  however it is safer to determine  t */
+    /*        by powering.  So we find t as the smallest positive integer for */
+    /*        which */
+
+    /*           fl( beta**t + 1.0 ) = 1.0. */
+
+    lt = 0;
+    a = 1.;
+    c__ = 1.;
+
+  /* +       WHILE( C.EQ.ONE )LOOP */
+  L30:
+    if (c__ == one) {
+      ++lt;
+      a *= lbeta;
+      c__ = dlamc3_(&a, &one);
+      d__1 = -a;
+      c__ = dlamc3_(&c__, &d__1);
+      goto L30;
+    }
+    /* +       END WHILE */
+  }
+
+  *beta = lbeta;
+  *t = lt;
+  *rnd = lrnd;
+  *ieee1 = lieee1;
+  first = FALSE_;
+
+  /*     End of DLAMC1 */
 
 } /* dlamc1_ */
 
-
 /* *********************************************************************** */
 
-/* Subroutine */ int dlamc2_(integer *beta, integer *t, logical *rnd, 
-	doublereal *eps, integer *emin, doublereal *rmin, integer *emax, 
-	doublereal *rmax)
-{
-    /* Initialized data */
+/* Subroutine */ void dlamc2_(integer *beta, integer *t, logical *rnd, doublereal *eps, integer *emin, doublereal *rmin,
+                              integer *emax, doublereal *rmax) {
+  /* Initialized data */
 
-    static logical first = TRUE_;
-    static logical iwarn = FALSE_;
+  static logical first = TRUE_;
+  static logical iwarn = FALSE_;
 
-    /* Format strings */
-    static char fmt_9999[] = "(//\002 WARNING. The value EMIN may be incorre"
-	    "ct:-\002,\002  EMIN = \002,i8,/\002 If, after inspection, the va"
-	    "lue EMIN looks\002,\002 acceptable please comment out \002,/\002"
-	    " the IF block as marked within the code of routine\002,\002 DLAM"
-	    "C2,\002,/\002 otherwise supply EMIN explicitly.\002,/)";
+  /* Format strings */
+  /*
+  static char fmt_9999[] =
+      "(//\002 WARNING. The value EMIN may be incorre"
+      "ct:-\002,\002  EMIN = \002,i8,/\002 If, after inspection, the va"
+      "lue EMIN looks\002,\002 acceptable please comment out \002,/\002"
+      " the IF block as marked within the code of routine\002,\002 DLAM"
+      "C2,\002,/\002 otherwise supply EMIN explicitly.\002,/)";
+  */
+  /* System generated locals */
+  integer i__1;
+  doublereal d__1, d__2, d__3, d__4, d__5;
 
-    /* System generated locals */
-    integer i__1;
-    doublereal d__1, d__2, d__3, d__4, d__5;
+  /* Builtin functions */
+  /* integer s_wsfe(cilist *), do_fio(integer *, char *, ftnlen), e_wsfe(void); */
 
-    /* Builtin functions */
-    double pow_di(doublereal *, integer *);
-    integer s_wsfe(cilist *), do_fio(integer *, char *, ftnlen), e_wsfe(void);
+  /* Local variables */
+  doublereal a, b, c__;
+  integer i__;
+  static integer lt;
+  doublereal one, two;
+  logical ieee;
+  doublereal half;
+  logical lrnd = 0;
+  static doublereal leps;
+  doublereal zero;
+  static integer lbeta;
+  doublereal rbase;
+  static integer lemin, lemax;
+  integer gnmin;
+  doublereal small;
+  integer gpmin;
+  doublereal third;
+  static doublereal lrmin, lrmax;
+  doublereal sixth;
+  extern /* Subroutine */ void dlamc1_(integer *, integer *, logical *, logical *);
+  extern doublereal dlamc3_(doublereal *, doublereal *);
+  logical lieee1;
+  extern /* Subroutine */ void dlamc4_(integer *, doublereal *, integer *),
+      dlamc5_(integer *, integer *, integer *, logical *, integer *, doublereal *);
+  integer ngnmin, ngpmin;
 
-    /* Local variables */
-    doublereal a, b, c__;
-    integer i__;
-    static integer lt;
-    doublereal one, two;
-    logical ieee;
-    doublereal half;
-    logical lrnd = 0;
-    static doublereal leps;
-    doublereal zero;
-    static integer lbeta;
-    doublereal rbase;
-    static integer lemin, lemax;
-    integer gnmin;
-    doublereal small;
-    integer gpmin;
-    doublereal third;
-    static doublereal lrmin, lrmax;
-    doublereal sixth;
-    extern /* Subroutine */ int dlamc1_(integer *, integer *, logical *, 
-	    logical *);
-    extern doublereal dlamc3_(doublereal *, doublereal *);
-    logical lieee1;
-    extern /* Subroutine */ int dlamc4_(integer *, doublereal *, integer *), 
-	    dlamc5_(integer *, integer *, integer *, logical *, integer *, 
-	    doublereal *);
-    integer ngnmin, ngpmin;
+  /* Fortran I/O blocks */
+  /* static cilist io___58 = {0, 6, 0, fmt_9999, 0}; */
 
-    /* Fortran I/O blocks */
-    static cilist io___58 = { 0, 6, 0, fmt_9999, 0 };
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
+  /*     .. Scalar Arguments .. */
+  /*     .. */
 
+  /*  Purpose */
+  /*  ======= */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*  DLAMC2 determines the machine parameters specified in its argument */
+  /*  list. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Purpose */
-/*  ======= */
+  /*  BETA    (output) INTEGER */
+  /*          The base of the machine. */
 
-/*  DLAMC2 determines the machine parameters specified in its argument */
-/*  list. */
+  /*  T       (output) INTEGER */
+  /*          The number of ( BETA ) digits in the mantissa. */
 
-/*  Arguments */
-/*  ========= */
+  /*  RND     (output) LOGICAL */
+  /*          Specifies whether proper rounding  ( RND = .TRUE. )  or */
+  /*          chopping  ( RND = .FALSE. )  occurs in addition. This may not */
+  /*          be a reliable guide to the way in which the machine performs */
+  /*          its arithmetic. */
 
-/*  BETA    (output) INTEGER */
-/*          The base of the machine. */
+  /*  EPS     (output) DOUBLE PRECISION */
+  /*          The smallest positive number such that */
 
-/*  T       (output) INTEGER */
-/*          The number of ( BETA ) digits in the mantissa. */
+  /*             fl( 1.0 - EPS ) .LT. 1.0, */
 
-/*  RND     (output) LOGICAL */
-/*          Specifies whether proper rounding  ( RND = .TRUE. )  or */
-/*          chopping  ( RND = .FALSE. )  occurs in addition. This may not */
-/*          be a reliable guide to the way in which the machine performs */
-/*          its arithmetic. */
+  /*          where fl denotes the computed value. */
 
-/*  EPS     (output) DOUBLE PRECISION */
-/*          The smallest positive number such that */
+  /*  EMIN    (output) INTEGER */
+  /*          The minimum exponent before (gradual) underflow occurs. */
 
-/*             fl( 1.0 - EPS ) .LT. 1.0, */
+  /*  RMIN    (output) DOUBLE PRECISION */
+  /*          The smallest normalized number for the machine, given by */
+  /*          BASE**( EMIN - 1 ), where  BASE  is the floating point value */
+  /*          of BETA. */
 
-/*          where fl denotes the computed value. */
+  /*  EMAX    (output) INTEGER */
+  /*          The maximum exponent before overflow occurs. */
 
-/*  EMIN    (output) INTEGER */
-/*          The minimum exponent before (gradual) underflow occurs. */
+  /*  RMAX    (output) DOUBLE PRECISION */
+  /*          The largest positive number for the machine, given by */
+  /*          BASE**EMAX * ( 1 - EPS ), where  BASE  is the floating point */
+  /*          value of BETA. */
 
-/*  RMIN    (output) DOUBLE PRECISION */
-/*          The smallest normalized number for the machine, given by */
-/*          BASE**( EMIN - 1 ), where  BASE  is the floating point value */
-/*          of BETA. */
+  /*  Further Details */
+  /*  =============== */
 
-/*  EMAX    (output) INTEGER */
-/*          The maximum exponent before overflow occurs. */
+  /*  The computation of  EPS  is based on a routine PARANOIA by */
+  /*  W. Kahan of the University of California at Berkeley. */
 
-/*  RMAX    (output) DOUBLE PRECISION */
-/*          The largest positive number for the machine, given by */
-/*          BASE**EMAX * ( 1 - EPS ), where  BASE  is the floating point */
-/*          value of BETA. */
+  /* ===================================================================== */
 
-/*  Further Details */
-/*  =============== */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. External Subroutines .. */
+  /*     .. */
+  /*     .. Intrinsic Functions .. */
+  /*     .. */
+  /*     .. Save statement .. */
+  /*     .. */
+  /*     .. Data statements .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*  The computation of  EPS  is based on a routine PARANOIA by */
-/*  W. Kahan of the University of California at Berkeley. */
+  if (first) {
+    zero = 0.;
+    one = 1.;
+    two = 2.;
 
-/* ===================================================================== */
+    /*        LBETA, LT, LRND, LEPS, LEMIN and LRMIN  are the local values of */
+    /*        BETA, T, RND, EPS, EMIN and RMIN. */
 
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. External Subroutines .. */
-/*     .. */
-/*     .. Intrinsic Functions .. */
-/*     .. */
-/*     .. Save statement .. */
-/*     .. */
-/*     .. Data statements .. */
-/*     .. */
-/*     .. Executable Statements .. */
+    /*        Throughout this routine  we use the function  DLAMC3  to ensure */
+    /*        that relevant values are stored  and not held in registers,  or */
+    /*        are not affected by optimizers. */
 
-    if (first) {
-	zero = 0.;
-	one = 1.;
-	two = 2.;
+    /*        DLAMC1 returns the parameters  LBETA, LT, LRND and LIEEE1. */
 
-/*        LBETA, LT, LRND, LEPS, LEMIN and LRMIN  are the local values of */
-/*        BETA, T, RND, EPS, EMIN and RMIN. */
+    dlamc1_(&lbeta, &lt, &lrnd, &lieee1);
 
-/*        Throughout this routine  we use the function  DLAMC3  to ensure */
-/*        that relevant values are stored  and not held in registers,  or */
-/*        are not affected by optimizers. */
+    /*        Start to find EPS. */
 
-/*        DLAMC1 returns the parameters  LBETA, LT, LRND and LIEEE1. */
+    b = (doublereal)lbeta;
+    i__1 = -lt;
+    a = pow_di(&b, &i__1);
+    leps = a;
 
-	dlamc1_(&lbeta, &lt, &lrnd, &lieee1);
+    /*        Try some tricks to see whether or not this is the correct  EPS. */
 
-/*        Start to find EPS. */
-
-	b = (doublereal) lbeta;
-	i__1 = -lt;
-	a = pow_di(&b, &i__1);
-	leps = a;
-
-/*        Try some tricks to see whether or not this is the correct  EPS. */
-
-	b = two / 3;
-	half = one / 2;
-	d__1 = -half;
-	sixth = dlamc3_(&b, &d__1);
-	third = dlamc3_(&sixth, &sixth);
-	d__1 = -half;
-	b = dlamc3_(&third, &d__1);
-	b = dlamc3_(&b, &sixth);
-	b = abs(b);
-	if (b < leps) {
-	    b = leps;
-	}
-
-	leps = 1.;
-
-/* +       WHILE( ( LEPS.GT.B ).AND.( B.GT.ZERO ) )LOOP */
-L10:
-	if (leps > b && b > zero) {
-	    leps = b;
-	    d__1 = half * leps;
-/* Computing 5th power */
-	    d__3 = two, d__4 = d__3, d__3 *= d__3;
-/* Computing 2nd power */
-	    d__5 = leps;
-	    d__2 = d__4 * (d__3 * d__3) * (d__5 * d__5);
-	    c__ = dlamc3_(&d__1, &d__2);
-	    d__1 = -c__;
-	    c__ = dlamc3_(&half, &d__1);
-	    b = dlamc3_(&half, &c__);
-	    d__1 = -b;
-	    c__ = dlamc3_(&half, &d__1);
-	    b = dlamc3_(&half, &c__);
-	    goto L10;
-	}
-/* +       END WHILE */
-
-	if (a < leps) {
-	    leps = a;
-	}
-
-/*        Computation of EPS complete. */
-
-/*        Now find  EMIN.  Let A = + or - 1, and + or - (1 + BASE**(-3)). */
-/*        Keep dividing  A by BETA until (gradual) underflow occurs. This */
-/*        is detected when we cannot recover the previous A. */
-
-	rbase = one / lbeta;
-	small = one;
-	for (i__ = 1; i__ <= 3; ++i__) {
-	    d__1 = small * rbase;
-	    small = dlamc3_(&d__1, &zero);
-/* L20: */
-	}
-	a = dlamc3_(&one, &small);
-	dlamc4_(&ngpmin, &one, &lbeta);
-	d__1 = -one;
-	dlamc4_(&ngnmin, &d__1, &lbeta);
-	dlamc4_(&gpmin, &a, &lbeta);
-	d__1 = -a;
-	dlamc4_(&gnmin, &d__1, &lbeta);
-	ieee = FALSE_;
-
-	if (ngpmin == ngnmin && gpmin == gnmin) {
-	    if (ngpmin == gpmin) {
-		lemin = ngpmin;
-/*            ( Non twos-complement machines, no gradual underflow; */
-/*              e.g.,  VAX ) */
-	    } else if (gpmin - ngpmin == 3) {
-		lemin = ngpmin - 1 + lt;
-		ieee = TRUE_;
-/*            ( Non twos-complement machines, with gradual underflow; */
-/*              e.g., IEEE standard followers ) */
-	    } else {
-		lemin = min(ngpmin,gpmin);
-/*            ( A guess; no known machine ) */
-		iwarn = TRUE_;
-	    }
-
-	} else if (ngpmin == gpmin && ngnmin == gnmin) {
-	    if ((i__1 = ngpmin - ngnmin, abs(i__1)) == 1) {
-		lemin = max(ngpmin,ngnmin);
-/*            ( Twos-complement machines, no gradual underflow; */
-/*              e.g., CYBER 205 ) */
-	    } else {
-		lemin = min(ngpmin,ngnmin);
-/*            ( A guess; no known machine ) */
-		iwarn = TRUE_;
-	    }
-
-	} else if ((i__1 = ngpmin - ngnmin, abs(i__1)) == 1 && gpmin == gnmin)
-		 {
-	    if (gpmin - min(ngpmin,ngnmin) == 3) {
-		lemin = max(ngpmin,ngnmin) - 1 + lt;
-/*            ( Twos-complement machines with gradual underflow; */
-/*              no known machine ) */
-	    } else {
-		lemin = min(ngpmin,ngnmin);
-/*            ( A guess; no known machine ) */
-		iwarn = TRUE_;
-	    }
-
-	} else {
-/* Computing MIN */
-	    i__1 = min(ngpmin,ngnmin), i__1 = min(i__1,gpmin);
-	    lemin = min(i__1,gnmin);
-/*         ( A guess; no known machine ) */
-	    iwarn = TRUE_;
-	}
-	first = FALSE_;
-/* ** */
-/* Comment out this if block if EMIN is ok */
-	if (iwarn) {
-	    first = TRUE_;
-	    s_wsfe(&io___58);
-	    do_fio(&c__1, (char *)&lemin, (ftnlen)sizeof(integer));
-	    e_wsfe();
-	}
-/* ** */
-
-/*        Assume IEEE arithmetic if we found denormalised  numbers above, */
-/*        or if arithmetic seems to round in the  IEEE style,  determined */
-/*        in routine DLAMC1. A true IEEE machine should have both  things */
-/*        true; however, faulty machines may have one or the other. */
-
-	ieee = ieee || lieee1;
-
-/*        Compute  RMIN by successive division by  BETA. We could compute */
-/*        RMIN as BASE**( EMIN - 1 ),  but some machines underflow during */
-/*        this computation. */
-
-	lrmin = 1.;
-	i__1 = 1 - lemin;
-	for (i__ = 1; i__ <= i__1; ++i__) {
-	    d__1 = lrmin * rbase;
-	    lrmin = dlamc3_(&d__1, &zero);
-/* L30: */
-	}
-
-/*        Finally, call DLAMC5 to compute EMAX and RMAX. */
-
-	dlamc5_(&lbeta, &lt, &lemin, &ieee, &lemax, &lrmax);
+    b = two / 3;
+    half = one / 2;
+    d__1 = -half;
+    sixth = dlamc3_(&b, &d__1);
+    third = dlamc3_(&sixth, &sixth);
+    d__1 = -half;
+    b = dlamc3_(&third, &d__1);
+    b = dlamc3_(&b, &sixth);
+    b = abs(b);
+    if (b < leps) {
+      b = leps;
     }
 
-    *beta = lbeta;
-    *t = lt;
-    *rnd = lrnd;
-    *eps = leps;
-    *emin = lemin;
-    *rmin = lrmin;
-    *emax = lemax;
-    *rmax = lrmax;
+    leps = 1.;
 
-    return 0;
+  /* +       WHILE( ( LEPS.GT.B ).AND.( B.GT.ZERO ) )LOOP */
+  L10:
+    if (leps > b && b > zero) {
+      leps = b;
+      d__1 = half * leps;
+      /* Computing 5th power */
+      d__3 = two, d__4 = d__3, d__3 *= d__3;
+      /* Computing 2nd power */
+      d__5 = leps;
+      d__2 = d__4 * (d__3 * d__3) * (d__5 * d__5);
+      c__ = dlamc3_(&d__1, &d__2);
+      d__1 = -c__;
+      c__ = dlamc3_(&half, &d__1);
+      b = dlamc3_(&half, &c__);
+      d__1 = -b;
+      c__ = dlamc3_(&half, &d__1);
+      b = dlamc3_(&half, &c__);
+      goto L10;
+    }
+    /* +       END WHILE */
 
+    if (a < leps) {
+      leps = a;
+    }
 
-/*     End of DLAMC2 */
+    /*        Computation of EPS complete. */
+
+    /*        Now find  EMIN.  Let A = + or - 1, and + or - (1 + BASE**(-3)). */
+    /*        Keep dividing  A by BETA until (gradual) underflow occurs. This */
+    /*        is detected when we cannot recover the previous A. */
+
+    rbase = one / lbeta;
+    small = one;
+    for (i__ = 1; i__ <= 3; ++i__) {
+      d__1 = small * rbase;
+      small = dlamc3_(&d__1, &zero);
+      /* L20: */
+    }
+    a = dlamc3_(&one, &small);
+    dlamc4_(&ngpmin, &one, &lbeta);
+    d__1 = -one;
+    dlamc4_(&ngnmin, &d__1, &lbeta);
+    dlamc4_(&gpmin, &a, &lbeta);
+    d__1 = -a;
+    dlamc4_(&gnmin, &d__1, &lbeta);
+    ieee = FALSE_;
+
+    if (ngpmin == ngnmin && gpmin == gnmin) {
+      if (ngpmin == gpmin) {
+        lemin = ngpmin;
+        /*            ( Non twos-complement machines, no gradual underflow; */
+        /*              e.g.,  VAX ) */
+      } else if (gpmin - ngpmin == 3) {
+        lemin = ngpmin - 1 + lt;
+        ieee = TRUE_;
+        /*            ( Non twos-complement machines, with gradual underflow; */
+        /*              e.g., IEEE standard followers ) */
+      } else {
+        lemin = min(ngpmin, gpmin);
+        /*            ( A guess; no known machine ) */
+        iwarn = TRUE_;
+      }
+
+    } else if (ngpmin == gpmin && ngnmin == gnmin) {
+      if ((i__1 = ngpmin - ngnmin, abs(i__1)) == 1) {
+        lemin = max(ngpmin, ngnmin);
+        /*            ( Twos-complement machines, no gradual underflow; */
+        /*              e.g., CYBER 205 ) */
+      } else {
+        lemin = min(ngpmin, ngnmin);
+        /*            ( A guess; no known machine ) */
+        iwarn = TRUE_;
+      }
+
+    } else if ((i__1 = ngpmin - ngnmin, abs(i__1)) == 1 && gpmin == gnmin) {
+      if (gpmin - min(ngpmin, ngnmin) == 3) {
+        lemin = max(ngpmin, ngnmin) - 1 + lt;
+        /*            ( Twos-complement machines with gradual underflow; */
+        /*              no known machine ) */
+      } else {
+        lemin = min(ngpmin, ngnmin);
+        /*            ( A guess; no known machine ) */
+        iwarn = TRUE_;
+      }
+
+    } else {
+      /* Computing MIN */
+      i__1 = min(ngpmin, ngnmin), i__1 = min(i__1, gpmin);
+      lemin = min(i__1, gnmin);
+      /*         ( A guess; no known machine ) */
+      iwarn = TRUE_;
+    }
+    first = FALSE_;
+    /* ** */
+    /* Comment out this if block if EMIN is ok */
+    /*
+    if (iwarn) {
+      first = TRUE_;
+      s_wsfe(&io___58);
+      do_fio(&c__1, (char *)&lemin, (ftnlen)sizeof(integer));
+      e_wsfe();
+    }
+    */
+    /* ** */
+
+    /*        Assume IEEE arithmetic if we found denormalised  numbers above, */
+    /*        or if arithmetic seems to round in the  IEEE style,  determined */
+    /*        in routine DLAMC1. A true IEEE machine should have both  things */
+    /*        true; however, faulty machines may have one or the other. */
+
+    ieee = ieee || lieee1;
+
+    /*        Compute  RMIN by successive division by  BETA. We could compute */
+    /*        RMIN as BASE**( EMIN - 1 ),  but some machines underflow during */
+    /*        this computation. */
+
+    lrmin = 1.;
+    i__1 = 1 - lemin;
+    for (i__ = 1; i__ <= i__1; ++i__) {
+      d__1 = lrmin * rbase;
+      lrmin = dlamc3_(&d__1, &zero);
+      /* L30: */
+    }
+
+    /*        Finally, call DLAMC5 to compute EMAX and RMAX. */
+
+    dlamc5_(&lbeta, &lt, &lemin, &ieee, &lemax, &lrmax);
+  }
+
+  *beta = lbeta;
+  *t = lt;
+  *rnd = lrnd;
+  *eps = leps;
+  *emin = lemin;
+  *rmin = lrmin;
+  *emax = lemax;
+  *rmax = lrmax;
+
+  /*     End of DLAMC2 */
 
 } /* dlamc2_ */
 
-
 /* *********************************************************************** */
 
-doublereal dlamc3_(doublereal *a, doublereal *b)
-{
-    /* System generated locals */
-    doublereal ret_val;
+doublereal dlamc3_(doublereal *a, doublereal *b) {
+  /* System generated locals */
+  doublereal ret_val;
 
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*     .. Scalar Arguments .. */
+  /*     .. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
+  /*  Purpose */
+  /*  ======= */
 
-/*  Purpose */
-/*  ======= */
+  /*  DLAMC3  is intended to force  A  and  B  to be stored prior to doing */
+  /*  the addition of  A  and  B ,  for use in situations where optimizers */
+  /*  might hold one of these in a register. */
 
-/*  DLAMC3  is intended to force  A  and  B  to be stored prior to doing */
-/*  the addition of  A  and  B ,  for use in situations where optimizers */
-/*  might hold one of these in a register. */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Arguments */
-/*  ========= */
+  /*  A       (input) DOUBLE PRECISION */
+  /*  B       (input) DOUBLE PRECISION */
+  /*          The values A and B. */
 
-/*  A       (input) DOUBLE PRECISION */
-/*  B       (input) DOUBLE PRECISION */
-/*          The values A and B. */
+  /* ===================================================================== */
 
-/* ===================================================================== */
+  /*     .. Executable Statements .. */
 
-/*     .. Executable Statements .. */
+  ret_val = *a + *b;
 
-    ret_val = *a + *b;
+  return ret_val;
 
-    return ret_val;
-
-/*     End of DLAMC3 */
+  /*     End of DLAMC3 */
 
 } /* dlamc3_ */
 
-
 /* *********************************************************************** */
 
-/* Subroutine */ int dlamc4_(integer *emin, doublereal *start, integer *base)
-{
-    /* System generated locals */
-    integer i__1;
-    doublereal d__1;
+/* Subroutine */ void dlamc4_(integer *emin, doublereal *start, integer *base) {
+  /* System generated locals */
+  integer i__1;
+  doublereal d__1;
 
-    /* Local variables */
-    doublereal a;
-    integer i__;
-    doublereal b1, b2, c1, c2, d1, d2, one, zero, rbase;
-    extern doublereal dlamc3_(doublereal *, doublereal *);
+  /* Local variables */
+  doublereal a;
+  integer i__;
+  doublereal b1, b2, c1, c2, d1, d2, one, zero, rbase;
+  extern doublereal dlamc3_(doublereal *, doublereal *);
 
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*     .. Scalar Arguments .. */
+  /*     .. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
+  /*  Purpose */
+  /*  ======= */
 
-/*  Purpose */
-/*  ======= */
+  /*  DLAMC4 is a service routine for DLAMC2. */
 
-/*  DLAMC4 is a service routine for DLAMC2. */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Arguments */
-/*  ========= */
+  /*  EMIN    (output) INTEGER */
+  /*          The minimum exponent before (gradual) underflow, computed by */
+  /*          setting A = START and dividing by BASE until the previous A */
+  /*          can not be recovered. */
 
-/*  EMIN    (output) INTEGER */
-/*          The minimum exponent before (gradual) underflow, computed by */
-/*          setting A = START and dividing by BASE until the previous A */
-/*          can not be recovered. */
+  /*  START   (input) DOUBLE PRECISION */
+  /*          The starting point for determining EMIN. */
 
-/*  START   (input) DOUBLE PRECISION */
-/*          The starting point for determining EMIN. */
+  /*  BASE    (input) INTEGER */
+  /*          The base of the machine. */
 
-/*  BASE    (input) INTEGER */
-/*          The base of the machine. */
+  /* ===================================================================== */
 
-/* ===================================================================== */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. Executable Statements .. */
-
-    a = *start;
-    one = 1.;
-    rbase = one / *base;
-    zero = 0.;
-    *emin = 1;
-    d__1 = a * rbase;
-    b1 = dlamc3_(&d__1, &zero);
-    c1 = a;
-    c2 = a;
-    d1 = a;
-    d2 = a;
+  a = *start;
+  one = 1.;
+  rbase = one / *base;
+  zero = 0.;
+  *emin = 1;
+  d__1 = a * rbase;
+  b1 = dlamc3_(&d__1, &zero);
+  c1 = a;
+  c2 = a;
+  d1 = a;
+  d2 = a;
 /* +    WHILE( ( C1.EQ.A ).AND.( C2.EQ.A ).AND. */
 /*    $       ( D1.EQ.A ).AND.( D2.EQ.A )      )LOOP */
 L10:
-    if (c1 == a && c2 == a && d1 == a && d2 == a) {
-	--(*emin);
-	a = b1;
-	d__1 = a / *base;
-	b1 = dlamc3_(&d__1, &zero);
-	d__1 = b1 * *base;
-	c1 = dlamc3_(&d__1, &zero);
-	d1 = zero;
-	i__1 = *base;
-	for (i__ = 1; i__ <= i__1; ++i__) {
-	    d1 += b1;
-/* L20: */
-	}
-	d__1 = a * rbase;
-	b2 = dlamc3_(&d__1, &zero);
-	d__1 = b2 / rbase;
-	c2 = dlamc3_(&d__1, &zero);
-	d2 = zero;
-	i__1 = *base;
-	for (i__ = 1; i__ <= i__1; ++i__) {
-	    d2 += b2;
-/* L30: */
-	}
-	goto L10;
+  if (c1 == a && c2 == a && d1 == a && d2 == a) {
+    --(*emin);
+    a = b1;
+    d__1 = a / *base;
+    b1 = dlamc3_(&d__1, &zero);
+    d__1 = b1 * *base;
+    c1 = dlamc3_(&d__1, &zero);
+    d1 = zero;
+    i__1 = *base;
+    for (i__ = 1; i__ <= i__1; ++i__) {
+      d1 += b1;
+      /* L20: */
     }
-/* +    END WHILE */
+    d__1 = a * rbase;
+    b2 = dlamc3_(&d__1, &zero);
+    d__1 = b2 / rbase;
+    c2 = dlamc3_(&d__1, &zero);
+    d2 = zero;
+    i__1 = *base;
+    for (i__ = 1; i__ <= i__1; ++i__) {
+      d2 += b2;
+      /* L30: */
+    }
+    goto L10;
+  }
+  /* +    END WHILE */
 
-    return 0;
-
-/*     End of DLAMC4 */
+  /*     End of DLAMC4 */
 
 } /* dlamc4_ */
 
-
 /* *********************************************************************** */
 
-/* Subroutine */ int dlamc5_(integer *beta, integer *p, integer *emin, 
-	logical *ieee, integer *emax, doublereal *rmax)
-{
-    /* System generated locals */
-    integer i__1;
-    doublereal d__1;
+/* Subroutine */ void dlamc5_(integer *beta, integer *p, integer *emin, logical *ieee, integer *emax,
+                              doublereal *rmax) {
+  /* System generated locals */
+  integer i__1;
+  doublereal d__1;
 
-    /* Local variables */
-    integer i__;
-    doublereal y, z__;
-    integer try__, lexp;
-    doublereal oldy;
-    integer uexp, nbits;
-    extern doublereal dlamc3_(doublereal *, doublereal *);
-    doublereal recbas;
-    integer exbits, expsum;
+  /* Local variables */
+  integer i__;
+  doublereal y, z__;
+  integer try__, lexp;
+  doublereal oldy;
+  integer uexp, nbits;
+  extern doublereal dlamc3_(doublereal *, doublereal *);
+  doublereal recbas;
+  integer exbits, expsum;
 
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*     .. Scalar Arguments .. */
+  /*     .. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
+  /*  Purpose */
+  /*  ======= */
 
-/*  Purpose */
-/*  ======= */
+  /*  DLAMC5 attempts to compute RMAX, the largest machine floating-point */
+  /*  number, without overflow.  It assumes that EMAX + abs(EMIN) sum */
+  /*  approximately to a power of 2.  It will fail on machines where this */
+  /*  assumption does not hold, for example, the Cyber 205 (EMIN = -28625, */
+  /*  EMAX = 28718).  It will also fail if the value supplied for EMIN is */
+  /*  too large (i.e. too close to zero), probably with overflow. */
 
-/*  DLAMC5 attempts to compute RMAX, the largest machine floating-point */
-/*  number, without overflow.  It assumes that EMAX + abs(EMIN) sum */
-/*  approximately to a power of 2.  It will fail on machines where this */
-/*  assumption does not hold, for example, the Cyber 205 (EMIN = -28625, */
-/*  EMAX = 28718).  It will also fail if the value supplied for EMIN is */
-/*  too large (i.e. too close to zero), probably with overflow. */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Arguments */
-/*  ========= */
+  /*  BETA    (input) INTEGER */
+  /*          The base of floating-point arithmetic. */
 
-/*  BETA    (input) INTEGER */
-/*          The base of floating-point arithmetic. */
+  /*  P       (input) INTEGER */
+  /*          The number of base BETA digits in the mantissa of a */
+  /*          floating-point value. */
 
-/*  P       (input) INTEGER */
-/*          The number of base BETA digits in the mantissa of a */
-/*          floating-point value. */
+  /*  EMIN    (input) INTEGER */
+  /*          The minimum exponent before (gradual) underflow. */
 
-/*  EMIN    (input) INTEGER */
-/*          The minimum exponent before (gradual) underflow. */
+  /*  IEEE    (input) LOGICAL */
+  /*          A logical flag specifying whether or not the arithmetic */
+  /*          system is thought to comply with the IEEE standard. */
 
-/*  IEEE    (input) LOGICAL */
-/*          A logical flag specifying whether or not the arithmetic */
-/*          system is thought to comply with the IEEE standard. */
+  /*  EMAX    (output) INTEGER */
+  /*          The largest exponent before overflow */
 
-/*  EMAX    (output) INTEGER */
-/*          The largest exponent before overflow */
+  /*  RMAX    (output) DOUBLE PRECISION */
+  /*          The largest machine floating-point number. */
 
-/*  RMAX    (output) DOUBLE PRECISION */
-/*          The largest machine floating-point number. */
+  /* ===================================================================== */
 
-/* ===================================================================== */
+  /*     .. Parameters .. */
+  /*     .. */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. Intrinsic Functions .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*     .. Parameters .. */
-/*     .. */
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. Intrinsic Functions .. */
-/*     .. */
-/*     .. Executable Statements .. */
+  /*     First compute LEXP and UEXP, two powers of 2 that bound */
+  /*     abs(EMIN). We then assume that EMAX + abs(EMIN) will sum */
+  /*     approximately to the bound that is closest to abs(EMIN). */
+  /*     (EMAX is the exponent of the required number RMAX). */
 
-/*     First compute LEXP and UEXP, two powers of 2 that bound */
-/*     abs(EMIN). We then assume that EMAX + abs(EMIN) will sum */
-/*     approximately to the bound that is closest to abs(EMIN). */
-/*     (EMAX is the exponent of the required number RMAX). */
-
-    lexp = 1;
-    exbits = 1;
+  lexp = 1;
+  exbits = 1;
 L10:
-    try__ = lexp << 1;
-    if (try__ <= -(*emin)) {
-	lexp = try__;
-	++exbits;
-	goto L10;
+  try__ = lexp << 1;
+  if (try__ <= -(*emin)) {
+    lexp = try__;
+    ++exbits;
+    goto L10;
+  }
+  if (lexp == -(*emin)) {
+    uexp = lexp;
+  } else {
+    uexp = try__;
+    ++exbits;
+  }
+
+  /*     Now -LEXP is less than or equal to EMIN, and -UEXP is greater */
+  /*     than or equal to EMIN. EXBITS is the number of bits needed to */
+  /*     store the exponent. */
+
+  if (uexp + *emin > -lexp - *emin) {
+    expsum = lexp << 1;
+  } else {
+    expsum = uexp << 1;
+  }
+
+  /*     EXPSUM is the exponent range, approximately equal to */
+  /*     EMAX - EMIN + 1 . */
+
+  *emax = expsum + *emin - 1;
+  nbits = exbits + 1 + *p;
+
+  /*     NBITS is the total number of bits needed to store a */
+  /*     floating-point number. */
+
+  if (nbits % 2 == 1 && *beta == 2) {
+    /*        Either there are an odd number of bits used to store a */
+    /*        floating-point number, which is unlikely, or some bits are */
+    /*        not used in the representation of numbers, which is possible, */
+    /*        (e.g. Cray machines) or the mantissa has an implicit bit, */
+    /*        (e.g. IEEE machines, Dec Vax machines), which is perhaps the */
+    /*        most likely. We have to assume the last alternative. */
+    /*        If this is true, then we need to reduce EMAX by one because */
+    /*        there must be some way of representing zero in an implicit-bit */
+    /*        system. On machines like Cray, we are reducing EMAX by one */
+    /*        unnecessarily. */
+
+    --(*emax);
+  }
+
+  if (*ieee) {
+    /*        Assume we are on an IEEE machine which reserves one exponent */
+    /*        for infinity and NaN. */
+
+    --(*emax);
+  }
+
+  /*     Now create RMAX, the largest machine number, which should */
+  /*     be equal to (1.0 - BETA**(-P)) * BETA**EMAX . */
+
+  /*     First compute 1.0 - BETA**(-P), being careful that the */
+  /*     result is less than 1.0 . */
+
+  recbas = 1. / *beta;
+  z__ = *beta - 1.;
+  y = 0.;
+  i__1 = *p;
+  for (i__ = 1; i__ <= i__1; ++i__) {
+    z__ *= recbas;
+    if (y < 1.) {
+      oldy = y;
     }
-    if (lexp == -(*emin)) {
-	uexp = lexp;
-    } else {
-	uexp = try__;
-	++exbits;
-    }
+    y = dlamc3_(&y, &z__);
+    /* L20: */
+  }
+  if (y >= 1.) {
+    y = oldy;
+  }
 
-/*     Now -LEXP is less than or equal to EMIN, and -UEXP is greater */
-/*     than or equal to EMIN. EXBITS is the number of bits needed to */
-/*     store the exponent. */
+  /*     Now multiply by BETA**EMAX to get RMAX. */
 
-    if (uexp + *emin > -lexp - *emin) {
-	expsum = lexp << 1;
-    } else {
-	expsum = uexp << 1;
-    }
+  i__1 = *emax;
+  for (i__ = 1; i__ <= i__1; ++i__) {
+    d__1 = y * *beta;
+    y = dlamc3_(&d__1, &c_b32);
+    /* L30: */
+  }
 
-/*     EXPSUM is the exponent range, approximately equal to */
-/*     EMAX - EMIN + 1 . */
+  *rmax = y;
 
-    *emax = expsum + *emin - 1;
-    nbits = exbits + 1 + *p;
-
-/*     NBITS is the total number of bits needed to store a */
-/*     floating-point number. */
-
-    if (nbits % 2 == 1 && *beta == 2) {
-
-/*        Either there are an odd number of bits used to store a */
-/*        floating-point number, which is unlikely, or some bits are */
-/*        not used in the representation of numbers, which is possible, */
-/*        (e.g. Cray machines) or the mantissa has an implicit bit, */
-/*        (e.g. IEEE machines, Dec Vax machines), which is perhaps the */
-/*        most likely. We have to assume the last alternative. */
-/*        If this is true, then we need to reduce EMAX by one because */
-/*        there must be some way of representing zero in an implicit-bit */
-/*        system. On machines like Cray, we are reducing EMAX by one */
-/*        unnecessarily. */
-
-	--(*emax);
-    }
-
-    if (*ieee) {
-
-/*        Assume we are on an IEEE machine which reserves one exponent */
-/*        for infinity and NaN. */
-
-	--(*emax);
-    }
-
-/*     Now create RMAX, the largest machine number, which should */
-/*     be equal to (1.0 - BETA**(-P)) * BETA**EMAX . */
-
-/*     First compute 1.0 - BETA**(-P), being careful that the */
-/*     result is less than 1.0 . */
-
-    recbas = 1. / *beta;
-    z__ = *beta - 1.;
-    y = 0.;
-    i__1 = *p;
-    for (i__ = 1; i__ <= i__1; ++i__) {
-	z__ *= recbas;
-	if (y < 1.) {
-	    oldy = y;
-	}
-	y = dlamc3_(&y, &z__);
-/* L20: */
-    }
-    if (y >= 1.) {
-	y = oldy;
-    }
-
-/*     Now multiply by BETA**EMAX to get RMAX. */
-
-    i__1 = *emax;
-    for (i__ = 1; i__ <= i__1; ++i__) {
-	d__1 = y * *beta;
-	y = dlamc3_(&d__1, &c_b32);
-/* L30: */
-    }
-
-    *rmax = y;
-    return 0;
-
-/*     End of DLAMC5 */
+  /*     End of DLAMC5 */
 
 } /* dlamc5_ */
diff --git a/lapack/dlapy2.c b/lapack/dlapy2.c
index 6e88cd1..ef4cf57 100644
--- a/lapack/dlapy2.c
+++ b/lapack/dlapy2.c
@@ -10,8 +10,8 @@
 		http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
 doublereal dlapy2_(doublereal *x, doublereal *y)
 {
diff --git a/lapack/dlapy3.c b/lapack/dlapy3.c
index 6aec3d0..91d5220 100644
--- a/lapack/dlapy3.c
+++ b/lapack/dlapy3.c
@@ -10,8 +10,8 @@
 		http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
 doublereal dlapy3_(doublereal *x, doublereal *y, doublereal *z__)
 {
diff --git a/lapack/dlarf.c b/lapack/dlarf.c
index aba8a59..07dda21 100644
--- a/lapack/dlarf.c
+++ b/lapack/dlarf.c
@@ -1,17 +1,17 @@
 /* dlarf.f -- translated by f2c (version 20061008).
    You must link the resulting object file with libf2c:
-	on Microsoft Windows system, link with libf2c.lib;
-	on Linux or Unix systems, link with .../path/to/libf2c.a -lm
-	or, if you install libf2c.a in a standard place, with -lf2c -lm
-	-- in that order, at the end of the command line, as in
-		cc *.o -lf2c -lm
-	Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
+        on Microsoft Windows system, link with libf2c.lib;
+        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
+        or, if you install libf2c.a in a standard place, with -lf2c -lm
+        -- in that order, at the end of the command line, as in
+                cc *.o -lf2c -lm
+        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
 
-		http://www.netlib.org/f2c/libf2c.zip
+                http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
 /* Table of constant values */
 
@@ -19,175 +19,162 @@
 static doublereal c_b5 = 0.;
 static integer c__1 = 1;
 
-/* Subroutine */ int dlarf_(char *side, integer *m, integer *n, doublereal *v, 
-	 integer *incv, doublereal *tau, doublereal *c__, integer *ldc, 
-	doublereal *work)
-{
-    /* System generated locals */
-    integer c_dim1, c_offset;
-    doublereal d__1;
+/* Subroutine */ void dlarf_(char *side, integer *m, integer *n, doublereal *v, integer *incv, doublereal *tau,
+                             doublereal *c__, integer *ldc, doublereal *work) {
+  /* System generated locals */
+  integer c_dim1, c_offset;
+  doublereal d__1;
 
-    /* Local variables */
-    integer i__;
-    logical applyleft;
-    extern /* Subroutine */ int dger_(integer *, integer *, doublereal *, 
-	    doublereal *, integer *, doublereal *, integer *, doublereal *, 
-	    integer *);
-    extern logical lsame_(char *, char *);
-    extern /* Subroutine */ int dgemv_(char *, integer *, integer *, 
-	    doublereal *, doublereal *, integer *, doublereal *, integer *, 
-	    doublereal *, doublereal *, integer *);
-    integer lastc, lastv;
-    extern integer iladlc_(integer *, integer *, doublereal *, integer *), 
-	    iladlr_(integer *, integer *, doublereal *, integer *);
+  /* Local variables */
+  integer i__;
+  logical applyleft;
+  extern /* Subroutine */ void dger_(integer *, integer *, doublereal *, doublereal *, integer *, doublereal *,
+                                     integer *, doublereal *, integer *);
+  extern logical lsame_(char *, char *);
+  extern /* Subroutine */ void dgemv_(const char *, const integer *, const integer *, const doublereal *,
+                                      const doublereal *, const integer *, const doublereal *, const integer *,
+                                      const doublereal *, doublereal *, const integer *);
+  integer lastc, lastv;
+  extern integer iladlc_(integer *, integer *, doublereal *, integer *),
+      iladlr_(integer *, integer *, doublereal *, integer *);
 
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*     .. Scalar Arguments .. */
+  /*     .. */
+  /*     .. Array Arguments .. */
+  /*     .. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
-/*     .. Array Arguments .. */
-/*     .. */
+  /*  Purpose */
+  /*  ======= */
 
-/*  Purpose */
-/*  ======= */
+  /*  DLARF applies a real elementary reflector H to a real m by n matrix */
+  /*  C, from either the left or the right. H is represented in the form */
 
-/*  DLARF applies a real elementary reflector H to a real m by n matrix */
-/*  C, from either the left or the right. H is represented in the form */
+  /*        H = I - tau * v * v' */
 
-/*        H = I - tau * v * v' */
+  /*  where tau is a real scalar and v is a real vector. */
 
-/*  where tau is a real scalar and v is a real vector. */
+  /*  If tau = 0, then H is taken to be the unit matrix. */
 
-/*  If tau = 0, then H is taken to be the unit matrix. */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Arguments */
-/*  ========= */
+  /*  SIDE    (input) CHARACTER*1 */
+  /*          = 'L': form  H * C */
+  /*          = 'R': form  C * H */
 
-/*  SIDE    (input) CHARACTER*1 */
-/*          = 'L': form  H * C */
-/*          = 'R': form  C * H */
+  /*  M       (input) INTEGER */
+  /*          The number of rows of the matrix C. */
 
-/*  M       (input) INTEGER */
-/*          The number of rows of the matrix C. */
+  /*  N       (input) INTEGER */
+  /*          The number of columns of the matrix C. */
 
-/*  N       (input) INTEGER */
-/*          The number of columns of the matrix C. */
+  /*  V       (input) DOUBLE PRECISION array, dimension */
+  /*                     (1 + (M-1)*abs(INCV)) if SIDE = 'L' */
+  /*                  or (1 + (N-1)*abs(INCV)) if SIDE = 'R' */
+  /*          The vector v in the representation of H. V is not used if */
+  /*          TAU = 0. */
 
-/*  V       (input) DOUBLE PRECISION array, dimension */
-/*                     (1 + (M-1)*abs(INCV)) if SIDE = 'L' */
-/*                  or (1 + (N-1)*abs(INCV)) if SIDE = 'R' */
-/*          The vector v in the representation of H. V is not used if */
-/*          TAU = 0. */
+  /*  INCV    (input) INTEGER */
+  /*          The increment between elements of v. INCV <> 0. */
 
-/*  INCV    (input) INTEGER */
-/*          The increment between elements of v. INCV <> 0. */
+  /*  TAU     (input) DOUBLE PRECISION */
+  /*          The value tau in the representation of H. */
 
-/*  TAU     (input) DOUBLE PRECISION */
-/*          The value tau in the representation of H. */
+  /*  C       (input/output) DOUBLE PRECISION array, dimension (LDC,N) */
+  /*          On entry, the m by n matrix C. */
+  /*          On exit, C is overwritten by the matrix H * C if SIDE = 'L', */
+  /*          or C * H if SIDE = 'R'. */
 
-/*  C       (input/output) DOUBLE PRECISION array, dimension (LDC,N) */
-/*          On entry, the m by n matrix C. */
-/*          On exit, C is overwritten by the matrix H * C if SIDE = 'L', */
-/*          or C * H if SIDE = 'R'. */
+  /*  LDC     (input) INTEGER */
+  /*          The leading dimension of the array C. LDC >= max(1,M). */
 
-/*  LDC     (input) INTEGER */
-/*          The leading dimension of the array C. LDC >= max(1,M). */
+  /*  WORK    (workspace) DOUBLE PRECISION array, dimension */
+  /*                         (N) if SIDE = 'L' */
+  /*                      or (M) if SIDE = 'R' */
 
-/*  WORK    (workspace) DOUBLE PRECISION array, dimension */
-/*                         (N) if SIDE = 'L' */
-/*                      or (M) if SIDE = 'R' */
+  /*  ===================================================================== */
 
-/*  ===================================================================== */
+  /*     .. Parameters .. */
+  /*     .. */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Subroutines .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*     .. Parameters .. */
-/*     .. */
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Subroutines .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. Executable Statements .. */
+  /* Parameter adjustments */
+  --v;
+  c_dim1 = *ldc;
+  c_offset = 1 + c_dim1;
+  c__ -= c_offset;
+  --work;
 
-    /* Parameter adjustments */
-    --v;
-    c_dim1 = *ldc;
-    c_offset = 1 + c_dim1;
-    c__ -= c_offset;
-    --work;
-
-    /* Function Body */
-    applyleft = lsame_(side, "L");
-    lastv = 0;
-    lastc = 0;
-    if (*tau != 0.) {
-/*     Set up variables for scanning V.  LASTV begins pointing to the end */
-/*     of V. */
-	if (applyleft) {
-	    lastv = *m;
-	} else {
-	    lastv = *n;
-	}
-	if (*incv > 0) {
-	    i__ = (lastv - 1) * *incv + 1;
-	} else {
-	    i__ = 1;
-	}
-/*     Look for the last non-zero row in V. */
-	while(lastv > 0 && v[i__] == 0.) {
-	    --lastv;
-	    i__ -= *incv;
-	}
-	if (applyleft) {
-/*     Scan for the last non-zero column in C(1:lastv,:). */
-	    lastc = iladlc_(&lastv, n, &c__[c_offset], ldc);
-	} else {
-/*     Scan for the last non-zero row in C(:,1:lastv). */
-	    lastc = iladlr_(m, &lastv, &c__[c_offset], ldc);
-	}
-    }
-/*     Note that lastc.eq.0 renders the BLAS operations null; no special */
-/*     case is needed at this level. */
+  /* Function Body */
+  applyleft = lsame_(side, "L");
+  lastv = 0;
+  lastc = 0;
+  if (*tau != 0.) {
+    /*     Set up variables for scanning V.  LASTV begins pointing to the end */
+    /*     of V. */
     if (applyleft) {
-
-/*        Form  H * C */
-
-	if (lastv > 0) {
-
-/*           w(1:lastc,1) := C(1:lastv,1:lastc)' * v(1:lastv,1) */
-
-	    dgemv_("Transpose", &lastv, &lastc, &c_b4, &c__[c_offset], ldc, &
-		    v[1], incv, &c_b5, &work[1], &c__1);
-
-/*           C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)' */
-
-	    d__1 = -(*tau);
-	    dger_(&lastv, &lastc, &d__1, &v[1], incv, &work[1], &c__1, &c__[
-		    c_offset], ldc);
-	}
+      lastv = *m;
     } else {
-
-/*        Form  C * H */
-
-	if (lastv > 0) {
-
-/*           w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) */
-
-	    dgemv_("No transpose", &lastc, &lastv, &c_b4, &c__[c_offset], ldc, 
-		     &v[1], incv, &c_b5, &work[1], &c__1);
-
-/*           C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)' */
-
-	    d__1 = -(*tau);
-	    dger_(&lastc, &lastv, &d__1, &work[1], &c__1, &v[1], incv, &c__[
-		    c_offset], ldc);
-	}
+      lastv = *n;
     }
-    return 0;
+    if (*incv > 0) {
+      i__ = (lastv - 1) * *incv + 1;
+    } else {
+      i__ = 1;
+    }
+    /*     Look for the last non-zero row in V. */
+    while (lastv > 0 && v[i__] == 0.) {
+      --lastv;
+      i__ -= *incv;
+    }
+    if (applyleft) {
+      /*     Scan for the last non-zero column in C(1:lastv,:). */
+      lastc = iladlc_(&lastv, n, &c__[c_offset], ldc);
+    } else {
+      /*     Scan for the last non-zero row in C(:,1:lastv). */
+      lastc = iladlr_(m, &lastv, &c__[c_offset], ldc);
+    }
+  }
+  /*     Note that lastc.eq.0 renders the BLAS operations null; no special */
+  /*     case is needed at this level. */
+  if (applyleft) {
+    /*        Form  H * C */
 
-/*     End of DLARF */
+    if (lastv > 0) {
+      /*           w(1:lastc,1) := C(1:lastv,1:lastc)' * v(1:lastv,1) */
+
+      dgemv_("Transpose", &lastv, &lastc, &c_b4, &c__[c_offset], ldc, &v[1], incv, &c_b5, &work[1], &c__1);
+
+      /*           C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)' */
+
+      d__1 = -(*tau);
+      dger_(&lastv, &lastc, &d__1, &v[1], incv, &work[1], &c__1, &c__[c_offset], ldc);
+    }
+  } else {
+    /*        Form  C * H */
+
+    if (lastv > 0) {
+      /*           w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) */
+
+      dgemv_("No transpose", &lastc, &lastv, &c_b4, &c__[c_offset], ldc, &v[1], incv, &c_b5, &work[1], &c__1);
+
+      /*           C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)' */
+
+      d__1 = -(*tau);
+      dger_(&lastc, &lastv, &d__1, &work[1], &c__1, &v[1], incv, &c__[c_offset], ldc);
+    }
+  }
+
+  /*     End of DLARF */
 
 } /* dlarf_ */
diff --git a/lapack/dlarfb.c b/lapack/dlarfb.c
index 9833b69..3bf4d23 100644
--- a/lapack/dlarfb.c
+++ b/lapack/dlarfb.c
@@ -1,17 +1,17 @@
 /* dlarfb.f -- translated by f2c (version 20061008).
    You must link the resulting object file with libf2c:
-	on Microsoft Windows system, link with libf2c.lib;
-	on Linux or Unix systems, link with .../path/to/libf2c.a -lm
-	or, if you install libf2c.a in a standard place, with -lf2c -lm
-	-- in that order, at the end of the command line, as in
-		cc *.o -lf2c -lm
-	Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
+        on Microsoft Windows system, link with libf2c.lib;
+        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
+        or, if you install libf2c.a in a standard place, with -lf2c -lm
+        -- in that order, at the end of the command line, as in
+                cc *.o -lf2c -lm
+        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
 
-		http://www.netlib.org/f2c/libf2c.zip
+                http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
 /* Table of constant values */
 
@@ -19,756 +19,662 @@
 static doublereal c_b14 = 1.;
 static doublereal c_b25 = -1.;
 
-/* Subroutine */ int dlarfb_(char *side, char *trans, char *direct, char *
-	storev, integer *m, integer *n, integer *k, doublereal *v, integer *
-	ldv, doublereal *t, integer *ldt, doublereal *c__, integer *ldc, 
-	doublereal *work, integer *ldwork)
-{
-    /* System generated locals */
-    integer c_dim1, c_offset, t_dim1, t_offset, v_dim1, v_offset, work_dim1, 
-	    work_offset, i__1, i__2;
+/* Subroutine */ void dlarfb_(char *side, char *trans, char *direct, char *storev, integer *m, integer *n, integer *k,
+                              doublereal *v, integer *ldv, doublereal *t, integer *ldt, doublereal *c__, integer *ldc,
+                              doublereal *work, integer *ldwork) {
+  /* System generated locals */
+  integer c_dim1, c_offset, t_dim1, t_offset, v_dim1, v_offset, work_dim1, work_offset, i__1, i__2;
 
-    /* Local variables */
-    integer i__, j;
-    extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, 
-	    integer *, doublereal *, doublereal *, integer *, doublereal *, 
-	    integer *, doublereal *, doublereal *, integer *);
-    extern logical lsame_(char *, char *);
-    integer lastc;
-    extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, 
-	    doublereal *, integer *), dtrmm_(char *, char *, char *, char *, 
-	    integer *, integer *, doublereal *, doublereal *, integer *, 
-	    doublereal *, integer *);
-    integer lastv;
-    extern integer iladlc_(integer *, integer *, doublereal *, integer *), 
-	    iladlr_(integer *, integer *, doublereal *, integer *);
-    char transt[1];
+  /* Local variables */
+  integer i__, j;
+  extern /* Subroutine */ void dgemm_(const char *, const char *, const integer *, const integer *, const integer *,
+                                      const doublereal *, const doublereal *, const integer *, const doublereal *,
+                                      const integer *, const doublereal *, doublereal *, const integer *);
+  extern logical lsame_(char *, char *);
+  integer lastc;
+  extern /* Subroutine */ void dcopy_(integer *, doublereal *, integer *, doublereal *, integer *),
+      dtrmm_(const char *, const char *, const char *, const char *, const integer *, const integer *,
+             const doublereal *, const doublereal *, const integer *, doublereal *, const integer *);
+  integer lastv;
+  extern integer iladlc_(integer *, integer *, doublereal *, integer *),
+      iladlr_(integer *, integer *, doublereal *, integer *);
+  char transt[1];
 
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*     .. Scalar Arguments .. */
+  /*     .. */
+  /*     .. Array Arguments .. */
+  /*     .. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
-/*     .. Array Arguments .. */
-/*     .. */
+  /*  Purpose */
+  /*  ======= */
 
-/*  Purpose */
-/*  ======= */
+  /*  DLARFB applies a real block reflector H or its transpose H' to a */
+  /*  real m by n matrix C, from either the left or the right. */
 
-/*  DLARFB applies a real block reflector H or its transpose H' to a */
-/*  real m by n matrix C, from either the left or the right. */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Arguments */
-/*  ========= */
+  /*  SIDE    (input) CHARACTER*1 */
+  /*          = 'L': apply H or H' from the Left */
+  /*          = 'R': apply H or H' from the Right */
 
-/*  SIDE    (input) CHARACTER*1 */
-/*          = 'L': apply H or H' from the Left */
-/*          = 'R': apply H or H' from the Right */
+  /*  TRANS   (input) CHARACTER*1 */
+  /*          = 'N': apply H (No transpose) */
+  /*          = 'T': apply H' (Transpose) */
 
-/*  TRANS   (input) CHARACTER*1 */
-/*          = 'N': apply H (No transpose) */
-/*          = 'T': apply H' (Transpose) */
+  /*  DIRECT  (input) CHARACTER*1 */
+  /*          Indicates how H is formed from a product of elementary */
+  /*          reflectors */
+  /*          = 'F': H = H(1) H(2) . . . H(k) (Forward) */
+  /*          = 'B': H = H(k) . . . H(2) H(1) (Backward) */
 
-/*  DIRECT  (input) CHARACTER*1 */
-/*          Indicates how H is formed from a product of elementary */
-/*          reflectors */
-/*          = 'F': H = H(1) H(2) . . . H(k) (Forward) */
-/*          = 'B': H = H(k) . . . H(2) H(1) (Backward) */
+  /*  STOREV  (input) CHARACTER*1 */
+  /*          Indicates how the vectors which define the elementary */
+  /*          reflectors are stored: */
+  /*          = 'C': Columnwise */
+  /*          = 'R': Rowwise */
 
-/*  STOREV  (input) CHARACTER*1 */
-/*          Indicates how the vectors which define the elementary */
-/*          reflectors are stored: */
-/*          = 'C': Columnwise */
-/*          = 'R': Rowwise */
+  /*  M       (input) INTEGER */
+  /*          The number of rows of the matrix C. */
 
-/*  M       (input) INTEGER */
-/*          The number of rows of the matrix C. */
+  /*  N       (input) INTEGER */
+  /*          The number of columns of the matrix C. */
 
-/*  N       (input) INTEGER */
-/*          The number of columns of the matrix C. */
+  /*  K       (input) INTEGER */
+  /*          The order of the matrix T (= the number of elementary */
+  /*          reflectors whose product defines the block reflector). */
 
-/*  K       (input) INTEGER */
-/*          The order of the matrix T (= the number of elementary */
-/*          reflectors whose product defines the block reflector). */
+  /*  V       (input) DOUBLE PRECISION array, dimension */
+  /*                                (LDV,K) if STOREV = 'C' */
+  /*                                (LDV,M) if STOREV = 'R' and SIDE = 'L' */
+  /*                                (LDV,N) if STOREV = 'R' and SIDE = 'R' */
+  /*          The matrix V. See further details. */
 
-/*  V       (input) DOUBLE PRECISION array, dimension */
-/*                                (LDV,K) if STOREV = 'C' */
-/*                                (LDV,M) if STOREV = 'R' and SIDE = 'L' */
-/*                                (LDV,N) if STOREV = 'R' and SIDE = 'R' */
-/*          The matrix V. See further details. */
+  /*  LDV     (input) INTEGER */
+  /*          The leading dimension of the array V. */
+  /*          If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); */
+  /*          if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); */
+  /*          if STOREV = 'R', LDV >= K. */
 
-/*  LDV     (input) INTEGER */
-/*          The leading dimension of the array V. */
-/*          If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); */
-/*          if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); */
-/*          if STOREV = 'R', LDV >= K. */
+  /*  T       (input) DOUBLE PRECISION array, dimension (LDT,K) */
+  /*          The triangular k by k matrix T in the representation of the */
+  /*          block reflector. */
 
-/*  T       (input) DOUBLE PRECISION array, dimension (LDT,K) */
-/*          The triangular k by k matrix T in the representation of the */
-/*          block reflector. */
+  /*  LDT     (input) INTEGER */
+  /*          The leading dimension of the array T. LDT >= K. */
 
-/*  LDT     (input) INTEGER */
-/*          The leading dimension of the array T. LDT >= K. */
+  /*  C       (input/output) DOUBLE PRECISION array, dimension (LDC,N) */
+  /*          On entry, the m by n matrix C. */
+  /*          On exit, C is overwritten by H*C or H'*C or C*H or C*H'. */
 
-/*  C       (input/output) DOUBLE PRECISION array, dimension (LDC,N) */
-/*          On entry, the m by n matrix C. */
-/*          On exit, C is overwritten by H*C or H'*C or C*H or C*H'. */
+  /*  LDC     (input) INTEGER */
+  /*          The leading dimension of the array C. LDA >= max(1,M). */
 
-/*  LDC     (input) INTEGER */
-/*          The leading dimension of the array C. LDA >= max(1,M). */
+  /*  WORK    (workspace) DOUBLE PRECISION array, dimension (LDWORK,K) */
 
-/*  WORK    (workspace) DOUBLE PRECISION array, dimension (LDWORK,K) */
+  /*  LDWORK  (input) INTEGER */
+  /*          The leading dimension of the array WORK. */
+  /*          If SIDE = 'L', LDWORK >= max(1,N); */
+  /*          if SIDE = 'R', LDWORK >= max(1,M). */
 
-/*  LDWORK  (input) INTEGER */
-/*          The leading dimension of the array WORK. */
-/*          If SIDE = 'L', LDWORK >= max(1,N); */
-/*          if SIDE = 'R', LDWORK >= max(1,M). */
+  /*  ===================================================================== */
 
-/*  ===================================================================== */
+  /*     .. Parameters .. */
+  /*     .. */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. External Subroutines .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*     .. Parameters .. */
-/*     .. */
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. External Subroutines .. */
-/*     .. */
-/*     .. Executable Statements .. */
+  /*     Quick return if possible */
 
-/*     Quick return if possible */
+  /* Parameter adjustments */
+  v_dim1 = *ldv;
+  v_offset = 1 + v_dim1;
+  v -= v_offset;
+  t_dim1 = *ldt;
+  t_offset = 1 + t_dim1;
+  t -= t_offset;
+  c_dim1 = *ldc;
+  c_offset = 1 + c_dim1;
+  c__ -= c_offset;
+  work_dim1 = *ldwork;
+  work_offset = 1 + work_dim1;
+  work -= work_offset;
 
-    /* Parameter adjustments */
-    v_dim1 = *ldv;
-    v_offset = 1 + v_dim1;
-    v -= v_offset;
-    t_dim1 = *ldt;
-    t_offset = 1 + t_dim1;
-    t -= t_offset;
-    c_dim1 = *ldc;
-    c_offset = 1 + c_dim1;
-    c__ -= c_offset;
-    work_dim1 = *ldwork;
-    work_offset = 1 + work_dim1;
-    work -= work_offset;
+  /* Function Body */
+  if (*m <= 0 || *n <= 0) {
+    return;
+  }
 
-    /* Function Body */
-    if (*m <= 0 || *n <= 0) {
-	return 0;
-    }
+  if (lsame_(trans, "N")) {
+    *(unsigned char *)transt = 'T';
+  } else {
+    *(unsigned char *)transt = 'N';
+  }
 
-    if (lsame_(trans, "N")) {
-	*(unsigned char *)transt = 'T';
+  if (lsame_(storev, "C")) {
+    if (lsame_(direct, "F")) {
+      /*           Let  V =  ( V1 )    (first K rows) */
+      /*                     ( V2 ) */
+      /*           where  V1  is unit lower triangular. */
+
+      if (lsame_(side, "L")) {
+        /*              Form  H * C  or  H' * C  where  C = ( C1 ) */
+        /*                                                  ( C2 ) */
+
+        /* Computing MAX */
+        i__1 = *k, i__2 = iladlr_(m, k, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = iladlc_(&lastv, n, &c__[c_offset], ldc);
+
+        /*              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK) */
+
+        /*              W := C1' */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          dcopy_(&lastc, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1);
+          /* L10: */
+        }
+
+        /*              W := W * V1 */
+
+        dtrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &c_b14, &v[v_offset], ldv, &work[work_offset],
+               ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C2'*V2 */
+
+          i__1 = lastv - *k;
+          dgemm_("Transpose", "No transpose", &lastc, k, &i__1, &c_b14, &c__[*k + 1 + c_dim1], ldc, &v[*k + 1 + v_dim1],
+                 ldv, &c_b14, &work[work_offset], ldwork);
+        }
+
+        /*              W := W * T'  or  W * T */
+
+        dtrmm_("Right", "Upper", transt, "Non-unit", &lastc, k, &c_b14, &t[t_offset], ldt, &work[work_offset], ldwork);
+
+        /*              C := C - V * W' */
+
+        if (lastv > *k) {
+          /*                 C2 := C2 - V2 * W' */
+
+          i__1 = lastv - *k;
+          dgemm_("No transpose", "Transpose", &i__1, &lastc, k, &c_b25, &v[*k + 1 + v_dim1], ldv, &work[work_offset],
+                 ldwork, &c_b14, &c__[*k + 1 + c_dim1], ldc);
+        }
+
+        /*              W := W * V1' */
+
+        dtrmm_("Right", "Lower", "Transpose", "Unit", &lastc, k, &c_b14, &v[v_offset], ldv, &work[work_offset], ldwork);
+
+        /*              C1 := C1 - W' */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            c__[j + i__ * c_dim1] -= work[i__ + j * work_dim1];
+            /* L20: */
+          }
+          /* L30: */
+        }
+
+      } else if (lsame_(side, "R")) {
+        /*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
+
+        /* Computing MAX */
+        i__1 = *k, i__2 = iladlr_(n, k, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = iladlr_(m, &lastv, &c__[c_offset], ldc);
+
+        /*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK) */
+
+        /*              W := C1 */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          dcopy_(&lastc, &c__[j * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1);
+          /* L40: */
+        }
+
+        /*              W := W * V1 */
+
+        dtrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &c_b14, &v[v_offset], ldv, &work[work_offset],
+               ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C2 * V2 */
+
+          i__1 = lastv - *k;
+          dgemm_("No transpose", "No transpose", &lastc, k, &i__1, &c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc,
+                 &v[*k + 1 + v_dim1], ldv, &c_b14, &work[work_offset], ldwork);
+        }
+
+        /*              W := W * T  or  W * T' */
+
+        dtrmm_("Right", "Upper", trans, "Non-unit", &lastc, k, &c_b14, &t[t_offset], ldt, &work[work_offset], ldwork);
+
+        /*              C := C - W * V' */
+
+        if (lastv > *k) {
+          /*                 C2 := C2 - W * V2' */
+
+          i__1 = lastv - *k;
+          dgemm_("No transpose", "Transpose", &lastc, &i__1, k, &c_b25, &work[work_offset], ldwork, &v[*k + 1 + v_dim1],
+                 ldv, &c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc);
+        }
+
+        /*              W := W * V1' */
+
+        dtrmm_("Right", "Lower", "Transpose", "Unit", &lastc, k, &c_b14, &v[v_offset], ldv, &work[work_offset], ldwork);
+
+        /*              C1 := C1 - W */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            c__[i__ + j * c_dim1] -= work[i__ + j * work_dim1];
+            /* L50: */
+          }
+          /* L60: */
+        }
+      }
+
     } else {
-	*(unsigned char *)transt = 'N';
+      /*           Let  V =  ( V1 ) */
+      /*                     ( V2 )    (last K rows) */
+      /*           where  V2  is unit upper triangular. */
+
+      if (lsame_(side, "L")) {
+        /*              Form  H * C  or  H' * C  where  C = ( C1 ) */
+        /*                                                  ( C2 ) */
+
+        /* Computing MAX */
+        i__1 = *k, i__2 = iladlr_(m, k, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = iladlc_(&lastv, n, &c__[c_offset], ldc);
+
+        /*              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK) */
+
+        /*              W := C2' */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          dcopy_(&lastc, &c__[lastv - *k + j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1);
+          /* L70: */
+        }
+
+        /*              W := W * V2 */
+
+        dtrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &c_b14, &v[lastv - *k + 1 + v_dim1], ldv,
+               &work[work_offset], ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C1'*V1 */
+
+          i__1 = lastv - *k;
+          dgemm_("Transpose", "No transpose", &lastc, k, &i__1, &c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, &c_b14,
+                 &work[work_offset], ldwork);
+        }
+
+        /*              W := W * T'  or  W * T */
+
+        dtrmm_("Right", "Lower", transt, "Non-unit", &lastc, k, &c_b14, &t[t_offset], ldt, &work[work_offset], ldwork);
+
+        /*              C := C - V * W' */
+
+        if (lastv > *k) {
+          /*                 C1 := C1 - V1 * W' */
+
+          i__1 = lastv - *k;
+          dgemm_("No transpose", "Transpose", &i__1, &lastc, k, &c_b25, &v[v_offset], ldv, &work[work_offset], ldwork,
+                 &c_b14, &c__[c_offset], ldc);
+        }
+
+        /*              W := W * V2' */
+
+        dtrmm_("Right", "Upper", "Transpose", "Unit", &lastc, k, &c_b14, &v[lastv - *k + 1 + v_dim1], ldv,
+               &work[work_offset], ldwork);
+
+        /*              C2 := C2 - W' */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            c__[lastv - *k + j + i__ * c_dim1] -= work[i__ + j * work_dim1];
+            /* L80: */
+          }
+          /* L90: */
+        }
+
+      } else if (lsame_(side, "R")) {
+        /*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
+
+        /* Computing MAX */
+        i__1 = *k, i__2 = iladlr_(n, k, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = iladlr_(m, &lastv, &c__[c_offset], ldc);
+
+        /*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK) */
+
+        /*              W := C2 */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          dcopy_(&lastc, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1);
+          /* L100: */
+        }
+
+        /*              W := W * V2 */
+
+        dtrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &c_b14, &v[lastv - *k + 1 + v_dim1], ldv,
+               &work[work_offset], ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C1 * V1 */
+
+          i__1 = lastv - *k;
+          dgemm_("No transpose", "No transpose", &lastc, k, &i__1, &c_b14, &c__[c_offset], ldc, &v[v_offset], ldv,
+                 &c_b14, &work[work_offset], ldwork);
+        }
+
+        /*              W := W * T  or  W * T' */
+
+        dtrmm_("Right", "Lower", trans, "Non-unit", &lastc, k, &c_b14, &t[t_offset], ldt, &work[work_offset], ldwork);
+
+        /*              C := C - W * V' */
+
+        if (lastv > *k) {
+          /*                 C1 := C1 - W * V1' */
+
+          i__1 = lastv - *k;
+          dgemm_("No transpose", "Transpose", &lastc, &i__1, k, &c_b25, &work[work_offset], ldwork, &v[v_offset], ldv,
+                 &c_b14, &c__[c_offset], ldc);
+        }
+
+        /*              W := W * V2' */
+
+        dtrmm_("Right", "Upper", "Transpose", "Unit", &lastc, k, &c_b14, &v[lastv - *k + 1 + v_dim1], ldv,
+               &work[work_offset], ldwork);
+
+        /*              C2 := C2 - W */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            c__[i__ + (lastv - *k + j) * c_dim1] -= work[i__ + j * work_dim1];
+            /* L110: */
+          }
+          /* L120: */
+        }
+      }
     }
 
-    if (lsame_(storev, "C")) {
+  } else if (lsame_(storev, "R")) {
+    if (lsame_(direct, "F")) {
+      /*           Let  V =  ( V1  V2 )    (V1: first K columns) */
+      /*           where  V1  is unit upper triangular. */
 
-	if (lsame_(direct, "F")) {
+      if (lsame_(side, "L")) {
+        /*              Form  H * C  or  H' * C  where  C = ( C1 ) */
+        /*                                                  ( C2 ) */
 
-/*           Let  V =  ( V1 )    (first K rows) */
-/*                     ( V2 ) */
-/*           where  V1  is unit lower triangular. */
+        /* Computing MAX */
+        i__1 = *k, i__2 = iladlc_(k, m, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = iladlc_(&lastv, n, &c__[c_offset], ldc);
 
-	    if (lsame_(side, "L")) {
+        /*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK) */
 
-/*              Form  H * C  or  H' * C  where  C = ( C1 ) */
-/*                                                  ( C2 ) */
+        /*              W := C1' */
 
-/* Computing MAX */
-		i__1 = *k, i__2 = iladlr_(m, k, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = iladlc_(&lastv, n, &c__[c_offset], ldc);
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          dcopy_(&lastc, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1);
+          /* L130: */
+        }
 
-/*              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK) */
+        /*              W := W * V1' */
 
-/*              W := C1' */
+        dtrmm_("Right", "Upper", "Transpose", "Unit", &lastc, k, &c_b14, &v[v_offset], ldv, &work[work_offset], ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C2'*V2' */
 
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    dcopy_(&lastc, &c__[j + c_dim1], ldc, &work[j * work_dim1 
-			    + 1], &c__1);
-/* L10: */
-		}
+          i__1 = lastv - *k;
+          dgemm_("Transpose", "Transpose", &lastc, k, &i__1, &c_b14, &c__[*k + 1 + c_dim1], ldc,
+                 &v[(*k + 1) * v_dim1 + 1], ldv, &c_b14, &work[work_offset], ldwork);
+        }
 
-/*              W := W * V1 */
+        /*              W := W * T'  or  W * T */
 
-		dtrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &
-			c_b14, &v[v_offset], ldv, &work[work_offset], ldwork);
-		if (lastv > *k) {
+        dtrmm_("Right", "Upper", transt, "Non-unit", &lastc, k, &c_b14, &t[t_offset], ldt, &work[work_offset], ldwork);
 
-/*                 W := W + C2'*V2 */
+        /*              C := C - V' * W' */
 
-		    i__1 = lastv - *k;
-		    dgemm_("Transpose", "No transpose", &lastc, k, &i__1, &
-			    c_b14, &c__[*k + 1 + c_dim1], ldc, &v[*k + 1 + 
-			    v_dim1], ldv, &c_b14, &work[work_offset], ldwork);
-		}
+        if (lastv > *k) {
+          /*                 C2 := C2 - V2' * W' */
 
-/*              W := W * T'  or  W * T */
+          i__1 = lastv - *k;
+          dgemm_("Transpose", "Transpose", &i__1, &lastc, k, &c_b25, &v[(*k + 1) * v_dim1 + 1], ldv, &work[work_offset],
+                 ldwork, &c_b14, &c__[*k + 1 + c_dim1], ldc);
+        }
 
-		dtrmm_("Right", "Upper", transt, "Non-unit", &lastc, k, &
-			c_b14, &t[t_offset], ldt, &work[work_offset], ldwork);
+        /*              W := W * V1 */
 
-/*              C := C - V * W' */
+        dtrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &c_b14, &v[v_offset], ldv, &work[work_offset],
+               ldwork);
 
-		if (lastv > *k) {
+        /*              C1 := C1 - W' */
 
-/*                 C2 := C2 - V2 * W' */
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            c__[j + i__ * c_dim1] -= work[i__ + j * work_dim1];
+            /* L140: */
+          }
+          /* L150: */
+        }
 
-		    i__1 = lastv - *k;
-		    dgemm_("No transpose", "Transpose", &i__1, &lastc, k, &
-			    c_b25, &v[*k + 1 + v_dim1], ldv, &work[
-			    work_offset], ldwork, &c_b14, &c__[*k + 1 + 
-			    c_dim1], ldc);
-		}
+      } else if (lsame_(side, "R")) {
+        /*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
 
-/*              W := W * V1' */
+        /* Computing MAX */
+        i__1 = *k, i__2 = iladlc_(k, n, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = iladlr_(m, &lastv, &c__[c_offset], ldc);
 
-		dtrmm_("Right", "Lower", "Transpose", "Unit", &lastc, k, &
-			c_b14, &v[v_offset], ldv, &work[work_offset], ldwork);
+        /*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK) */
 
-/*              C1 := C1 - W' */
+        /*              W := C1 */
 
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			c__[j + i__ * c_dim1] -= work[i__ + j * work_dim1];
-/* L20: */
-		    }
-/* L30: */
-		}
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          dcopy_(&lastc, &c__[j * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1);
+          /* L160: */
+        }
 
-	    } else if (lsame_(side, "R")) {
+        /*              W := W * V1' */
 
-/*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
+        dtrmm_("Right", "Upper", "Transpose", "Unit", &lastc, k, &c_b14, &v[v_offset], ldv, &work[work_offset], ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C2 * V2' */
 
-/* Computing MAX */
-		i__1 = *k, i__2 = iladlr_(n, k, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = iladlr_(m, &lastv, &c__[c_offset], ldc);
+          i__1 = lastv - *k;
+          dgemm_("No transpose", "Transpose", &lastc, k, &i__1, &c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc,
+                 &v[(*k + 1) * v_dim1 + 1], ldv, &c_b14, &work[work_offset], ldwork);
+        }
 
-/*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK) */
+        /*              W := W * T  or  W * T' */
 
-/*              W := C1 */
+        dtrmm_("Right", "Upper", trans, "Non-unit", &lastc, k, &c_b14, &t[t_offset], ldt, &work[work_offset], ldwork);
 
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    dcopy_(&lastc, &c__[j * c_dim1 + 1], &c__1, &work[j * 
-			    work_dim1 + 1], &c__1);
-/* L40: */
-		}
+        /*              C := C - W * V */
 
-/*              W := W * V1 */
+        if (lastv > *k) {
+          /*                 C2 := C2 - W * V2 */
 
-		dtrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &
-			c_b14, &v[v_offset], ldv, &work[work_offset], ldwork);
-		if (lastv > *k) {
+          i__1 = lastv - *k;
+          dgemm_("No transpose", "No transpose", &lastc, &i__1, k, &c_b25, &work[work_offset], ldwork,
+                 &v[(*k + 1) * v_dim1 + 1], ldv, &c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc);
+        }
 
-/*                 W := W + C2 * V2 */
+        /*              W := W * V1 */
 
-		    i__1 = lastv - *k;
-		    dgemm_("No transpose", "No transpose", &lastc, k, &i__1, &
-			    c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc, &v[*k + 
-			    1 + v_dim1], ldv, &c_b14, &work[work_offset], 
-			    ldwork);
-		}
+        dtrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &c_b14, &v[v_offset], ldv, &work[work_offset],
+               ldwork);
 
-/*              W := W * T  or  W * T' */
+        /*              C1 := C1 - W */
 
-		dtrmm_("Right", "Upper", trans, "Non-unit", &lastc, k, &c_b14, 
-			 &t[t_offset], ldt, &work[work_offset], ldwork);
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            c__[i__ + j * c_dim1] -= work[i__ + j * work_dim1];
+            /* L170: */
+          }
+          /* L180: */
+        }
+      }
 
-/*              C := C - W * V' */
+    } else {
+      /*           Let  V =  ( V1  V2 )    (V2: last K columns) */
+      /*           where  V2  is unit lower triangular. */
 
-		if (lastv > *k) {
+      if (lsame_(side, "L")) {
+        /*              Form  H * C  or  H' * C  where  C = ( C1 ) */
+        /*                                                  ( C2 ) */
 
-/*                 C2 := C2 - W * V2' */
+        /* Computing MAX */
+        i__1 = *k, i__2 = iladlc_(k, m, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = iladlc_(&lastv, n, &c__[c_offset], ldc);
 
-		    i__1 = lastv - *k;
-		    dgemm_("No transpose", "Transpose", &lastc, &i__1, k, &
-			    c_b25, &work[work_offset], ldwork, &v[*k + 1 + 
-			    v_dim1], ldv, &c_b14, &c__[(*k + 1) * c_dim1 + 1], 
-			     ldc);
-		}
+        /*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK) */
 
-/*              W := W * V1' */
+        /*              W := C2' */
 
-		dtrmm_("Right", "Lower", "Transpose", "Unit", &lastc, k, &
-			c_b14, &v[v_offset], ldv, &work[work_offset], ldwork);
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          dcopy_(&lastc, &c__[lastv - *k + j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1);
+          /* L190: */
+        }
 
-/*              C1 := C1 - W */
+        /*              W := W * V2' */
 
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			c__[i__ + j * c_dim1] -= work[i__ + j * work_dim1];
-/* L50: */
-		    }
-/* L60: */
-		}
-	    }
+        dtrmm_("Right", "Lower", "Transpose", "Unit", &lastc, k, &c_b14, &v[(lastv - *k + 1) * v_dim1 + 1], ldv,
+               &work[work_offset], ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C1'*V1' */
 
-	} else {
+          i__1 = lastv - *k;
+          dgemm_("Transpose", "Transpose", &lastc, k, &i__1, &c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, &c_b14,
+                 &work[work_offset], ldwork);
+        }
 
-/*           Let  V =  ( V1 ) */
-/*                     ( V2 )    (last K rows) */
-/*           where  V2  is unit upper triangular. */
+        /*              W := W * T'  or  W * T */
 
-	    if (lsame_(side, "L")) {
+        dtrmm_("Right", "Lower", transt, "Non-unit", &lastc, k, &c_b14, &t[t_offset], ldt, &work[work_offset], ldwork);
 
-/*              Form  H * C  or  H' * C  where  C = ( C1 ) */
-/*                                                  ( C2 ) */
+        /*              C := C - V' * W' */
 
-/* Computing MAX */
-		i__1 = *k, i__2 = iladlr_(m, k, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = iladlc_(&lastv, n, &c__[c_offset], ldc);
+        if (lastv > *k) {
+          /*                 C1 := C1 - V1' * W' */
 
-/*              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK) */
+          i__1 = lastv - *k;
+          dgemm_("Transpose", "Transpose", &i__1, &lastc, k, &c_b25, &v[v_offset], ldv, &work[work_offset], ldwork,
+                 &c_b14, &c__[c_offset], ldc);
+        }
 
-/*              W := C2' */
+        /*              W := W * V2 */
 
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    dcopy_(&lastc, &c__[lastv - *k + j + c_dim1], ldc, &work[
-			    j * work_dim1 + 1], &c__1);
-/* L70: */
-		}
+        dtrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &c_b14, &v[(lastv - *k + 1) * v_dim1 + 1], ldv,
+               &work[work_offset], ldwork);
 
-/*              W := W * V2 */
+        /*              C2 := C2 - W' */
 
-		dtrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &
-			c_b14, &v[lastv - *k + 1 + v_dim1], ldv, &work[
-			work_offset], ldwork);
-		if (lastv > *k) {
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            c__[lastv - *k + j + i__ * c_dim1] -= work[i__ + j * work_dim1];
+            /* L200: */
+          }
+          /* L210: */
+        }
 
-/*                 W := W + C1'*V1 */
+      } else if (lsame_(side, "R")) {
+        /*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
 
-		    i__1 = lastv - *k;
-		    dgemm_("Transpose", "No transpose", &lastc, k, &i__1, &
-			    c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, &
-			    c_b14, &work[work_offset], ldwork);
-		}
+        /* Computing MAX */
+        i__1 = *k, i__2 = iladlc_(k, n, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = iladlr_(m, &lastv, &c__[c_offset], ldc);
 
-/*              W := W * T'  or  W * T */
+        /*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK) */
 
-		dtrmm_("Right", "Lower", transt, "Non-unit", &lastc, k, &
-			c_b14, &t[t_offset], ldt, &work[work_offset], ldwork);
+        /*              W := C2 */
 
-/*              C := C - V * W' */
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          dcopy_(&lastc, &c__[(lastv - *k + j) * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1);
+          /* L220: */
+        }
 
-		if (lastv > *k) {
+        /*              W := W * V2' */
 
-/*                 C1 := C1 - V1 * W' */
+        dtrmm_("Right", "Lower", "Transpose", "Unit", &lastc, k, &c_b14, &v[(lastv - *k + 1) * v_dim1 + 1], ldv,
+               &work[work_offset], ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C1 * V1' */
 
-		    i__1 = lastv - *k;
-		    dgemm_("No transpose", "Transpose", &i__1, &lastc, k, &
-			    c_b25, &v[v_offset], ldv, &work[work_offset], 
-			    ldwork, &c_b14, &c__[c_offset], ldc);
-		}
+          i__1 = lastv - *k;
+          dgemm_("No transpose", "Transpose", &lastc, k, &i__1, &c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, &c_b14,
+                 &work[work_offset], ldwork);
+        }
 
-/*              W := W * V2' */
+        /*              W := W * T  or  W * T' */
 
-		dtrmm_("Right", "Upper", "Transpose", "Unit", &lastc, k, &
-			c_b14, &v[lastv - *k + 1 + v_dim1], ldv, &work[
-			work_offset], ldwork);
+        dtrmm_("Right", "Lower", trans, "Non-unit", &lastc, k, &c_b14, &t[t_offset], ldt, &work[work_offset], ldwork);
 
-/*              C2 := C2 - W' */
+        /*              C := C - W * V */
 
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			c__[lastv - *k + j + i__ * c_dim1] -= work[i__ + j * 
-				work_dim1];
-/* L80: */
-		    }
-/* L90: */
-		}
+        if (lastv > *k) {
+          /*                 C1 := C1 - W * V1 */
 
-	    } else if (lsame_(side, "R")) {
+          i__1 = lastv - *k;
+          dgemm_("No transpose", "No transpose", &lastc, &i__1, k, &c_b25, &work[work_offset], ldwork, &v[v_offset],
+                 ldv, &c_b14, &c__[c_offset], ldc);
+        }
 
-/*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
+        /*              W := W * V2 */
 
-/* Computing MAX */
-		i__1 = *k, i__2 = iladlr_(n, k, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = iladlr_(m, &lastv, &c__[c_offset], ldc);
+        dtrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &c_b14, &v[(lastv - *k + 1) * v_dim1 + 1], ldv,
+               &work[work_offset], ldwork);
 
-/*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK) */
+        /*              C1 := C1 - W */
 
-/*              W := C2 */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    dcopy_(&lastc, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &
-			    work[j * work_dim1 + 1], &c__1);
-/* L100: */
-		}
-
-/*              W := W * V2 */
-
-		dtrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &
-			c_b14, &v[lastv - *k + 1 + v_dim1], ldv, &work[
-			work_offset], ldwork);
-		if (lastv > *k) {
-
-/*                 W := W + C1 * V1 */
-
-		    i__1 = lastv - *k;
-		    dgemm_("No transpose", "No transpose", &lastc, k, &i__1, &
-			    c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, &
-			    c_b14, &work[work_offset], ldwork);
-		}
-
-/*              W := W * T  or  W * T' */
-
-		dtrmm_("Right", "Lower", trans, "Non-unit", &lastc, k, &c_b14, 
-			 &t[t_offset], ldt, &work[work_offset], ldwork);
-
-/*              C := C - W * V' */
-
-		if (lastv > *k) {
-
-/*                 C1 := C1 - W * V1' */
-
-		    i__1 = lastv - *k;
-		    dgemm_("No transpose", "Transpose", &lastc, &i__1, k, &
-			    c_b25, &work[work_offset], ldwork, &v[v_offset], 
-			    ldv, &c_b14, &c__[c_offset], ldc);
-		}
-
-/*              W := W * V2' */
-
-		dtrmm_("Right", "Upper", "Transpose", "Unit", &lastc, k, &
-			c_b14, &v[lastv - *k + 1 + v_dim1], ldv, &work[
-			work_offset], ldwork);
-
-/*              C2 := C2 - W */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			c__[i__ + (lastv - *k + j) * c_dim1] -= work[i__ + j *
-				 work_dim1];
-/* L110: */
-		    }
-/* L120: */
-		}
-	    }
-	}
-
-    } else if (lsame_(storev, "R")) {
-
-	if (lsame_(direct, "F")) {
-
-/*           Let  V =  ( V1  V2 )    (V1: first K columns) */
-/*           where  V1  is unit upper triangular. */
-
-	    if (lsame_(side, "L")) {
-
-/*              Form  H * C  or  H' * C  where  C = ( C1 ) */
-/*                                                  ( C2 ) */
-
-/* Computing MAX */
-		i__1 = *k, i__2 = iladlc_(k, m, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = iladlc_(&lastv, n, &c__[c_offset], ldc);
-
-/*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK) */
-
-/*              W := C1' */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    dcopy_(&lastc, &c__[j + c_dim1], ldc, &work[j * work_dim1 
-			    + 1], &c__1);
-/* L130: */
-		}
-
-/*              W := W * V1' */
-
-		dtrmm_("Right", "Upper", "Transpose", "Unit", &lastc, k, &
-			c_b14, &v[v_offset], ldv, &work[work_offset], ldwork);
-		if (lastv > *k) {
-
-/*                 W := W + C2'*V2' */
-
-		    i__1 = lastv - *k;
-		    dgemm_("Transpose", "Transpose", &lastc, k, &i__1, &c_b14, 
-			     &c__[*k + 1 + c_dim1], ldc, &v[(*k + 1) * v_dim1 
-			    + 1], ldv, &c_b14, &work[work_offset], ldwork);
-		}
-
-/*              W := W * T'  or  W * T */
-
-		dtrmm_("Right", "Upper", transt, "Non-unit", &lastc, k, &
-			c_b14, &t[t_offset], ldt, &work[work_offset], ldwork);
-
-/*              C := C - V' * W' */
-
-		if (lastv > *k) {
-
-/*                 C2 := C2 - V2' * W' */
-
-		    i__1 = lastv - *k;
-		    dgemm_("Transpose", "Transpose", &i__1, &lastc, k, &c_b25, 
-			     &v[(*k + 1) * v_dim1 + 1], ldv, &work[
-			    work_offset], ldwork, &c_b14, &c__[*k + 1 + 
-			    c_dim1], ldc);
-		}
-
-/*              W := W * V1 */
-
-		dtrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &
-			c_b14, &v[v_offset], ldv, &work[work_offset], ldwork);
-
-/*              C1 := C1 - W' */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			c__[j + i__ * c_dim1] -= work[i__ + j * work_dim1];
-/* L140: */
-		    }
-/* L150: */
-		}
-
-	    } else if (lsame_(side, "R")) {
-
-/*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
-
-/* Computing MAX */
-		i__1 = *k, i__2 = iladlc_(k, n, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = iladlr_(m, &lastv, &c__[c_offset], ldc);
-
-/*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK) */
-
-/*              W := C1 */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    dcopy_(&lastc, &c__[j * c_dim1 + 1], &c__1, &work[j * 
-			    work_dim1 + 1], &c__1);
-/* L160: */
-		}
-
-/*              W := W * V1' */
-
-		dtrmm_("Right", "Upper", "Transpose", "Unit", &lastc, k, &
-			c_b14, &v[v_offset], ldv, &work[work_offset], ldwork);
-		if (lastv > *k) {
-
-/*                 W := W + C2 * V2' */
-
-		    i__1 = lastv - *k;
-		    dgemm_("No transpose", "Transpose", &lastc, k, &i__1, &
-			    c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc, &v[(*k + 
-			    1) * v_dim1 + 1], ldv, &c_b14, &work[work_offset], 
-			     ldwork);
-		}
-
-/*              W := W * T  or  W * T' */
-
-		dtrmm_("Right", "Upper", trans, "Non-unit", &lastc, k, &c_b14, 
-			 &t[t_offset], ldt, &work[work_offset], ldwork);
-
-/*              C := C - W * V */
-
-		if (lastv > *k) {
-
-/*                 C2 := C2 - W * V2 */
-
-		    i__1 = lastv - *k;
-		    dgemm_("No transpose", "No transpose", &lastc, &i__1, k, &
-			    c_b25, &work[work_offset], ldwork, &v[(*k + 1) * 
-			    v_dim1 + 1], ldv, &c_b14, &c__[(*k + 1) * c_dim1 
-			    + 1], ldc);
-		}
-
-/*              W := W * V1 */
-
-		dtrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &
-			c_b14, &v[v_offset], ldv, &work[work_offset], ldwork);
-
-/*              C1 := C1 - W */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			c__[i__ + j * c_dim1] -= work[i__ + j * work_dim1];
-/* L170: */
-		    }
-/* L180: */
-		}
-
-	    }
-
-	} else {
-
-/*           Let  V =  ( V1  V2 )    (V2: last K columns) */
-/*           where  V2  is unit lower triangular. */
-
-	    if (lsame_(side, "L")) {
-
-/*              Form  H * C  or  H' * C  where  C = ( C1 ) */
-/*                                                  ( C2 ) */
-
-/* Computing MAX */
-		i__1 = *k, i__2 = iladlc_(k, m, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = iladlc_(&lastv, n, &c__[c_offset], ldc);
-
-/*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK) */
-
-/*              W := C2' */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    dcopy_(&lastc, &c__[lastv - *k + j + c_dim1], ldc, &work[
-			    j * work_dim1 + 1], &c__1);
-/* L190: */
-		}
-
-/*              W := W * V2' */
-
-		dtrmm_("Right", "Lower", "Transpose", "Unit", &lastc, k, &
-			c_b14, &v[(lastv - *k + 1) * v_dim1 + 1], ldv, &work[
-			work_offset], ldwork);
-		if (lastv > *k) {
-
-/*                 W := W + C1'*V1' */
-
-		    i__1 = lastv - *k;
-		    dgemm_("Transpose", "Transpose", &lastc, k, &i__1, &c_b14, 
-			     &c__[c_offset], ldc, &v[v_offset], ldv, &c_b14, &
-			    work[work_offset], ldwork);
-		}
-
-/*              W := W * T'  or  W * T */
-
-		dtrmm_("Right", "Lower", transt, "Non-unit", &lastc, k, &
-			c_b14, &t[t_offset], ldt, &work[work_offset], ldwork);
-
-/*              C := C - V' * W' */
-
-		if (lastv > *k) {
-
-/*                 C1 := C1 - V1' * W' */
-
-		    i__1 = lastv - *k;
-		    dgemm_("Transpose", "Transpose", &i__1, &lastc, k, &c_b25, 
-			     &v[v_offset], ldv, &work[work_offset], ldwork, &
-			    c_b14, &c__[c_offset], ldc);
-		}
-
-/*              W := W * V2 */
-
-		dtrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &
-			c_b14, &v[(lastv - *k + 1) * v_dim1 + 1], ldv, &work[
-			work_offset], ldwork);
-
-/*              C2 := C2 - W' */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			c__[lastv - *k + j + i__ * c_dim1] -= work[i__ + j * 
-				work_dim1];
-/* L200: */
-		    }
-/* L210: */
-		}
-
-	    } else if (lsame_(side, "R")) {
-
-/*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
-
-/* Computing MAX */
-		i__1 = *k, i__2 = iladlc_(k, n, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = iladlr_(m, &lastv, &c__[c_offset], ldc);
-
-/*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK) */
-
-/*              W := C2 */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    dcopy_(&lastc, &c__[(lastv - *k + j) * c_dim1 + 1], &c__1, 
-			     &work[j * work_dim1 + 1], &c__1);
-/* L220: */
-		}
-
-/*              W := W * V2' */
-
-		dtrmm_("Right", "Lower", "Transpose", "Unit", &lastc, k, &
-			c_b14, &v[(lastv - *k + 1) * v_dim1 + 1], ldv, &work[
-			work_offset], ldwork);
-		if (lastv > *k) {
-
-/*                 W := W + C1 * V1' */
-
-		    i__1 = lastv - *k;
-		    dgemm_("No transpose", "Transpose", &lastc, k, &i__1, &
-			    c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, &
-			    c_b14, &work[work_offset], ldwork);
-		}
-
-/*              W := W * T  or  W * T' */
-
-		dtrmm_("Right", "Lower", trans, "Non-unit", &lastc, k, &c_b14, 
-			 &t[t_offset], ldt, &work[work_offset], ldwork);
-
-/*              C := C - W * V */
-
-		if (lastv > *k) {
-
-/*                 C1 := C1 - W * V1 */
-
-		    i__1 = lastv - *k;
-		    dgemm_("No transpose", "No transpose", &lastc, &i__1, k, &
-			    c_b25, &work[work_offset], ldwork, &v[v_offset], 
-			    ldv, &c_b14, &c__[c_offset], ldc);
-		}
-
-/*              W := W * V2 */
-
-		dtrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &
-			c_b14, &v[(lastv - *k + 1) * v_dim1 + 1], ldv, &work[
-			work_offset], ldwork);
-
-/*              C1 := C1 - W */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			c__[i__ + (lastv - *k + j) * c_dim1] -= work[i__ + j *
-				 work_dim1];
-/* L230: */
-		    }
-/* L240: */
-		}
-
-	    }
-
-	}
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            c__[i__ + (lastv - *k + j) * c_dim1] -= work[i__ + j * work_dim1];
+            /* L230: */
+          }
+          /* L240: */
+        }
+      }
     }
+  }
 
-    return 0;
-
-/*     End of DLARFB */
+  /*     End of DLARFB */
 
 } /* dlarfb_ */
diff --git a/lapack/dlarfg.c b/lapack/dlarfg.c
index 2a052ca..be321f9 100644
--- a/lapack/dlarfg.c
+++ b/lapack/dlarfg.c
@@ -1,170 +1,164 @@
 /* dlarfg.f -- translated by f2c (version 20061008).
    You must link the resulting object file with libf2c:
-	on Microsoft Windows system, link with libf2c.lib;
-	on Linux or Unix systems, link with .../path/to/libf2c.a -lm
-	or, if you install libf2c.a in a standard place, with -lf2c -lm
-	-- in that order, at the end of the command line, as in
-		cc *.o -lf2c -lm
-	Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
+        on Microsoft Windows system, link with libf2c.lib;
+        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
+        or, if you install libf2c.a in a standard place, with -lf2c -lm
+        -- in that order, at the end of the command line, as in
+                cc *.o -lf2c -lm
+        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
 
-		http://www.netlib.org/f2c/libf2c.zip
+                http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
-/* Subroutine */ int dlarfg_(integer *n, doublereal *alpha, doublereal *x, 
-	integer *incx, doublereal *tau)
-{
-    /* System generated locals */
-    integer i__1;
-    doublereal d__1;
+static inline doublereal d_sign(doublereal *a, doublereal *b) {
+  doublereal x;
+  x = (*a >= 0 ? *a : -*a);
+  return (*b >= 0 ? x : -x);
+}
 
-    /* Builtin functions */
-    double d_sign(doublereal *, doublereal *);
+/* Subroutine */ void dlarfg_(integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *tau) {
+  /* System generated locals */
+  integer i__1;
+  doublereal d__1;
 
-    /* Local variables */
-    integer j, knt;
-    doublereal beta;
-    extern doublereal dnrm2_(integer *, doublereal *, integer *);
-    extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, 
-	    integer *);
-    doublereal xnorm;
-    extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *);
-    doublereal safmin, rsafmn;
+  /* Local variables */
+  integer j, knt;
+  doublereal beta;
+  extern doublereal dnrm2_(integer *, doublereal *, integer *);
+  extern /* Subroutine */ void dscal_(integer *, doublereal *, doublereal *, integer *);
+  doublereal xnorm;
+  extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *);
+  doublereal safmin, rsafmn;
 
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*     .. Scalar Arguments .. */
+  /*     .. */
+  /*     .. Array Arguments .. */
+  /*     .. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
-/*     .. Array Arguments .. */
-/*     .. */
+  /*  Purpose */
+  /*  ======= */
 
-/*  Purpose */
-/*  ======= */
+  /*  DLARFG generates a real elementary reflector H of order n, such */
+  /*  that */
 
-/*  DLARFG generates a real elementary reflector H of order n, such */
-/*  that */
+  /*        H * ( alpha ) = ( beta ),   H' * H = I. */
+  /*            (   x   )   (   0  ) */
 
-/*        H * ( alpha ) = ( beta ),   H' * H = I. */
-/*            (   x   )   (   0  ) */
+  /*  where alpha and beta are scalars, and x is an (n-1)-element real */
+  /*  vector. H is represented in the form */
 
-/*  where alpha and beta are scalars, and x is an (n-1)-element real */
-/*  vector. H is represented in the form */
+  /*        H = I - tau * ( 1 ) * ( 1 v' ) , */
+  /*                      ( v ) */
 
-/*        H = I - tau * ( 1 ) * ( 1 v' ) , */
-/*                      ( v ) */
+  /*  where tau is a real scalar and v is a real (n-1)-element */
+  /*  vector. */
 
-/*  where tau is a real scalar and v is a real (n-1)-element */
-/*  vector. */
+  /*  If the elements of x are all zero, then tau = 0 and H is taken to be */
+  /*  the unit matrix. */
 
-/*  If the elements of x are all zero, then tau = 0 and H is taken to be */
-/*  the unit matrix. */
+  /*  Otherwise  1 <= tau <= 2. */
 
-/*  Otherwise  1 <= tau <= 2. */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Arguments */
-/*  ========= */
+  /*  N       (input) INTEGER */
+  /*          The order of the elementary reflector. */
 
-/*  N       (input) INTEGER */
-/*          The order of the elementary reflector. */
+  /*  ALPHA   (input/output) DOUBLE PRECISION */
+  /*          On entry, the value alpha. */
+  /*          On exit, it is overwritten with the value beta. */
 
-/*  ALPHA   (input/output) DOUBLE PRECISION */
-/*          On entry, the value alpha. */
-/*          On exit, it is overwritten with the value beta. */
+  /*  X       (input/output) DOUBLE PRECISION array, dimension */
+  /*                         (1+(N-2)*abs(INCX)) */
+  /*          On entry, the vector x. */
+  /*          On exit, it is overwritten with the vector v. */
 
-/*  X       (input/output) DOUBLE PRECISION array, dimension */
-/*                         (1+(N-2)*abs(INCX)) */
-/*          On entry, the vector x. */
-/*          On exit, it is overwritten with the vector v. */
+  /*  INCX    (input) INTEGER */
+  /*          The increment between elements of X. INCX > 0. */
 
-/*  INCX    (input) INTEGER */
-/*          The increment between elements of X. INCX > 0. */
+  /*  TAU     (output) DOUBLE PRECISION */
+  /*          The value tau. */
 
-/*  TAU     (output) DOUBLE PRECISION */
-/*          The value tau. */
+  /*  ===================================================================== */
 
-/*  ===================================================================== */
+  /*     .. Parameters .. */
+  /*     .. */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. Intrinsic Functions .. */
+  /*     .. */
+  /*     .. External Subroutines .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*     .. Parameters .. */
-/*     .. */
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. Intrinsic Functions .. */
-/*     .. */
-/*     .. External Subroutines .. */
-/*     .. */
-/*     .. Executable Statements .. */
+  /* Parameter adjustments */
+  --x;
 
-    /* Parameter adjustments */
-    --x;
+  /* Function Body */
+  if (*n <= 1) {
+    *tau = 0.;
+    return;
+  }
 
-    /* Function Body */
-    if (*n <= 1) {
-	*tau = 0.;
-	return 0;
+  i__1 = *n - 1;
+  xnorm = dnrm2_(&i__1, &x[1], incx);
+
+  if (xnorm == 0.) {
+    /*        H  =  I */
+
+    *tau = 0.;
+  } else {
+    /*        general case */
+
+    d__1 = dlapy2_(alpha, &xnorm);
+    beta = -d_sign(&d__1, alpha);
+    safmin = dlamch_("S") / dlamch_("E");
+    knt = 0;
+    if (abs(beta) < safmin) {
+      /*           XNORM, BETA may be inaccurate; scale X and recompute them */
+
+      rsafmn = 1. / safmin;
+    L10:
+      ++knt;
+      i__1 = *n - 1;
+      dscal_(&i__1, &rsafmn, &x[1], incx);
+      beta *= rsafmn;
+      *alpha *= rsafmn;
+      if (abs(beta) < safmin) {
+        goto L10;
+      }
+
+      /*           New BETA is at most 1, at least SAFMIN */
+
+      i__1 = *n - 1;
+      xnorm = dnrm2_(&i__1, &x[1], incx);
+      d__1 = dlapy2_(alpha, &xnorm);
+      beta = -d_sign(&d__1, alpha);
     }
-
+    *tau = (beta - *alpha) / beta;
     i__1 = *n - 1;
-    xnorm = dnrm2_(&i__1, &x[1], incx);
+    d__1 = 1. / (*alpha - beta);
+    dscal_(&i__1, &d__1, &x[1], incx);
 
-    if (xnorm == 0.) {
+    /*        If ALPHA is subnormal, it may lose relative accuracy */
 
-/*        H  =  I */
-
-	*tau = 0.;
-    } else {
-
-/*        general case */
-
-	d__1 = dlapy2_(alpha, &xnorm);
-	beta = -d_sign(&d__1, alpha);
-	safmin = dlamch_("S") / dlamch_("E");
-	knt = 0;
-	if (abs(beta) < safmin) {
-
-/*           XNORM, BETA may be inaccurate; scale X and recompute them */
-
-	    rsafmn = 1. / safmin;
-L10:
-	    ++knt;
-	    i__1 = *n - 1;
-	    dscal_(&i__1, &rsafmn, &x[1], incx);
-	    beta *= rsafmn;
-	    *alpha *= rsafmn;
-	    if (abs(beta) < safmin) {
-		goto L10;
-	    }
-
-/*           New BETA is at most 1, at least SAFMIN */
-
-	    i__1 = *n - 1;
-	    xnorm = dnrm2_(&i__1, &x[1], incx);
-	    d__1 = dlapy2_(alpha, &xnorm);
-	    beta = -d_sign(&d__1, alpha);
-	}
-	*tau = (beta - *alpha) / beta;
-	i__1 = *n - 1;
-	d__1 = 1. / (*alpha - beta);
-	dscal_(&i__1, &d__1, &x[1], incx);
-
-/*        If ALPHA is subnormal, it may lose relative accuracy */
-
-	i__1 = knt;
-	for (j = 1; j <= i__1; ++j) {
-	    beta *= safmin;
-/* L20: */
-	}
-	*alpha = beta;
+    i__1 = knt;
+    for (j = 1; j <= i__1; ++j) {
+      beta *= safmin;
+      /* L20: */
     }
+    *alpha = beta;
+  }
 
-    return 0;
-
-/*     End of DLARFG */
+  /*     End of DLARFG */
 
 } /* dlarfg_ */
diff --git a/lapack/dlarft.c b/lapack/dlarft.c
index 0d4951c..46f36f9 100644
--- a/lapack/dlarft.c
+++ b/lapack/dlarft.c
@@ -1,325 +1,309 @@
 /* dlarft.f -- translated by f2c (version 20061008).
    You must link the resulting object file with libf2c:
-	on Microsoft Windows system, link with libf2c.lib;
-	on Linux or Unix systems, link with .../path/to/libf2c.a -lm
-	or, if you install libf2c.a in a standard place, with -lf2c -lm
-	-- in that order, at the end of the command line, as in
-		cc *.o -lf2c -lm
-	Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
+        on Microsoft Windows system, link with libf2c.lib;
+        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
+        or, if you install libf2c.a in a standard place, with -lf2c -lm
+        -- in that order, at the end of the command line, as in
+                cc *.o -lf2c -lm
+        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
 
-		http://www.netlib.org/f2c/libf2c.zip
+                http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
 /* Table of constant values */
 
 static integer c__1 = 1;
 static doublereal c_b8 = 0.;
 
-/* Subroutine */ int dlarft_(char *direct, char *storev, integer *n, integer *
-	k, doublereal *v, integer *ldv, doublereal *tau, doublereal *t, 
-	integer *ldt)
-{
-    /* System generated locals */
-    integer t_dim1, t_offset, v_dim1, v_offset, i__1, i__2, i__3;
-    doublereal d__1;
+/* Subroutine */ void dlarft_(char *direct, char *storev, integer *n, integer *k, doublereal *v, integer *ldv,
+                              doublereal *tau, doublereal *t, integer *ldt) {
+  /* System generated locals */
+  integer t_dim1, t_offset, v_dim1, v_offset, i__1, i__2, i__3;
+  doublereal d__1;
 
-    /* Local variables */
-    integer i__, j, prevlastv;
-    doublereal vii;
-    extern logical lsame_(char *, char *);
-    extern /* Subroutine */ int dgemv_(char *, integer *, integer *, 
-	    doublereal *, doublereal *, integer *, doublereal *, integer *, 
-	    doublereal *, doublereal *, integer *);
-    integer lastv;
-    extern /* Subroutine */ int dtrmv_(char *, char *, char *, integer *, 
-	    doublereal *, integer *, doublereal *, integer *);
+  /* Local variables */
+  integer i__, j, prevlastv;
+  doublereal vii;
+  extern logical lsame_(char *, char *);
+  extern /* Subroutine */ void dgemv_(const char *, const integer *, const integer *, const doublereal *,
+                                      const doublereal *, const integer *, const doublereal *, const integer *,
+                                      const doublereal *, doublereal *, const integer *);
+  integer lastv;
+  extern /* Subroutine */ void dtrmv_(const char *, const char *, const char *, const integer *, const doublereal *,
+                                      const integer *, doublereal *, const integer *);
 
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*     .. Scalar Arguments .. */
+  /*     .. */
+  /*     .. Array Arguments .. */
+  /*     .. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
-/*     .. Array Arguments .. */
-/*     .. */
+  /*  Purpose */
+  /*  ======= */
 
-/*  Purpose */
-/*  ======= */
+  /*  DLARFT forms the triangular factor T of a real block reflector H */
+  /*  of order n, which is defined as a product of k elementary reflectors. */
 
-/*  DLARFT forms the triangular factor T of a real block reflector H */
-/*  of order n, which is defined as a product of k elementary reflectors. */
+  /*  If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; */
 
-/*  If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; */
+  /*  If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. */
 
-/*  If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. */
+  /*  If STOREV = 'C', the vector which defines the elementary reflector */
+  /*  H(i) is stored in the i-th column of the array V, and */
 
-/*  If STOREV = 'C', the vector which defines the elementary reflector */
-/*  H(i) is stored in the i-th column of the array V, and */
+  /*     H  =  I - V * T * V' */
 
-/*     H  =  I - V * T * V' */
+  /*  If STOREV = 'R', the vector which defines the elementary reflector */
+  /*  H(i) is stored in the i-th row of the array V, and */
 
-/*  If STOREV = 'R', the vector which defines the elementary reflector */
-/*  H(i) is stored in the i-th row of the array V, and */
+  /*     H  =  I - V' * T * V */
 
-/*     H  =  I - V' * T * V */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Arguments */
-/*  ========= */
+  /*  DIRECT  (input) CHARACTER*1 */
+  /*          Specifies the order in which the elementary reflectors are */
+  /*          multiplied to form the block reflector: */
+  /*          = 'F': H = H(1) H(2) . . . H(k) (Forward) */
+  /*          = 'B': H = H(k) . . . H(2) H(1) (Backward) */
 
-/*  DIRECT  (input) CHARACTER*1 */
-/*          Specifies the order in which the elementary reflectors are */
-/*          multiplied to form the block reflector: */
-/*          = 'F': H = H(1) H(2) . . . H(k) (Forward) */
-/*          = 'B': H = H(k) . . . H(2) H(1) (Backward) */
+  /*  STOREV  (input) CHARACTER*1 */
+  /*          Specifies how the vectors which define the elementary */
+  /*          reflectors are stored (see also Further Details): */
+  /*          = 'C': columnwise */
+  /*          = 'R': rowwise */
 
-/*  STOREV  (input) CHARACTER*1 */
-/*          Specifies how the vectors which define the elementary */
-/*          reflectors are stored (see also Further Details): */
-/*          = 'C': columnwise */
-/*          = 'R': rowwise */
+  /*  N       (input) INTEGER */
+  /*          The order of the block reflector H. N >= 0. */
 
-/*  N       (input) INTEGER */
-/*          The order of the block reflector H. N >= 0. */
+  /*  K       (input) INTEGER */
+  /*          The order of the triangular factor T (= the number of */
+  /*          elementary reflectors). K >= 1. */
 
-/*  K       (input) INTEGER */
-/*          The order of the triangular factor T (= the number of */
-/*          elementary reflectors). K >= 1. */
+  /*  V       (input/output) DOUBLE PRECISION array, dimension */
+  /*                               (LDV,K) if STOREV = 'C' */
+  /*                               (LDV,N) if STOREV = 'R' */
+  /*          The matrix V. See further details. */
 
-/*  V       (input/output) DOUBLE PRECISION array, dimension */
-/*                               (LDV,K) if STOREV = 'C' */
-/*                               (LDV,N) if STOREV = 'R' */
-/*          The matrix V. See further details. */
+  /*  LDV     (input) INTEGER */
+  /*          The leading dimension of the array V. */
+  /*          If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. */
 
-/*  LDV     (input) INTEGER */
-/*          The leading dimension of the array V. */
-/*          If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. */
+  /*  TAU     (input) DOUBLE PRECISION array, dimension (K) */
+  /*          TAU(i) must contain the scalar factor of the elementary */
+  /*          reflector H(i). */
 
-/*  TAU     (input) DOUBLE PRECISION array, dimension (K) */
-/*          TAU(i) must contain the scalar factor of the elementary */
-/*          reflector H(i). */
+  /*  T       (output) DOUBLE PRECISION array, dimension (LDT,K) */
+  /*          The k by k triangular factor T of the block reflector. */
+  /*          If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is */
+  /*          lower triangular. The rest of the array is not used. */
 
-/*  T       (output) DOUBLE PRECISION array, dimension (LDT,K) */
-/*          The k by k triangular factor T of the block reflector. */
-/*          If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is */
-/*          lower triangular. The rest of the array is not used. */
+  /*  LDT     (input) INTEGER */
+  /*          The leading dimension of the array T. LDT >= K. */
 
-/*  LDT     (input) INTEGER */
-/*          The leading dimension of the array T. LDT >= K. */
+  /*  Further Details */
+  /*  =============== */
 
-/*  Further Details */
-/*  =============== */
+  /*  The shape of the matrix V and the storage of the vectors which define */
+  /*  the H(i) is best illustrated by the following example with n = 5 and */
+  /*  k = 3. The elements equal to 1 are not stored; the corresponding */
+  /*  array elements are modified but restored on exit. The rest of the */
+  /*  array is not used. */
 
-/*  The shape of the matrix V and the storage of the vectors which define */
-/*  the H(i) is best illustrated by the following example with n = 5 and */
-/*  k = 3. The elements equal to 1 are not stored; the corresponding */
-/*  array elements are modified but restored on exit. The rest of the */
-/*  array is not used. */
+  /*  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R': */
 
-/*  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R': */
+  /*               V = (  1       )                 V = (  1 v1 v1 v1 v1 ) */
+  /*                   ( v1  1    )                     (     1 v2 v2 v2 ) */
+  /*                   ( v1 v2  1 )                     (        1 v3 v3 ) */
+  /*                   ( v1 v2 v3 ) */
+  /*                   ( v1 v2 v3 ) */
 
-/*               V = (  1       )                 V = (  1 v1 v1 v1 v1 ) */
-/*                   ( v1  1    )                     (     1 v2 v2 v2 ) */
-/*                   ( v1 v2  1 )                     (        1 v3 v3 ) */
-/*                   ( v1 v2 v3 ) */
-/*                   ( v1 v2 v3 ) */
+  /*  DIRECT = 'B' and STOREV = 'C':         DIRECT = 'B' and STOREV = 'R': */
 
-/*  DIRECT = 'B' and STOREV = 'C':         DIRECT = 'B' and STOREV = 'R': */
+  /*               V = ( v1 v2 v3 )                 V = ( v1 v1  1       ) */
+  /*                   ( v1 v2 v3 )                     ( v2 v2 v2  1    ) */
+  /*                   (  1 v2 v3 )                     ( v3 v3 v3 v3  1 ) */
+  /*                   (     1 v3 ) */
+  /*                   (        1 ) */
 
-/*               V = ( v1 v2 v3 )                 V = ( v1 v1  1       ) */
-/*                   ( v1 v2 v3 )                     ( v2 v2 v2  1    ) */
-/*                   (  1 v2 v3 )                     ( v3 v3 v3 v3  1 ) */
-/*                   (     1 v3 ) */
-/*                   (        1 ) */
+  /*  ===================================================================== */
 
-/*  ===================================================================== */
+  /*     .. Parameters .. */
+  /*     .. */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Subroutines .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*     .. Parameters .. */
-/*     .. */
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Subroutines .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. Executable Statements .. */
+  /*     Quick return if possible */
 
-/*     Quick return if possible */
+  /* Parameter adjustments */
+  v_dim1 = *ldv;
+  v_offset = 1 + v_dim1;
+  v -= v_offset;
+  --tau;
+  t_dim1 = *ldt;
+  t_offset = 1 + t_dim1;
+  t -= t_offset;
 
-    /* Parameter adjustments */
-    v_dim1 = *ldv;
-    v_offset = 1 + v_dim1;
-    v -= v_offset;
-    --tau;
-    t_dim1 = *ldt;
-    t_offset = 1 + t_dim1;
-    t -= t_offset;
+  /* Function Body */
+  if (*n == 0) {
+    return;
+  }
 
-    /* Function Body */
-    if (*n == 0) {
-	return 0;
+  if (lsame_(direct, "F")) {
+    prevlastv = *n;
+    i__1 = *k;
+    for (i__ = 1; i__ <= i__1; ++i__) {
+      prevlastv = max(i__, prevlastv);
+      if (tau[i__] == 0.) {
+        /*              H(i)  =  I */
+
+        i__2 = i__;
+        for (j = 1; j <= i__2; ++j) {
+          t[j + i__ * t_dim1] = 0.;
+          /* L10: */
+        }
+      } else {
+        /*              general case */
+
+        vii = v[i__ + i__ * v_dim1];
+        v[i__ + i__ * v_dim1] = 1.;
+        if (lsame_(storev, "C")) {
+          /*                 Skip any trailing zeros. */
+          i__2 = i__ + 1;
+          for (lastv = *n; lastv >= i__2; --lastv) {
+            if (v[lastv + i__ * v_dim1] != 0.) {
+              break;
+            }
+          }
+          j = min(lastv, prevlastv);
+
+          /*                 T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)' * V(i:j,i) */
+
+          i__2 = j - i__ + 1;
+          i__3 = i__ - 1;
+          d__1 = -tau[i__];
+          dgemv_("Transpose", &i__2, &i__3, &d__1, &v[i__ + v_dim1], ldv, &v[i__ + i__ * v_dim1], &c__1, &c_b8,
+                 &t[i__ * t_dim1 + 1], &c__1);
+        } else {
+          /*                 Skip any trailing zeros. */
+          i__2 = i__ + 1;
+          for (lastv = *n; lastv >= i__2; --lastv) {
+            if (v[i__ + lastv * v_dim1] != 0.) {
+              break;
+            }
+          }
+          j = min(lastv, prevlastv);
+
+          /*                 T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)' */
+
+          i__2 = i__ - 1;
+          i__3 = j - i__ + 1;
+          d__1 = -tau[i__];
+          dgemv_("No transpose", &i__2, &i__3, &d__1, &v[i__ * v_dim1 + 1], ldv, &v[i__ + i__ * v_dim1], ldv, &c_b8,
+                 &t[i__ * t_dim1 + 1], &c__1);
+        }
+        v[i__ + i__ * v_dim1] = vii;
+
+        /*              T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) */
+
+        i__2 = i__ - 1;
+        dtrmv_("Upper", "No transpose", "Non-unit", &i__2, &t[t_offset], ldt, &t[i__ * t_dim1 + 1], &c__1);
+        t[i__ + i__ * t_dim1] = tau[i__];
+        if (i__ > 1) {
+          prevlastv = max(prevlastv, lastv);
+        } else {
+          prevlastv = lastv;
+        }
+      }
+      /* L20: */
     }
+  } else {
+    prevlastv = 1;
+    for (i__ = *k; i__ >= 1; --i__) {
+      if (tau[i__] == 0.) {
+        /*              H(i)  =  I */
 
-    if (lsame_(direct, "F")) {
-	prevlastv = *n;
-	i__1 = *k;
-	for (i__ = 1; i__ <= i__1; ++i__) {
-	    prevlastv = max(i__,prevlastv);
-	    if (tau[i__] == 0.) {
+        i__1 = *k;
+        for (j = i__; j <= i__1; ++j) {
+          t[j + i__ * t_dim1] = 0.;
+          /* L30: */
+        }
+      } else {
+        /*              general case */
 
-/*              H(i)  =  I */
+        if (i__ < *k) {
+          if (lsame_(storev, "C")) {
+            vii = v[*n - *k + i__ + i__ * v_dim1];
+            v[*n - *k + i__ + i__ * v_dim1] = 1.;
+            /*                    Skip any leading zeros. */
+            i__1 = i__ - 1;
+            for (lastv = 1; lastv <= i__1; ++lastv) {
+              if (v[lastv + i__ * v_dim1] != 0.) {
+                break;
+              }
+            }
+            j = max(lastv, prevlastv);
 
-		i__2 = i__;
-		for (j = 1; j <= i__2; ++j) {
-		    t[j + i__ * t_dim1] = 0.;
-/* L10: */
-		}
-	    } else {
+            /*                    T(i+1:k,i) := */
+            /*                            - tau(i) * V(j:n-k+i,i+1:k)' * V(j:n-k+i,i) */
 
-/*              general case */
+            i__1 = *n - *k + i__ - j + 1;
+            i__2 = *k - i__;
+            d__1 = -tau[i__];
+            dgemv_("Transpose", &i__1, &i__2, &d__1, &v[j + (i__ + 1) * v_dim1], ldv, &v[j + i__ * v_dim1], &c__1,
+                   &c_b8, &t[i__ + 1 + i__ * t_dim1], &c__1);
+            v[*n - *k + i__ + i__ * v_dim1] = vii;
+          } else {
+            vii = v[i__ + (*n - *k + i__) * v_dim1];
+            v[i__ + (*n - *k + i__) * v_dim1] = 1.;
+            /*                    Skip any leading zeros. */
+            i__1 = i__ - 1;
+            for (lastv = 1; lastv <= i__1; ++lastv) {
+              if (v[i__ + lastv * v_dim1] != 0.) {
+                break;
+              }
+            }
+            j = max(lastv, prevlastv);
 
-		vii = v[i__ + i__ * v_dim1];
-		v[i__ + i__ * v_dim1] = 1.;
-		if (lsame_(storev, "C")) {
-/*                 Skip any trailing zeros. */
-		    i__2 = i__ + 1;
-		    for (lastv = *n; lastv >= i__2; --lastv) {
-			if (v[lastv + i__ * v_dim1] != 0.) {
-			    break;
-			}
-		    }
-		    j = min(lastv,prevlastv);
+            /*                    T(i+1:k,i) := */
+            /*                            - tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)' */
 
-/*                 T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)' * V(i:j,i) */
+            i__1 = *k - i__;
+            i__2 = *n - *k + i__ - j + 1;
+            d__1 = -tau[i__];
+            dgemv_("No transpose", &i__1, &i__2, &d__1, &v[i__ + 1 + j * v_dim1], ldv, &v[i__ + j * v_dim1], ldv, &c_b8,
+                   &t[i__ + 1 + i__ * t_dim1], &c__1);
+            v[i__ + (*n - *k + i__) * v_dim1] = vii;
+          }
 
-		    i__2 = j - i__ + 1;
-		    i__3 = i__ - 1;
-		    d__1 = -tau[i__];
-		    dgemv_("Transpose", &i__2, &i__3, &d__1, &v[i__ + v_dim1], 
-			     ldv, &v[i__ + i__ * v_dim1], &c__1, &c_b8, &t[
-			    i__ * t_dim1 + 1], &c__1);
-		} else {
-/*                 Skip any trailing zeros. */
-		    i__2 = i__ + 1;
-		    for (lastv = *n; lastv >= i__2; --lastv) {
-			if (v[i__ + lastv * v_dim1] != 0.) {
-			    break;
-			}
-		    }
-		    j = min(lastv,prevlastv);
+          /*                 T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) */
 
-/*                 T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)' */
-
-		    i__2 = i__ - 1;
-		    i__3 = j - i__ + 1;
-		    d__1 = -tau[i__];
-		    dgemv_("No transpose", &i__2, &i__3, &d__1, &v[i__ * 
-			    v_dim1 + 1], ldv, &v[i__ + i__ * v_dim1], ldv, &
-			    c_b8, &t[i__ * t_dim1 + 1], &c__1);
-		}
-		v[i__ + i__ * v_dim1] = vii;
-
-/*              T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) */
-
-		i__2 = i__ - 1;
-		dtrmv_("Upper", "No transpose", "Non-unit", &i__2, &t[
-			t_offset], ldt, &t[i__ * t_dim1 + 1], &c__1);
-		t[i__ + i__ * t_dim1] = tau[i__];
-		if (i__ > 1) {
-		    prevlastv = max(prevlastv,lastv);
-		} else {
-		    prevlastv = lastv;
-		}
-	    }
-/* L20: */
-	}
-    } else {
-	prevlastv = 1;
-	for (i__ = *k; i__ >= 1; --i__) {
-	    if (tau[i__] == 0.) {
-
-/*              H(i)  =  I */
-
-		i__1 = *k;
-		for (j = i__; j <= i__1; ++j) {
-		    t[j + i__ * t_dim1] = 0.;
-/* L30: */
-		}
-	    } else {
-
-/*              general case */
-
-		if (i__ < *k) {
-		    if (lsame_(storev, "C")) {
-			vii = v[*n - *k + i__ + i__ * v_dim1];
-			v[*n - *k + i__ + i__ * v_dim1] = 1.;
-/*                    Skip any leading zeros. */
-			i__1 = i__ - 1;
-			for (lastv = 1; lastv <= i__1; ++lastv) {
-			    if (v[lastv + i__ * v_dim1] != 0.) {
-				break;
-			    }
-			}
-			j = max(lastv,prevlastv);
-
-/*                    T(i+1:k,i) := */
-/*                            - tau(i) * V(j:n-k+i,i+1:k)' * V(j:n-k+i,i) */
-
-			i__1 = *n - *k + i__ - j + 1;
-			i__2 = *k - i__;
-			d__1 = -tau[i__];
-			dgemv_("Transpose", &i__1, &i__2, &d__1, &v[j + (i__ 
-				+ 1) * v_dim1], ldv, &v[j + i__ * v_dim1], &
-				c__1, &c_b8, &t[i__ + 1 + i__ * t_dim1], &
-				c__1);
-			v[*n - *k + i__ + i__ * v_dim1] = vii;
-		    } else {
-			vii = v[i__ + (*n - *k + i__) * v_dim1];
-			v[i__ + (*n - *k + i__) * v_dim1] = 1.;
-/*                    Skip any leading zeros. */
-			i__1 = i__ - 1;
-			for (lastv = 1; lastv <= i__1; ++lastv) {
-			    if (v[i__ + lastv * v_dim1] != 0.) {
-				break;
-			    }
-			}
-			j = max(lastv,prevlastv);
-
-/*                    T(i+1:k,i) := */
-/*                            - tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)' */
-
-			i__1 = *k - i__;
-			i__2 = *n - *k + i__ - j + 1;
-			d__1 = -tau[i__];
-			dgemv_("No transpose", &i__1, &i__2, &d__1, &v[i__ + 
-				1 + j * v_dim1], ldv, &v[i__ + j * v_dim1], 
-				ldv, &c_b8, &t[i__ + 1 + i__ * t_dim1], &c__1);
-			v[i__ + (*n - *k + i__) * v_dim1] = vii;
-		    }
-
-/*                 T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) */
-
-		    i__1 = *k - i__;
-		    dtrmv_("Lower", "No transpose", "Non-unit", &i__1, &t[i__ 
-			    + 1 + (i__ + 1) * t_dim1], ldt, &t[i__ + 1 + i__ *
-			     t_dim1], &c__1)
-			    ;
-		    if (i__ > 1) {
-			prevlastv = min(prevlastv,lastv);
-		    } else {
-			prevlastv = lastv;
-		    }
-		}
-		t[i__ + i__ * t_dim1] = tau[i__];
-	    }
-/* L40: */
-	}
+          i__1 = *k - i__;
+          dtrmv_("Lower", "No transpose", "Non-unit", &i__1, &t[i__ + 1 + (i__ + 1) * t_dim1], ldt,
+                 &t[i__ + 1 + i__ * t_dim1], &c__1);
+          if (i__ > 1) {
+            prevlastv = min(prevlastv, lastv);
+          } else {
+            prevlastv = lastv;
+          }
+        }
+        t[i__ + i__ * t_dim1] = tau[i__];
+      }
+      /* L40: */
     }
-    return 0;
+  }
 
-/*     End of DLARFT */
+  /*     End of DLARFT */
 
 } /* dlarft_ */
diff --git a/lapack/ilaclc.c b/lapack/ilaclc.c
index 98a0519..d5f4518 100644
--- a/lapack/ilaclc.c
+++ b/lapack/ilaclc.c
@@ -10,8 +10,8 @@
 		http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
 integer ilaclc_(integer *m, integer *n, complex *a, integer *lda)
 {
diff --git a/lapack/ilaclr.c b/lapack/ilaclr.c
index b28e22e..fe768c0 100644
--- a/lapack/ilaclr.c
+++ b/lapack/ilaclr.c
@@ -10,8 +10,8 @@
 		http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
 integer ilaclr_(integer *m, integer *n, complex *a, integer *lda)
 {
diff --git a/lapack/iladlc.c b/lapack/iladlc.c
index a18f02e..8af8292 100644
--- a/lapack/iladlc.c
+++ b/lapack/iladlc.c
@@ -10,8 +10,8 @@
 		http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
 integer iladlc_(integer *m, integer *n, doublereal *a, integer *lda)
 {
diff --git a/lapack/iladlr.c b/lapack/iladlr.c
index f1626e4..9e074d8 100644
--- a/lapack/iladlr.c
+++ b/lapack/iladlr.c
@@ -10,8 +10,8 @@
 		http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
 integer iladlr_(integer *m, integer *n, doublereal *a, integer *lda)
 {
diff --git a/lapack/ilaslc.c b/lapack/ilaslc.c
index c877084..cbcfe17 100644
--- a/lapack/ilaslc.c
+++ b/lapack/ilaslc.c
@@ -10,8 +10,8 @@
 		http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
 integer ilaslc_(integer *m, integer *n, real *a, integer *lda)
 {
diff --git a/lapack/ilaslr.c b/lapack/ilaslr.c
index 0aaa4a0..4d9c7b6 100644
--- a/lapack/ilaslr.c
+++ b/lapack/ilaslr.c
@@ -10,8 +10,8 @@
 		http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
 integer ilaslr_(integer *m, integer *n, real *a, integer *lda)
 {
diff --git a/lapack/ilazlc.c b/lapack/ilazlc.c
index 2b20f40..4691646 100644
--- a/lapack/ilazlc.c
+++ b/lapack/ilazlc.c
@@ -10,8 +10,8 @@
 		http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
 integer ilazlc_(integer *m, integer *n, doublecomplex *a, integer *lda)
 {
diff --git a/lapack/ilazlr.c b/lapack/ilazlr.c
index 373d077..553b166 100644
--- a/lapack/ilazlr.c
+++ b/lapack/ilazlr.c
@@ -10,8 +10,8 @@
 		http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
 integer ilazlr_(integer *m, integer *n, doublecomplex *a, integer *lda)
 {
diff --git a/lapack/lapack_datatypes.h b/lapack/lapack_datatypes.h
new file mode 100644
index 0000000..01818a5
--- /dev/null
+++ b/lapack/lapack_datatypes.h
@@ -0,0 +1,9 @@
+#ifndef EIGEN_LAPACK_DATATYPES_H_
+#define EIGEN_LAPACK_DATATYPES_H_
+
+#include "../blas/f2c/datatypes.h"
+
+#define TRUE_ (logical)1
+#define FALSE_ (logical)0
+
+#endif  // EIGEN_LAPACK_DATATYPES_H_
\ No newline at end of file
diff --git a/lapack/sladiv.c b/lapack/sladiv.c
index af4e0c5..629992d 100644
--- a/lapack/sladiv.c
+++ b/lapack/sladiv.c
@@ -1,78 +1,73 @@
 /* sladiv.f -- translated by f2c (version 20061008).
    You must link the resulting object file with libf2c:
-	on Microsoft Windows system, link with libf2c.lib;
-	on Linux or Unix systems, link with .../path/to/libf2c.a -lm
-	or, if you install libf2c.a in a standard place, with -lf2c -lm
-	-- in that order, at the end of the command line, as in
-		cc *.o -lf2c -lm
-	Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
+        on Microsoft Windows system, link with libf2c.lib;
+        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
+        or, if you install libf2c.a in a standard place, with -lf2c -lm
+        -- in that order, at the end of the command line, as in
+                cc *.o -lf2c -lm
+        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
 
-		http://www.netlib.org/f2c/libf2c.zip
+                http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
-/* Subroutine */ int sladiv_(real *a, real *b, real *c__, real *d__, real *p, 
-	real *q)
-{
-    real e, f;
+/* Subroutine */ void sladiv_(real *a, real *b, real *c__, real *d__, real *p, real *q) {
+  real e, f;
 
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*     .. Scalar Arguments .. */
+  /*     .. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
+  /*  Purpose */
+  /*  ======= */
 
-/*  Purpose */
-/*  ======= */
+  /*  SLADIV performs complex division in  real arithmetic */
 
-/*  SLADIV performs complex division in  real arithmetic */
+  /*                        a + i*b */
+  /*             p + i*q = --------- */
+  /*                        c + i*d */
 
-/*                        a + i*b */
-/*             p + i*q = --------- */
-/*                        c + i*d */
+  /*  The algorithm is due to Robert L. Smith and can be found */
+  /*  in D. Knuth, The art of Computer Programming, Vol.2, p.195 */
 
-/*  The algorithm is due to Robert L. Smith and can be found */
-/*  in D. Knuth, The art of Computer Programming, Vol.2, p.195 */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Arguments */
-/*  ========= */
+  /*  A       (input) REAL */
+  /*  B       (input) REAL */
+  /*  C       (input) REAL */
+  /*  D       (input) REAL */
+  /*          The scalars a, b, c, and d in the above expression. */
 
-/*  A       (input) REAL */
-/*  B       (input) REAL */
-/*  C       (input) REAL */
-/*  D       (input) REAL */
-/*          The scalars a, b, c, and d in the above expression. */
+  /*  P       (output) REAL */
+  /*  Q       (output) REAL */
+  /*          The scalars p and q in the above expression. */
 
-/*  P       (output) REAL */
-/*  Q       (output) REAL */
-/*          The scalars p and q in the above expression. */
+  /*  ===================================================================== */
 
-/*  ===================================================================== */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. Intrinsic Functions .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. Intrinsic Functions .. */
-/*     .. */
-/*     .. Executable Statements .. */
+  if (dabs(*d__) < dabs(*c__)) {
+    e = *d__ / *c__;
+    f = *c__ + *d__ * e;
+    *p = (*a + *b * e) / f;
+    *q = (*b - *a * e) / f;
+  } else {
+    e = *c__ / *d__;
+    f = *d__ + *c__ * e;
+    *p = (*b + *a * e) / f;
+    *q = (-(*a) + *b * e) / f;
+  }
 
-    if (dabs(*d__) < dabs(*c__)) {
-	e = *d__ / *c__;
-	f = *c__ + *d__ * e;
-	*p = (*a + *b * e) / f;
-	*q = (*b - *a * e) / f;
-    } else {
-	e = *c__ / *d__;
-	f = *d__ + *c__ * e;
-	*p = (*b + *a * e) / f;
-	*q = (-(*a) + *b * e) / f;
-    }
-
-    return 0;
-
-/*     End of SLADIV */
+  /*     End of SLADIV */
 
 } /* sladiv_ */
diff --git a/lapack/slamch.c b/lapack/slamch.c
index e57b5e5..7438dfe 100644
--- a/lapack/slamch.c
+++ b/lapack/slamch.c
@@ -1,1000 +1,991 @@
 /* slamch.f -- translated by f2c (version 20061008).
    You must link the resulting object file with libf2c:
-	on Microsoft Windows system, link with libf2c.lib;
-	on Linux or Unix systems, link with .../path/to/libf2c.a -lm
-	or, if you install libf2c.a in a standard place, with -lf2c -lm
-	-- in that order, at the end of the command line, as in
-		cc *.o -lf2c -lm
-	Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
+        on Microsoft Windows system, link with libf2c.lib;
+        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
+        or, if you install libf2c.a in a standard place, with -lf2c -lm
+        -- in that order, at the end of the command line, as in
+                cc *.o -lf2c -lm
+        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
 
-		http://www.netlib.org/f2c/libf2c.zip
+                http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
 /* Table of constant values */
 
-static integer c__1 = 1;
+/* static integer c__1 = 1; */
 static real c_b32 = 0.f;
 
-doublereal slamch_(char *cmach)
-{
-    /* Initialized data */
+static inline real pow_ri(real *ap, integer *bp) {
+  real pow, x;
+  integer n;
+  unsigned long u;
 
-    static logical first = TRUE_;
+  pow = 1;
+  x = *ap;
+  n = *bp;
 
-    /* System generated locals */
-    integer i__1;
-    real ret_val;
-
-    /* Builtin functions */
-    double pow_ri(real *, integer *);
-
-    /* Local variables */
-    static real t;
-    integer it;
-    static real rnd, eps, base;
-    integer beta;
-    static real emin, prec, emax;
-    integer imin, imax;
-    logical lrnd;
-    static real rmin, rmax;
-    real rmach = 0;
-    extern logical lsame_(char *, char *);
-    real small;
-    static real sfmin;
-    extern /* Subroutine */ int slamc2_(integer *, integer *, logical *, real 
-	    *, integer *, real *, integer *, real *);
-
-
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
-
-/*     .. Scalar Arguments .. */
-/*     .. */
-
-/*  Purpose */
-/*  ======= */
-
-/*  SLAMCH determines single precision machine parameters. */
-
-/*  Arguments */
-/*  ========= */
-
-/*  CMACH   (input) CHARACTER*1 */
-/*          Specifies the value to be returned by SLAMCH: */
-/*          = 'E' or 'e',   SLAMCH := eps */
-/*          = 'S' or 's ,   SLAMCH := sfmin */
-/*          = 'B' or 'b',   SLAMCH := base */
-/*          = 'P' or 'p',   SLAMCH := eps*base */
-/*          = 'N' or 'n',   SLAMCH := t */
-/*          = 'R' or 'r',   SLAMCH := rnd */
-/*          = 'M' or 'm',   SLAMCH := emin */
-/*          = 'U' or 'u',   SLAMCH := rmin */
-/*          = 'L' or 'l',   SLAMCH := emax */
-/*          = 'O' or 'o',   SLAMCH := rmax */
-
-/*          where */
-
-/*          eps   = relative machine precision */
-/*          sfmin = safe minimum, such that 1/sfmin does not overflow */
-/*          base  = base of the machine */
-/*          prec  = eps*base */
-/*          t     = number of (base) digits in the mantissa */
-/*          rnd   = 1.0 when rounding occurs in addition, 0.0 otherwise */
-/*          emin  = minimum exponent before (gradual) underflow */
-/*          rmin  = underflow threshold - base**(emin-1) */
-/*          emax  = largest exponent before overflow */
-/*          rmax  = overflow threshold  - (base**emax)*(1-eps) */
-
-/* ===================================================================== */
-
-/*     .. Parameters .. */
-/*     .. */
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. External Subroutines .. */
-/*     .. */
-/*     .. Save statement .. */
-/*     .. */
-/*     .. Data statements .. */
-/*     .. */
-/*     .. Executable Statements .. */
-
-    if (first) {
-	slamc2_(&beta, &it, &lrnd, &eps, &imin, &rmin, &imax, &rmax);
-	base = (real) beta;
-	t = (real) it;
-	if (lrnd) {
-	    rnd = 1.f;
-	    i__1 = 1 - it;
-	    eps = pow_ri(&base, &i__1) / 2;
-	} else {
-	    rnd = 0.f;
-	    i__1 = 1 - it;
-	    eps = pow_ri(&base, &i__1);
-	}
-	prec = eps * base;
-	emin = (real) imin;
-	emax = (real) imax;
-	sfmin = rmin;
-	small = 1.f / rmax;
-	if (small >= sfmin) {
-
-/*           Use SMALL plus a bit, to avoid the possibility of rounding */
-/*           causing overflow when computing  1/sfmin. */
-
-	    sfmin = small * (eps + 1.f);
-	}
+  if (n != 0) {
+    if (n < 0) {
+      n = -n;
+      x = 1 / x;
     }
-
-    if (lsame_(cmach, "E")) {
-	rmach = eps;
-    } else if (lsame_(cmach, "S")) {
-	rmach = sfmin;
-    } else if (lsame_(cmach, "B")) {
-	rmach = base;
-    } else if (lsame_(cmach, "P")) {
-	rmach = prec;
-    } else if (lsame_(cmach, "N")) {
-	rmach = t;
-    } else if (lsame_(cmach, "R")) {
-	rmach = rnd;
-    } else if (lsame_(cmach, "M")) {
-	rmach = emin;
-    } else if (lsame_(cmach, "U")) {
-	rmach = rmin;
-    } else if (lsame_(cmach, "L")) {
-	rmach = emax;
-    } else if (lsame_(cmach, "O")) {
-	rmach = rmax;
+    for (u = n;;) {
+      if (u & 01) pow *= x;
+      if (u >>= 1)
+        x *= x;
+      else
+        break;
     }
+  }
+  return (pow);
+}
 
-    ret_val = rmach;
-    first = FALSE_;
-    return ret_val;
+doublereal slamch_(char *cmach) {
+  /* Initialized data */
 
-/*     End of SLAMCH */
+  static logical first = TRUE_;
+
+  /* System generated locals */
+  integer i__1;
+  real ret_val;
+
+  /* Local variables */
+  static real t;
+  integer it;
+  static real rnd, eps, base;
+  integer beta;
+  static real emin, prec, emax;
+  integer imin, imax;
+  logical lrnd;
+  static real rmin, rmax;
+  real rmach = 0;
+  extern logical lsame_(char *, char *);
+  real small;
+  static real sfmin;
+  extern /* Subroutine */ void slamc2_(integer *, integer *, logical *, real *, integer *, real *, integer *, real *);
+
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
+
+  /*     .. Scalar Arguments .. */
+  /*     .. */
+
+  /*  Purpose */
+  /*  ======= */
+
+  /*  SLAMCH determines single precision machine parameters. */
+
+  /*  Arguments */
+  /*  ========= */
+
+  /*  CMACH   (input) CHARACTER*1 */
+  /*          Specifies the value to be returned by SLAMCH: */
+  /*          = 'E' or 'e',   SLAMCH := eps */
+  /*          = 'S' or 's ,   SLAMCH := sfmin */
+  /*          = 'B' or 'b',   SLAMCH := base */
+  /*          = 'P' or 'p',   SLAMCH := eps*base */
+  /*          = 'N' or 'n',   SLAMCH := t */
+  /*          = 'R' or 'r',   SLAMCH := rnd */
+  /*          = 'M' or 'm',   SLAMCH := emin */
+  /*          = 'U' or 'u',   SLAMCH := rmin */
+  /*          = 'L' or 'l',   SLAMCH := emax */
+  /*          = 'O' or 'o',   SLAMCH := rmax */
+
+  /*          where */
+
+  /*          eps   = relative machine precision */
+  /*          sfmin = safe minimum, such that 1/sfmin does not overflow */
+  /*          base  = base of the machine */
+  /*          prec  = eps*base */
+  /*          t     = number of (base) digits in the mantissa */
+  /*          rnd   = 1.0 when rounding occurs in addition, 0.0 otherwise */
+  /*          emin  = minimum exponent before (gradual) underflow */
+  /*          rmin  = underflow threshold - base**(emin-1) */
+  /*          emax  = largest exponent before overflow */
+  /*          rmax  = overflow threshold  - (base**emax)*(1-eps) */
+
+  /* ===================================================================== */
+
+  /*     .. Parameters .. */
+  /*     .. */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. External Subroutines .. */
+  /*     .. */
+  /*     .. Save statement .. */
+  /*     .. */
+  /*     .. Data statements .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
+
+  if (first) {
+    slamc2_(&beta, &it, &lrnd, &eps, &imin, &rmin, &imax, &rmax);
+    base = (real)beta;
+    t = (real)it;
+    if (lrnd) {
+      rnd = 1.f;
+      i__1 = 1 - it;
+      eps = pow_ri(&base, &i__1) / 2;
+    } else {
+      rnd = 0.f;
+      i__1 = 1 - it;
+      eps = pow_ri(&base, &i__1);
+    }
+    prec = eps * base;
+    emin = (real)imin;
+    emax = (real)imax;
+    sfmin = rmin;
+    small = 1.f / rmax;
+    if (small >= sfmin) {
+      /*           Use SMALL plus a bit, to avoid the possibility of rounding */
+      /*           causing overflow when computing  1/sfmin. */
+
+      sfmin = small * (eps + 1.f);
+    }
+  }
+
+  if (lsame_(cmach, "E")) {
+    rmach = eps;
+  } else if (lsame_(cmach, "S")) {
+    rmach = sfmin;
+  } else if (lsame_(cmach, "B")) {
+    rmach = base;
+  } else if (lsame_(cmach, "P")) {
+    rmach = prec;
+  } else if (lsame_(cmach, "N")) {
+    rmach = t;
+  } else if (lsame_(cmach, "R")) {
+    rmach = rnd;
+  } else if (lsame_(cmach, "M")) {
+    rmach = emin;
+  } else if (lsame_(cmach, "U")) {
+    rmach = rmin;
+  } else if (lsame_(cmach, "L")) {
+    rmach = emax;
+  } else if (lsame_(cmach, "O")) {
+    rmach = rmax;
+  }
+
+  ret_val = rmach;
+  first = FALSE_;
+  return ret_val;
+
+  /*     End of SLAMCH */
 
 } /* slamch_ */
 
-
 /* *********************************************************************** */
 
-/* Subroutine */ int slamc1_(integer *beta, integer *t, logical *rnd, logical 
-	*ieee1)
-{
-    /* Initialized data */
+/* Subroutine */ void slamc1_(integer *beta, integer *t, logical *rnd, logical *ieee1) {
+  /* Initialized data */
 
-    static logical first = TRUE_;
+  static logical first = TRUE_;
 
-    /* System generated locals */
-    real r__1, r__2;
+  /* System generated locals */
+  real r__1, r__2;
 
-    /* Local variables */
-    real a, b, c__, f, t1, t2;
-    static integer lt;
-    real one, qtr;
-    static logical lrnd;
-    static integer lbeta;
-    real savec;
-    static logical lieee1;
-    extern doublereal slamc3_(real *, real *);
+  /* Local variables */
+  real a, b, c__, f, t1, t2;
+  static integer lt;
+  real one, qtr;
+  static logical lrnd;
+  static integer lbeta;
+  real savec;
+  static logical lieee1;
+  extern doublereal slamc3_(real *, real *);
 
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*     .. Scalar Arguments .. */
+  /*     .. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
+  /*  Purpose */
+  /*  ======= */
 
-/*  Purpose */
-/*  ======= */
+  /*  SLAMC1 determines the machine parameters given by BETA, T, RND, and */
+  /*  IEEE1. */
 
-/*  SLAMC1 determines the machine parameters given by BETA, T, RND, and */
-/*  IEEE1. */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Arguments */
-/*  ========= */
+  /*  BETA    (output) INTEGER */
+  /*          The base of the machine. */
 
-/*  BETA    (output) INTEGER */
-/*          The base of the machine. */
+  /*  T       (output) INTEGER */
+  /*          The number of ( BETA ) digits in the mantissa. */
 
-/*  T       (output) INTEGER */
-/*          The number of ( BETA ) digits in the mantissa. */
+  /*  RND     (output) LOGICAL */
+  /*          Specifies whether proper rounding  ( RND = .TRUE. )  or */
+  /*          chopping  ( RND = .FALSE. )  occurs in addition. This may not */
+  /*          be a reliable guide to the way in which the machine performs */
+  /*          its arithmetic. */
 
-/*  RND     (output) LOGICAL */
-/*          Specifies whether proper rounding  ( RND = .TRUE. )  or */
-/*          chopping  ( RND = .FALSE. )  occurs in addition. This may not */
-/*          be a reliable guide to the way in which the machine performs */
-/*          its arithmetic. */
+  /*  IEEE1   (output) LOGICAL */
+  /*          Specifies whether rounding appears to be done in the IEEE */
+  /*          'round to nearest' style. */
 
-/*  IEEE1   (output) LOGICAL */
-/*          Specifies whether rounding appears to be done in the IEEE */
-/*          'round to nearest' style. */
+  /*  Further Details */
+  /*  =============== */
 
-/*  Further Details */
-/*  =============== */
+  /*  The routine is based on the routine  ENVRON  by Malcolm and */
+  /*  incorporates suggestions by Gentleman and Marovich. See */
 
-/*  The routine is based on the routine  ENVRON  by Malcolm and */
-/*  incorporates suggestions by Gentleman and Marovich. See */
+  /*     Malcolm M. A. (1972) Algorithms to reveal properties of */
+  /*        floating-point arithmetic. Comms. of the ACM, 15, 949-951. */
 
-/*     Malcolm M. A. (1972) Algorithms to reveal properties of */
-/*        floating-point arithmetic. Comms. of the ACM, 15, 949-951. */
+  /*     Gentleman W. M. and Marovich S. B. (1974) More on algorithms */
+  /*        that reveal properties of floating point arithmetic units. */
+  /*        Comms. of the ACM, 17, 276-277. */
 
-/*     Gentleman W. M. and Marovich S. B. (1974) More on algorithms */
-/*        that reveal properties of floating point arithmetic units. */
-/*        Comms. of the ACM, 17, 276-277. */
+  /* ===================================================================== */
 
-/* ===================================================================== */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. Save statement .. */
+  /*     .. */
+  /*     .. Data statements .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. Save statement .. */
-/*     .. */
-/*     .. Data statements .. */
-/*     .. */
-/*     .. Executable Statements .. */
+  if (first) {
+    one = 1.f;
 
-    if (first) {
-	one = 1.f;
+    /*        LBETA,  LIEEE1,  LT and  LRND  are the  local values  of  BETA, */
+    /*        IEEE1, T and RND. */
 
-/*        LBETA,  LIEEE1,  LT and  LRND  are the  local values  of  BETA, */
-/*        IEEE1, T and RND. */
+    /*        Throughout this routine  we use the function  SLAMC3  to ensure */
+    /*        that relevant values are  stored and not held in registers,  or */
+    /*        are not affected by optimizers. */
 
-/*        Throughout this routine  we use the function  SLAMC3  to ensure */
-/*        that relevant values are  stored and not held in registers,  or */
-/*        are not affected by optimizers. */
+    /*        Compute  a = 2.0**m  with the  smallest positive integer m such */
+    /*        that */
 
-/*        Compute  a = 2.0**m  with the  smallest positive integer m such */
-/*        that */
+    /*           fl( a + 1.0 ) = a. */
 
-/*           fl( a + 1.0 ) = a. */
+    a = 1.f;
+    c__ = 1.f;
 
-	a = 1.f;
-	c__ = 1.f;
+  /* +       WHILE( C.EQ.ONE )LOOP */
+  L10:
+    if (c__ == one) {
+      a *= 2;
+      c__ = slamc3_(&a, &one);
+      r__1 = -a;
+      c__ = slamc3_(&c__, &r__1);
+      goto L10;
+    }
+    /* +       END WHILE */
 
-/* +       WHILE( C.EQ.ONE )LOOP */
-L10:
-	if (c__ == one) {
-	    a *= 2;
-	    c__ = slamc3_(&a, &one);
-	    r__1 = -a;
-	    c__ = slamc3_(&c__, &r__1);
-	    goto L10;
-	}
-/* +       END WHILE */
+    /*        Now compute  b = 2.0**m  with the smallest positive integer m */
+    /*        such that */
 
-/*        Now compute  b = 2.0**m  with the smallest positive integer m */
-/*        such that */
+    /*           fl( a + b ) .gt. a. */
 
-/*           fl( a + b ) .gt. a. */
+    b = 1.f;
+    c__ = slamc3_(&a, &b);
 
-	b = 1.f;
-	c__ = slamc3_(&a, &b);
+  /* +       WHILE( C.EQ.A )LOOP */
+  L20:
+    if (c__ == a) {
+      b *= 2;
+      c__ = slamc3_(&a, &b);
+      goto L20;
+    }
+    /* +       END WHILE */
 
-/* +       WHILE( C.EQ.A )LOOP */
-L20:
-	if (c__ == a) {
-	    b *= 2;
-	    c__ = slamc3_(&a, &b);
-	    goto L20;
-	}
-/* +       END WHILE */
+    /*        Now compute the base.  a and c  are neighbouring floating point */
+    /*        numbers  in the  interval  ( beta**t, beta**( t + 1 ) )  and so */
+    /*        their difference is beta. Adding 0.25 to c is to ensure that it */
+    /*        is truncated to beta and not ( beta - 1 ). */
 
-/*        Now compute the base.  a and c  are neighbouring floating point */
-/*        numbers  in the  interval  ( beta**t, beta**( t + 1 ) )  and so */
-/*        their difference is beta. Adding 0.25 to c is to ensure that it */
-/*        is truncated to beta and not ( beta - 1 ). */
+    qtr = one / 4;
+    savec = c__;
+    r__1 = -a;
+    c__ = slamc3_(&c__, &r__1);
+    lbeta = c__ + qtr;
 
-	qtr = one / 4;
-	savec = c__;
-	r__1 = -a;
-	c__ = slamc3_(&c__, &r__1);
-	lbeta = c__ + qtr;
+    /*        Now determine whether rounding or chopping occurs,  by adding a */
+    /*        bit  less  than  beta/2  and a  bit  more  than  beta/2  to  a. */
 
-/*        Now determine whether rounding or chopping occurs,  by adding a */
-/*        bit  less  than  beta/2  and a  bit  more  than  beta/2  to  a. */
-
-	b = (real) lbeta;
-	r__1 = b / 2;
-	r__2 = -b / 100;
-	f = slamc3_(&r__1, &r__2);
-	c__ = slamc3_(&f, &a);
-	if (c__ == a) {
-	    lrnd = TRUE_;
-	} else {
-	    lrnd = FALSE_;
-	}
-	r__1 = b / 2;
-	r__2 = b / 100;
-	f = slamc3_(&r__1, &r__2);
-	c__ = slamc3_(&f, &a);
-	if (lrnd && c__ == a) {
-	    lrnd = FALSE_;
-	}
-
-/*        Try and decide whether rounding is done in the  IEEE  'round to */
-/*        nearest' style. B/2 is half a unit in the last place of the two */
-/*        numbers A and SAVEC. Furthermore, A is even, i.e. has last  bit */
-/*        zero, and SAVEC is odd. Thus adding B/2 to A should not  change */
-/*        A, but adding B/2 to SAVEC should change SAVEC. */
-
-	r__1 = b / 2;
-	t1 = slamc3_(&r__1, &a);
-	r__1 = b / 2;
-	t2 = slamc3_(&r__1, &savec);
-	lieee1 = t1 == a && t2 > savec && lrnd;
-
-/*        Now find  the  mantissa, t.  It should  be the  integer part of */
-/*        log to the base beta of a,  however it is safer to determine  t */
-/*        by powering.  So we find t as the smallest positive integer for */
-/*        which */
-
-/*           fl( beta**t + 1.0 ) = 1.0. */
-
-	lt = 0;
-	a = 1.f;
-	c__ = 1.f;
-
-/* +       WHILE( C.EQ.ONE )LOOP */
-L30:
-	if (c__ == one) {
-	    ++lt;
-	    a *= lbeta;
-	    c__ = slamc3_(&a, &one);
-	    r__1 = -a;
-	    c__ = slamc3_(&c__, &r__1);
-	    goto L30;
-	}
-/* +       END WHILE */
-
+    b = (real)lbeta;
+    r__1 = b / 2;
+    r__2 = -b / 100;
+    f = slamc3_(&r__1, &r__2);
+    c__ = slamc3_(&f, &a);
+    if (c__ == a) {
+      lrnd = TRUE_;
+    } else {
+      lrnd = FALSE_;
+    }
+    r__1 = b / 2;
+    r__2 = b / 100;
+    f = slamc3_(&r__1, &r__2);
+    c__ = slamc3_(&f, &a);
+    if (lrnd && c__ == a) {
+      lrnd = FALSE_;
     }
 
-    *beta = lbeta;
-    *t = lt;
-    *rnd = lrnd;
-    *ieee1 = lieee1;
-    first = FALSE_;
-    return 0;
+    /*        Try and decide whether rounding is done in the  IEEE  'round to */
+    /*        nearest' style. B/2 is half a unit in the last place of the two */
+    /*        numbers A and SAVEC. Furthermore, A is even, i.e. has last  bit */
+    /*        zero, and SAVEC is odd. Thus adding B/2 to A should not  change */
+    /*        A, but adding B/2 to SAVEC should change SAVEC. */
 
-/*     End of SLAMC1 */
+    r__1 = b / 2;
+    t1 = slamc3_(&r__1, &a);
+    r__1 = b / 2;
+    t2 = slamc3_(&r__1, &savec);
+    lieee1 = t1 == a && t2 > savec && lrnd;
+
+    /*        Now find  the  mantissa, t.  It should  be the  integer part of */
+    /*        log to the base beta of a,  however it is safer to determine  t */
+    /*        by powering.  So we find t as the smallest positive integer for */
+    /*        which */
+
+    /*           fl( beta**t + 1.0 ) = 1.0. */
+
+    lt = 0;
+    a = 1.f;
+    c__ = 1.f;
+
+  /* +       WHILE( C.EQ.ONE )LOOP */
+  L30:
+    if (c__ == one) {
+      ++lt;
+      a *= lbeta;
+      c__ = slamc3_(&a, &one);
+      r__1 = -a;
+      c__ = slamc3_(&c__, &r__1);
+      goto L30;
+    }
+    /* +       END WHILE */
+  }
+
+  *beta = lbeta;
+  *t = lt;
+  *rnd = lrnd;
+  *ieee1 = lieee1;
+  first = FALSE_;
+
+  /*     End of SLAMC1 */
 
 } /* slamc1_ */
 
-
 /* *********************************************************************** */
 
-/* Subroutine */ int slamc2_(integer *beta, integer *t, logical *rnd, real *
-	eps, integer *emin, real *rmin, integer *emax, real *rmax)
-{
-    /* Initialized data */
+/* Subroutine */ void slamc2_(integer *beta, integer *t, logical *rnd, real *eps, integer *emin, real *rmin,
+                              integer *emax, real *rmax) {
+  /* Initialized data */
 
-    static logical first = TRUE_;
-    static logical iwarn = FALSE_;
+  static logical first = TRUE_;
+  static logical iwarn = FALSE_;
 
-    /* Format strings */
-    static char fmt_9999[] = "(//\002 WARNING. The value EMIN may be incorre"
-	    "ct:-\002,\002  EMIN = \002,i8,/\002 If, after inspection, the va"
-	    "lue EMIN looks\002,\002 acceptable please comment out \002,/\002"
-	    " the IF block as marked within the code of routine\002,\002 SLAM"
-	    "C2,\002,/\002 otherwise supply EMIN explicitly.\002,/)";
+  /* Format strings */
+  /*
+  static char fmt_9999[] =
+      "(//\002 WARNING. The value EMIN may be incorre"
+      "ct:-\002,\002  EMIN = \002,i8,/\002 If, after inspection, the va"
+      "lue EMIN looks\002,\002 acceptable please comment out \002,/\002"
+      " the IF block as marked within the code of routine\002,\002 SLAM"
+      "C2,\002,/\002 otherwise supply EMIN explicitly.\002,/)";
+  */
+  /* System generated locals */
+  integer i__1;
+  real r__1, r__2, r__3, r__4, r__5;
 
-    /* System generated locals */
-    integer i__1;
-    real r__1, r__2, r__3, r__4, r__5;
+  /* Builtin functions */
+  /* double pow_ri(real *, integer *); */
+  /* integer s_wsfe(cilist *), do_fio(integer *, char *, ftnlen), e_wsfe(void); */
 
-    /* Builtin functions */
-    double pow_ri(real *, integer *);
-    integer s_wsfe(cilist *), do_fio(integer *, char *, ftnlen), e_wsfe(void);
+  /* Local variables */
+  real a, b, c__;
+  integer i__;
+  static integer lt;
+  real one, two;
+  logical ieee;
+  real half;
+  logical lrnd = 0;
+  static real leps;
+  real zero;
+  static integer lbeta;
+  real rbase;
+  static integer lemin, lemax;
+  integer gnmin;
+  real small;
+  integer gpmin;
+  real third;
+  static real lrmin, lrmax;
+  real sixth;
+  logical lieee1;
+  extern /* Subroutine */ void slamc1_(integer *, integer *, logical *, logical *);
+  extern doublereal slamc3_(real *, real *);
+  extern /* Subroutine */ void slamc4_(integer *, real *, integer *),
+      slamc5_(integer *, integer *, integer *, logical *, integer *, real *);
+  integer ngnmin, ngpmin;
 
-    /* Local variables */
-    real a, b, c__;
-    integer i__;
-    static integer lt;
-    real one, two;
-    logical ieee;
-    real half;
-    logical lrnd = 0;
-    static real leps;
-    real zero;
-    static integer lbeta;
-    real rbase;
-    static integer lemin, lemax;
-    integer gnmin;
-    real small;
-    integer gpmin;
-    real third;
-    static real lrmin, lrmax;
-    real sixth;
-    logical lieee1;
-    extern /* Subroutine */ int slamc1_(integer *, integer *, logical *, 
-	    logical *);
-    extern doublereal slamc3_(real *, real *);
-    extern /* Subroutine */ int slamc4_(integer *, real *, integer *), 
-	    slamc5_(integer *, integer *, integer *, logical *, integer *, 
-	    real *);
-    integer ngnmin, ngpmin;
+  /* Fortran I/O blocks */
+  /* static cilist io___58 = {0, 6, 0, fmt_9999, 0}; */
 
-    /* Fortran I/O blocks */
-    static cilist io___58 = { 0, 6, 0, fmt_9999, 0 };
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
+  /*     .. Scalar Arguments .. */
+  /*     .. */
 
+  /*  Purpose */
+  /*  ======= */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*  SLAMC2 determines the machine parameters specified in its argument */
+  /*  list. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Purpose */
-/*  ======= */
+  /*  BETA    (output) INTEGER */
+  /*          The base of the machine. */
 
-/*  SLAMC2 determines the machine parameters specified in its argument */
-/*  list. */
+  /*  T       (output) INTEGER */
+  /*          The number of ( BETA ) digits in the mantissa. */
 
-/*  Arguments */
-/*  ========= */
+  /*  RND     (output) LOGICAL */
+  /*          Specifies whether proper rounding  ( RND = .TRUE. )  or */
+  /*          chopping  ( RND = .FALSE. )  occurs in addition. This may not */
+  /*          be a reliable guide to the way in which the machine performs */
+  /*          its arithmetic. */
 
-/*  BETA    (output) INTEGER */
-/*          The base of the machine. */
+  /*  EPS     (output) REAL */
+  /*          The smallest positive number such that */
 
-/*  T       (output) INTEGER */
-/*          The number of ( BETA ) digits in the mantissa. */
+  /*             fl( 1.0 - EPS ) .LT. 1.0, */
 
-/*  RND     (output) LOGICAL */
-/*          Specifies whether proper rounding  ( RND = .TRUE. )  or */
-/*          chopping  ( RND = .FALSE. )  occurs in addition. This may not */
-/*          be a reliable guide to the way in which the machine performs */
-/*          its arithmetic. */
+  /*          where fl denotes the computed value. */
 
-/*  EPS     (output) REAL */
-/*          The smallest positive number such that */
+  /*  EMIN    (output) INTEGER */
+  /*          The minimum exponent before (gradual) underflow occurs. */
 
-/*             fl( 1.0 - EPS ) .LT. 1.0, */
+  /*  RMIN    (output) REAL */
+  /*          The smallest normalized number for the machine, given by */
+  /*          BASE**( EMIN - 1 ), where  BASE  is the floating point value */
+  /*          of BETA. */
 
-/*          where fl denotes the computed value. */
+  /*  EMAX    (output) INTEGER */
+  /*          The maximum exponent before overflow occurs. */
 
-/*  EMIN    (output) INTEGER */
-/*          The minimum exponent before (gradual) underflow occurs. */
+  /*  RMAX    (output) REAL */
+  /*          The largest positive number for the machine, given by */
+  /*          BASE**EMAX * ( 1 - EPS ), where  BASE  is the floating point */
+  /*          value of BETA. */
 
-/*  RMIN    (output) REAL */
-/*          The smallest normalized number for the machine, given by */
-/*          BASE**( EMIN - 1 ), where  BASE  is the floating point value */
-/*          of BETA. */
+  /*  Further Details */
+  /*  =============== */
 
-/*  EMAX    (output) INTEGER */
-/*          The maximum exponent before overflow occurs. */
+  /*  The computation of  EPS  is based on a routine PARANOIA by */
+  /*  W. Kahan of the University of California at Berkeley. */
 
-/*  RMAX    (output) REAL */
-/*          The largest positive number for the machine, given by */
-/*          BASE**EMAX * ( 1 - EPS ), where  BASE  is the floating point */
-/*          value of BETA. */
+  /* ===================================================================== */
 
-/*  Further Details */
-/*  =============== */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. External Subroutines .. */
+  /*     .. */
+  /*     .. Intrinsic Functions .. */
+  /*     .. */
+  /*     .. Save statement .. */
+  /*     .. */
+  /*     .. Data statements .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*  The computation of  EPS  is based on a routine PARANOIA by */
-/*  W. Kahan of the University of California at Berkeley. */
+  if (first) {
+    zero = 0.f;
+    one = 1.f;
+    two = 2.f;
 
-/* ===================================================================== */
+    /*        LBETA, LT, LRND, LEPS, LEMIN and LRMIN  are the local values of */
+    /*        BETA, T, RND, EPS, EMIN and RMIN. */
 
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. External Subroutines .. */
-/*     .. */
-/*     .. Intrinsic Functions .. */
-/*     .. */
-/*     .. Save statement .. */
-/*     .. */
-/*     .. Data statements .. */
-/*     .. */
-/*     .. Executable Statements .. */
+    /*        Throughout this routine  we use the function  SLAMC3  to ensure */
+    /*        that relevant values are stored  and not held in registers,  or */
+    /*        are not affected by optimizers. */
 
-    if (first) {
-	zero = 0.f;
-	one = 1.f;
-	two = 2.f;
+    /*        SLAMC1 returns the parameters  LBETA, LT, LRND and LIEEE1. */
 
-/*        LBETA, LT, LRND, LEPS, LEMIN and LRMIN  are the local values of */
-/*        BETA, T, RND, EPS, EMIN and RMIN. */
+    slamc1_(&lbeta, &lt, &lrnd, &lieee1);
 
-/*        Throughout this routine  we use the function  SLAMC3  to ensure */
-/*        that relevant values are stored  and not held in registers,  or */
-/*        are not affected by optimizers. */
+    /*        Start to find EPS. */
 
-/*        SLAMC1 returns the parameters  LBETA, LT, LRND and LIEEE1. */
+    b = (real)lbeta;
+    i__1 = -lt;
+    a = pow_ri(&b, &i__1);
+    leps = a;
 
-	slamc1_(&lbeta, &lt, &lrnd, &lieee1);
+    /*        Try some tricks to see whether or not this is the correct  EPS. */
 
-/*        Start to find EPS. */
-
-	b = (real) lbeta;
-	i__1 = -lt;
-	a = pow_ri(&b, &i__1);
-	leps = a;
-
-/*        Try some tricks to see whether or not this is the correct  EPS. */
-
-	b = two / 3;
-	half = one / 2;
-	r__1 = -half;
-	sixth = slamc3_(&b, &r__1);
-	third = slamc3_(&sixth, &sixth);
-	r__1 = -half;
-	b = slamc3_(&third, &r__1);
-	b = slamc3_(&b, &sixth);
-	b = dabs(b);
-	if (b < leps) {
-	    b = leps;
-	}
-
-	leps = 1.f;
-
-/* +       WHILE( ( LEPS.GT.B ).AND.( B.GT.ZERO ) )LOOP */
-L10:
-	if (leps > b && b > zero) {
-	    leps = b;
-	    r__1 = half * leps;
-/* Computing 5th power */
-	    r__3 = two, r__4 = r__3, r__3 *= r__3;
-/* Computing 2nd power */
-	    r__5 = leps;
-	    r__2 = r__4 * (r__3 * r__3) * (r__5 * r__5);
-	    c__ = slamc3_(&r__1, &r__2);
-	    r__1 = -c__;
-	    c__ = slamc3_(&half, &r__1);
-	    b = slamc3_(&half, &c__);
-	    r__1 = -b;
-	    c__ = slamc3_(&half, &r__1);
-	    b = slamc3_(&half, &c__);
-	    goto L10;
-	}
-/* +       END WHILE */
-
-	if (a < leps) {
-	    leps = a;
-	}
-
-/*        Computation of EPS complete. */
-
-/*        Now find  EMIN.  Let A = + or - 1, and + or - (1 + BASE**(-3)). */
-/*        Keep dividing  A by BETA until (gradual) underflow occurs. This */
-/*        is detected when we cannot recover the previous A. */
-
-	rbase = one / lbeta;
-	small = one;
-	for (i__ = 1; i__ <= 3; ++i__) {
-	    r__1 = small * rbase;
-	    small = slamc3_(&r__1, &zero);
-/* L20: */
-	}
-	a = slamc3_(&one, &small);
-	slamc4_(&ngpmin, &one, &lbeta);
-	r__1 = -one;
-	slamc4_(&ngnmin, &r__1, &lbeta);
-	slamc4_(&gpmin, &a, &lbeta);
-	r__1 = -a;
-	slamc4_(&gnmin, &r__1, &lbeta);
-	ieee = FALSE_;
-
-	if (ngpmin == ngnmin && gpmin == gnmin) {
-	    if (ngpmin == gpmin) {
-		lemin = ngpmin;
-/*            ( Non twos-complement machines, no gradual underflow; */
-/*              e.g.,  VAX ) */
-	    } else if (gpmin - ngpmin == 3) {
-		lemin = ngpmin - 1 + lt;
-		ieee = TRUE_;
-/*            ( Non twos-complement machines, with gradual underflow; */
-/*              e.g., IEEE standard followers ) */
-	    } else {
-		lemin = min(ngpmin,gpmin);
-/*            ( A guess; no known machine ) */
-		iwarn = TRUE_;
-	    }
-
-	} else if (ngpmin == gpmin && ngnmin == gnmin) {
-	    if ((i__1 = ngpmin - ngnmin, abs(i__1)) == 1) {
-		lemin = max(ngpmin,ngnmin);
-/*            ( Twos-complement machines, no gradual underflow; */
-/*              e.g., CYBER 205 ) */
-	    } else {
-		lemin = min(ngpmin,ngnmin);
-/*            ( A guess; no known machine ) */
-		iwarn = TRUE_;
-	    }
-
-	} else if ((i__1 = ngpmin - ngnmin, abs(i__1)) == 1 && gpmin == gnmin)
-		 {
-	    if (gpmin - min(ngpmin,ngnmin) == 3) {
-		lemin = max(ngpmin,ngnmin) - 1 + lt;
-/*            ( Twos-complement machines with gradual underflow; */
-/*              no known machine ) */
-	    } else {
-		lemin = min(ngpmin,ngnmin);
-/*            ( A guess; no known machine ) */
-		iwarn = TRUE_;
-	    }
-
-	} else {
-/* Computing MIN */
-	    i__1 = min(ngpmin,ngnmin), i__1 = min(i__1,gpmin);
-	    lemin = min(i__1,gnmin);
-/*         ( A guess; no known machine ) */
-	    iwarn = TRUE_;
-	}
-	first = FALSE_;
-/* ** */
-/* Comment out this if block if EMIN is ok */
-	if (iwarn) {
-	    first = TRUE_;
-	    s_wsfe(&io___58);
-	    do_fio(&c__1, (char *)&lemin, (ftnlen)sizeof(integer));
-	    e_wsfe();
-	}
-/* ** */
-
-/*        Assume IEEE arithmetic if we found denormalised  numbers above, */
-/*        or if arithmetic seems to round in the  IEEE style,  determined */
-/*        in routine SLAMC1. A true IEEE machine should have both  things */
-/*        true; however, faulty machines may have one or the other. */
-
-	ieee = ieee || lieee1;
-
-/*        Compute  RMIN by successive division by  BETA. We could compute */
-/*        RMIN as BASE**( EMIN - 1 ),  but some machines underflow during */
-/*        this computation. */
-
-	lrmin = 1.f;
-	i__1 = 1 - lemin;
-	for (i__ = 1; i__ <= i__1; ++i__) {
-	    r__1 = lrmin * rbase;
-	    lrmin = slamc3_(&r__1, &zero);
-/* L30: */
-	}
-
-/*        Finally, call SLAMC5 to compute EMAX and RMAX. */
-
-	slamc5_(&lbeta, &lt, &lemin, &ieee, &lemax, &lrmax);
+    b = two / 3;
+    half = one / 2;
+    r__1 = -half;
+    sixth = slamc3_(&b, &r__1);
+    third = slamc3_(&sixth, &sixth);
+    r__1 = -half;
+    b = slamc3_(&third, &r__1);
+    b = slamc3_(&b, &sixth);
+    b = dabs(b);
+    if (b < leps) {
+      b = leps;
     }
 
-    *beta = lbeta;
-    *t = lt;
-    *rnd = lrnd;
-    *eps = leps;
-    *emin = lemin;
-    *rmin = lrmin;
-    *emax = lemax;
-    *rmax = lrmax;
+    leps = 1.f;
 
-    return 0;
+  /* +       WHILE( ( LEPS.GT.B ).AND.( B.GT.ZERO ) )LOOP */
+  L10:
+    if (leps > b && b > zero) {
+      leps = b;
+      r__1 = half * leps;
+      /* Computing 5th power */
+      r__3 = two, r__4 = r__3, r__3 *= r__3;
+      /* Computing 2nd power */
+      r__5 = leps;
+      r__2 = r__4 * (r__3 * r__3) * (r__5 * r__5);
+      c__ = slamc3_(&r__1, &r__2);
+      r__1 = -c__;
+      c__ = slamc3_(&half, &r__1);
+      b = slamc3_(&half, &c__);
+      r__1 = -b;
+      c__ = slamc3_(&half, &r__1);
+      b = slamc3_(&half, &c__);
+      goto L10;
+    }
+    /* +       END WHILE */
 
+    if (a < leps) {
+      leps = a;
+    }
 
-/*     End of SLAMC2 */
+    /*        Computation of EPS complete. */
+
+    /*        Now find  EMIN.  Let A = + or - 1, and + or - (1 + BASE**(-3)). */
+    /*        Keep dividing  A by BETA until (gradual) underflow occurs. This */
+    /*        is detected when we cannot recover the previous A. */
+
+    rbase = one / lbeta;
+    small = one;
+    for (i__ = 1; i__ <= 3; ++i__) {
+      r__1 = small * rbase;
+      small = slamc3_(&r__1, &zero);
+      /* L20: */
+    }
+    a = slamc3_(&one, &small);
+    slamc4_(&ngpmin, &one, &lbeta);
+    r__1 = -one;
+    slamc4_(&ngnmin, &r__1, &lbeta);
+    slamc4_(&gpmin, &a, &lbeta);
+    r__1 = -a;
+    slamc4_(&gnmin, &r__1, &lbeta);
+    ieee = FALSE_;
+
+    if (ngpmin == ngnmin && gpmin == gnmin) {
+      if (ngpmin == gpmin) {
+        lemin = ngpmin;
+        /*            ( Non twos-complement machines, no gradual underflow; */
+        /*              e.g.,  VAX ) */
+      } else if (gpmin - ngpmin == 3) {
+        lemin = ngpmin - 1 + lt;
+        ieee = TRUE_;
+        /*            ( Non twos-complement machines, with gradual underflow; */
+        /*              e.g., IEEE standard followers ) */
+      } else {
+        lemin = min(ngpmin, gpmin);
+        /*            ( A guess; no known machine ) */
+        iwarn = TRUE_;
+      }
+
+    } else if (ngpmin == gpmin && ngnmin == gnmin) {
+      if ((i__1 = ngpmin - ngnmin, abs(i__1)) == 1) {
+        lemin = max(ngpmin, ngnmin);
+        /*            ( Twos-complement machines, no gradual underflow; */
+        /*              e.g., CYBER 205 ) */
+      } else {
+        lemin = min(ngpmin, ngnmin);
+        /*            ( A guess; no known machine ) */
+        iwarn = TRUE_;
+      }
+
+    } else if ((i__1 = ngpmin - ngnmin, abs(i__1)) == 1 && gpmin == gnmin) {
+      if (gpmin - min(ngpmin, ngnmin) == 3) {
+        lemin = max(ngpmin, ngnmin) - 1 + lt;
+        /*            ( Twos-complement machines with gradual underflow; */
+        /*              no known machine ) */
+      } else {
+        lemin = min(ngpmin, ngnmin);
+        /*            ( A guess; no known machine ) */
+        iwarn = TRUE_;
+      }
+
+    } else {
+      /* Computing MIN */
+      i__1 = min(ngpmin, ngnmin), i__1 = min(i__1, gpmin);
+      lemin = min(i__1, gnmin);
+      /*         ( A guess; no known machine ) */
+      iwarn = TRUE_;
+    }
+    first = FALSE_;
+    /* ** */
+    /* Comment out this if block if EMIN is ok */
+    /*
+    if (iwarn) {
+      first = TRUE_;
+      s_wsfe(&io___58);
+      do_fio(&c__1, (char *)&lemin, (ftnlen)sizeof(integer));
+      e_wsfe();
+    }
+    */
+    /* ** */
+
+    /*        Assume IEEE arithmetic if we found denormalised  numbers above, */
+    /*        or if arithmetic seems to round in the  IEEE style,  determined */
+    /*        in routine SLAMC1. A true IEEE machine should have both  things */
+    /*        true; however, faulty machines may have one or the other. */
+
+    ieee = ieee || lieee1;
+
+    /*        Compute  RMIN by successive division by  BETA. We could compute */
+    /*        RMIN as BASE**( EMIN - 1 ),  but some machines underflow during */
+    /*        this computation. */
+
+    lrmin = 1.f;
+    i__1 = 1 - lemin;
+    for (i__ = 1; i__ <= i__1; ++i__) {
+      r__1 = lrmin * rbase;
+      lrmin = slamc3_(&r__1, &zero);
+      /* L30: */
+    }
+
+    /*        Finally, call SLAMC5 to compute EMAX and RMAX. */
+
+    slamc5_(&lbeta, &lt, &lemin, &ieee, &lemax, &lrmax);
+  }
+
+  *beta = lbeta;
+  *t = lt;
+  *rnd = lrnd;
+  *eps = leps;
+  *emin = lemin;
+  *rmin = lrmin;
+  *emax = lemax;
+  *rmax = lrmax;
+
+  /*     End of SLAMC2 */
 
 } /* slamc2_ */
 
-
 /* *********************************************************************** */
 
-doublereal slamc3_(real *a, real *b)
-{
-    /* System generated locals */
-    real ret_val;
+doublereal slamc3_(real *a, real *b) {
+  /* System generated locals */
+  real ret_val;
 
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*     .. Scalar Arguments .. */
+  /*     .. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
+  /*  Purpose */
+  /*  ======= */
 
-/*  Purpose */
-/*  ======= */
+  /*  SLAMC3  is intended to force  A  and  B  to be stored prior to doing */
+  /*  the addition of  A  and  B ,  for use in situations where optimizers */
+  /*  might hold one of these in a register. */
 
-/*  SLAMC3  is intended to force  A  and  B  to be stored prior to doing */
-/*  the addition of  A  and  B ,  for use in situations where optimizers */
-/*  might hold one of these in a register. */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Arguments */
-/*  ========= */
+  /*  A       (input) REAL */
+  /*  B       (input) REAL */
+  /*          The values A and B. */
 
-/*  A       (input) REAL */
-/*  B       (input) REAL */
-/*          The values A and B. */
+  /* ===================================================================== */
 
-/* ===================================================================== */
+  /*     .. Executable Statements .. */
 
-/*     .. Executable Statements .. */
+  ret_val = *a + *b;
 
-    ret_val = *a + *b;
+  return ret_val;
 
-    return ret_val;
-
-/*     End of SLAMC3 */
+  /*     End of SLAMC3 */
 
 } /* slamc3_ */
 
-
 /* *********************************************************************** */
 
-/* Subroutine */ int slamc4_(integer *emin, real *start, integer *base)
-{
-    /* System generated locals */
-    integer i__1;
-    real r__1;
+/* Subroutine */ void slamc4_(integer *emin, real *start, integer *base) {
+  /* System generated locals */
+  integer i__1;
+  real r__1;
 
-    /* Local variables */
-    real a;
-    integer i__;
-    real b1, b2, c1, c2, d1, d2, one, zero, rbase;
-    extern doublereal slamc3_(real *, real *);
+  /* Local variables */
+  real a;
+  integer i__;
+  real b1, b2, c1, c2, d1, d2, one, zero, rbase;
+  extern doublereal slamc3_(real *, real *);
 
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*     .. Scalar Arguments .. */
+  /*     .. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
+  /*  Purpose */
+  /*  ======= */
 
-/*  Purpose */
-/*  ======= */
+  /*  SLAMC4 is a service routine for SLAMC2. */
 
-/*  SLAMC4 is a service routine for SLAMC2. */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Arguments */
-/*  ========= */
+  /*  EMIN    (output) INTEGER */
+  /*          The minimum exponent before (gradual) underflow, computed by */
+  /*          setting A = START and dividing by BASE until the previous A */
+  /*          can not be recovered. */
 
-/*  EMIN    (output) INTEGER */
-/*          The minimum exponent before (gradual) underflow, computed by */
-/*          setting A = START and dividing by BASE until the previous A */
-/*          can not be recovered. */
+  /*  START   (input) REAL */
+  /*          The starting point for determining EMIN. */
 
-/*  START   (input) REAL */
-/*          The starting point for determining EMIN. */
+  /*  BASE    (input) INTEGER */
+  /*          The base of the machine. */
 
-/*  BASE    (input) INTEGER */
-/*          The base of the machine. */
+  /* ===================================================================== */
 
-/* ===================================================================== */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. Executable Statements .. */
-
-    a = *start;
-    one = 1.f;
-    rbase = one / *base;
-    zero = 0.f;
-    *emin = 1;
-    r__1 = a * rbase;
-    b1 = slamc3_(&r__1, &zero);
-    c1 = a;
-    c2 = a;
-    d1 = a;
-    d2 = a;
+  a = *start;
+  one = 1.f;
+  rbase = one / *base;
+  zero = 0.f;
+  *emin = 1;
+  r__1 = a * rbase;
+  b1 = slamc3_(&r__1, &zero);
+  c1 = a;
+  c2 = a;
+  d1 = a;
+  d2 = a;
 /* +    WHILE( ( C1.EQ.A ).AND.( C2.EQ.A ).AND. */
 /*    $       ( D1.EQ.A ).AND.( D2.EQ.A )      )LOOP */
 L10:
-    if (c1 == a && c2 == a && d1 == a && d2 == a) {
-	--(*emin);
-	a = b1;
-	r__1 = a / *base;
-	b1 = slamc3_(&r__1, &zero);
-	r__1 = b1 * *base;
-	c1 = slamc3_(&r__1, &zero);
-	d1 = zero;
-	i__1 = *base;
-	for (i__ = 1; i__ <= i__1; ++i__) {
-	    d1 += b1;
-/* L20: */
-	}
-	r__1 = a * rbase;
-	b2 = slamc3_(&r__1, &zero);
-	r__1 = b2 / rbase;
-	c2 = slamc3_(&r__1, &zero);
-	d2 = zero;
-	i__1 = *base;
-	for (i__ = 1; i__ <= i__1; ++i__) {
-	    d2 += b2;
-/* L30: */
-	}
-	goto L10;
+  if (c1 == a && c2 == a && d1 == a && d2 == a) {
+    --(*emin);
+    a = b1;
+    r__1 = a / *base;
+    b1 = slamc3_(&r__1, &zero);
+    r__1 = b1 * *base;
+    c1 = slamc3_(&r__1, &zero);
+    d1 = zero;
+    i__1 = *base;
+    for (i__ = 1; i__ <= i__1; ++i__) {
+      d1 += b1;
+      /* L20: */
     }
-/* +    END WHILE */
+    r__1 = a * rbase;
+    b2 = slamc3_(&r__1, &zero);
+    r__1 = b2 / rbase;
+    c2 = slamc3_(&r__1, &zero);
+    d2 = zero;
+    i__1 = *base;
+    for (i__ = 1; i__ <= i__1; ++i__) {
+      d2 += b2;
+      /* L30: */
+    }
+    goto L10;
+  }
+  /* +    END WHILE */
 
-    return 0;
-
-/*     End of SLAMC4 */
+  /*     End of SLAMC4 */
 
 } /* slamc4_ */
 
-
 /* *********************************************************************** */
 
-/* Subroutine */ int slamc5_(integer *beta, integer *p, integer *emin, 
-	logical *ieee, integer *emax, real *rmax)
-{
-    /* System generated locals */
-    integer i__1;
-    real r__1;
+/* Subroutine */ void slamc5_(integer *beta, integer *p, integer *emin, logical *ieee, integer *emax, real *rmax) {
+  /* System generated locals */
+  integer i__1;
+  real r__1;
 
-    /* Local variables */
-    integer i__;
-    real y, z__;
-    integer try__, lexp;
-    real oldy;
-    integer uexp, nbits;
-    extern doublereal slamc3_(real *, real *);
-    real recbas;
-    integer exbits, expsum;
+  /* Local variables */
+  integer i__;
+  real y, z__;
+  integer try__, lexp;
+  real oldy;
+  integer uexp, nbits;
+  extern doublereal slamc3_(real *, real *);
+  real recbas;
+  integer exbits, expsum;
 
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*     .. Scalar Arguments .. */
+  /*     .. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
+  /*  Purpose */
+  /*  ======= */
 
-/*  Purpose */
-/*  ======= */
+  /*  SLAMC5 attempts to compute RMAX, the largest machine floating-point */
+  /*  number, without overflow.  It assumes that EMAX + abs(EMIN) sum */
+  /*  approximately to a power of 2.  It will fail on machines where this */
+  /*  assumption does not hold, for example, the Cyber 205 (EMIN = -28625, */
+  /*  EMAX = 28718).  It will also fail if the value supplied for EMIN is */
+  /*  too large (i.e. too close to zero), probably with overflow. */
 
-/*  SLAMC5 attempts to compute RMAX, the largest machine floating-point */
-/*  number, without overflow.  It assumes that EMAX + abs(EMIN) sum */
-/*  approximately to a power of 2.  It will fail on machines where this */
-/*  assumption does not hold, for example, the Cyber 205 (EMIN = -28625, */
-/*  EMAX = 28718).  It will also fail if the value supplied for EMIN is */
-/*  too large (i.e. too close to zero), probably with overflow. */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Arguments */
-/*  ========= */
+  /*  BETA    (input) INTEGER */
+  /*          The base of floating-point arithmetic. */
 
-/*  BETA    (input) INTEGER */
-/*          The base of floating-point arithmetic. */
+  /*  P       (input) INTEGER */
+  /*          The number of base BETA digits in the mantissa of a */
+  /*          floating-point value. */
 
-/*  P       (input) INTEGER */
-/*          The number of base BETA digits in the mantissa of a */
-/*          floating-point value. */
+  /*  EMIN    (input) INTEGER */
+  /*          The minimum exponent before (gradual) underflow. */
 
-/*  EMIN    (input) INTEGER */
-/*          The minimum exponent before (gradual) underflow. */
+  /*  IEEE    (input) LOGICAL */
+  /*          A logical flag specifying whether or not the arithmetic */
+  /*          system is thought to comply with the IEEE standard. */
 
-/*  IEEE    (input) LOGICAL */
-/*          A logical flag specifying whether or not the arithmetic */
-/*          system is thought to comply with the IEEE standard. */
+  /*  EMAX    (output) INTEGER */
+  /*          The largest exponent before overflow */
 
-/*  EMAX    (output) INTEGER */
-/*          The largest exponent before overflow */
+  /*  RMAX    (output) REAL */
+  /*          The largest machine floating-point number. */
 
-/*  RMAX    (output) REAL */
-/*          The largest machine floating-point number. */
+  /* ===================================================================== */
 
-/* ===================================================================== */
+  /*     .. Parameters .. */
+  /*     .. */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. Intrinsic Functions .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*     .. Parameters .. */
-/*     .. */
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. Intrinsic Functions .. */
-/*     .. */
-/*     .. Executable Statements .. */
+  /*     First compute LEXP and UEXP, two powers of 2 that bound */
+  /*     abs(EMIN). We then assume that EMAX + abs(EMIN) will sum */
+  /*     approximately to the bound that is closest to abs(EMIN). */
+  /*     (EMAX is the exponent of the required number RMAX). */
 
-/*     First compute LEXP and UEXP, two powers of 2 that bound */
-/*     abs(EMIN). We then assume that EMAX + abs(EMIN) will sum */
-/*     approximately to the bound that is closest to abs(EMIN). */
-/*     (EMAX is the exponent of the required number RMAX). */
-
-    lexp = 1;
-    exbits = 1;
+  lexp = 1;
+  exbits = 1;
 L10:
-    try__ = lexp << 1;
-    if (try__ <= -(*emin)) {
-	lexp = try__;
-	++exbits;
-	goto L10;
+  try__ = lexp << 1;
+  if (try__ <= -(*emin)) {
+    lexp = try__;
+    ++exbits;
+    goto L10;
+  }
+  if (lexp == -(*emin)) {
+    uexp = lexp;
+  } else {
+    uexp = try__;
+    ++exbits;
+  }
+
+  /*     Now -LEXP is less than or equal to EMIN, and -UEXP is greater */
+  /*     than or equal to EMIN. EXBITS is the number of bits needed to */
+  /*     store the exponent. */
+
+  if (uexp + *emin > -lexp - *emin) {
+    expsum = lexp << 1;
+  } else {
+    expsum = uexp << 1;
+  }
+
+  /*     EXPSUM is the exponent range, approximately equal to */
+  /*     EMAX - EMIN + 1 . */
+
+  *emax = expsum + *emin - 1;
+  nbits = exbits + 1 + *p;
+
+  /*     NBITS is the total number of bits needed to store a */
+  /*     floating-point number. */
+
+  if (nbits % 2 == 1 && *beta == 2) {
+    /*        Either there are an odd number of bits used to store a */
+    /*        floating-point number, which is unlikely, or some bits are */
+    /*        not used in the representation of numbers, which is possible, */
+    /*        (e.g. Cray machines) or the mantissa has an implicit bit, */
+    /*        (e.g. IEEE machines, Dec Vax machines), which is perhaps the */
+    /*        most likely. We have to assume the last alternative. */
+    /*        If this is true, then we need to reduce EMAX by one because */
+    /*        there must be some way of representing zero in an implicit-bit */
+    /*        system. On machines like Cray, we are reducing EMAX by one */
+    /*        unnecessarily. */
+
+    --(*emax);
+  }
+
+  if (*ieee) {
+    /*        Assume we are on an IEEE machine which reserves one exponent */
+    /*        for infinity and NaN. */
+
+    --(*emax);
+  }
+
+  /*     Now create RMAX, the largest machine number, which should */
+  /*     be equal to (1.0 - BETA**(-P)) * BETA**EMAX . */
+
+  /*     First compute 1.0 - BETA**(-P), being careful that the */
+  /*     result is less than 1.0 . */
+
+  recbas = 1.f / *beta;
+  z__ = *beta - 1.f;
+  y = 0.f;
+  i__1 = *p;
+  for (i__ = 1; i__ <= i__1; ++i__) {
+    z__ *= recbas;
+    if (y < 1.f) {
+      oldy = y;
     }
-    if (lexp == -(*emin)) {
-	uexp = lexp;
-    } else {
-	uexp = try__;
-	++exbits;
-    }
+    y = slamc3_(&y, &z__);
+    /* L20: */
+  }
+  if (y >= 1.f) {
+    y = oldy;
+  }
 
-/*     Now -LEXP is less than or equal to EMIN, and -UEXP is greater */
-/*     than or equal to EMIN. EXBITS is the number of bits needed to */
-/*     store the exponent. */
+  /*     Now multiply by BETA**EMAX to get RMAX. */
 
-    if (uexp + *emin > -lexp - *emin) {
-	expsum = lexp << 1;
-    } else {
-	expsum = uexp << 1;
-    }
+  i__1 = *emax;
+  for (i__ = 1; i__ <= i__1; ++i__) {
+    r__1 = y * *beta;
+    y = slamc3_(&r__1, &c_b32);
+    /* L30: */
+  }
 
-/*     EXPSUM is the exponent range, approximately equal to */
-/*     EMAX - EMIN + 1 . */
+  *rmax = y;
 
-    *emax = expsum + *emin - 1;
-    nbits = exbits + 1 + *p;
-
-/*     NBITS is the total number of bits needed to store a */
-/*     floating-point number. */
-
-    if (nbits % 2 == 1 && *beta == 2) {
-
-/*        Either there are an odd number of bits used to store a */
-/*        floating-point number, which is unlikely, or some bits are */
-/*        not used in the representation of numbers, which is possible, */
-/*        (e.g. Cray machines) or the mantissa has an implicit bit, */
-/*        (e.g. IEEE machines, Dec Vax machines), which is perhaps the */
-/*        most likely. We have to assume the last alternative. */
-/*        If this is true, then we need to reduce EMAX by one because */
-/*        there must be some way of representing zero in an implicit-bit */
-/*        system. On machines like Cray, we are reducing EMAX by one */
-/*        unnecessarily. */
-
-	--(*emax);
-    }
-
-    if (*ieee) {
-
-/*        Assume we are on an IEEE machine which reserves one exponent */
-/*        for infinity and NaN. */
-
-	--(*emax);
-    }
-
-/*     Now create RMAX, the largest machine number, which should */
-/*     be equal to (1.0 - BETA**(-P)) * BETA**EMAX . */
-
-/*     First compute 1.0 - BETA**(-P), being careful that the */
-/*     result is less than 1.0 . */
-
-    recbas = 1.f / *beta;
-    z__ = *beta - 1.f;
-    y = 0.f;
-    i__1 = *p;
-    for (i__ = 1; i__ <= i__1; ++i__) {
-	z__ *= recbas;
-	if (y < 1.f) {
-	    oldy = y;
-	}
-	y = slamc3_(&y, &z__);
-/* L20: */
-    }
-    if (y >= 1.f) {
-	y = oldy;
-    }
-
-/*     Now multiply by BETA**EMAX to get RMAX. */
-
-    i__1 = *emax;
-    for (i__ = 1; i__ <= i__1; ++i__) {
-	r__1 = y * *beta;
-	y = slamc3_(&r__1, &c_b32);
-/* L30: */
-    }
-
-    *rmax = y;
-    return 0;
-
-/*     End of SLAMC5 */
+  /*     End of SLAMC5 */
 
 } /* slamc5_ */
diff --git a/lapack/slapy2.c b/lapack/slapy2.c
index e048cac..63293cd 100644
--- a/lapack/slapy2.c
+++ b/lapack/slapy2.c
@@ -10,8 +10,8 @@
 		http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
 doublereal slapy2_(real *x, real *y)
 {
diff --git a/lapack/slapy3.c b/lapack/slapy3.c
index 921a2c4..3e352a4 100644
--- a/lapack/slapy3.c
+++ b/lapack/slapy3.c
@@ -10,8 +10,8 @@
 		http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
 doublereal slapy3_(real *x, real *y, real *z__)
 {
diff --git a/lapack/slarf.c b/lapack/slarf.c
index dbef082..66133ba 100644
--- a/lapack/slarf.c
+++ b/lapack/slarf.c
@@ -1,17 +1,17 @@
 /* slarf.f -- translated by f2c (version 20061008).
    You must link the resulting object file with libf2c:
-	on Microsoft Windows system, link with libf2c.lib;
-	on Linux or Unix systems, link with .../path/to/libf2c.a -lm
-	or, if you install libf2c.a in a standard place, with -lf2c -lm
-	-- in that order, at the end of the command line, as in
-		cc *.o -lf2c -lm
-	Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
+        on Microsoft Windows system, link with libf2c.lib;
+        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
+        or, if you install libf2c.a in a standard place, with -lf2c -lm
+        -- in that order, at the end of the command line, as in
+                cc *.o -lf2c -lm
+        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
 
-		http://www.netlib.org/f2c/libf2c.zip
+                http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
 /* Table of constant values */
 
@@ -19,173 +19,162 @@
 static real c_b5 = 0.f;
 static integer c__1 = 1;
 
-/* Subroutine */ int slarf_(char *side, integer *m, integer *n, real *v, 
-	integer *incv, real *tau, real *c__, integer *ldc, real *work)
-{
-    /* System generated locals */
-    integer c_dim1, c_offset;
-    real r__1;
+/* Subroutine */ void slarf_(char *side, integer *m, integer *n, real *v, integer *incv, real *tau, real *c__,
+                             integer *ldc, real *work) {
+  /* System generated locals */
+  integer c_dim1, c_offset;
+  real r__1;
 
-    /* Local variables */
-    integer i__;
-    logical applyleft;
-    extern /* Subroutine */ int sger_(integer *, integer *, real *, real *, 
-	    integer *, real *, integer *, real *, integer *);
-    extern logical lsame_(char *, char *);
-    integer lastc;
-    extern /* Subroutine */ int sgemv_(char *, integer *, integer *, real *, 
-	    real *, integer *, real *, integer *, real *, real *, integer *);
-    integer lastv;
-    extern integer ilaslc_(integer *, integer *, real *, integer *), ilaslr_(
-	    integer *, integer *, real *, integer *);
+  /* Local variables */
+  integer i__;
+  logical applyleft;
+  extern /* Subroutine */ void sger_(integer *, integer *, real *, real *, integer *, real *, integer *, real *,
+                                     integer *);
+  extern logical lsame_(char *, char *);
+  integer lastc;
+  extern /* Subroutine */ void sgemv_(const char *, const integer *, const integer *, const real *, const real *,
+                                      const integer *, const real *, const integer *, const real *, real *,
+                                      const integer *);
+  integer lastv;
+  extern integer ilaslc_(integer *, integer *, real *, integer *), ilaslr_(integer *, integer *, real *, integer *);
 
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*     .. Scalar Arguments .. */
+  /*     .. */
+  /*     .. Array Arguments .. */
+  /*     .. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
-/*     .. Array Arguments .. */
-/*     .. */
+  /*  Purpose */
+  /*  ======= */
 
-/*  Purpose */
-/*  ======= */
+  /*  SLARF applies a real elementary reflector H to a real m by n matrix */
+  /*  C, from either the left or the right. H is represented in the form */
 
-/*  SLARF applies a real elementary reflector H to a real m by n matrix */
-/*  C, from either the left or the right. H is represented in the form */
+  /*        H = I - tau * v * v' */
 
-/*        H = I - tau * v * v' */
+  /*  where tau is a real scalar and v is a real vector. */
 
-/*  where tau is a real scalar and v is a real vector. */
+  /*  If tau = 0, then H is taken to be the unit matrix. */
 
-/*  If tau = 0, then H is taken to be the unit matrix. */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Arguments */
-/*  ========= */
+  /*  SIDE    (input) CHARACTER*1 */
+  /*          = 'L': form  H * C */
+  /*          = 'R': form  C * H */
 
-/*  SIDE    (input) CHARACTER*1 */
-/*          = 'L': form  H * C */
-/*          = 'R': form  C * H */
+  /*  M       (input) INTEGER */
+  /*          The number of rows of the matrix C. */
 
-/*  M       (input) INTEGER */
-/*          The number of rows of the matrix C. */
+  /*  N       (input) INTEGER */
+  /*          The number of columns of the matrix C. */
 
-/*  N       (input) INTEGER */
-/*          The number of columns of the matrix C. */
+  /*  V       (input) REAL array, dimension */
+  /*                     (1 + (M-1)*abs(INCV)) if SIDE = 'L' */
+  /*                  or (1 + (N-1)*abs(INCV)) if SIDE = 'R' */
+  /*          The vector v in the representation of H. V is not used if */
+  /*          TAU = 0. */
 
-/*  V       (input) REAL array, dimension */
-/*                     (1 + (M-1)*abs(INCV)) if SIDE = 'L' */
-/*                  or (1 + (N-1)*abs(INCV)) if SIDE = 'R' */
-/*          The vector v in the representation of H. V is not used if */
-/*          TAU = 0. */
+  /*  INCV    (input) INTEGER */
+  /*          The increment between elements of v. INCV <> 0. */
 
-/*  INCV    (input) INTEGER */
-/*          The increment between elements of v. INCV <> 0. */
+  /*  TAU     (input) REAL */
+  /*          The value tau in the representation of H. */
 
-/*  TAU     (input) REAL */
-/*          The value tau in the representation of H. */
+  /*  C       (input/output) REAL array, dimension (LDC,N) */
+  /*          On entry, the m by n matrix C. */
+  /*          On exit, C is overwritten by the matrix H * C if SIDE = 'L', */
+  /*          or C * H if SIDE = 'R'. */
 
-/*  C       (input/output) REAL array, dimension (LDC,N) */
-/*          On entry, the m by n matrix C. */
-/*          On exit, C is overwritten by the matrix H * C if SIDE = 'L', */
-/*          or C * H if SIDE = 'R'. */
+  /*  LDC     (input) INTEGER */
+  /*          The leading dimension of the array C. LDC >= max(1,M). */
 
-/*  LDC     (input) INTEGER */
-/*          The leading dimension of the array C. LDC >= max(1,M). */
+  /*  WORK    (workspace) REAL array, dimension */
+  /*                         (N) if SIDE = 'L' */
+  /*                      or (M) if SIDE = 'R' */
 
-/*  WORK    (workspace) REAL array, dimension */
-/*                         (N) if SIDE = 'L' */
-/*                      or (M) if SIDE = 'R' */
+  /*  ===================================================================== */
 
-/*  ===================================================================== */
+  /*     .. Parameters .. */
+  /*     .. */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Subroutines .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*     .. Parameters .. */
-/*     .. */
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Subroutines .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. Executable Statements .. */
+  /* Parameter adjustments */
+  --v;
+  c_dim1 = *ldc;
+  c_offset = 1 + c_dim1;
+  c__ -= c_offset;
+  --work;
 
-    /* Parameter adjustments */
-    --v;
-    c_dim1 = *ldc;
-    c_offset = 1 + c_dim1;
-    c__ -= c_offset;
-    --work;
-
-    /* Function Body */
-    applyleft = lsame_(side, "L");
-    lastv = 0;
-    lastc = 0;
-    if (*tau != 0.f) {
-/*     Set up variables for scanning V.  LASTV begins pointing to the end */
-/*     of V. */
-	if (applyleft) {
-	    lastv = *m;
-	} else {
-	    lastv = *n;
-	}
-	if (*incv > 0) {
-	    i__ = (lastv - 1) * *incv + 1;
-	} else {
-	    i__ = 1;
-	}
-/*     Look for the last non-zero row in V. */
-	while(lastv > 0 && v[i__] == 0.f) {
-	    --lastv;
-	    i__ -= *incv;
-	}
-	if (applyleft) {
-/*     Scan for the last non-zero column in C(1:lastv,:). */
-	    lastc = ilaslc_(&lastv, n, &c__[c_offset], ldc);
-	} else {
-/*     Scan for the last non-zero row in C(:,1:lastv). */
-	    lastc = ilaslr_(m, &lastv, &c__[c_offset], ldc);
-	}
-    }
-/*     Note that lastc.eq.0 renders the BLAS operations null; no special */
-/*     case is needed at this level. */
+  /* Function Body */
+  applyleft = lsame_(side, "L");
+  lastv = 0;
+  lastc = 0;
+  if (*tau != 0.f) {
+    /*     Set up variables for scanning V.  LASTV begins pointing to the end */
+    /*     of V. */
     if (applyleft) {
-
-/*        Form  H * C */
-
-	if (lastv > 0) {
-
-/*           w(1:lastc,1) := C(1:lastv,1:lastc)' * v(1:lastv,1) */
-
-	    sgemv_("Transpose", &lastv, &lastc, &c_b4, &c__[c_offset], ldc, &
-		    v[1], incv, &c_b5, &work[1], &c__1);
-
-/*           C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)' */
-
-	    r__1 = -(*tau);
-	    sger_(&lastv, &lastc, &r__1, &v[1], incv, &work[1], &c__1, &c__[
-		    c_offset], ldc);
-	}
+      lastv = *m;
     } else {
-
-/*        Form  C * H */
-
-	if (lastv > 0) {
-
-/*           w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) */
-
-	    sgemv_("No transpose", &lastc, &lastv, &c_b4, &c__[c_offset], ldc, 
-		     &v[1], incv, &c_b5, &work[1], &c__1);
-
-/*           C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)' */
-
-	    r__1 = -(*tau);
-	    sger_(&lastc, &lastv, &r__1, &work[1], &c__1, &v[1], incv, &c__[
-		    c_offset], ldc);
-	}
+      lastv = *n;
     }
-    return 0;
+    if (*incv > 0) {
+      i__ = (lastv - 1) * *incv + 1;
+    } else {
+      i__ = 1;
+    }
+    /*     Look for the last non-zero row in V. */
+    while (lastv > 0 && v[i__] == 0.f) {
+      --lastv;
+      i__ -= *incv;
+    }
+    if (applyleft) {
+      /*     Scan for the last non-zero column in C(1:lastv,:). */
+      lastc = ilaslc_(&lastv, n, &c__[c_offset], ldc);
+    } else {
+      /*     Scan for the last non-zero row in C(:,1:lastv). */
+      lastc = ilaslr_(m, &lastv, &c__[c_offset], ldc);
+    }
+  }
+  /*     Note that lastc.eq.0 renders the BLAS operations null; no special */
+  /*     case is needed at this level. */
+  if (applyleft) {
+    /*        Form  H * C */
 
-/*     End of SLARF */
+    if (lastv > 0) {
+      /*           w(1:lastc,1) := C(1:lastv,1:lastc)' * v(1:lastv,1) */
+
+      sgemv_("Transpose", &lastv, &lastc, &c_b4, &c__[c_offset], ldc, &v[1], incv, &c_b5, &work[1], &c__1);
+
+      /*           C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)' */
+
+      r__1 = -(*tau);
+      sger_(&lastv, &lastc, &r__1, &v[1], incv, &work[1], &c__1, &c__[c_offset], ldc);
+    }
+  } else {
+    /*        Form  C * H */
+
+    if (lastv > 0) {
+      /*           w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) */
+
+      sgemv_("No transpose", &lastc, &lastv, &c_b4, &c__[c_offset], ldc, &v[1], incv, &c_b5, &work[1], &c__1);
+
+      /*           C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)' */
+
+      r__1 = -(*tau);
+      sger_(&lastc, &lastv, &r__1, &work[1], &c__1, &v[1], incv, &c__[c_offset], ldc);
+    }
+  }
+
+  /*     End of SLARF */
 
 } /* slarf_ */
diff --git a/lapack/slarfb.c b/lapack/slarfb.c
index 3c8030a..95364b2 100644
--- a/lapack/slarfb.c
+++ b/lapack/slarfb.c
@@ -1,17 +1,17 @@
 /* slarfb.f -- translated by f2c (version 20061008).
    You must link the resulting object file with libf2c:
-	on Microsoft Windows system, link with libf2c.lib;
-	on Linux or Unix systems, link with .../path/to/libf2c.a -lm
-	or, if you install libf2c.a in a standard place, with -lf2c -lm
-	-- in that order, at the end of the command line, as in
-		cc *.o -lf2c -lm
-	Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
+        on Microsoft Windows system, link with libf2c.lib;
+        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
+        or, if you install libf2c.a in a standard place, with -lf2c -lm
+        -- in that order, at the end of the command line, as in
+                cc *.o -lf2c -lm
+        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
 
-		http://www.netlib.org/f2c/libf2c.zip
+                http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
 /* Table of constant values */
 
@@ -19,755 +19,661 @@
 static real c_b14 = 1.f;
 static real c_b25 = -1.f;
 
-/* Subroutine */ int slarfb_(char *side, char *trans, char *direct, char *
-	storev, integer *m, integer *n, integer *k, real *v, integer *ldv, 
-	real *t, integer *ldt, real *c__, integer *ldc, real *work, integer *
-	ldwork)
-{
-    /* System generated locals */
-    integer c_dim1, c_offset, t_dim1, t_offset, v_dim1, v_offset, work_dim1, 
-	    work_offset, i__1, i__2;
+/* Subroutine */ void slarfb_(char *side, char *trans, char *direct, char *storev, integer *m, integer *n, integer *k,
+                              real *v, integer *ldv, real *t, integer *ldt, real *c__, integer *ldc, real *work,
+                              integer *ldwork) {
+  /* System generated locals */
+  integer c_dim1, c_offset, t_dim1, t_offset, v_dim1, v_offset, work_dim1, work_offset, i__1, i__2;
 
-    /* Local variables */
-    integer i__, j;
-    extern logical lsame_(char *, char *);
-    integer lastc;
-    extern /* Subroutine */ int sgemm_(char *, char *, integer *, integer *, 
-	    integer *, real *, real *, integer *, real *, integer *, real *, 
-	    real *, integer *);
-    integer lastv;
-    extern /* Subroutine */ int scopy_(integer *, real *, integer *, real *, 
-	    integer *), strmm_(char *, char *, char *, char *, integer *, 
-	    integer *, real *, real *, integer *, real *, integer *);
-    extern integer ilaslc_(integer *, integer *, real *, integer *), ilaslr_(
-	    integer *, integer *, real *, integer *);
-    char transt[1];
+  /* Local variables */
+  integer i__, j;
+  extern logical lsame_(char *, char *);
+  integer lastc;
+  extern /* Subroutine */ void sgemm_(const char *, const char *, const integer *, const integer *, const integer *,
+                                      const real *, const real *, const integer *, const real *, const integer *,
+                                      const real *, real *, const integer *);
+  integer lastv;
+  extern /* Subroutine */ void scopy_(integer *, real *, integer *, real *, integer *),
+      strmm_(const char *, const char *, const char *, const char *, const integer *, const integer *, const real *,
+             const real *, const integer *, real *, const integer *);
+  extern integer ilaslc_(integer *, integer *, real *, integer *), ilaslr_(integer *, integer *, real *, integer *);
+  char transt[1];
 
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*     .. Scalar Arguments .. */
+  /*     .. */
+  /*     .. Array Arguments .. */
+  /*     .. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
-/*     .. Array Arguments .. */
-/*     .. */
+  /*  Purpose */
+  /*  ======= */
 
-/*  Purpose */
-/*  ======= */
+  /*  SLARFB applies a real block reflector H or its transpose H' to a */
+  /*  real m by n matrix C, from either the left or the right. */
 
-/*  SLARFB applies a real block reflector H or its transpose H' to a */
-/*  real m by n matrix C, from either the left or the right. */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Arguments */
-/*  ========= */
+  /*  SIDE    (input) CHARACTER*1 */
+  /*          = 'L': apply H or H' from the Left */
+  /*          = 'R': apply H or H' from the Right */
 
-/*  SIDE    (input) CHARACTER*1 */
-/*          = 'L': apply H or H' from the Left */
-/*          = 'R': apply H or H' from the Right */
+  /*  TRANS   (input) CHARACTER*1 */
+  /*          = 'N': apply H (No transpose) */
+  /*          = 'T': apply H' (Transpose) */
 
-/*  TRANS   (input) CHARACTER*1 */
-/*          = 'N': apply H (No transpose) */
-/*          = 'T': apply H' (Transpose) */
+  /*  DIRECT  (input) CHARACTER*1 */
+  /*          Indicates how H is formed from a product of elementary */
+  /*          reflectors */
+  /*          = 'F': H = H(1) H(2) . . . H(k) (Forward) */
+  /*          = 'B': H = H(k) . . . H(2) H(1) (Backward) */
 
-/*  DIRECT  (input) CHARACTER*1 */
-/*          Indicates how H is formed from a product of elementary */
-/*          reflectors */
-/*          = 'F': H = H(1) H(2) . . . H(k) (Forward) */
-/*          = 'B': H = H(k) . . . H(2) H(1) (Backward) */
+  /*  STOREV  (input) CHARACTER*1 */
+  /*          Indicates how the vectors which define the elementary */
+  /*          reflectors are stored: */
+  /*          = 'C': Columnwise */
+  /*          = 'R': Rowwise */
 
-/*  STOREV  (input) CHARACTER*1 */
-/*          Indicates how the vectors which define the elementary */
-/*          reflectors are stored: */
-/*          = 'C': Columnwise */
-/*          = 'R': Rowwise */
+  /*  M       (input) INTEGER */
+  /*          The number of rows of the matrix C. */
 
-/*  M       (input) INTEGER */
-/*          The number of rows of the matrix C. */
+  /*  N       (input) INTEGER */
+  /*          The number of columns of the matrix C. */
 
-/*  N       (input) INTEGER */
-/*          The number of columns of the matrix C. */
+  /*  K       (input) INTEGER */
+  /*          The order of the matrix T (= the number of elementary */
+  /*          reflectors whose product defines the block reflector). */
 
-/*  K       (input) INTEGER */
-/*          The order of the matrix T (= the number of elementary */
-/*          reflectors whose product defines the block reflector). */
+  /*  V       (input) REAL array, dimension */
+  /*                                (LDV,K) if STOREV = 'C' */
+  /*                                (LDV,M) if STOREV = 'R' and SIDE = 'L' */
+  /*                                (LDV,N) if STOREV = 'R' and SIDE = 'R' */
+  /*          The matrix V. See further details. */
 
-/*  V       (input) REAL array, dimension */
-/*                                (LDV,K) if STOREV = 'C' */
-/*                                (LDV,M) if STOREV = 'R' and SIDE = 'L' */
-/*                                (LDV,N) if STOREV = 'R' and SIDE = 'R' */
-/*          The matrix V. See further details. */
+  /*  LDV     (input) INTEGER */
+  /*          The leading dimension of the array V. */
+  /*          If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); */
+  /*          if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); */
+  /*          if STOREV = 'R', LDV >= K. */
 
-/*  LDV     (input) INTEGER */
-/*          The leading dimension of the array V. */
-/*          If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); */
-/*          if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); */
-/*          if STOREV = 'R', LDV >= K. */
+  /*  T       (input) REAL array, dimension (LDT,K) */
+  /*          The triangular k by k matrix T in the representation of the */
+  /*          block reflector. */
 
-/*  T       (input) REAL array, dimension (LDT,K) */
-/*          The triangular k by k matrix T in the representation of the */
-/*          block reflector. */
+  /*  LDT     (input) INTEGER */
+  /*          The leading dimension of the array T. LDT >= K. */
 
-/*  LDT     (input) INTEGER */
-/*          The leading dimension of the array T. LDT >= K. */
+  /*  C       (input/output) REAL array, dimension (LDC,N) */
+  /*          On entry, the m by n matrix C. */
+  /*          On exit, C is overwritten by H*C or H'*C or C*H or C*H'. */
 
-/*  C       (input/output) REAL array, dimension (LDC,N) */
-/*          On entry, the m by n matrix C. */
-/*          On exit, C is overwritten by H*C or H'*C or C*H or C*H'. */
+  /*  LDC     (input) INTEGER */
+  /*          The leading dimension of the array C. LDA >= max(1,M). */
 
-/*  LDC     (input) INTEGER */
-/*          The leading dimension of the array C. LDA >= max(1,M). */
+  /*  WORK    (workspace) REAL array, dimension (LDWORK,K) */
 
-/*  WORK    (workspace) REAL array, dimension (LDWORK,K) */
+  /*  LDWORK  (input) INTEGER */
+  /*          The leading dimension of the array WORK. */
+  /*          If SIDE = 'L', LDWORK >= max(1,N); */
+  /*          if SIDE = 'R', LDWORK >= max(1,M). */
 
-/*  LDWORK  (input) INTEGER */
-/*          The leading dimension of the array WORK. */
-/*          If SIDE = 'L', LDWORK >= max(1,N); */
-/*          if SIDE = 'R', LDWORK >= max(1,M). */
+  /*  ===================================================================== */
 
-/*  ===================================================================== */
+  /*     .. Parameters .. */
+  /*     .. */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. External Subroutines .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*     .. Parameters .. */
-/*     .. */
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. External Subroutines .. */
-/*     .. */
-/*     .. Executable Statements .. */
+  /*     Quick return if possible */
 
-/*     Quick return if possible */
+  /* Parameter adjustments */
+  v_dim1 = *ldv;
+  v_offset = 1 + v_dim1;
+  v -= v_offset;
+  t_dim1 = *ldt;
+  t_offset = 1 + t_dim1;
+  t -= t_offset;
+  c_dim1 = *ldc;
+  c_offset = 1 + c_dim1;
+  c__ -= c_offset;
+  work_dim1 = *ldwork;
+  work_offset = 1 + work_dim1;
+  work -= work_offset;
 
-    /* Parameter adjustments */
-    v_dim1 = *ldv;
-    v_offset = 1 + v_dim1;
-    v -= v_offset;
-    t_dim1 = *ldt;
-    t_offset = 1 + t_dim1;
-    t -= t_offset;
-    c_dim1 = *ldc;
-    c_offset = 1 + c_dim1;
-    c__ -= c_offset;
-    work_dim1 = *ldwork;
-    work_offset = 1 + work_dim1;
-    work -= work_offset;
+  /* Function Body */
+  if (*m <= 0 || *n <= 0) {
+    return;
+  }
 
-    /* Function Body */
-    if (*m <= 0 || *n <= 0) {
-	return 0;
-    }
+  if (lsame_(trans, "N")) {
+    *(unsigned char *)transt = 'T';
+  } else {
+    *(unsigned char *)transt = 'N';
+  }
 
-    if (lsame_(trans, "N")) {
-	*(unsigned char *)transt = 'T';
+  if (lsame_(storev, "C")) {
+    if (lsame_(direct, "F")) {
+      /*           Let  V =  ( V1 )    (first K rows) */
+      /*                     ( V2 ) */
+      /*           where  V1  is unit lower triangular. */
+
+      if (lsame_(side, "L")) {
+        /*              Form  H * C  or  H' * C  where  C = ( C1 ) */
+        /*                                                  ( C2 ) */
+
+        /* Computing MAX */
+        i__1 = *k, i__2 = ilaslr_(m, k, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = ilaslc_(&lastv, n, &c__[c_offset], ldc);
+
+        /*              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK) */
+
+        /*              W := C1' */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          scopy_(&lastc, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1);
+          /* L10: */
+        }
+
+        /*              W := W * V1 */
+
+        strmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &c_b14, &v[v_offset], ldv, &work[work_offset],
+               ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C2'*V2 */
+
+          i__1 = lastv - *k;
+          sgemm_("Transpose", "No transpose", &lastc, k, &i__1, &c_b14, &c__[*k + 1 + c_dim1], ldc, &v[*k + 1 + v_dim1],
+                 ldv, &c_b14, &work[work_offset], ldwork);
+        }
+
+        /*              W := W * T'  or  W * T */
+
+        strmm_("Right", "Upper", transt, "Non-unit", &lastc, k, &c_b14, &t[t_offset], ldt, &work[work_offset], ldwork);
+
+        /*              C := C - V * W' */
+
+        if (lastv > *k) {
+          /*                 C2 := C2 - V2 * W' */
+
+          i__1 = lastv - *k;
+          sgemm_("No transpose", "Transpose", &i__1, &lastc, k, &c_b25, &v[*k + 1 + v_dim1], ldv, &work[work_offset],
+                 ldwork, &c_b14, &c__[*k + 1 + c_dim1], ldc);
+        }
+
+        /*              W := W * V1' */
+
+        strmm_("Right", "Lower", "Transpose", "Unit", &lastc, k, &c_b14, &v[v_offset], ldv, &work[work_offset], ldwork);
+
+        /*              C1 := C1 - W' */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            c__[j + i__ * c_dim1] -= work[i__ + j * work_dim1];
+            /* L20: */
+          }
+          /* L30: */
+        }
+
+      } else if (lsame_(side, "R")) {
+        /*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
+
+        /* Computing MAX */
+        i__1 = *k, i__2 = ilaslr_(n, k, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = ilaslr_(m, &lastv, &c__[c_offset], ldc);
+
+        /*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK) */
+
+        /*              W := C1 */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          scopy_(&lastc, &c__[j * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1);
+          /* L40: */
+        }
+
+        /*              W := W * V1 */
+
+        strmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &c_b14, &v[v_offset], ldv, &work[work_offset],
+               ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C2 * V2 */
+
+          i__1 = lastv - *k;
+          sgemm_("No transpose", "No transpose", &lastc, k, &i__1, &c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc,
+                 &v[*k + 1 + v_dim1], ldv, &c_b14, &work[work_offset], ldwork);
+        }
+
+        /*              W := W * T  or  W * T' */
+
+        strmm_("Right", "Upper", trans, "Non-unit", &lastc, k, &c_b14, &t[t_offset], ldt, &work[work_offset], ldwork);
+
+        /*              C := C - W * V' */
+
+        if (lastv > *k) {
+          /*                 C2 := C2 - W * V2' */
+
+          i__1 = lastv - *k;
+          sgemm_("No transpose", "Transpose", &lastc, &i__1, k, &c_b25, &work[work_offset], ldwork, &v[*k + 1 + v_dim1],
+                 ldv, &c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc);
+        }
+
+        /*              W := W * V1' */
+
+        strmm_("Right", "Lower", "Transpose", "Unit", &lastc, k, &c_b14, &v[v_offset], ldv, &work[work_offset], ldwork);
+
+        /*              C1 := C1 - W */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            c__[i__ + j * c_dim1] -= work[i__ + j * work_dim1];
+            /* L50: */
+          }
+          /* L60: */
+        }
+      }
+
     } else {
-	*(unsigned char *)transt = 'N';
+      /*           Let  V =  ( V1 ) */
+      /*                     ( V2 )    (last K rows) */
+      /*           where  V2  is unit upper triangular. */
+
+      if (lsame_(side, "L")) {
+        /*              Form  H * C  or  H' * C  where  C = ( C1 ) */
+        /*                                                  ( C2 ) */
+
+        /* Computing MAX */
+        i__1 = *k, i__2 = ilaslr_(m, k, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = ilaslc_(&lastv, n, &c__[c_offset], ldc);
+
+        /*              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK) */
+
+        /*              W := C2' */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          scopy_(&lastc, &c__[lastv - *k + j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1);
+          /* L70: */
+        }
+
+        /*              W := W * V2 */
+
+        strmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &c_b14, &v[lastv - *k + 1 + v_dim1], ldv,
+               &work[work_offset], ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C1'*V1 */
+
+          i__1 = lastv - *k;
+          sgemm_("Transpose", "No transpose", &lastc, k, &i__1, &c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, &c_b14,
+                 &work[work_offset], ldwork);
+        }
+
+        /*              W := W * T'  or  W * T */
+
+        strmm_("Right", "Lower", transt, "Non-unit", &lastc, k, &c_b14, &t[t_offset], ldt, &work[work_offset], ldwork);
+
+        /*              C := C - V * W' */
+
+        if (lastv > *k) {
+          /*                 C1 := C1 - V1 * W' */
+
+          i__1 = lastv - *k;
+          sgemm_("No transpose", "Transpose", &i__1, &lastc, k, &c_b25, &v[v_offset], ldv, &work[work_offset], ldwork,
+                 &c_b14, &c__[c_offset], ldc);
+        }
+
+        /*              W := W * V2' */
+
+        strmm_("Right", "Upper", "Transpose", "Unit", &lastc, k, &c_b14, &v[lastv - *k + 1 + v_dim1], ldv,
+               &work[work_offset], ldwork);
+
+        /*              C2 := C2 - W' */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            c__[lastv - *k + j + i__ * c_dim1] -= work[i__ + j * work_dim1];
+            /* L80: */
+          }
+          /* L90: */
+        }
+
+      } else if (lsame_(side, "R")) {
+        /*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
+
+        /* Computing MAX */
+        i__1 = *k, i__2 = ilaslr_(n, k, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = ilaslr_(m, &lastv, &c__[c_offset], ldc);
+
+        /*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK) */
+
+        /*              W := C2 */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          scopy_(&lastc, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1);
+          /* L100: */
+        }
+
+        /*              W := W * V2 */
+
+        strmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &c_b14, &v[lastv - *k + 1 + v_dim1], ldv,
+               &work[work_offset], ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C1 * V1 */
+
+          i__1 = lastv - *k;
+          sgemm_("No transpose", "No transpose", &lastc, k, &i__1, &c_b14, &c__[c_offset], ldc, &v[v_offset], ldv,
+                 &c_b14, &work[work_offset], ldwork);
+        }
+
+        /*              W := W * T  or  W * T' */
+
+        strmm_("Right", "Lower", trans, "Non-unit", &lastc, k, &c_b14, &t[t_offset], ldt, &work[work_offset], ldwork);
+
+        /*              C := C - W * V' */
+
+        if (lastv > *k) {
+          /*                 C1 := C1 - W * V1' */
+
+          i__1 = lastv - *k;
+          sgemm_("No transpose", "Transpose", &lastc, &i__1, k, &c_b25, &work[work_offset], ldwork, &v[v_offset], ldv,
+                 &c_b14, &c__[c_offset], ldc);
+        }
+
+        /*              W := W * V2' */
+
+        strmm_("Right", "Upper", "Transpose", "Unit", &lastc, k, &c_b14, &v[lastv - *k + 1 + v_dim1], ldv,
+               &work[work_offset], ldwork);
+
+        /*              C2 := C2 - W */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            c__[i__ + (lastv - *k + j) * c_dim1] -= work[i__ + j * work_dim1];
+            /* L110: */
+          }
+          /* L120: */
+        }
+      }
     }
 
-    if (lsame_(storev, "C")) {
+  } else if (lsame_(storev, "R")) {
+    if (lsame_(direct, "F")) {
+      /*           Let  V =  ( V1  V2 )    (V1: first K columns) */
+      /*           where  V1  is unit upper triangular. */
 
-	if (lsame_(direct, "F")) {
+      if (lsame_(side, "L")) {
+        /*              Form  H * C  or  H' * C  where  C = ( C1 ) */
+        /*                                                  ( C2 ) */
 
-/*           Let  V =  ( V1 )    (first K rows) */
-/*                     ( V2 ) */
-/*           where  V1  is unit lower triangular. */
+        /* Computing MAX */
+        i__1 = *k, i__2 = ilaslc_(k, m, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = ilaslc_(&lastv, n, &c__[c_offset], ldc);
 
-	    if (lsame_(side, "L")) {
+        /*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK) */
 
-/*              Form  H * C  or  H' * C  where  C = ( C1 ) */
-/*                                                  ( C2 ) */
+        /*              W := C1' */
 
-/* Computing MAX */
-		i__1 = *k, i__2 = ilaslr_(m, k, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = ilaslc_(&lastv, n, &c__[c_offset], ldc);
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          scopy_(&lastc, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1);
+          /* L130: */
+        }
 
-/*              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK) */
+        /*              W := W * V1' */
 
-/*              W := C1' */
+        strmm_("Right", "Upper", "Transpose", "Unit", &lastc, k, &c_b14, &v[v_offset], ldv, &work[work_offset], ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C2'*V2' */
 
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    scopy_(&lastc, &c__[j + c_dim1], ldc, &work[j * work_dim1 
-			    + 1], &c__1);
-/* L10: */
-		}
+          i__1 = lastv - *k;
+          sgemm_("Transpose", "Transpose", &lastc, k, &i__1, &c_b14, &c__[*k + 1 + c_dim1], ldc,
+                 &v[(*k + 1) * v_dim1 + 1], ldv, &c_b14, &work[work_offset], ldwork);
+        }
 
-/*              W := W * V1 */
+        /*              W := W * T'  or  W * T */
 
-		strmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &
-			c_b14, &v[v_offset], ldv, &work[work_offset], ldwork);
-		if (lastv > *k) {
+        strmm_("Right", "Upper", transt, "Non-unit", &lastc, k, &c_b14, &t[t_offset], ldt, &work[work_offset], ldwork);
 
-/*                 W := W + C2'*V2 */
+        /*              C := C - V' * W' */
 
-		    i__1 = lastv - *k;
-		    sgemm_("Transpose", "No transpose", &lastc, k, &i__1, &
-			    c_b14, &c__[*k + 1 + c_dim1], ldc, &v[*k + 1 + 
-			    v_dim1], ldv, &c_b14, &work[work_offset], ldwork);
-		}
+        if (lastv > *k) {
+          /*                 C2 := C2 - V2' * W' */
 
-/*              W := W * T'  or  W * T */
+          i__1 = lastv - *k;
+          sgemm_("Transpose", "Transpose", &i__1, &lastc, k, &c_b25, &v[(*k + 1) * v_dim1 + 1], ldv, &work[work_offset],
+                 ldwork, &c_b14, &c__[*k + 1 + c_dim1], ldc);
+        }
 
-		strmm_("Right", "Upper", transt, "Non-unit", &lastc, k, &
-			c_b14, &t[t_offset], ldt, &work[work_offset], ldwork);
+        /*              W := W * V1 */
 
-/*              C := C - V * W' */
+        strmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &c_b14, &v[v_offset], ldv, &work[work_offset],
+               ldwork);
 
-		if (lastv > *k) {
+        /*              C1 := C1 - W' */
 
-/*                 C2 := C2 - V2 * W' */
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            c__[j + i__ * c_dim1] -= work[i__ + j * work_dim1];
+            /* L140: */
+          }
+          /* L150: */
+        }
 
-		    i__1 = lastv - *k;
-		    sgemm_("No transpose", "Transpose", &i__1, &lastc, k, &
-			    c_b25, &v[*k + 1 + v_dim1], ldv, &work[
-			    work_offset], ldwork, &c_b14, &c__[*k + 1 + 
-			    c_dim1], ldc);
-		}
+      } else if (lsame_(side, "R")) {
+        /*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
 
-/*              W := W * V1' */
+        /* Computing MAX */
+        i__1 = *k, i__2 = ilaslc_(k, n, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = ilaslr_(m, &lastv, &c__[c_offset], ldc);
 
-		strmm_("Right", "Lower", "Transpose", "Unit", &lastc, k, &
-			c_b14, &v[v_offset], ldv, &work[work_offset], ldwork);
+        /*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK) */
 
-/*              C1 := C1 - W' */
+        /*              W := C1 */
 
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			c__[j + i__ * c_dim1] -= work[i__ + j * work_dim1];
-/* L20: */
-		    }
-/* L30: */
-		}
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          scopy_(&lastc, &c__[j * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1);
+          /* L160: */
+        }
 
-	    } else if (lsame_(side, "R")) {
+        /*              W := W * V1' */
 
-/*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
+        strmm_("Right", "Upper", "Transpose", "Unit", &lastc, k, &c_b14, &v[v_offset], ldv, &work[work_offset], ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C2 * V2' */
 
-/* Computing MAX */
-		i__1 = *k, i__2 = ilaslr_(n, k, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = ilaslr_(m, &lastv, &c__[c_offset], ldc);
+          i__1 = lastv - *k;
+          sgemm_("No transpose", "Transpose", &lastc, k, &i__1, &c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc,
+                 &v[(*k + 1) * v_dim1 + 1], ldv, &c_b14, &work[work_offset], ldwork);
+        }
 
-/*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK) */
+        /*              W := W * T  or  W * T' */
 
-/*              W := C1 */
+        strmm_("Right", "Upper", trans, "Non-unit", &lastc, k, &c_b14, &t[t_offset], ldt, &work[work_offset], ldwork);
 
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    scopy_(&lastc, &c__[j * c_dim1 + 1], &c__1, &work[j * 
-			    work_dim1 + 1], &c__1);
-/* L40: */
-		}
+        /*              C := C - W * V */
 
-/*              W := W * V1 */
+        if (lastv > *k) {
+          /*                 C2 := C2 - W * V2 */
 
-		strmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &
-			c_b14, &v[v_offset], ldv, &work[work_offset], ldwork);
-		if (lastv > *k) {
+          i__1 = lastv - *k;
+          sgemm_("No transpose", "No transpose", &lastc, &i__1, k, &c_b25, &work[work_offset], ldwork,
+                 &v[(*k + 1) * v_dim1 + 1], ldv, &c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc);
+        }
 
-/*                 W := W + C2 * V2 */
+        /*              W := W * V1 */
 
-		    i__1 = lastv - *k;
-		    sgemm_("No transpose", "No transpose", &lastc, k, &i__1, &
-			    c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc, &v[*k + 
-			    1 + v_dim1], ldv, &c_b14, &work[work_offset], 
-			    ldwork);
-		}
+        strmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &c_b14, &v[v_offset], ldv, &work[work_offset],
+               ldwork);
 
-/*              W := W * T  or  W * T' */
+        /*              C1 := C1 - W */
 
-		strmm_("Right", "Upper", trans, "Non-unit", &lastc, k, &c_b14, 
-			 &t[t_offset], ldt, &work[work_offset], ldwork);
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            c__[i__ + j * c_dim1] -= work[i__ + j * work_dim1];
+            /* L170: */
+          }
+          /* L180: */
+        }
+      }
 
-/*              C := C - W * V' */
+    } else {
+      /*           Let  V =  ( V1  V2 )    (V2: last K columns) */
+      /*           where  V2  is unit lower triangular. */
 
-		if (lastv > *k) {
+      if (lsame_(side, "L")) {
+        /*              Form  H * C  or  H' * C  where  C = ( C1 ) */
+        /*                                                  ( C2 ) */
 
-/*                 C2 := C2 - W * V2' */
+        /* Computing MAX */
+        i__1 = *k, i__2 = ilaslc_(k, m, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = ilaslc_(&lastv, n, &c__[c_offset], ldc);
 
-		    i__1 = lastv - *k;
-		    sgemm_("No transpose", "Transpose", &lastc, &i__1, k, &
-			    c_b25, &work[work_offset], ldwork, &v[*k + 1 + 
-			    v_dim1], ldv, &c_b14, &c__[(*k + 1) * c_dim1 + 1], 
-			     ldc);
-		}
+        /*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK) */
 
-/*              W := W * V1' */
+        /*              W := C2' */
 
-		strmm_("Right", "Lower", "Transpose", "Unit", &lastc, k, &
-			c_b14, &v[v_offset], ldv, &work[work_offset], ldwork);
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          scopy_(&lastc, &c__[lastv - *k + j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1);
+          /* L190: */
+        }
 
-/*              C1 := C1 - W */
+        /*              W := W * V2' */
 
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			c__[i__ + j * c_dim1] -= work[i__ + j * work_dim1];
-/* L50: */
-		    }
-/* L60: */
-		}
-	    }
+        strmm_("Right", "Lower", "Transpose", "Unit", &lastc, k, &c_b14, &v[(lastv - *k + 1) * v_dim1 + 1], ldv,
+               &work[work_offset], ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C1'*V1' */
 
-	} else {
+          i__1 = lastv - *k;
+          sgemm_("Transpose", "Transpose", &lastc, k, &i__1, &c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, &c_b14,
+                 &work[work_offset], ldwork);
+        }
 
-/*           Let  V =  ( V1 ) */
-/*                     ( V2 )    (last K rows) */
-/*           where  V2  is unit upper triangular. */
+        /*              W := W * T'  or  W * T */
 
-	    if (lsame_(side, "L")) {
+        strmm_("Right", "Lower", transt, "Non-unit", &lastc, k, &c_b14, &t[t_offset], ldt, &work[work_offset], ldwork);
 
-/*              Form  H * C  or  H' * C  where  C = ( C1 ) */
-/*                                                  ( C2 ) */
+        /*              C := C - V' * W' */
 
-/* Computing MAX */
-		i__1 = *k, i__2 = ilaslr_(m, k, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = ilaslc_(&lastv, n, &c__[c_offset], ldc);
+        if (lastv > *k) {
+          /*                 C1 := C1 - V1' * W' */
 
-/*              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK) */
+          i__1 = lastv - *k;
+          sgemm_("Transpose", "Transpose", &i__1, &lastc, k, &c_b25, &v[v_offset], ldv, &work[work_offset], ldwork,
+                 &c_b14, &c__[c_offset], ldc);
+        }
 
-/*              W := C2' */
+        /*              W := W * V2 */
 
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    scopy_(&lastc, &c__[lastv - *k + j + c_dim1], ldc, &work[
-			    j * work_dim1 + 1], &c__1);
-/* L70: */
-		}
+        strmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &c_b14, &v[(lastv - *k + 1) * v_dim1 + 1], ldv,
+               &work[work_offset], ldwork);
 
-/*              W := W * V2 */
+        /*              C2 := C2 - W' */
 
-		strmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &
-			c_b14, &v[lastv - *k + 1 + v_dim1], ldv, &work[
-			work_offset], ldwork);
-		if (lastv > *k) {
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            c__[lastv - *k + j + i__ * c_dim1] -= work[i__ + j * work_dim1];
+            /* L200: */
+          }
+          /* L210: */
+        }
 
-/*                 W := W + C1'*V1 */
+      } else if (lsame_(side, "R")) {
+        /*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
 
-		    i__1 = lastv - *k;
-		    sgemm_("Transpose", "No transpose", &lastc, k, &i__1, &
-			    c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, &
-			    c_b14, &work[work_offset], ldwork);
-		}
+        /* Computing MAX */
+        i__1 = *k, i__2 = ilaslc_(k, n, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = ilaslr_(m, &lastv, &c__[c_offset], ldc);
 
-/*              W := W * T'  or  W * T */
+        /*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK) */
 
-		strmm_("Right", "Lower", transt, "Non-unit", &lastc, k, &
-			c_b14, &t[t_offset], ldt, &work[work_offset], ldwork);
+        /*              W := C2 */
 
-/*              C := C - V * W' */
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          scopy_(&lastc, &c__[(lastv - *k + j) * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1);
+          /* L220: */
+        }
 
-		if (lastv > *k) {
+        /*              W := W * V2' */
 
-/*                 C1 := C1 - V1 * W' */
+        strmm_("Right", "Lower", "Transpose", "Unit", &lastc, k, &c_b14, &v[(lastv - *k + 1) * v_dim1 + 1], ldv,
+               &work[work_offset], ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C1 * V1' */
 
-		    i__1 = lastv - *k;
-		    sgemm_("No transpose", "Transpose", &i__1, &lastc, k, &
-			    c_b25, &v[v_offset], ldv, &work[work_offset], 
-			    ldwork, &c_b14, &c__[c_offset], ldc);
-		}
+          i__1 = lastv - *k;
+          sgemm_("No transpose", "Transpose", &lastc, k, &i__1, &c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, &c_b14,
+                 &work[work_offset], ldwork);
+        }
 
-/*              W := W * V2' */
+        /*              W := W * T  or  W * T' */
 
-		strmm_("Right", "Upper", "Transpose", "Unit", &lastc, k, &
-			c_b14, &v[lastv - *k + 1 + v_dim1], ldv, &work[
-			work_offset], ldwork);
+        strmm_("Right", "Lower", trans, "Non-unit", &lastc, k, &c_b14, &t[t_offset], ldt, &work[work_offset], ldwork);
 
-/*              C2 := C2 - W' */
+        /*              C := C - W * V */
 
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			c__[lastv - *k + j + i__ * c_dim1] -= work[i__ + j * 
-				work_dim1];
-/* L80: */
-		    }
-/* L90: */
-		}
+        if (lastv > *k) {
+          /*                 C1 := C1 - W * V1 */
 
-	    } else if (lsame_(side, "R")) {
+          i__1 = lastv - *k;
+          sgemm_("No transpose", "No transpose", &lastc, &i__1, k, &c_b25, &work[work_offset], ldwork, &v[v_offset],
+                 ldv, &c_b14, &c__[c_offset], ldc);
+        }
 
-/*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
+        /*              W := W * V2 */
 
-/* Computing MAX */
-		i__1 = *k, i__2 = ilaslr_(n, k, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = ilaslr_(m, &lastv, &c__[c_offset], ldc);
+        strmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &c_b14, &v[(lastv - *k + 1) * v_dim1 + 1], ldv,
+               &work[work_offset], ldwork);
 
-/*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK) */
+        /*              C1 := C1 - W */
 
-/*              W := C2 */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    scopy_(&lastc, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &
-			    work[j * work_dim1 + 1], &c__1);
-/* L100: */
-		}
-
-/*              W := W * V2 */
-
-		strmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &
-			c_b14, &v[lastv - *k + 1 + v_dim1], ldv, &work[
-			work_offset], ldwork);
-		if (lastv > *k) {
-
-/*                 W := W + C1 * V1 */
-
-		    i__1 = lastv - *k;
-		    sgemm_("No transpose", "No transpose", &lastc, k, &i__1, &
-			    c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, &
-			    c_b14, &work[work_offset], ldwork);
-		}
-
-/*              W := W * T  or  W * T' */
-
-		strmm_("Right", "Lower", trans, "Non-unit", &lastc, k, &c_b14, 
-			 &t[t_offset], ldt, &work[work_offset], ldwork);
-
-/*              C := C - W * V' */
-
-		if (lastv > *k) {
-
-/*                 C1 := C1 - W * V1' */
-
-		    i__1 = lastv - *k;
-		    sgemm_("No transpose", "Transpose", &lastc, &i__1, k, &
-			    c_b25, &work[work_offset], ldwork, &v[v_offset], 
-			    ldv, &c_b14, &c__[c_offset], ldc);
-		}
-
-/*              W := W * V2' */
-
-		strmm_("Right", "Upper", "Transpose", "Unit", &lastc, k, &
-			c_b14, &v[lastv - *k + 1 + v_dim1], ldv, &work[
-			work_offset], ldwork);
-
-/*              C2 := C2 - W */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			c__[i__ + (lastv - *k + j) * c_dim1] -= work[i__ + j *
-				 work_dim1];
-/* L110: */
-		    }
-/* L120: */
-		}
-	    }
-	}
-
-    } else if (lsame_(storev, "R")) {
-
-	if (lsame_(direct, "F")) {
-
-/*           Let  V =  ( V1  V2 )    (V1: first K columns) */
-/*           where  V1  is unit upper triangular. */
-
-	    if (lsame_(side, "L")) {
-
-/*              Form  H * C  or  H' * C  where  C = ( C1 ) */
-/*                                                  ( C2 ) */
-
-/* Computing MAX */
-		i__1 = *k, i__2 = ilaslc_(k, m, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = ilaslc_(&lastv, n, &c__[c_offset], ldc);
-
-/*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK) */
-
-/*              W := C1' */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    scopy_(&lastc, &c__[j + c_dim1], ldc, &work[j * work_dim1 
-			    + 1], &c__1);
-/* L130: */
-		}
-
-/*              W := W * V1' */
-
-		strmm_("Right", "Upper", "Transpose", "Unit", &lastc, k, &
-			c_b14, &v[v_offset], ldv, &work[work_offset], ldwork);
-		if (lastv > *k) {
-
-/*                 W := W + C2'*V2' */
-
-		    i__1 = lastv - *k;
-		    sgemm_("Transpose", "Transpose", &lastc, k, &i__1, &c_b14, 
-			     &c__[*k + 1 + c_dim1], ldc, &v[(*k + 1) * v_dim1 
-			    + 1], ldv, &c_b14, &work[work_offset], ldwork);
-		}
-
-/*              W := W * T'  or  W * T */
-
-		strmm_("Right", "Upper", transt, "Non-unit", &lastc, k, &
-			c_b14, &t[t_offset], ldt, &work[work_offset], ldwork);
-
-/*              C := C - V' * W' */
-
-		if (lastv > *k) {
-
-/*                 C2 := C2 - V2' * W' */
-
-		    i__1 = lastv - *k;
-		    sgemm_("Transpose", "Transpose", &i__1, &lastc, k, &c_b25, 
-			     &v[(*k + 1) * v_dim1 + 1], ldv, &work[
-			    work_offset], ldwork, &c_b14, &c__[*k + 1 + 
-			    c_dim1], ldc);
-		}
-
-/*              W := W * V1 */
-
-		strmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &
-			c_b14, &v[v_offset], ldv, &work[work_offset], ldwork);
-
-/*              C1 := C1 - W' */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			c__[j + i__ * c_dim1] -= work[i__ + j * work_dim1];
-/* L140: */
-		    }
-/* L150: */
-		}
-
-	    } else if (lsame_(side, "R")) {
-
-/*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
-
-/* Computing MAX */
-		i__1 = *k, i__2 = ilaslc_(k, n, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = ilaslr_(m, &lastv, &c__[c_offset], ldc);
-
-/*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK) */
-
-/*              W := C1 */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    scopy_(&lastc, &c__[j * c_dim1 + 1], &c__1, &work[j * 
-			    work_dim1 + 1], &c__1);
-/* L160: */
-		}
-
-/*              W := W * V1' */
-
-		strmm_("Right", "Upper", "Transpose", "Unit", &lastc, k, &
-			c_b14, &v[v_offset], ldv, &work[work_offset], ldwork);
-		if (lastv > *k) {
-
-/*                 W := W + C2 * V2' */
-
-		    i__1 = lastv - *k;
-		    sgemm_("No transpose", "Transpose", &lastc, k, &i__1, &
-			    c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc, &v[(*k + 
-			    1) * v_dim1 + 1], ldv, &c_b14, &work[work_offset], 
-			     ldwork);
-		}
-
-/*              W := W * T  or  W * T' */
-
-		strmm_("Right", "Upper", trans, "Non-unit", &lastc, k, &c_b14, 
-			 &t[t_offset], ldt, &work[work_offset], ldwork);
-
-/*              C := C - W * V */
-
-		if (lastv > *k) {
-
-/*                 C2 := C2 - W * V2 */
-
-		    i__1 = lastv - *k;
-		    sgemm_("No transpose", "No transpose", &lastc, &i__1, k, &
-			    c_b25, &work[work_offset], ldwork, &v[(*k + 1) * 
-			    v_dim1 + 1], ldv, &c_b14, &c__[(*k + 1) * c_dim1 
-			    + 1], ldc);
-		}
-
-/*              W := W * V1 */
-
-		strmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &
-			c_b14, &v[v_offset], ldv, &work[work_offset], ldwork);
-
-/*              C1 := C1 - W */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			c__[i__ + j * c_dim1] -= work[i__ + j * work_dim1];
-/* L170: */
-		    }
-/* L180: */
-		}
-
-	    }
-
-	} else {
-
-/*           Let  V =  ( V1  V2 )    (V2: last K columns) */
-/*           where  V2  is unit lower triangular. */
-
-	    if (lsame_(side, "L")) {
-
-/*              Form  H * C  or  H' * C  where  C = ( C1 ) */
-/*                                                  ( C2 ) */
-
-/* Computing MAX */
-		i__1 = *k, i__2 = ilaslc_(k, m, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = ilaslc_(&lastv, n, &c__[c_offset], ldc);
-
-/*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK) */
-
-/*              W := C2' */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    scopy_(&lastc, &c__[lastv - *k + j + c_dim1], ldc, &work[
-			    j * work_dim1 + 1], &c__1);
-/* L190: */
-		}
-
-/*              W := W * V2' */
-
-		strmm_("Right", "Lower", "Transpose", "Unit", &lastc, k, &
-			c_b14, &v[(lastv - *k + 1) * v_dim1 + 1], ldv, &work[
-			work_offset], ldwork);
-		if (lastv > *k) {
-
-/*                 W := W + C1'*V1' */
-
-		    i__1 = lastv - *k;
-		    sgemm_("Transpose", "Transpose", &lastc, k, &i__1, &c_b14, 
-			     &c__[c_offset], ldc, &v[v_offset], ldv, &c_b14, &
-			    work[work_offset], ldwork);
-		}
-
-/*              W := W * T'  or  W * T */
-
-		strmm_("Right", "Lower", transt, "Non-unit", &lastc, k, &
-			c_b14, &t[t_offset], ldt, &work[work_offset], ldwork);
-
-/*              C := C - V' * W' */
-
-		if (lastv > *k) {
-
-/*                 C1 := C1 - V1' * W' */
-
-		    i__1 = lastv - *k;
-		    sgemm_("Transpose", "Transpose", &i__1, &lastc, k, &c_b25, 
-			     &v[v_offset], ldv, &work[work_offset], ldwork, &
-			    c_b14, &c__[c_offset], ldc);
-		}
-
-/*              W := W * V2 */
-
-		strmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &
-			c_b14, &v[(lastv - *k + 1) * v_dim1 + 1], ldv, &work[
-			work_offset], ldwork);
-
-/*              C2 := C2 - W' */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			c__[lastv - *k + j + i__ * c_dim1] -= work[i__ + j * 
-				work_dim1];
-/* L200: */
-		    }
-/* L210: */
-		}
-
-	    } else if (lsame_(side, "R")) {
-
-/*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
-
-/* Computing MAX */
-		i__1 = *k, i__2 = ilaslc_(k, n, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = ilaslr_(m, &lastv, &c__[c_offset], ldc);
-
-/*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK) */
-
-/*              W := C2 */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    scopy_(&lastc, &c__[(lastv - *k + j) * c_dim1 + 1], &c__1, 
-			     &work[j * work_dim1 + 1], &c__1);
-/* L220: */
-		}
-
-/*              W := W * V2' */
-
-		strmm_("Right", "Lower", "Transpose", "Unit", &lastc, k, &
-			c_b14, &v[(lastv - *k + 1) * v_dim1 + 1], ldv, &work[
-			work_offset], ldwork);
-		if (lastv > *k) {
-
-/*                 W := W + C1 * V1' */
-
-		    i__1 = lastv - *k;
-		    sgemm_("No transpose", "Transpose", &lastc, k, &i__1, &
-			    c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, &
-			    c_b14, &work[work_offset], ldwork);
-		}
-
-/*              W := W * T  or  W * T' */
-
-		strmm_("Right", "Lower", trans, "Non-unit", &lastc, k, &c_b14, 
-			 &t[t_offset], ldt, &work[work_offset], ldwork);
-
-/*              C := C - W * V */
-
-		if (lastv > *k) {
-
-/*                 C1 := C1 - W * V1 */
-
-		    i__1 = lastv - *k;
-		    sgemm_("No transpose", "No transpose", &lastc, &i__1, k, &
-			    c_b25, &work[work_offset], ldwork, &v[v_offset], 
-			    ldv, &c_b14, &c__[c_offset], ldc);
-		}
-
-/*              W := W * V2 */
-
-		strmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &
-			c_b14, &v[(lastv - *k + 1) * v_dim1 + 1], ldv, &work[
-			work_offset], ldwork);
-
-/*              C1 := C1 - W */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			c__[i__ + (lastv - *k + j) * c_dim1] -= work[i__ + j *
-				 work_dim1];
-/* L230: */
-		    }
-/* L240: */
-		}
-
-	    }
-
-	}
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            c__[i__ + (lastv - *k + j) * c_dim1] -= work[i__ + j * work_dim1];
+            /* L230: */
+          }
+          /* L240: */
+        }
+      }
     }
+  }
 
-    return 0;
-
-/*     End of SLARFB */
+  /*     End of SLARFB */
 
 } /* slarfb_ */
diff --git a/lapack/slarfg.c b/lapack/slarfg.c
index 0d31251..beccdc3 100644
--- a/lapack/slarfg.c
+++ b/lapack/slarfg.c
@@ -1,169 +1,164 @@
 /* slarfg.f -- translated by f2c (version 20061008).
    You must link the resulting object file with libf2c:
-	on Microsoft Windows system, link with libf2c.lib;
-	on Linux or Unix systems, link with .../path/to/libf2c.a -lm
-	or, if you install libf2c.a in a standard place, with -lf2c -lm
-	-- in that order, at the end of the command line, as in
-		cc *.o -lf2c -lm
-	Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
+        on Microsoft Windows system, link with libf2c.lib;
+        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
+        or, if you install libf2c.a in a standard place, with -lf2c -lm
+        -- in that order, at the end of the command line, as in
+                cc *.o -lf2c -lm
+        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
 
-		http://www.netlib.org/f2c/libf2c.zip
+                http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
-/* Subroutine */ int slarfg_(integer *n, real *alpha, real *x, integer *incx, 
-	real *tau)
-{
-    /* System generated locals */
-    integer i__1;
-    real r__1;
+static inline real r_sign(real *a, real *b) {
+  real x;
+  x = (*a >= 0 ? *a : -*a);
+  return (*b >= 0 ? x : -x);
+}
 
-    /* Builtin functions */
-    double r_sign(real *, real *);
+/* Subroutine */ void slarfg_(integer *n, real *alpha, real *x, integer *incx, real *tau) {
+  /* System generated locals */
+  integer i__1;
+  real r__1;
 
-    /* Local variables */
-    integer j, knt;
-    real beta;
-    extern doublereal snrm2_(integer *, real *, integer *);
-    extern /* Subroutine */ int sscal_(integer *, real *, real *, integer *);
-    real xnorm;
-    extern doublereal slapy2_(real *, real *), slamch_(char *);
-    real safmin, rsafmn;
+  /* Local variables */
+  integer j, knt;
+  real beta;
+  extern real snrm2_(integer *, real *, integer *);
+  extern /* Subroutine */ void sscal_(integer *, real *, real *, integer *);
+  real xnorm;
+  extern doublereal slapy2_(real *, real *), slamch_(char *);
+  real safmin, rsafmn;
 
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*     .. Scalar Arguments .. */
+  /*     .. */
+  /*     .. Array Arguments .. */
+  /*     .. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
-/*     .. Array Arguments .. */
-/*     .. */
+  /*  Purpose */
+  /*  ======= */
 
-/*  Purpose */
-/*  ======= */
+  /*  SLARFG generates a real elementary reflector H of order n, such */
+  /*  that */
 
-/*  SLARFG generates a real elementary reflector H of order n, such */
-/*  that */
+  /*        H * ( alpha ) = ( beta ),   H' * H = I. */
+  /*            (   x   )   (   0  ) */
 
-/*        H * ( alpha ) = ( beta ),   H' * H = I. */
-/*            (   x   )   (   0  ) */
+  /*  where alpha and beta are scalars, and x is an (n-1)-element real */
+  /*  vector. H is represented in the form */
 
-/*  where alpha and beta are scalars, and x is an (n-1)-element real */
-/*  vector. H is represented in the form */
+  /*        H = I - tau * ( 1 ) * ( 1 v' ) , */
+  /*                      ( v ) */
 
-/*        H = I - tau * ( 1 ) * ( 1 v' ) , */
-/*                      ( v ) */
+  /*  where tau is a real scalar and v is a real (n-1)-element */
+  /*  vector. */
 
-/*  where tau is a real scalar and v is a real (n-1)-element */
-/*  vector. */
+  /*  If the elements of x are all zero, then tau = 0 and H is taken to be */
+  /*  the unit matrix. */
 
-/*  If the elements of x are all zero, then tau = 0 and H is taken to be */
-/*  the unit matrix. */
+  /*  Otherwise  1 <= tau <= 2. */
 
-/*  Otherwise  1 <= tau <= 2. */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Arguments */
-/*  ========= */
+  /*  N       (input) INTEGER */
+  /*          The order of the elementary reflector. */
 
-/*  N       (input) INTEGER */
-/*          The order of the elementary reflector. */
+  /*  ALPHA   (input/output) REAL */
+  /*          On entry, the value alpha. */
+  /*          On exit, it is overwritten with the value beta. */
 
-/*  ALPHA   (input/output) REAL */
-/*          On entry, the value alpha. */
-/*          On exit, it is overwritten with the value beta. */
+  /*  X       (input/output) REAL array, dimension */
+  /*                         (1+(N-2)*abs(INCX)) */
+  /*          On entry, the vector x. */
+  /*          On exit, it is overwritten with the vector v. */
 
-/*  X       (input/output) REAL array, dimension */
-/*                         (1+(N-2)*abs(INCX)) */
-/*          On entry, the vector x. */
-/*          On exit, it is overwritten with the vector v. */
+  /*  INCX    (input) INTEGER */
+  /*          The increment between elements of X. INCX > 0. */
 
-/*  INCX    (input) INTEGER */
-/*          The increment between elements of X. INCX > 0. */
+  /*  TAU     (output) REAL */
+  /*          The value tau. */
 
-/*  TAU     (output) REAL */
-/*          The value tau. */
+  /*  ===================================================================== */
 
-/*  ===================================================================== */
+  /*     .. Parameters .. */
+  /*     .. */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. Intrinsic Functions .. */
+  /*     .. */
+  /*     .. External Subroutines .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*     .. Parameters .. */
-/*     .. */
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. Intrinsic Functions .. */
-/*     .. */
-/*     .. External Subroutines .. */
-/*     .. */
-/*     .. Executable Statements .. */
+  /* Parameter adjustments */
+  --x;
 
-    /* Parameter adjustments */
-    --x;
+  /* Function Body */
+  if (*n <= 1) {
+    *tau = 0.f;
+    return;
+  }
 
-    /* Function Body */
-    if (*n <= 1) {
-	*tau = 0.f;
-	return 0;
+  i__1 = *n - 1;
+  xnorm = snrm2_(&i__1, &x[1], incx);
+
+  if (xnorm == 0.f) {
+    /*        H  =  I */
+
+    *tau = 0.f;
+  } else {
+    /*        general case */
+
+    r__1 = slapy2_(alpha, &xnorm);
+    beta = -r_sign(&r__1, alpha);
+    safmin = slamch_("S") / slamch_("E");
+    knt = 0;
+    if (dabs(beta) < safmin) {
+      /*           XNORM, BETA may be inaccurate; scale X and recompute them */
+
+      rsafmn = 1.f / safmin;
+    L10:
+      ++knt;
+      i__1 = *n - 1;
+      sscal_(&i__1, &rsafmn, &x[1], incx);
+      beta *= rsafmn;
+      *alpha *= rsafmn;
+      if (dabs(beta) < safmin) {
+        goto L10;
+      }
+
+      /*           New BETA is at most 1, at least SAFMIN */
+
+      i__1 = *n - 1;
+      xnorm = snrm2_(&i__1, &x[1], incx);
+      r__1 = slapy2_(alpha, &xnorm);
+      beta = -r_sign(&r__1, alpha);
     }
-
+    *tau = (beta - *alpha) / beta;
     i__1 = *n - 1;
-    xnorm = snrm2_(&i__1, &x[1], incx);
+    r__1 = 1.f / (*alpha - beta);
+    sscal_(&i__1, &r__1, &x[1], incx);
 
-    if (xnorm == 0.f) {
+    /*        If ALPHA is subnormal, it may lose relative accuracy */
 
-/*        H  =  I */
-
-	*tau = 0.f;
-    } else {
-
-/*        general case */
-
-	r__1 = slapy2_(alpha, &xnorm);
-	beta = -r_sign(&r__1, alpha);
-	safmin = slamch_("S") / slamch_("E");
-	knt = 0;
-	if (dabs(beta) < safmin) {
-
-/*           XNORM, BETA may be inaccurate; scale X and recompute them */
-
-	    rsafmn = 1.f / safmin;
-L10:
-	    ++knt;
-	    i__1 = *n - 1;
-	    sscal_(&i__1, &rsafmn, &x[1], incx);
-	    beta *= rsafmn;
-	    *alpha *= rsafmn;
-	    if (dabs(beta) < safmin) {
-		goto L10;
-	    }
-
-/*           New BETA is at most 1, at least SAFMIN */
-
-	    i__1 = *n - 1;
-	    xnorm = snrm2_(&i__1, &x[1], incx);
-	    r__1 = slapy2_(alpha, &xnorm);
-	    beta = -r_sign(&r__1, alpha);
-	}
-	*tau = (beta - *alpha) / beta;
-	i__1 = *n - 1;
-	r__1 = 1.f / (*alpha - beta);
-	sscal_(&i__1, &r__1, &x[1], incx);
-
-/*        If ALPHA is subnormal, it may lose relative accuracy */
-
-	i__1 = knt;
-	for (j = 1; j <= i__1; ++j) {
-	    beta *= safmin;
-/* L20: */
-	}
-	*alpha = beta;
+    i__1 = knt;
+    for (j = 1; j <= i__1; ++j) {
+      beta *= safmin;
+      /* L20: */
     }
+    *alpha = beta;
+  }
 
-    return 0;
-
-/*     End of SLARFG */
+  /*     End of SLARFG */
 
 } /* slarfg_ */
diff --git a/lapack/slarft.c b/lapack/slarft.c
index 4143ce4..97bfa41 100644
--- a/lapack/slarft.c
+++ b/lapack/slarft.c
@@ -1,323 +1,309 @@
 /* slarft.f -- translated by f2c (version 20061008).
    You must link the resulting object file with libf2c:
-	on Microsoft Windows system, link with libf2c.lib;
-	on Linux or Unix systems, link with .../path/to/libf2c.a -lm
-	or, if you install libf2c.a in a standard place, with -lf2c -lm
-	-- in that order, at the end of the command line, as in
-		cc *.o -lf2c -lm
-	Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
+        on Microsoft Windows system, link with libf2c.lib;
+        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
+        or, if you install libf2c.a in a standard place, with -lf2c -lm
+        -- in that order, at the end of the command line, as in
+                cc *.o -lf2c -lm
+        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
 
-		http://www.netlib.org/f2c/libf2c.zip
+                http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
 /* Table of constant values */
 
 static integer c__1 = 1;
 static real c_b8 = 0.f;
 
-/* Subroutine */ int slarft_(char *direct, char *storev, integer *n, integer *
-	k, real *v, integer *ldv, real *tau, real *t, integer *ldt)
-{
-    /* System generated locals */
-    integer t_dim1, t_offset, v_dim1, v_offset, i__1, i__2, i__3;
-    real r__1;
+/* Subroutine */ void slarft_(char *direct, char *storev, integer *n, integer *k, real *v, integer *ldv, real *tau,
+                              real *t, integer *ldt) {
+  /* System generated locals */
+  integer t_dim1, t_offset, v_dim1, v_offset, i__1, i__2, i__3;
+  real r__1;
 
-    /* Local variables */
-    integer i__, j, prevlastv;
-    real vii;
-    extern logical lsame_(char *, char *);
-    extern /* Subroutine */ int sgemv_(char *, integer *, integer *, real *, 
-	    real *, integer *, real *, integer *, real *, real *, integer *);
-    integer lastv;
-    extern /* Subroutine */ int strmv_(char *, char *, char *, integer *, 
-	    real *, integer *, real *, integer *);
+  /* Local variables */
+  integer i__, j, prevlastv;
+  real vii;
+  extern logical lsame_(char *, char *);
+  extern /* Subroutine */ void sgemv_(const char *, const integer *, const integer *, const real *, const real *,
+                                      const integer *, const real *, const integer *, const real *, real *,
+                                      const integer *);
+  integer lastv;
+  extern /* Subroutine */ void strmv_(const char *, const char *, const char *, const integer *, const real *,
+                                      const integer *, real *, const integer *);
 
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*     .. Scalar Arguments .. */
+  /*     .. */
+  /*     .. Array Arguments .. */
+  /*     .. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
-/*     .. Array Arguments .. */
-/*     .. */
+  /*  Purpose */
+  /*  ======= */
 
-/*  Purpose */
-/*  ======= */
+  /*  SLARFT forms the triangular factor T of a real block reflector H */
+  /*  of order n, which is defined as a product of k elementary reflectors. */
 
-/*  SLARFT forms the triangular factor T of a real block reflector H */
-/*  of order n, which is defined as a product of k elementary reflectors. */
+  /*  If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; */
 
-/*  If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; */
+  /*  If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. */
 
-/*  If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. */
+  /*  If STOREV = 'C', the vector which defines the elementary reflector */
+  /*  H(i) is stored in the i-th column of the array V, and */
 
-/*  If STOREV = 'C', the vector which defines the elementary reflector */
-/*  H(i) is stored in the i-th column of the array V, and */
+  /*     H  =  I - V * T * V' */
 
-/*     H  =  I - V * T * V' */
+  /*  If STOREV = 'R', the vector which defines the elementary reflector */
+  /*  H(i) is stored in the i-th row of the array V, and */
 
-/*  If STOREV = 'R', the vector which defines the elementary reflector */
-/*  H(i) is stored in the i-th row of the array V, and */
+  /*     H  =  I - V' * T * V */
 
-/*     H  =  I - V' * T * V */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Arguments */
-/*  ========= */
+  /*  DIRECT  (input) CHARACTER*1 */
+  /*          Specifies the order in which the elementary reflectors are */
+  /*          multiplied to form the block reflector: */
+  /*          = 'F': H = H(1) H(2) . . . H(k) (Forward) */
+  /*          = 'B': H = H(k) . . . H(2) H(1) (Backward) */
 
-/*  DIRECT  (input) CHARACTER*1 */
-/*          Specifies the order in which the elementary reflectors are */
-/*          multiplied to form the block reflector: */
-/*          = 'F': H = H(1) H(2) . . . H(k) (Forward) */
-/*          = 'B': H = H(k) . . . H(2) H(1) (Backward) */
+  /*  STOREV  (input) CHARACTER*1 */
+  /*          Specifies how the vectors which define the elementary */
+  /*          reflectors are stored (see also Further Details): */
+  /*          = 'C': columnwise */
+  /*          = 'R': rowwise */
 
-/*  STOREV  (input) CHARACTER*1 */
-/*          Specifies how the vectors which define the elementary */
-/*          reflectors are stored (see also Further Details): */
-/*          = 'C': columnwise */
-/*          = 'R': rowwise */
+  /*  N       (input) INTEGER */
+  /*          The order of the block reflector H. N >= 0. */
 
-/*  N       (input) INTEGER */
-/*          The order of the block reflector H. N >= 0. */
+  /*  K       (input) INTEGER */
+  /*          The order of the triangular factor T (= the number of */
+  /*          elementary reflectors). K >= 1. */
 
-/*  K       (input) INTEGER */
-/*          The order of the triangular factor T (= the number of */
-/*          elementary reflectors). K >= 1. */
+  /*  V       (input/output) REAL array, dimension */
+  /*                               (LDV,K) if STOREV = 'C' */
+  /*                               (LDV,N) if STOREV = 'R' */
+  /*          The matrix V. See further details. */
 
-/*  V       (input/output) REAL array, dimension */
-/*                               (LDV,K) if STOREV = 'C' */
-/*                               (LDV,N) if STOREV = 'R' */
-/*          The matrix V. See further details. */
+  /*  LDV     (input) INTEGER */
+  /*          The leading dimension of the array V. */
+  /*          If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. */
 
-/*  LDV     (input) INTEGER */
-/*          The leading dimension of the array V. */
-/*          If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. */
+  /*  TAU     (input) REAL array, dimension (K) */
+  /*          TAU(i) must contain the scalar factor of the elementary */
+  /*          reflector H(i). */
 
-/*  TAU     (input) REAL array, dimension (K) */
-/*          TAU(i) must contain the scalar factor of the elementary */
-/*          reflector H(i). */
+  /*  T       (output) REAL array, dimension (LDT,K) */
+  /*          The k by k triangular factor T of the block reflector. */
+  /*          If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is */
+  /*          lower triangular. The rest of the array is not used. */
 
-/*  T       (output) REAL array, dimension (LDT,K) */
-/*          The k by k triangular factor T of the block reflector. */
-/*          If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is */
-/*          lower triangular. The rest of the array is not used. */
+  /*  LDT     (input) INTEGER */
+  /*          The leading dimension of the array T. LDT >= K. */
 
-/*  LDT     (input) INTEGER */
-/*          The leading dimension of the array T. LDT >= K. */
+  /*  Further Details */
+  /*  =============== */
 
-/*  Further Details */
-/*  =============== */
+  /*  The shape of the matrix V and the storage of the vectors which define */
+  /*  the H(i) is best illustrated by the following example with n = 5 and */
+  /*  k = 3. The elements equal to 1 are not stored; the corresponding */
+  /*  array elements are modified but restored on exit. The rest of the */
+  /*  array is not used. */
 
-/*  The shape of the matrix V and the storage of the vectors which define */
-/*  the H(i) is best illustrated by the following example with n = 5 and */
-/*  k = 3. The elements equal to 1 are not stored; the corresponding */
-/*  array elements are modified but restored on exit. The rest of the */
-/*  array is not used. */
+  /*  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R': */
 
-/*  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R': */
+  /*               V = (  1       )                 V = (  1 v1 v1 v1 v1 ) */
+  /*                   ( v1  1    )                     (     1 v2 v2 v2 ) */
+  /*                   ( v1 v2  1 )                     (        1 v3 v3 ) */
+  /*                   ( v1 v2 v3 ) */
+  /*                   ( v1 v2 v3 ) */
 
-/*               V = (  1       )                 V = (  1 v1 v1 v1 v1 ) */
-/*                   ( v1  1    )                     (     1 v2 v2 v2 ) */
-/*                   ( v1 v2  1 )                     (        1 v3 v3 ) */
-/*                   ( v1 v2 v3 ) */
-/*                   ( v1 v2 v3 ) */
+  /*  DIRECT = 'B' and STOREV = 'C':         DIRECT = 'B' and STOREV = 'R': */
 
-/*  DIRECT = 'B' and STOREV = 'C':         DIRECT = 'B' and STOREV = 'R': */
+  /*               V = ( v1 v2 v3 )                 V = ( v1 v1  1       ) */
+  /*                   ( v1 v2 v3 )                     ( v2 v2 v2  1    ) */
+  /*                   (  1 v2 v3 )                     ( v3 v3 v3 v3  1 ) */
+  /*                   (     1 v3 ) */
+  /*                   (        1 ) */
 
-/*               V = ( v1 v2 v3 )                 V = ( v1 v1  1       ) */
-/*                   ( v1 v2 v3 )                     ( v2 v2 v2  1    ) */
-/*                   (  1 v2 v3 )                     ( v3 v3 v3 v3  1 ) */
-/*                   (     1 v3 ) */
-/*                   (        1 ) */
+  /*  ===================================================================== */
 
-/*  ===================================================================== */
+  /*     .. Parameters .. */
+  /*     .. */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Subroutines .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*     .. Parameters .. */
-/*     .. */
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Subroutines .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. Executable Statements .. */
+  /*     Quick return if possible */
 
-/*     Quick return if possible */
+  /* Parameter adjustments */
+  v_dim1 = *ldv;
+  v_offset = 1 + v_dim1;
+  v -= v_offset;
+  --tau;
+  t_dim1 = *ldt;
+  t_offset = 1 + t_dim1;
+  t -= t_offset;
 
-    /* Parameter adjustments */
-    v_dim1 = *ldv;
-    v_offset = 1 + v_dim1;
-    v -= v_offset;
-    --tau;
-    t_dim1 = *ldt;
-    t_offset = 1 + t_dim1;
-    t -= t_offset;
+  /* Function Body */
+  if (*n == 0) {
+    return;
+  }
 
-    /* Function Body */
-    if (*n == 0) {
-	return 0;
+  if (lsame_(direct, "F")) {
+    prevlastv = *n;
+    i__1 = *k;
+    for (i__ = 1; i__ <= i__1; ++i__) {
+      prevlastv = max(i__, prevlastv);
+      if (tau[i__] == 0.f) {
+        /*              H(i)  =  I */
+
+        i__2 = i__;
+        for (j = 1; j <= i__2; ++j) {
+          t[j + i__ * t_dim1] = 0.f;
+          /* L10: */
+        }
+      } else {
+        /*              general case */
+
+        vii = v[i__ + i__ * v_dim1];
+        v[i__ + i__ * v_dim1] = 1.f;
+        if (lsame_(storev, "C")) {
+          /*                 Skip any trailing zeros. */
+          i__2 = i__ + 1;
+          for (lastv = *n; lastv >= i__2; --lastv) {
+            if (v[lastv + i__ * v_dim1] != 0.f) {
+              break;
+            }
+          }
+          j = min(lastv, prevlastv);
+
+          /*                 T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)' * V(i:j,i) */
+
+          i__2 = j - i__ + 1;
+          i__3 = i__ - 1;
+          r__1 = -tau[i__];
+          sgemv_("Transpose", &i__2, &i__3, &r__1, &v[i__ + v_dim1], ldv, &v[i__ + i__ * v_dim1], &c__1, &c_b8,
+                 &t[i__ * t_dim1 + 1], &c__1);
+        } else {
+          /*                 Skip any trailing zeros. */
+          i__2 = i__ + 1;
+          for (lastv = *n; lastv >= i__2; --lastv) {
+            if (v[i__ + lastv * v_dim1] != 0.f) {
+              break;
+            }
+          }
+          j = min(lastv, prevlastv);
+
+          /*                 T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)' */
+
+          i__2 = i__ - 1;
+          i__3 = j - i__ + 1;
+          r__1 = -tau[i__];
+          sgemv_("No transpose", &i__2, &i__3, &r__1, &v[i__ * v_dim1 + 1], ldv, &v[i__ + i__ * v_dim1], ldv, &c_b8,
+                 &t[i__ * t_dim1 + 1], &c__1);
+        }
+        v[i__ + i__ * v_dim1] = vii;
+
+        /*              T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) */
+
+        i__2 = i__ - 1;
+        strmv_("Upper", "No transpose", "Non-unit", &i__2, &t[t_offset], ldt, &t[i__ * t_dim1 + 1], &c__1);
+        t[i__ + i__ * t_dim1] = tau[i__];
+        if (i__ > 1) {
+          prevlastv = max(prevlastv, lastv);
+        } else {
+          prevlastv = lastv;
+        }
+      }
+      /* L20: */
     }
+  } else {
+    prevlastv = 1;
+    for (i__ = *k; i__ >= 1; --i__) {
+      if (tau[i__] == 0.f) {
+        /*              H(i)  =  I */
 
-    if (lsame_(direct, "F")) {
-	prevlastv = *n;
-	i__1 = *k;
-	for (i__ = 1; i__ <= i__1; ++i__) {
-	    prevlastv = max(i__,prevlastv);
-	    if (tau[i__] == 0.f) {
+        i__1 = *k;
+        for (j = i__; j <= i__1; ++j) {
+          t[j + i__ * t_dim1] = 0.f;
+          /* L30: */
+        }
+      } else {
+        /*              general case */
 
-/*              H(i)  =  I */
+        if (i__ < *k) {
+          if (lsame_(storev, "C")) {
+            vii = v[*n - *k + i__ + i__ * v_dim1];
+            v[*n - *k + i__ + i__ * v_dim1] = 1.f;
+            /*                    Skip any leading zeros. */
+            i__1 = i__ - 1;
+            for (lastv = 1; lastv <= i__1; ++lastv) {
+              if (v[lastv + i__ * v_dim1] != 0.f) {
+                break;
+              }
+            }
+            j = max(lastv, prevlastv);
 
-		i__2 = i__;
-		for (j = 1; j <= i__2; ++j) {
-		    t[j + i__ * t_dim1] = 0.f;
-/* L10: */
-		}
-	    } else {
+            /*                    T(i+1:k,i) := */
+            /*                            - tau(i) * V(j:n-k+i,i+1:k)' * V(j:n-k+i,i) */
 
-/*              general case */
+            i__1 = *n - *k + i__ - j + 1;
+            i__2 = *k - i__;
+            r__1 = -tau[i__];
+            sgemv_("Transpose", &i__1, &i__2, &r__1, &v[j + (i__ + 1) * v_dim1], ldv, &v[j + i__ * v_dim1], &c__1,
+                   &c_b8, &t[i__ + 1 + i__ * t_dim1], &c__1);
+            v[*n - *k + i__ + i__ * v_dim1] = vii;
+          } else {
+            vii = v[i__ + (*n - *k + i__) * v_dim1];
+            v[i__ + (*n - *k + i__) * v_dim1] = 1.f;
+            /*                    Skip any leading zeros. */
+            i__1 = i__ - 1;
+            for (lastv = 1; lastv <= i__1; ++lastv) {
+              if (v[i__ + lastv * v_dim1] != 0.f) {
+                break;
+              }
+            }
+            j = max(lastv, prevlastv);
 
-		vii = v[i__ + i__ * v_dim1];
-		v[i__ + i__ * v_dim1] = 1.f;
-		if (lsame_(storev, "C")) {
-/*                 Skip any trailing zeros. */
-		    i__2 = i__ + 1;
-		    for (lastv = *n; lastv >= i__2; --lastv) {
-			if (v[lastv + i__ * v_dim1] != 0.f) {
-			    break;
-			}
-		    }
-		    j = min(lastv,prevlastv);
+            /*                    T(i+1:k,i) := */
+            /*                            - tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)' */
 
-/*                 T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)' * V(i:j,i) */
+            i__1 = *k - i__;
+            i__2 = *n - *k + i__ - j + 1;
+            r__1 = -tau[i__];
+            sgemv_("No transpose", &i__1, &i__2, &r__1, &v[i__ + 1 + j * v_dim1], ldv, &v[i__ + j * v_dim1], ldv, &c_b8,
+                   &t[i__ + 1 + i__ * t_dim1], &c__1);
+            v[i__ + (*n - *k + i__) * v_dim1] = vii;
+          }
 
-		    i__2 = j - i__ + 1;
-		    i__3 = i__ - 1;
-		    r__1 = -tau[i__];
-		    sgemv_("Transpose", &i__2, &i__3, &r__1, &v[i__ + v_dim1], 
-			     ldv, &v[i__ + i__ * v_dim1], &c__1, &c_b8, &t[
-			    i__ * t_dim1 + 1], &c__1);
-		} else {
-/*                 Skip any trailing zeros. */
-		    i__2 = i__ + 1;
-		    for (lastv = *n; lastv >= i__2; --lastv) {
-			if (v[i__ + lastv * v_dim1] != 0.f) {
-			    break;
-			}
-		    }
-		    j = min(lastv,prevlastv);
+          /*                 T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) */
 
-/*                 T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)' */
-
-		    i__2 = i__ - 1;
-		    i__3 = j - i__ + 1;
-		    r__1 = -tau[i__];
-		    sgemv_("No transpose", &i__2, &i__3, &r__1, &v[i__ * 
-			    v_dim1 + 1], ldv, &v[i__ + i__ * v_dim1], ldv, &
-			    c_b8, &t[i__ * t_dim1 + 1], &c__1);
-		}
-		v[i__ + i__ * v_dim1] = vii;
-
-/*              T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) */
-
-		i__2 = i__ - 1;
-		strmv_("Upper", "No transpose", "Non-unit", &i__2, &t[
-			t_offset], ldt, &t[i__ * t_dim1 + 1], &c__1);
-		t[i__ + i__ * t_dim1] = tau[i__];
-		if (i__ > 1) {
-		    prevlastv = max(prevlastv,lastv);
-		} else {
-		    prevlastv = lastv;
-		}
-	    }
-/* L20: */
-	}
-    } else {
-	prevlastv = 1;
-	for (i__ = *k; i__ >= 1; --i__) {
-	    if (tau[i__] == 0.f) {
-
-/*              H(i)  =  I */
-
-		i__1 = *k;
-		for (j = i__; j <= i__1; ++j) {
-		    t[j + i__ * t_dim1] = 0.f;
-/* L30: */
-		}
-	    } else {
-
-/*              general case */
-
-		if (i__ < *k) {
-		    if (lsame_(storev, "C")) {
-			vii = v[*n - *k + i__ + i__ * v_dim1];
-			v[*n - *k + i__ + i__ * v_dim1] = 1.f;
-/*                    Skip any leading zeros. */
-			i__1 = i__ - 1;
-			for (lastv = 1; lastv <= i__1; ++lastv) {
-			    if (v[lastv + i__ * v_dim1] != 0.f) {
-				break;
-			    }
-			}
-			j = max(lastv,prevlastv);
-
-/*                    T(i+1:k,i) := */
-/*                            - tau(i) * V(j:n-k+i,i+1:k)' * V(j:n-k+i,i) */
-
-			i__1 = *n - *k + i__ - j + 1;
-			i__2 = *k - i__;
-			r__1 = -tau[i__];
-			sgemv_("Transpose", &i__1, &i__2, &r__1, &v[j + (i__ 
-				+ 1) * v_dim1], ldv, &v[j + i__ * v_dim1], &
-				c__1, &c_b8, &t[i__ + 1 + i__ * t_dim1], &
-				c__1);
-			v[*n - *k + i__ + i__ * v_dim1] = vii;
-		    } else {
-			vii = v[i__ + (*n - *k + i__) * v_dim1];
-			v[i__ + (*n - *k + i__) * v_dim1] = 1.f;
-/*                    Skip any leading zeros. */
-			i__1 = i__ - 1;
-			for (lastv = 1; lastv <= i__1; ++lastv) {
-			    if (v[i__ + lastv * v_dim1] != 0.f) {
-				break;
-			    }
-			}
-			j = max(lastv,prevlastv);
-
-/*                    T(i+1:k,i) := */
-/*                            - tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)' */
-
-			i__1 = *k - i__;
-			i__2 = *n - *k + i__ - j + 1;
-			r__1 = -tau[i__];
-			sgemv_("No transpose", &i__1, &i__2, &r__1, &v[i__ + 
-				1 + j * v_dim1], ldv, &v[i__ + j * v_dim1], 
-				ldv, &c_b8, &t[i__ + 1 + i__ * t_dim1], &c__1);
-			v[i__ + (*n - *k + i__) * v_dim1] = vii;
-		    }
-
-/*                 T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) */
-
-		    i__1 = *k - i__;
-		    strmv_("Lower", "No transpose", "Non-unit", &i__1, &t[i__ 
-			    + 1 + (i__ + 1) * t_dim1], ldt, &t[i__ + 1 + i__ *
-			     t_dim1], &c__1)
-			    ;
-		    if (i__ > 1) {
-			prevlastv = min(prevlastv,lastv);
-		    } else {
-			prevlastv = lastv;
-		    }
-		}
-		t[i__ + i__ * t_dim1] = tau[i__];
-	    }
-/* L40: */
-	}
+          i__1 = *k - i__;
+          strmv_("Lower", "No transpose", "Non-unit", &i__1, &t[i__ + 1 + (i__ + 1) * t_dim1], ldt,
+                 &t[i__ + 1 + i__ * t_dim1], &c__1);
+          if (i__ > 1) {
+            prevlastv = min(prevlastv, lastv);
+          } else {
+            prevlastv = lastv;
+          }
+        }
+        t[i__ + i__ * t_dim1] = tau[i__];
+      }
+      /* L40: */
     }
-    return 0;
+  }
 
-/*     End of SLARFT */
+  /*     End of SLARFT */
 
 } /* slarft_ */
diff --git a/lapack/zlacgv.c b/lapack/zlacgv.c
index e455696..672fb3e 100644
--- a/lapack/zlacgv.c
+++ b/lapack/zlacgv.c
@@ -1,95 +1,94 @@
 /* zlacgv.f -- translated by f2c (version 20061008).
    You must link the resulting object file with libf2c:
-	on Microsoft Windows system, link with libf2c.lib;
-	on Linux or Unix systems, link with .../path/to/libf2c.a -lm
-	or, if you install libf2c.a in a standard place, with -lf2c -lm
-	-- in that order, at the end of the command line, as in
-		cc *.o -lf2c -lm
-	Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
+        on Microsoft Windows system, link with libf2c.lib;
+        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
+        or, if you install libf2c.a in a standard place, with -lf2c -lm
+        -- in that order, at the end of the command line, as in
+                cc *.o -lf2c -lm
+        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
 
-		http://www.netlib.org/f2c/libf2c.zip
+                http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
-/* Subroutine */ int zlacgv_(integer *n, doublecomplex *x, integer *incx)
-{
-    /* System generated locals */
-    integer i__1, i__2;
-    doublecomplex z__1;
+static inline void d_cnjg(doublecomplex *r, doublecomplex *z) {
+  r->r = z->r;
+  r->i = -(z->i);
+}
 
-    /* Builtin functions */
-    void d_cnjg(doublecomplex *, doublecomplex *);
+/* Subroutine */ void zlacgv_(integer *n, doublecomplex *x, integer *incx) {
+  /* System generated locals */
+  integer i__1, i__2;
+  doublecomplex z__1;
 
-    /* Local variables */
-    integer i__, ioff;
+  /* Local variables */
+  integer i__, ioff;
 
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*     .. Scalar Arguments .. */
+  /*     .. */
+  /*     .. Array Arguments .. */
+  /*     .. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
-/*     .. Array Arguments .. */
-/*     .. */
+  /*  Purpose */
+  /*  ======= */
 
-/*  Purpose */
-/*  ======= */
+  /*  ZLACGV conjugates a complex vector of length N. */
 
-/*  ZLACGV conjugates a complex vector of length N. */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Arguments */
-/*  ========= */
+  /*  N       (input) INTEGER */
+  /*          The length of the vector X.  N >= 0. */
 
-/*  N       (input) INTEGER */
-/*          The length of the vector X.  N >= 0. */
+  /*  X       (input/output) COMPLEX*16 array, dimension */
+  /*                         (1+(N-1)*abs(INCX)) */
+  /*          On entry, the vector of length N to be conjugated. */
+  /*          On exit, X is overwritten with conjg(X). */
 
-/*  X       (input/output) COMPLEX*16 array, dimension */
-/*                         (1+(N-1)*abs(INCX)) */
-/*          On entry, the vector of length N to be conjugated. */
-/*          On exit, X is overwritten with conjg(X). */
+  /*  INCX    (input) INTEGER */
+  /*          The spacing between successive elements of X. */
 
-/*  INCX    (input) INTEGER */
-/*          The spacing between successive elements of X. */
+  /* ===================================================================== */
 
-/* ===================================================================== */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. Intrinsic Functions .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. Intrinsic Functions .. */
-/*     .. */
-/*     .. Executable Statements .. */
+  /* Parameter adjustments */
+  --x;
 
-    /* Parameter adjustments */
-    --x;
-
-    /* Function Body */
-    if (*incx == 1) {
-	i__1 = *n;
-	for (i__ = 1; i__ <= i__1; ++i__) {
-	    i__2 = i__;
-	    d_cnjg(&z__1, &x[i__]);
-	    x[i__2].r = z__1.r, x[i__2].i = z__1.i;
-/* L10: */
-	}
-    } else {
-	ioff = 1;
-	if (*incx < 0) {
-	    ioff = 1 - (*n - 1) * *incx;
-	}
-	i__1 = *n;
-	for (i__ = 1; i__ <= i__1; ++i__) {
-	    i__2 = ioff;
-	    d_cnjg(&z__1, &x[ioff]);
-	    x[i__2].r = z__1.r, x[i__2].i = z__1.i;
-	    ioff += *incx;
-/* L20: */
-	}
+  /* Function Body */
+  if (*incx == 1) {
+    i__1 = *n;
+    for (i__ = 1; i__ <= i__1; ++i__) {
+      i__2 = i__;
+      d_cnjg(&z__1, &x[i__]);
+      x[i__2].r = z__1.r, x[i__2].i = z__1.i;
+      /* L10: */
     }
-    return 0;
+  } else {
+    ioff = 1;
+    if (*incx < 0) {
+      ioff = 1 - (*n - 1) * *incx;
+    }
+    i__1 = *n;
+    for (i__ = 1; i__ <= i__1; ++i__) {
+      i__2 = ioff;
+      d_cnjg(&z__1, &x[ioff]);
+      x[i__2].r = z__1.r, x[i__2].i = z__1.i;
+      ioff += *incx;
+      /* L20: */
+    }
+  }
 
-/*     End of ZLACGV */
+  /*     End of ZLACGV */
 
 } /* zlacgv_ */
diff --git a/lapack/zladiv.c b/lapack/zladiv.c
index d92be5a..37aa923 100644
--- a/lapack/zladiv.c
+++ b/lapack/zladiv.c
@@ -1,75 +1,67 @@
 /* zladiv.f -- translated by f2c (version 20061008).
    You must link the resulting object file with libf2c:
-	on Microsoft Windows system, link with libf2c.lib;
-	on Linux or Unix systems, link with .../path/to/libf2c.a -lm
-	or, if you install libf2c.a in a standard place, with -lf2c -lm
-	-- in that order, at the end of the command line, as in
-		cc *.o -lf2c -lm
-	Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
+        on Microsoft Windows system, link with libf2c.lib;
+        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
+        or, if you install libf2c.a in a standard place, with -lf2c -lm
+        -- in that order, at the end of the command line, as in
+                cc *.o -lf2c -lm
+        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
 
-		http://www.netlib.org/f2c/libf2c.zip
+                http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
-/* Double Complex */ VOID zladiv_(doublecomplex * ret_val, doublecomplex *x, 
-	doublecomplex *y)
-{
-    /* System generated locals */
-    doublereal d__1, d__2, d__3, d__4;
-    doublecomplex z__1;
+/* Double Complex */ void zladiv_(doublecomplex *ret_val, doublecomplex *x, doublecomplex *y) {
+  /* System generated locals */
+  doublereal d__1, d__2, d__3, d__4;
+  doublecomplex z__1;
 
-    /* Builtin functions */
-    double d_imag(doublecomplex *);
+  /* Local variables */
+  doublereal zi, zr;
+  extern /* Subroutine */ void dladiv_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *,
+                                       doublereal *);
 
-    /* Local variables */
-    doublereal zi, zr;
-    extern /* Subroutine */ int dladiv_(doublereal *, doublereal *, 
-	    doublereal *, doublereal *, doublereal *, doublereal *);
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
+  /*     .. Scalar Arguments .. */
+  /*     .. */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*  Purpose */
+  /*  ======= */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
+  /*  ZLADIV := X / Y, where X and Y are complex.  The computation of X / Y */
+  /*  will not overflow on an intermediary step unless the results */
+  /*  overflows. */
 
-/*  Purpose */
-/*  ======= */
+  /*  Arguments */
+  /*  ========= */
 
-/*  ZLADIV := X / Y, where X and Y are complex.  The computation of X / Y */
-/*  will not overflow on an intermediary step unless the results */
-/*  overflows. */
+  /*  X       (input) COMPLEX*16 */
+  /*  Y       (input) COMPLEX*16 */
+  /*          The complex scalars X and Y. */
 
-/*  Arguments */
-/*  ========= */
+  /*  ===================================================================== */
 
-/*  X       (input) COMPLEX*16 */
-/*  Y       (input) COMPLEX*16 */
-/*          The complex scalars X and Y. */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Subroutines .. */
+  /*     .. */
+  /*     .. Intrinsic Functions .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*  ===================================================================== */
+  d__1 = x->r;
+  d__2 = x->i;
+  d__3 = y->r;
+  d__4 = y->i;
+  dladiv_(&d__1, &d__2, &d__3, &d__4, &zr, &zi);
+  z__1.r = zr, z__1.i = zi;
+  ret_val->r = z__1.r, ret_val->i = z__1.i;
 
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Subroutines .. */
-/*     .. */
-/*     .. Intrinsic Functions .. */
-/*     .. */
-/*     .. Executable Statements .. */
-
-    d__1 = x->r;
-    d__2 = d_imag(x);
-    d__3 = y->r;
-    d__4 = d_imag(y);
-    dladiv_(&d__1, &d__2, &d__3, &d__4, &zr, &zi);
-    z__1.r = zr, z__1.i = zi;
-     ret_val->r = z__1.r,  ret_val->i = z__1.i;
-
-    return ;
-
-/*     End of ZLADIV */
+  /*     End of ZLADIV */
 
 } /* zladiv_ */
diff --git a/lapack/zlarf.c b/lapack/zlarf.c
index 0b8ad02..032cb31 100644
--- a/lapack/zlarf.c
+++ b/lapack/zlarf.c
@@ -1,200 +1,187 @@
 /* zlarf.f -- translated by f2c (version 20061008).
    You must link the resulting object file with libf2c:
-	on Microsoft Windows system, link with libf2c.lib;
-	on Linux or Unix systems, link with .../path/to/libf2c.a -lm
-	or, if you install libf2c.a in a standard place, with -lf2c -lm
-	-- in that order, at the end of the command line, as in
-		cc *.o -lf2c -lm
-	Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
+        on Microsoft Windows system, link with libf2c.lib;
+        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
+        or, if you install libf2c.a in a standard place, with -lf2c -lm
+        -- in that order, at the end of the command line, as in
+                cc *.o -lf2c -lm
+        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
 
-		http://www.netlib.org/f2c/libf2c.zip
+                http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
 /* Table of constant values */
 
-static doublecomplex c_b1 = {1.,0.};
-static doublecomplex c_b2 = {0.,0.};
+static doublecomplex c_b1 = {1., 0.};
+static doublecomplex c_b2 = {0., 0.};
 static integer c__1 = 1;
 
-/* Subroutine */ int zlarf_(char *side, integer *m, integer *n, doublecomplex 
-	*v, integer *incv, doublecomplex *tau, doublecomplex *c__, integer *
-	ldc, doublecomplex *work)
-{
-    /* System generated locals */
-    integer c_dim1, c_offset, i__1;
-    doublecomplex z__1;
+/* Subroutine */ void zlarf_(char *side, integer *m, integer *n, doublecomplex *v, integer *incv, doublecomplex *tau,
+                             doublecomplex *c__, integer *ldc, doublecomplex *work) {
+  /* System generated locals */
+  integer c_dim1, c_offset, i__1;
+  doublecomplex z__1;
 
-    /* Local variables */
-    integer i__;
-    logical applyleft;
-    extern logical lsame_(char *, char *);
-    integer lastc;
-    extern /* Subroutine */ int zgerc_(integer *, integer *, doublecomplex *, 
-	    doublecomplex *, integer *, doublecomplex *, integer *, 
-	    doublecomplex *, integer *), zgemv_(char *, integer *, integer *, 
-	    doublecomplex *, doublecomplex *, integer *, doublecomplex *, 
-	    integer *, doublecomplex *, doublecomplex *, integer *);
-    integer lastv;
-    extern integer ilazlc_(integer *, integer *, doublecomplex *, integer *), 
-	    ilazlr_(integer *, integer *, doublecomplex *, integer *);
+  /* Local variables */
+  integer i__;
+  logical applyleft;
+  extern logical lsame_(char *, char *);
+  integer lastc;
+  extern /* Subroutine */ void zgerc_(integer *, integer *, doublecomplex *, doublecomplex *, integer *,
+                                      doublecomplex *, integer *, doublecomplex *, integer *),
+      zgemv_(const char *, const integer *, const integer *, const doublecomplex *, const doublecomplex *,
+             const integer *, const doublecomplex *, const integer *, const doublecomplex *, doublecomplex *,
+             const integer *);
+  integer lastv;
+  extern integer ilazlc_(integer *, integer *, doublecomplex *, integer *),
+      ilazlr_(integer *, integer *, doublecomplex *, integer *);
 
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*     .. Scalar Arguments .. */
+  /*     .. */
+  /*     .. Array Arguments .. */
+  /*     .. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
-/*     .. Array Arguments .. */
-/*     .. */
+  /*  Purpose */
+  /*  ======= */
 
-/*  Purpose */
-/*  ======= */
+  /*  ZLARF applies a complex elementary reflector H to a complex M-by-N */
+  /*  matrix C, from either the left or the right. H is represented in the */
+  /*  form */
 
-/*  ZLARF applies a complex elementary reflector H to a complex M-by-N */
-/*  matrix C, from either the left or the right. H is represented in the */
-/*  form */
+  /*        H = I - tau * v * v' */
 
-/*        H = I - tau * v * v' */
+  /*  where tau is a complex scalar and v is a complex vector. */
 
-/*  where tau is a complex scalar and v is a complex vector. */
+  /*  If tau = 0, then H is taken to be the unit matrix. */
 
-/*  If tau = 0, then H is taken to be the unit matrix. */
+  /*  To apply H' (the conjugate transpose of H), supply conjg(tau) instead */
+  /*  tau. */
 
-/*  To apply H' (the conjugate transpose of H), supply conjg(tau) instead */
-/*  tau. */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Arguments */
-/*  ========= */
+  /*  SIDE    (input) CHARACTER*1 */
+  /*          = 'L': form  H * C */
+  /*          = 'R': form  C * H */
 
-/*  SIDE    (input) CHARACTER*1 */
-/*          = 'L': form  H * C */
-/*          = 'R': form  C * H */
+  /*  M       (input) INTEGER */
+  /*          The number of rows of the matrix C. */
 
-/*  M       (input) INTEGER */
-/*          The number of rows of the matrix C. */
+  /*  N       (input) INTEGER */
+  /*          The number of columns of the matrix C. */
 
-/*  N       (input) INTEGER */
-/*          The number of columns of the matrix C. */
+  /*  V       (input) COMPLEX*16 array, dimension */
+  /*                     (1 + (M-1)*abs(INCV)) if SIDE = 'L' */
+  /*                  or (1 + (N-1)*abs(INCV)) if SIDE = 'R' */
+  /*          The vector v in the representation of H. V is not used if */
+  /*          TAU = 0. */
 
-/*  V       (input) COMPLEX*16 array, dimension */
-/*                     (1 + (M-1)*abs(INCV)) if SIDE = 'L' */
-/*                  or (1 + (N-1)*abs(INCV)) if SIDE = 'R' */
-/*          The vector v in the representation of H. V is not used if */
-/*          TAU = 0. */
+  /*  INCV    (input) INTEGER */
+  /*          The increment between elements of v. INCV <> 0. */
 
-/*  INCV    (input) INTEGER */
-/*          The increment between elements of v. INCV <> 0. */
+  /*  TAU     (input) COMPLEX*16 */
+  /*          The value tau in the representation of H. */
 
-/*  TAU     (input) COMPLEX*16 */
-/*          The value tau in the representation of H. */
+  /*  C       (input/output) COMPLEX*16 array, dimension (LDC,N) */
+  /*          On entry, the M-by-N matrix C. */
+  /*          On exit, C is overwritten by the matrix H * C if SIDE = 'L', */
+  /*          or C * H if SIDE = 'R'. */
 
-/*  C       (input/output) COMPLEX*16 array, dimension (LDC,N) */
-/*          On entry, the M-by-N matrix C. */
-/*          On exit, C is overwritten by the matrix H * C if SIDE = 'L', */
-/*          or C * H if SIDE = 'R'. */
+  /*  LDC     (input) INTEGER */
+  /*          The leading dimension of the array C. LDC >= max(1,M). */
 
-/*  LDC     (input) INTEGER */
-/*          The leading dimension of the array C. LDC >= max(1,M). */
+  /*  WORK    (workspace) COMPLEX*16 array, dimension */
+  /*                         (N) if SIDE = 'L' */
+  /*                      or (M) if SIDE = 'R' */
 
-/*  WORK    (workspace) COMPLEX*16 array, dimension */
-/*                         (N) if SIDE = 'L' */
-/*                      or (M) if SIDE = 'R' */
+  /*  ===================================================================== */
 
-/*  ===================================================================== */
+  /*     .. Parameters .. */
+  /*     .. */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Subroutines .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*     .. Parameters .. */
-/*     .. */
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Subroutines .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. Executable Statements .. */
+  /* Parameter adjustments */
+  --v;
+  c_dim1 = *ldc;
+  c_offset = 1 + c_dim1;
+  c__ -= c_offset;
+  --work;
 
-    /* Parameter adjustments */
-    --v;
-    c_dim1 = *ldc;
-    c_offset = 1 + c_dim1;
-    c__ -= c_offset;
-    --work;
-
-    /* Function Body */
-    applyleft = lsame_(side, "L");
-    lastv = 0;
-    lastc = 0;
-    if (tau->r != 0. || tau->i != 0.) {
-/*     Set up variables for scanning V.  LASTV begins pointing to the end */
-/*     of V. */
-	if (applyleft) {
-	    lastv = *m;
-	} else {
-	    lastv = *n;
-	}
-	if (*incv > 0) {
-	    i__ = (lastv - 1) * *incv + 1;
-	} else {
-	    i__ = 1;
-	}
-/*     Look for the last non-zero row in V. */
-	for(;;) { /* while(complicated condition) */
-	    i__1 = i__;
-	    if (!(lastv > 0 && (v[i__1].r == 0. && v[i__1].i == 0.)))
-	    	break;
-	    --lastv;
-	    i__ -= *incv;
-	}
-	if (applyleft) {
-/*     Scan for the last non-zero column in C(1:lastv,:). */
-	    lastc = ilazlc_(&lastv, n, &c__[c_offset], ldc);
-	} else {
-/*     Scan for the last non-zero row in C(:,1:lastv). */
-	    lastc = ilazlr_(m, &lastv, &c__[c_offset], ldc);
-	}
-    }
-/*     Note that lastc.eq.0 renders the BLAS operations null; no special */
-/*     case is needed at this level. */
+  /* Function Body */
+  applyleft = lsame_(side, "L");
+  lastv = 0;
+  lastc = 0;
+  if (tau->r != 0. || tau->i != 0.) {
+    /*     Set up variables for scanning V.  LASTV begins pointing to the end */
+    /*     of V. */
     if (applyleft) {
-
-/*        Form  H * C */
-
-	if (lastv > 0) {
-
-/*           w(1:lastc,1) := C(1:lastv,1:lastc)' * v(1:lastv,1) */
-
-	    zgemv_("Conjugate transpose", &lastv, &lastc, &c_b1, &c__[
-		    c_offset], ldc, &v[1], incv, &c_b2, &work[1], &c__1);
-
-/*           C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)' */
-
-	    z__1.r = -tau->r, z__1.i = -tau->i;
-	    zgerc_(&lastv, &lastc, &z__1, &v[1], incv, &work[1], &c__1, &c__[
-		    c_offset], ldc);
-	}
+      lastv = *m;
     } else {
-
-/*        Form  C * H */
-
-	if (lastv > 0) {
-
-/*           w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) */
-
-	    zgemv_("No transpose", &lastc, &lastv, &c_b1, &c__[c_offset], ldc, 
-		     &v[1], incv, &c_b2, &work[1], &c__1);
-
-/*           C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)' */
-
-	    z__1.r = -tau->r, z__1.i = -tau->i;
-	    zgerc_(&lastc, &lastv, &z__1, &work[1], &c__1, &v[1], incv, &c__[
-		    c_offset], ldc);
-	}
+      lastv = *n;
     }
-    return 0;
+    if (*incv > 0) {
+      i__ = (lastv - 1) * *incv + 1;
+    } else {
+      i__ = 1;
+    }
+    /*     Look for the last non-zero row in V. */
+    for (;;) { /* while(complicated condition) */
+      i__1 = i__;
+      if (!(lastv > 0 && (v[i__1].r == 0. && v[i__1].i == 0.))) break;
+      --lastv;
+      i__ -= *incv;
+    }
+    if (applyleft) {
+      /*     Scan for the last non-zero column in C(1:lastv,:). */
+      lastc = ilazlc_(&lastv, n, &c__[c_offset], ldc);
+    } else {
+      /*     Scan for the last non-zero row in C(:,1:lastv). */
+      lastc = ilazlr_(m, &lastv, &c__[c_offset], ldc);
+    }
+  }
+  /*     Note that lastc.eq.0 renders the BLAS operations null; no special */
+  /*     case is needed at this level. */
+  if (applyleft) {
+    /*        Form  H * C */
 
-/*     End of ZLARF */
+    if (lastv > 0) {
+      /*           w(1:lastc,1) := C(1:lastv,1:lastc)' * v(1:lastv,1) */
+
+      zgemv_("Conjugate transpose", &lastv, &lastc, &c_b1, &c__[c_offset], ldc, &v[1], incv, &c_b2, &work[1], &c__1);
+
+      /*           C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)' */
+
+      z__1.r = -tau->r, z__1.i = -tau->i;
+      zgerc_(&lastv, &lastc, &z__1, &v[1], incv, &work[1], &c__1, &c__[c_offset], ldc);
+    }
+  } else {
+    /*        Form  C * H */
+
+    if (lastv > 0) {
+      /*           w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) */
+
+      zgemv_("No transpose", &lastc, &lastv, &c_b1, &c__[c_offset], ldc, &v[1], incv, &c_b2, &work[1], &c__1);
+
+      /*           C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)' */
+
+      z__1.r = -tau->r, z__1.i = -tau->i;
+      zgerc_(&lastc, &lastv, &z__1, &work[1], &c__1, &v[1], incv, &c__[c_offset], ldc);
+    }
+  }
+
+  /*     End of ZLARF */
 
 } /* zlarf_ */
diff --git a/lapack/zlarfb.c b/lapack/zlarfb.c
index cdd584e..d98370c 100644
--- a/lapack/zlarfb.c
+++ b/lapack/zlarfb.c
@@ -1,839 +1,737 @@
 /* zlarfb.f -- translated by f2c (version 20061008).
    You must link the resulting object file with libf2c:
-	on Microsoft Windows system, link with libf2c.lib;
-	on Linux or Unix systems, link with .../path/to/libf2c.a -lm
-	or, if you install libf2c.a in a standard place, with -lf2c -lm
-	-- in that order, at the end of the command line, as in
-		cc *.o -lf2c -lm
-	Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
+        on Microsoft Windows system, link with libf2c.lib;
+        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
+        or, if you install libf2c.a in a standard place, with -lf2c -lm
+        -- in that order, at the end of the command line, as in
+                cc *.o -lf2c -lm
+        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
 
-		http://www.netlib.org/f2c/libf2c.zip
+                http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
+
+static inline void d_cnjg(doublecomplex *r, doublecomplex *z) {
+  r->r = z->r;
+  r->i = -(z->i);
+}
 
 /* Table of constant values */
 
-static doublecomplex c_b1 = {1.,0.};
+static doublecomplex c_b1 = {1., 0.};
 static integer c__1 = 1;
 
-/* Subroutine */ int zlarfb_(char *side, char *trans, char *direct, char *
-	storev, integer *m, integer *n, integer *k, doublecomplex *v, integer 
-	*ldv, doublecomplex *t, integer *ldt, doublecomplex *c__, integer *
-	ldc, doublecomplex *work, integer *ldwork)
-{
-    /* System generated locals */
-    integer c_dim1, c_offset, t_dim1, t_offset, v_dim1, v_offset, work_dim1, 
-	    work_offset, i__1, i__2, i__3, i__4, i__5;
-    doublecomplex z__1, z__2;
+/* Subroutine */ void zlarfb_(char *side, char *trans, char *direct, char *storev, integer *m, integer *n, integer *k,
+                              doublecomplex *v, integer *ldv, doublecomplex *t, integer *ldt, doublecomplex *c__,
+                              integer *ldc, doublecomplex *work, integer *ldwork) {
+  /* System generated locals */
+  integer c_dim1, c_offset, t_dim1, t_offset, v_dim1, v_offset, work_dim1, work_offset, i__1, i__2, i__3, i__4, i__5;
+  doublecomplex z__1, z__2;
 
-    /* Builtin functions */
-    void d_cnjg(doublecomplex *, doublecomplex *);
+  /* Local variables */
+  integer i__, j;
+  extern logical lsame_(char *, char *);
+  integer lastc;
+  extern /* Subroutine */ void zgemm_(const char *, const char *, const integer *, const integer *, const integer *,
+                                      const doublecomplex *, const doublecomplex *, const integer *,
+                                      const doublecomplex *, const integer *, const doublecomplex *, doublecomplex *,
+                                      const integer *);
+  integer lastv;
+  extern /* Subroutine */ void zcopy_(integer *, doublecomplex *, integer *, doublecomplex *, integer *),
+      ztrmm_(const char *, const char *, const char *, const char *, const integer *, const integer *,
+             const doublecomplex *, const doublecomplex *, const integer *, doublecomplex *, const integer *);
+  extern integer ilazlc_(integer *, integer *, doublecomplex *, integer *);
+  extern /* Subroutine */ void zlacgv_(integer *, doublecomplex *, integer *);
+  extern integer ilazlr_(integer *, integer *, doublecomplex *, integer *);
+  char transt[1];
 
-    /* Local variables */
-    integer i__, j;
-    extern logical lsame_(char *, char *);
-    integer lastc;
-    extern /* Subroutine */ int zgemm_(char *, char *, integer *, integer *, 
-	    integer *, doublecomplex *, doublecomplex *, integer *, 
-	    doublecomplex *, integer *, doublecomplex *, doublecomplex *, 
-	    integer *);
-    integer lastv;
-    extern /* Subroutine */ int zcopy_(integer *, doublecomplex *, integer *, 
-	    doublecomplex *, integer *), ztrmm_(char *, char *, char *, char *
-, integer *, integer *, doublecomplex *, doublecomplex *, integer 
-	    *, doublecomplex *, integer *);
-    extern integer ilazlc_(integer *, integer *, doublecomplex *, integer *);
-    extern /* Subroutine */ int zlacgv_(integer *, doublecomplex *, integer *)
-	    ;
-    extern integer ilazlr_(integer *, integer *, doublecomplex *, integer *);
-    char transt[1];
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
+  /*     .. Scalar Arguments .. */
+  /*     .. */
+  /*     .. Array Arguments .. */
+  /*     .. */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*  Purpose */
+  /*  ======= */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
-/*     .. Array Arguments .. */
-/*     .. */
+  /*  ZLARFB applies a complex block reflector H or its transpose H' to a */
+  /*  complex M-by-N matrix C, from either the left or the right. */
 
-/*  Purpose */
-/*  ======= */
+  /*  Arguments */
+  /*  ========= */
 
-/*  ZLARFB applies a complex block reflector H or its transpose H' to a */
-/*  complex M-by-N matrix C, from either the left or the right. */
+  /*  SIDE    (input) CHARACTER*1 */
+  /*          = 'L': apply H or H' from the Left */
+  /*          = 'R': apply H or H' from the Right */
 
-/*  Arguments */
-/*  ========= */
+  /*  TRANS   (input) CHARACTER*1 */
+  /*          = 'N': apply H (No transpose) */
+  /*          = 'C': apply H' (Conjugate transpose) */
 
-/*  SIDE    (input) CHARACTER*1 */
-/*          = 'L': apply H or H' from the Left */
-/*          = 'R': apply H or H' from the Right */
+  /*  DIRECT  (input) CHARACTER*1 */
+  /*          Indicates how H is formed from a product of elementary */
+  /*          reflectors */
+  /*          = 'F': H = H(1) H(2) . . . H(k) (Forward) */
+  /*          = 'B': H = H(k) . . . H(2) H(1) (Backward) */
 
-/*  TRANS   (input) CHARACTER*1 */
-/*          = 'N': apply H (No transpose) */
-/*          = 'C': apply H' (Conjugate transpose) */
+  /*  STOREV  (input) CHARACTER*1 */
+  /*          Indicates how the vectors which define the elementary */
+  /*          reflectors are stored: */
+  /*          = 'C': Columnwise */
+  /*          = 'R': Rowwise */
 
-/*  DIRECT  (input) CHARACTER*1 */
-/*          Indicates how H is formed from a product of elementary */
-/*          reflectors */
-/*          = 'F': H = H(1) H(2) . . . H(k) (Forward) */
-/*          = 'B': H = H(k) . . . H(2) H(1) (Backward) */
+  /*  M       (input) INTEGER */
+  /*          The number of rows of the matrix C. */
 
-/*  STOREV  (input) CHARACTER*1 */
-/*          Indicates how the vectors which define the elementary */
-/*          reflectors are stored: */
-/*          = 'C': Columnwise */
-/*          = 'R': Rowwise */
+  /*  N       (input) INTEGER */
+  /*          The number of columns of the matrix C. */
 
-/*  M       (input) INTEGER */
-/*          The number of rows of the matrix C. */
+  /*  K       (input) INTEGER */
+  /*          The order of the matrix T (= the number of elementary */
+  /*          reflectors whose product defines the block reflector). */
 
-/*  N       (input) INTEGER */
-/*          The number of columns of the matrix C. */
+  /*  V       (input) COMPLEX*16 array, dimension */
+  /*                                (LDV,K) if STOREV = 'C' */
+  /*                                (LDV,M) if STOREV = 'R' and SIDE = 'L' */
+  /*                                (LDV,N) if STOREV = 'R' and SIDE = 'R' */
+  /*          The matrix V. See further details. */
 
-/*  K       (input) INTEGER */
-/*          The order of the matrix T (= the number of elementary */
-/*          reflectors whose product defines the block reflector). */
+  /*  LDV     (input) INTEGER */
+  /*          The leading dimension of the array V. */
+  /*          If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); */
+  /*          if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); */
+  /*          if STOREV = 'R', LDV >= K. */
 
-/*  V       (input) COMPLEX*16 array, dimension */
-/*                                (LDV,K) if STOREV = 'C' */
-/*                                (LDV,M) if STOREV = 'R' and SIDE = 'L' */
-/*                                (LDV,N) if STOREV = 'R' and SIDE = 'R' */
-/*          The matrix V. See further details. */
+  /*  T       (input) COMPLEX*16 array, dimension (LDT,K) */
+  /*          The triangular K-by-K matrix T in the representation of the */
+  /*          block reflector. */
 
-/*  LDV     (input) INTEGER */
-/*          The leading dimension of the array V. */
-/*          If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); */
-/*          if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); */
-/*          if STOREV = 'R', LDV >= K. */
+  /*  LDT     (input) INTEGER */
+  /*          The leading dimension of the array T. LDT >= K. */
 
-/*  T       (input) COMPLEX*16 array, dimension (LDT,K) */
-/*          The triangular K-by-K matrix T in the representation of the */
-/*          block reflector. */
+  /*  C       (input/output) COMPLEX*16 array, dimension (LDC,N) */
+  /*          On entry, the M-by-N matrix C. */
+  /*          On exit, C is overwritten by H*C or H'*C or C*H or C*H'. */
 
-/*  LDT     (input) INTEGER */
-/*          The leading dimension of the array T. LDT >= K. */
+  /*  LDC     (input) INTEGER */
+  /*          The leading dimension of the array C. LDC >= max(1,M). */
 
-/*  C       (input/output) COMPLEX*16 array, dimension (LDC,N) */
-/*          On entry, the M-by-N matrix C. */
-/*          On exit, C is overwritten by H*C or H'*C or C*H or C*H'. */
+  /*  WORK    (workspace) COMPLEX*16 array, dimension (LDWORK,K) */
 
-/*  LDC     (input) INTEGER */
-/*          The leading dimension of the array C. LDC >= max(1,M). */
+  /*  LDWORK  (input) INTEGER */
+  /*          The leading dimension of the array WORK. */
+  /*          If SIDE = 'L', LDWORK >= max(1,N); */
+  /*          if SIDE = 'R', LDWORK >= max(1,M). */
 
-/*  WORK    (workspace) COMPLEX*16 array, dimension (LDWORK,K) */
+  /*  ===================================================================== */
 
-/*  LDWORK  (input) INTEGER */
-/*          The leading dimension of the array WORK. */
-/*          If SIDE = 'L', LDWORK >= max(1,N); */
-/*          if SIDE = 'R', LDWORK >= max(1,M). */
+  /*     .. Parameters .. */
+  /*     .. */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. External Subroutines .. */
+  /*     .. */
+  /*     .. Intrinsic Functions .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*  ===================================================================== */
+  /*     Quick return if possible */
 
-/*     .. Parameters .. */
-/*     .. */
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. External Subroutines .. */
-/*     .. */
-/*     .. Intrinsic Functions .. */
-/*     .. */
-/*     .. Executable Statements .. */
+  /* Parameter adjustments */
+  v_dim1 = *ldv;
+  v_offset = 1 + v_dim1;
+  v -= v_offset;
+  t_dim1 = *ldt;
+  t_offset = 1 + t_dim1;
+  t -= t_offset;
+  c_dim1 = *ldc;
+  c_offset = 1 + c_dim1;
+  c__ -= c_offset;
+  work_dim1 = *ldwork;
+  work_offset = 1 + work_dim1;
+  work -= work_offset;
 
-/*     Quick return if possible */
+  /* Function Body */
+  if (*m <= 0 || *n <= 0) {
+    return;
+  }
 
-    /* Parameter adjustments */
-    v_dim1 = *ldv;
-    v_offset = 1 + v_dim1;
-    v -= v_offset;
-    t_dim1 = *ldt;
-    t_offset = 1 + t_dim1;
-    t -= t_offset;
-    c_dim1 = *ldc;
-    c_offset = 1 + c_dim1;
-    c__ -= c_offset;
-    work_dim1 = *ldwork;
-    work_offset = 1 + work_dim1;
-    work -= work_offset;
+  if (lsame_(trans, "N")) {
+    *(unsigned char *)transt = 'C';
+  } else {
+    *(unsigned char *)transt = 'N';
+  }
 
-    /* Function Body */
-    if (*m <= 0 || *n <= 0) {
-	return 0;
-    }
+  if (lsame_(storev, "C")) {
+    if (lsame_(direct, "F")) {
+      /*           Let  V =  ( V1 )    (first K rows) */
+      /*                     ( V2 ) */
+      /*           where  V1  is unit lower triangular. */
 
-    if (lsame_(trans, "N")) {
-	*(unsigned char *)transt = 'C';
+      if (lsame_(side, "L")) {
+        /*              Form  H * C  or  H' * C  where  C = ( C1 ) */
+        /*                                                  ( C2 ) */
+
+        /* Computing MAX */
+        i__1 = *k, i__2 = ilazlr_(m, k, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = ilazlc_(&lastv, n, &c__[c_offset], ldc);
+
+        /*              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK) */
+
+        /*              W := C1' */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          zcopy_(&lastc, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1);
+          zlacgv_(&lastc, &work[j * work_dim1 + 1], &c__1);
+          /* L10: */
+        }
+
+        /*              W := W * V1 */
+
+        ztrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &c_b1, &v[v_offset], ldv, &work[work_offset],
+               ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C2'*V2 */
+
+          i__1 = lastv - *k;
+          zgemm_("Conjugate transpose", "No transpose", &lastc, k, &i__1, &c_b1, &c__[*k + 1 + c_dim1], ldc,
+                 &v[*k + 1 + v_dim1], ldv, &c_b1, &work[work_offset], ldwork);
+        }
+
+        /*              W := W * T'  or  W * T */
+
+        ztrmm_("Right", "Upper", transt, "Non-unit", &lastc, k, &c_b1, &t[t_offset], ldt, &work[work_offset], ldwork);
+
+        /*              C := C - V * W' */
+
+        if (*m > *k) {
+          /*                 C2 := C2 - V2 * W' */
+
+          i__1 = lastv - *k;
+          z__1.r = -1., z__1.i = -0.;
+          zgemm_("No transpose", "Conjugate transpose", &i__1, &lastc, k, &z__1, &v[*k + 1 + v_dim1], ldv,
+                 &work[work_offset], ldwork, &c_b1, &c__[*k + 1 + c_dim1], ldc);
+        }
+
+        /*              W := W * V1' */
+
+        ztrmm_("Right", "Lower", "Conjugate transpose", "Unit", &lastc, k, &c_b1, &v[v_offset], ldv, &work[work_offset],
+               ldwork);
+
+        /*              C1 := C1 - W' */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            i__3 = j + i__ * c_dim1;
+            i__4 = j + i__ * c_dim1;
+            d_cnjg(&z__2, &work[i__ + j * work_dim1]);
+            z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - z__2.i;
+            c__[i__3].r = z__1.r, c__[i__3].i = z__1.i;
+            /* L20: */
+          }
+          /* L30: */
+        }
+
+      } else if (lsame_(side, "R")) {
+        /*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
+
+        /* Computing MAX */
+        i__1 = *k, i__2 = ilazlr_(n, k, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = ilazlr_(m, &lastv, &c__[c_offset], ldc);
+
+        /*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK) */
+
+        /*              W := C1 */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          zcopy_(&lastc, &c__[j * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1);
+          /* L40: */
+        }
+
+        /*              W := W * V1 */
+
+        ztrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &c_b1, &v[v_offset], ldv, &work[work_offset],
+               ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C2 * V2 */
+
+          i__1 = lastv - *k;
+          zgemm_("No transpose", "No transpose", &lastc, k, &i__1, &c_b1, &c__[(*k + 1) * c_dim1 + 1], ldc,
+                 &v[*k + 1 + v_dim1], ldv, &c_b1, &work[work_offset], ldwork);
+        }
+
+        /*              W := W * T  or  W * T' */
+
+        ztrmm_("Right", "Upper", trans, "Non-unit", &lastc, k, &c_b1, &t[t_offset], ldt, &work[work_offset], ldwork);
+
+        /*              C := C - W * V' */
+
+        if (lastv > *k) {
+          /*                 C2 := C2 - W * V2' */
+
+          i__1 = lastv - *k;
+          z__1.r = -1., z__1.i = -0.;
+          zgemm_("No transpose", "Conjugate transpose", &lastc, &i__1, k, &z__1, &work[work_offset], ldwork,
+                 &v[*k + 1 + v_dim1], ldv, &c_b1, &c__[(*k + 1) * c_dim1 + 1], ldc);
+        }
+
+        /*              W := W * V1' */
+
+        ztrmm_("Right", "Lower", "Conjugate transpose", "Unit", &lastc, k, &c_b1, &v[v_offset], ldv, &work[work_offset],
+               ldwork);
+
+        /*              C1 := C1 - W */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            i__3 = i__ + j * c_dim1;
+            i__4 = i__ + j * c_dim1;
+            i__5 = i__ + j * work_dim1;
+            z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[i__4].i - work[i__5].i;
+            c__[i__3].r = z__1.r, c__[i__3].i = z__1.i;
+            /* L50: */
+          }
+          /* L60: */
+        }
+      }
+
     } else {
-	*(unsigned char *)transt = 'N';
+      /*           Let  V =  ( V1 ) */
+      /*                     ( V2 )    (last K rows) */
+      /*           where  V2  is unit upper triangular. */
+
+      if (lsame_(side, "L")) {
+        /*              Form  H * C  or  H' * C  where  C = ( C1 ) */
+        /*                                                  ( C2 ) */
+
+        /* Computing MAX */
+        i__1 = *k, i__2 = ilazlr_(m, k, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = ilazlc_(&lastv, n, &c__[c_offset], ldc);
+
+        /*              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK) */
+
+        /*              W := C2' */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          zcopy_(&lastc, &c__[lastv - *k + j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1);
+          zlacgv_(&lastc, &work[j * work_dim1 + 1], &c__1);
+          /* L70: */
+        }
+
+        /*              W := W * V2 */
+
+        ztrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &c_b1, &v[lastv - *k + 1 + v_dim1], ldv,
+               &work[work_offset], ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C1'*V1 */
+
+          i__1 = lastv - *k;
+          zgemm_("Conjugate transpose", "No transpose", &lastc, k, &i__1, &c_b1, &c__[c_offset], ldc, &v[v_offset], ldv,
+                 &c_b1, &work[work_offset], ldwork);
+        }
+
+        /*              W := W * T'  or  W * T */
+
+        ztrmm_("Right", "Lower", transt, "Non-unit", &lastc, k, &c_b1, &t[t_offset], ldt, &work[work_offset], ldwork);
+
+        /*              C := C - V * W' */
+
+        if (lastv > *k) {
+          /*                 C1 := C1 - V1 * W' */
+
+          i__1 = lastv - *k;
+          z__1.r = -1., z__1.i = -0.;
+          zgemm_("No transpose", "Conjugate transpose", &i__1, &lastc, k, &z__1, &v[v_offset], ldv, &work[work_offset],
+                 ldwork, &c_b1, &c__[c_offset], ldc);
+        }
+
+        /*              W := W * V2' */
+
+        ztrmm_("Right", "Upper", "Conjugate transpose", "Unit", &lastc, k, &c_b1, &v[lastv - *k + 1 + v_dim1], ldv,
+               &work[work_offset], ldwork);
+
+        /*              C2 := C2 - W' */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            i__3 = lastv - *k + j + i__ * c_dim1;
+            i__4 = lastv - *k + j + i__ * c_dim1;
+            d_cnjg(&z__2, &work[i__ + j * work_dim1]);
+            z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - z__2.i;
+            c__[i__3].r = z__1.r, c__[i__3].i = z__1.i;
+            /* L80: */
+          }
+          /* L90: */
+        }
+
+      } else if (lsame_(side, "R")) {
+        /*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
+
+        /* Computing MAX */
+        i__1 = *k, i__2 = ilazlr_(n, k, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = ilazlr_(m, &lastv, &c__[c_offset], ldc);
+
+        /*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK) */
+
+        /*              W := C2 */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          zcopy_(&lastc, &c__[(lastv - *k + j) * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1);
+          /* L100: */
+        }
+
+        /*              W := W * V2 */
+
+        ztrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &c_b1, &v[lastv - *k + 1 + v_dim1], ldv,
+               &work[work_offset], ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C1 * V1 */
+
+          i__1 = lastv - *k;
+          zgemm_("No transpose", "No transpose", &lastc, k, &i__1, &c_b1, &c__[c_offset], ldc, &v[v_offset], ldv, &c_b1,
+                 &work[work_offset], ldwork);
+        }
+
+        /*              W := W * T  or  W * T' */
+
+        ztrmm_("Right", "Lower", trans, "Non-unit", &lastc, k, &c_b1, &t[t_offset], ldt, &work[work_offset], ldwork);
+
+        /*              C := C - W * V' */
+
+        if (lastv > *k) {
+          /*                 C1 := C1 - W * V1' */
+
+          i__1 = lastv - *k;
+          z__1.r = -1., z__1.i = -0.;
+          zgemm_("No transpose", "Conjugate transpose", &lastc, &i__1, k, &z__1, &work[work_offset], ldwork,
+                 &v[v_offset], ldv, &c_b1, &c__[c_offset], ldc);
+        }
+
+        /*              W := W * V2' */
+
+        ztrmm_("Right", "Upper", "Conjugate transpose", "Unit", &lastc, k, &c_b1, &v[lastv - *k + 1 + v_dim1], ldv,
+               &work[work_offset], ldwork);
+
+        /*              C2 := C2 - W */
+
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            i__3 = i__ + (lastv - *k + j) * c_dim1;
+            i__4 = i__ + (lastv - *k + j) * c_dim1;
+            i__5 = i__ + j * work_dim1;
+            z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[i__4].i - work[i__5].i;
+            c__[i__3].r = z__1.r, c__[i__3].i = z__1.i;
+            /* L110: */
+          }
+          /* L120: */
+        }
+      }
     }
 
-    if (lsame_(storev, "C")) {
+  } else if (lsame_(storev, "R")) {
+    if (lsame_(direct, "F")) {
+      /*           Let  V =  ( V1  V2 )    (V1: first K columns) */
+      /*           where  V1  is unit upper triangular. */
 
-	if (lsame_(direct, "F")) {
+      if (lsame_(side, "L")) {
+        /*              Form  H * C  or  H' * C  where  C = ( C1 ) */
+        /*                                                  ( C2 ) */
 
-/*           Let  V =  ( V1 )    (first K rows) */
-/*                     ( V2 ) */
-/*           where  V1  is unit lower triangular. */
+        /* Computing MAX */
+        i__1 = *k, i__2 = ilazlc_(k, m, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = ilazlc_(&lastv, n, &c__[c_offset], ldc);
 
-	    if (lsame_(side, "L")) {
+        /*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK) */
 
-/*              Form  H * C  or  H' * C  where  C = ( C1 ) */
-/*                                                  ( C2 ) */
+        /*              W := C1' */
 
-/* Computing MAX */
-		i__1 = *k, i__2 = ilazlr_(m, k, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = ilazlc_(&lastv, n, &c__[c_offset], ldc);
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          zcopy_(&lastc, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1);
+          zlacgv_(&lastc, &work[j * work_dim1 + 1], &c__1);
+          /* L130: */
+        }
 
-/*              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK) */
+        /*              W := W * V1' */
 
-/*              W := C1' */
+        ztrmm_("Right", "Upper", "Conjugate transpose", "Unit", &lastc, k, &c_b1, &v[v_offset], ldv, &work[work_offset],
+               ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C2'*V2' */
 
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    zcopy_(&lastc, &c__[j + c_dim1], ldc, &work[j * work_dim1 
-			    + 1], &c__1);
-		    zlacgv_(&lastc, &work[j * work_dim1 + 1], &c__1);
-/* L10: */
-		}
+          i__1 = lastv - *k;
+          zgemm_("Conjugate transpose", "Conjugate transpose", &lastc, k, &i__1, &c_b1, &c__[*k + 1 + c_dim1], ldc,
+                 &v[(*k + 1) * v_dim1 + 1], ldv, &c_b1, &work[work_offset], ldwork);
+        }
 
-/*              W := W * V1 */
+        /*              W := W * T'  or  W * T */
 
-		ztrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &
-			c_b1, &v[v_offset], ldv, &work[work_offset], ldwork);
-		if (lastv > *k) {
+        ztrmm_("Right", "Upper", transt, "Non-unit", &lastc, k, &c_b1, &t[t_offset], ldt, &work[work_offset], ldwork);
 
-/*                 W := W + C2'*V2 */
+        /*              C := C - V' * W' */
 
-		    i__1 = lastv - *k;
-		    zgemm_("Conjugate transpose", "No transpose", &lastc, k, &
-			    i__1, &c_b1, &c__[*k + 1 + c_dim1], ldc, &v[*k + 
-			    1 + v_dim1], ldv, &c_b1, &work[work_offset], 
-			    ldwork);
-		}
+        if (lastv > *k) {
+          /*                 C2 := C2 - V2' * W' */
 
-/*              W := W * T'  or  W * T */
+          i__1 = lastv - *k;
+          z__1.r = -1., z__1.i = -0.;
+          zgemm_("Conjugate transpose", "Conjugate transpose", &i__1, &lastc, k, &z__1, &v[(*k + 1) * v_dim1 + 1], ldv,
+                 &work[work_offset], ldwork, &c_b1, &c__[*k + 1 + c_dim1], ldc);
+        }
 
-		ztrmm_("Right", "Upper", transt, "Non-unit", &lastc, k, &c_b1, 
-			 &t[t_offset], ldt, &work[work_offset], ldwork);
+        /*              W := W * V1 */
 
-/*              C := C - V * W' */
+        ztrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &c_b1, &v[v_offset], ldv, &work[work_offset],
+               ldwork);
 
-		if (*m > *k) {
+        /*              C1 := C1 - W' */
 
-/*                 C2 := C2 - V2 * W' */
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            i__3 = j + i__ * c_dim1;
+            i__4 = j + i__ * c_dim1;
+            d_cnjg(&z__2, &work[i__ + j * work_dim1]);
+            z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - z__2.i;
+            c__[i__3].r = z__1.r, c__[i__3].i = z__1.i;
+            /* L140: */
+          }
+          /* L150: */
+        }
 
-		    i__1 = lastv - *k;
-		    z__1.r = -1., z__1.i = -0.;
-		    zgemm_("No transpose", "Conjugate transpose", &i__1, &
-			    lastc, k, &z__1, &v[*k + 1 + v_dim1], ldv, &work[
-			    work_offset], ldwork, &c_b1, &c__[*k + 1 + c_dim1]
-, ldc);
-		}
+      } else if (lsame_(side, "R")) {
+        /*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
 
-/*              W := W * V1' */
+        /* Computing MAX */
+        i__1 = *k, i__2 = ilazlc_(k, n, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = ilazlr_(m, &lastv, &c__[c_offset], ldc);
 
-		ztrmm_("Right", "Lower", "Conjugate transpose", "Unit", &
-			lastc, k, &c_b1, &v[v_offset], ldv, &work[work_offset]
-, ldwork)
-			;
+        /*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK) */
 
-/*              C1 := C1 - W' */
+        /*              W := C1 */
 
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			i__3 = j + i__ * c_dim1;
-			i__4 = j + i__ * c_dim1;
-			d_cnjg(&z__2, &work[i__ + j * work_dim1]);
-			z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - 
-				z__2.i;
-			c__[i__3].r = z__1.r, c__[i__3].i = z__1.i;
-/* L20: */
-		    }
-/* L30: */
-		}
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          zcopy_(&lastc, &c__[j * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1);
+          /* L160: */
+        }
 
-	    } else if (lsame_(side, "R")) {
+        /*              W := W * V1' */
 
-/*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
+        ztrmm_("Right", "Upper", "Conjugate transpose", "Unit", &lastc, k, &c_b1, &v[v_offset], ldv, &work[work_offset],
+               ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C2 * V2' */
 
-/* Computing MAX */
-		i__1 = *k, i__2 = ilazlr_(n, k, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = ilazlr_(m, &lastv, &c__[c_offset], ldc);
+          i__1 = lastv - *k;
+          zgemm_("No transpose", "Conjugate transpose", &lastc, k, &i__1, &c_b1, &c__[(*k + 1) * c_dim1 + 1], ldc,
+                 &v[(*k + 1) * v_dim1 + 1], ldv, &c_b1, &work[work_offset], ldwork);
+        }
 
-/*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK) */
+        /*              W := W * T  or  W * T' */
 
-/*              W := C1 */
+        ztrmm_("Right", "Upper", trans, "Non-unit", &lastc, k, &c_b1, &t[t_offset], ldt, &work[work_offset], ldwork);
 
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    zcopy_(&lastc, &c__[j * c_dim1 + 1], &c__1, &work[j * 
-			    work_dim1 + 1], &c__1);
-/* L40: */
-		}
+        /*              C := C - W * V */
 
-/*              W := W * V1 */
+        if (lastv > *k) {
+          /*                 C2 := C2 - W * V2 */
 
-		ztrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &
-			c_b1, &v[v_offset], ldv, &work[work_offset], ldwork);
-		if (lastv > *k) {
+          i__1 = lastv - *k;
+          z__1.r = -1., z__1.i = -0.;
+          zgemm_("No transpose", "No transpose", &lastc, &i__1, k, &z__1, &work[work_offset], ldwork,
+                 &v[(*k + 1) * v_dim1 + 1], ldv, &c_b1, &c__[(*k + 1) * c_dim1 + 1], ldc);
+        }
 
-/*                 W := W + C2 * V2 */
+        /*              W := W * V1 */
 
-		    i__1 = lastv - *k;
-		    zgemm_("No transpose", "No transpose", &lastc, k, &i__1, &
-			    c_b1, &c__[(*k + 1) * c_dim1 + 1], ldc, &v[*k + 1 
-			    + v_dim1], ldv, &c_b1, &work[work_offset], ldwork);
-		}
+        ztrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &c_b1, &v[v_offset], ldv, &work[work_offset],
+               ldwork);
 
-/*              W := W * T  or  W * T' */
+        /*              C1 := C1 - W */
 
-		ztrmm_("Right", "Upper", trans, "Non-unit", &lastc, k, &c_b1, 
-			&t[t_offset], ldt, &work[work_offset], ldwork);
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            i__3 = i__ + j * c_dim1;
+            i__4 = i__ + j * c_dim1;
+            i__5 = i__ + j * work_dim1;
+            z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[i__4].i - work[i__5].i;
+            c__[i__3].r = z__1.r, c__[i__3].i = z__1.i;
+            /* L170: */
+          }
+          /* L180: */
+        }
+      }
 
-/*              C := C - W * V' */
+    } else {
+      /*           Let  V =  ( V1  V2 )    (V2: last K columns) */
+      /*           where  V2  is unit lower triangular. */
 
-		if (lastv > *k) {
+      if (lsame_(side, "L")) {
+        /*              Form  H * C  or  H' * C  where  C = ( C1 ) */
+        /*                                                  ( C2 ) */
 
-/*                 C2 := C2 - W * V2' */
+        /* Computing MAX */
+        i__1 = *k, i__2 = ilazlc_(k, m, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = ilazlc_(&lastv, n, &c__[c_offset], ldc);
 
-		    i__1 = lastv - *k;
-		    z__1.r = -1., z__1.i = -0.;
-		    zgemm_("No transpose", "Conjugate transpose", &lastc, &
-			    i__1, k, &z__1, &work[work_offset], ldwork, &v[*k 
-			    + 1 + v_dim1], ldv, &c_b1, &c__[(*k + 1) * c_dim1 
-			    + 1], ldc);
-		}
+        /*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK) */
 
-/*              W := W * V1' */
+        /*              W := C2' */
 
-		ztrmm_("Right", "Lower", "Conjugate transpose", "Unit", &
-			lastc, k, &c_b1, &v[v_offset], ldv, &work[work_offset]
-, ldwork)
-			;
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          zcopy_(&lastc, &c__[lastv - *k + j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1);
+          zlacgv_(&lastc, &work[j * work_dim1 + 1], &c__1);
+          /* L190: */
+        }
 
-/*              C1 := C1 - W */
+        /*              W := W * V2' */
 
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			i__3 = i__ + j * c_dim1;
-			i__4 = i__ + j * c_dim1;
-			i__5 = i__ + j * work_dim1;
-			z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[
-				i__4].i - work[i__5].i;
-			c__[i__3].r = z__1.r, c__[i__3].i = z__1.i;
-/* L50: */
-		    }
-/* L60: */
-		}
-	    }
+        ztrmm_("Right", "Lower", "Conjugate transpose", "Unit", &lastc, k, &c_b1, &v[(lastv - *k + 1) * v_dim1 + 1],
+               ldv, &work[work_offset], ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C1'*V1' */
 
-	} else {
+          i__1 = lastv - *k;
+          zgemm_("Conjugate transpose", "Conjugate transpose", &lastc, k, &i__1, &c_b1, &c__[c_offset], ldc,
+                 &v[v_offset], ldv, &c_b1, &work[work_offset], ldwork);
+        }
 
-/*           Let  V =  ( V1 ) */
-/*                     ( V2 )    (last K rows) */
-/*           where  V2  is unit upper triangular. */
+        /*              W := W * T'  or  W * T */
 
-	    if (lsame_(side, "L")) {
+        ztrmm_("Right", "Lower", transt, "Non-unit", &lastc, k, &c_b1, &t[t_offset], ldt, &work[work_offset], ldwork);
 
-/*              Form  H * C  or  H' * C  where  C = ( C1 ) */
-/*                                                  ( C2 ) */
+        /*              C := C - V' * W' */
 
-/* Computing MAX */
-		i__1 = *k, i__2 = ilazlr_(m, k, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = ilazlc_(&lastv, n, &c__[c_offset], ldc);
+        if (lastv > *k) {
+          /*                 C1 := C1 - V1' * W' */
 
-/*              W := C' * V  =  (C1'*V1 + C2'*V2)  (stored in WORK) */
+          i__1 = lastv - *k;
+          z__1.r = -1., z__1.i = -0.;
+          zgemm_("Conjugate transpose", "Conjugate transpose", &i__1, &lastc, k, &z__1, &v[v_offset], ldv,
+                 &work[work_offset], ldwork, &c_b1, &c__[c_offset], ldc);
+        }
 
-/*              W := C2' */
+        /*              W := W * V2 */
 
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    zcopy_(&lastc, &c__[lastv - *k + j + c_dim1], ldc, &work[
-			    j * work_dim1 + 1], &c__1);
-		    zlacgv_(&lastc, &work[j * work_dim1 + 1], &c__1);
-/* L70: */
-		}
+        ztrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &c_b1, &v[(lastv - *k + 1) * v_dim1 + 1], ldv,
+               &work[work_offset], ldwork);
 
-/*              W := W * V2 */
+        /*              C2 := C2 - W' */
 
-		ztrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &
-			c_b1, &v[lastv - *k + 1 + v_dim1], ldv, &work[
-			work_offset], ldwork);
-		if (lastv > *k) {
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            i__3 = lastv - *k + j + i__ * c_dim1;
+            i__4 = lastv - *k + j + i__ * c_dim1;
+            d_cnjg(&z__2, &work[i__ + j * work_dim1]);
+            z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - z__2.i;
+            c__[i__3].r = z__1.r, c__[i__3].i = z__1.i;
+            /* L200: */
+          }
+          /* L210: */
+        }
 
-/*                 W := W + C1'*V1 */
+      } else if (lsame_(side, "R")) {
+        /*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
 
-		    i__1 = lastv - *k;
-		    zgemm_("Conjugate transpose", "No transpose", &lastc, k, &
-			    i__1, &c_b1, &c__[c_offset], ldc, &v[v_offset], 
-			    ldv, &c_b1, &work[work_offset], ldwork);
-		}
+        /* Computing MAX */
+        i__1 = *k, i__2 = ilazlc_(k, n, &v[v_offset], ldv);
+        lastv = max(i__1, i__2);
+        lastc = ilazlr_(m, &lastv, &c__[c_offset], ldc);
 
-/*              W := W * T'  or  W * T */
+        /*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK) */
 
-		ztrmm_("Right", "Lower", transt, "Non-unit", &lastc, k, &c_b1, 
-			 &t[t_offset], ldt, &work[work_offset], ldwork);
+        /*              W := C2 */
 
-/*              C := C - V * W' */
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          zcopy_(&lastc, &c__[(lastv - *k + j) * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1);
+          /* L220: */
+        }
 
-		if (lastv > *k) {
+        /*              W := W * V2' */
 
-/*                 C1 := C1 - V1 * W' */
+        ztrmm_("Right", "Lower", "Conjugate transpose", "Unit", &lastc, k, &c_b1, &v[(lastv - *k + 1) * v_dim1 + 1],
+               ldv, &work[work_offset], ldwork);
+        if (lastv > *k) {
+          /*                 W := W + C1 * V1' */
 
-		    i__1 = lastv - *k;
-		    z__1.r = -1., z__1.i = -0.;
-		    zgemm_("No transpose", "Conjugate transpose", &i__1, &
-			    lastc, k, &z__1, &v[v_offset], ldv, &work[
-			    work_offset], ldwork, &c_b1, &c__[c_offset], ldc);
-		}
+          i__1 = lastv - *k;
+          zgemm_("No transpose", "Conjugate transpose", &lastc, k, &i__1, &c_b1, &c__[c_offset], ldc, &v[v_offset], ldv,
+                 &c_b1, &work[work_offset], ldwork);
+        }
 
-/*              W := W * V2' */
+        /*              W := W * T  or  W * T' */
 
-		ztrmm_("Right", "Upper", "Conjugate transpose", "Unit", &
-			lastc, k, &c_b1, &v[lastv - *k + 1 + v_dim1], ldv, &
-			work[work_offset], ldwork);
+        ztrmm_("Right", "Lower", trans, "Non-unit", &lastc, k, &c_b1, &t[t_offset], ldt, &work[work_offset], ldwork);
 
-/*              C2 := C2 - W' */
+        /*              C := C - W * V */
 
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			i__3 = lastv - *k + j + i__ * c_dim1;
-			i__4 = lastv - *k + j + i__ * c_dim1;
-			d_cnjg(&z__2, &work[i__ + j * work_dim1]);
-			z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - 
-				z__2.i;
-			c__[i__3].r = z__1.r, c__[i__3].i = z__1.i;
-/* L80: */
-		    }
-/* L90: */
-		}
+        if (lastv > *k) {
+          /*                 C1 := C1 - W * V1 */
 
-	    } else if (lsame_(side, "R")) {
+          i__1 = lastv - *k;
+          z__1.r = -1., z__1.i = -0.;
+          zgemm_("No transpose", "No transpose", &lastc, &i__1, k, &z__1, &work[work_offset], ldwork, &v[v_offset], ldv,
+                 &c_b1, &c__[c_offset], ldc);
+        }
 
-/*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
+        /*              W := W * V2 */
 
-/* Computing MAX */
-		i__1 = *k, i__2 = ilazlr_(n, k, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = ilazlr_(m, &lastv, &c__[c_offset], ldc);
+        ztrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &c_b1, &v[(lastv - *k + 1) * v_dim1 + 1], ldv,
+               &work[work_offset], ldwork);
 
-/*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK) */
+        /*              C1 := C1 - W */
 
-/*              W := C2 */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    zcopy_(&lastc, &c__[(lastv - *k + j) * c_dim1 + 1], &c__1, 
-			     &work[j * work_dim1 + 1], &c__1);
-/* L100: */
-		}
-
-/*              W := W * V2 */
-
-		ztrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &
-			c_b1, &v[lastv - *k + 1 + v_dim1], ldv, &work[
-			work_offset], ldwork);
-		if (lastv > *k) {
-
-/*                 W := W + C1 * V1 */
-
-		    i__1 = lastv - *k;
-		    zgemm_("No transpose", "No transpose", &lastc, k, &i__1, &
-			    c_b1, &c__[c_offset], ldc, &v[v_offset], ldv, &
-			    c_b1, &work[work_offset], ldwork);
-		}
-
-/*              W := W * T  or  W * T' */
-
-		ztrmm_("Right", "Lower", trans, "Non-unit", &lastc, k, &c_b1, 
-			&t[t_offset], ldt, &work[work_offset], ldwork);
-
-/*              C := C - W * V' */
-
-		if (lastv > *k) {
-
-/*                 C1 := C1 - W * V1' */
-
-		    i__1 = lastv - *k;
-		    z__1.r = -1., z__1.i = -0.;
-		    zgemm_("No transpose", "Conjugate transpose", &lastc, &
-			    i__1, k, &z__1, &work[work_offset], ldwork, &v[
-			    v_offset], ldv, &c_b1, &c__[c_offset], ldc);
-		}
-
-/*              W := W * V2' */
-
-		ztrmm_("Right", "Upper", "Conjugate transpose", "Unit", &
-			lastc, k, &c_b1, &v[lastv - *k + 1 + v_dim1], ldv, &
-			work[work_offset], ldwork);
-
-/*              C2 := C2 - W */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			i__3 = i__ + (lastv - *k + j) * c_dim1;
-			i__4 = i__ + (lastv - *k + j) * c_dim1;
-			i__5 = i__ + j * work_dim1;
-			z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[
-				i__4].i - work[i__5].i;
-			c__[i__3].r = z__1.r, c__[i__3].i = z__1.i;
-/* L110: */
-		    }
-/* L120: */
-		}
-	    }
-	}
-
-    } else if (lsame_(storev, "R")) {
-
-	if (lsame_(direct, "F")) {
-
-/*           Let  V =  ( V1  V2 )    (V1: first K columns) */
-/*           where  V1  is unit upper triangular. */
-
-	    if (lsame_(side, "L")) {
-
-/*              Form  H * C  or  H' * C  where  C = ( C1 ) */
-/*                                                  ( C2 ) */
-
-/* Computing MAX */
-		i__1 = *k, i__2 = ilazlc_(k, m, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = ilazlc_(&lastv, n, &c__[c_offset], ldc);
-
-/*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK) */
-
-/*              W := C1' */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    zcopy_(&lastc, &c__[j + c_dim1], ldc, &work[j * work_dim1 
-			    + 1], &c__1);
-		    zlacgv_(&lastc, &work[j * work_dim1 + 1], &c__1);
-/* L130: */
-		}
-
-/*              W := W * V1' */
-
-		ztrmm_("Right", "Upper", "Conjugate transpose", "Unit", &
-			lastc, k, &c_b1, &v[v_offset], ldv, &work[work_offset]
-, ldwork)
-			;
-		if (lastv > *k) {
-
-/*                 W := W + C2'*V2' */
-
-		    i__1 = lastv - *k;
-		    zgemm_("Conjugate transpose", "Conjugate transpose", &
-			    lastc, k, &i__1, &c_b1, &c__[*k + 1 + c_dim1], 
-			    ldc, &v[(*k + 1) * v_dim1 + 1], ldv, &c_b1, &work[
-			    work_offset], ldwork);
-		}
-
-/*              W := W * T'  or  W * T */
-
-		ztrmm_("Right", "Upper", transt, "Non-unit", &lastc, k, &c_b1, 
-			 &t[t_offset], ldt, &work[work_offset], ldwork);
-
-/*              C := C - V' * W' */
-
-		if (lastv > *k) {
-
-/*                 C2 := C2 - V2' * W' */
-
-		    i__1 = lastv - *k;
-		    z__1.r = -1., z__1.i = -0.;
-		    zgemm_("Conjugate transpose", "Conjugate transpose", &
-			    i__1, &lastc, k, &z__1, &v[(*k + 1) * v_dim1 + 1], 
-			     ldv, &work[work_offset], ldwork, &c_b1, &c__[*k 
-			    + 1 + c_dim1], ldc);
-		}
-
-/*              W := W * V1 */
-
-		ztrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &
-			c_b1, &v[v_offset], ldv, &work[work_offset], ldwork);
-
-/*              C1 := C1 - W' */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			i__3 = j + i__ * c_dim1;
-			i__4 = j + i__ * c_dim1;
-			d_cnjg(&z__2, &work[i__ + j * work_dim1]);
-			z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - 
-				z__2.i;
-			c__[i__3].r = z__1.r, c__[i__3].i = z__1.i;
-/* L140: */
-		    }
-/* L150: */
-		}
-
-	    } else if (lsame_(side, "R")) {
-
-/*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
-
-/* Computing MAX */
-		i__1 = *k, i__2 = ilazlc_(k, n, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = ilazlr_(m, &lastv, &c__[c_offset], ldc);
-
-/*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK) */
-
-/*              W := C1 */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    zcopy_(&lastc, &c__[j * c_dim1 + 1], &c__1, &work[j * 
-			    work_dim1 + 1], &c__1);
-/* L160: */
-		}
-
-/*              W := W * V1' */
-
-		ztrmm_("Right", "Upper", "Conjugate transpose", "Unit", &
-			lastc, k, &c_b1, &v[v_offset], ldv, &work[work_offset]
-, ldwork)
-			;
-		if (lastv > *k) {
-
-/*                 W := W + C2 * V2' */
-
-		    i__1 = lastv - *k;
-		    zgemm_("No transpose", "Conjugate transpose", &lastc, k, &
-			    i__1, &c_b1, &c__[(*k + 1) * c_dim1 + 1], ldc, &v[
-			    (*k + 1) * v_dim1 + 1], ldv, &c_b1, &work[
-			    work_offset], ldwork);
-		}
-
-/*              W := W * T  or  W * T' */
-
-		ztrmm_("Right", "Upper", trans, "Non-unit", &lastc, k, &c_b1, 
-			&t[t_offset], ldt, &work[work_offset], ldwork);
-
-/*              C := C - W * V */
-
-		if (lastv > *k) {
-
-/*                 C2 := C2 - W * V2 */
-
-		    i__1 = lastv - *k;
-		    z__1.r = -1., z__1.i = -0.;
-		    zgemm_("No transpose", "No transpose", &lastc, &i__1, k, &
-			    z__1, &work[work_offset], ldwork, &v[(*k + 1) * 
-			    v_dim1 + 1], ldv, &c_b1, &c__[(*k + 1) * c_dim1 + 
-			    1], ldc);
-		}
-
-/*              W := W * V1 */
-
-		ztrmm_("Right", "Upper", "No transpose", "Unit", &lastc, k, &
-			c_b1, &v[v_offset], ldv, &work[work_offset], ldwork);
-
-/*              C1 := C1 - W */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			i__3 = i__ + j * c_dim1;
-			i__4 = i__ + j * c_dim1;
-			i__5 = i__ + j * work_dim1;
-			z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[
-				i__4].i - work[i__5].i;
-			c__[i__3].r = z__1.r, c__[i__3].i = z__1.i;
-/* L170: */
-		    }
-/* L180: */
-		}
-
-	    }
-
-	} else {
-
-/*           Let  V =  ( V1  V2 )    (V2: last K columns) */
-/*           where  V2  is unit lower triangular. */
-
-	    if (lsame_(side, "L")) {
-
-/*              Form  H * C  or  H' * C  where  C = ( C1 ) */
-/*                                                  ( C2 ) */
-
-/* Computing MAX */
-		i__1 = *k, i__2 = ilazlc_(k, m, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = ilazlc_(&lastv, n, &c__[c_offset], ldc);
-
-/*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK) */
-
-/*              W := C2' */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    zcopy_(&lastc, &c__[lastv - *k + j + c_dim1], ldc, &work[
-			    j * work_dim1 + 1], &c__1);
-		    zlacgv_(&lastc, &work[j * work_dim1 + 1], &c__1);
-/* L190: */
-		}
-
-/*              W := W * V2' */
-
-		ztrmm_("Right", "Lower", "Conjugate transpose", "Unit", &
-			lastc, k, &c_b1, &v[(lastv - *k + 1) * v_dim1 + 1], 
-			ldv, &work[work_offset], ldwork);
-		if (lastv > *k) {
-
-/*                 W := W + C1'*V1' */
-
-		    i__1 = lastv - *k;
-		    zgemm_("Conjugate transpose", "Conjugate transpose", &
-			    lastc, k, &i__1, &c_b1, &c__[c_offset], ldc, &v[
-			    v_offset], ldv, &c_b1, &work[work_offset], ldwork);
-		}
-
-/*              W := W * T'  or  W * T */
-
-		ztrmm_("Right", "Lower", transt, "Non-unit", &lastc, k, &c_b1, 
-			 &t[t_offset], ldt, &work[work_offset], ldwork);
-
-/*              C := C - V' * W' */
-
-		if (lastv > *k) {
-
-/*                 C1 := C1 - V1' * W' */
-
-		    i__1 = lastv - *k;
-		    z__1.r = -1., z__1.i = -0.;
-		    zgemm_("Conjugate transpose", "Conjugate transpose", &
-			    i__1, &lastc, k, &z__1, &v[v_offset], ldv, &work[
-			    work_offset], ldwork, &c_b1, &c__[c_offset], ldc);
-		}
-
-/*              W := W * V2 */
-
-		ztrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &
-			c_b1, &v[(lastv - *k + 1) * v_dim1 + 1], ldv, &work[
-			work_offset], ldwork);
-
-/*              C2 := C2 - W' */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			i__3 = lastv - *k + j + i__ * c_dim1;
-			i__4 = lastv - *k + j + i__ * c_dim1;
-			d_cnjg(&z__2, &work[i__ + j * work_dim1]);
-			z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - 
-				z__2.i;
-			c__[i__3].r = z__1.r, c__[i__3].i = z__1.i;
-/* L200: */
-		    }
-/* L210: */
-		}
-
-	    } else if (lsame_(side, "R")) {
-
-/*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */
-
-/* Computing MAX */
-		i__1 = *k, i__2 = ilazlc_(k, n, &v[v_offset], ldv);
-		lastv = max(i__1,i__2);
-		lastc = ilazlr_(m, &lastv, &c__[c_offset], ldc);
-
-/*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK) */
-
-/*              W := C2 */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    zcopy_(&lastc, &c__[(lastv - *k + j) * c_dim1 + 1], &c__1, 
-			     &work[j * work_dim1 + 1], &c__1);
-/* L220: */
-		}
-
-/*              W := W * V2' */
-
-		ztrmm_("Right", "Lower", "Conjugate transpose", "Unit", &
-			lastc, k, &c_b1, &v[(lastv - *k + 1) * v_dim1 + 1], 
-			ldv, &work[work_offset], ldwork);
-		if (lastv > *k) {
-
-/*                 W := W + C1 * V1' */
-
-		    i__1 = lastv - *k;
-		    zgemm_("No transpose", "Conjugate transpose", &lastc, k, &
-			    i__1, &c_b1, &c__[c_offset], ldc, &v[v_offset], 
-			    ldv, &c_b1, &work[work_offset], ldwork);
-		}
-
-/*              W := W * T  or  W * T' */
-
-		ztrmm_("Right", "Lower", trans, "Non-unit", &lastc, k, &c_b1, 
-			&t[t_offset], ldt, &work[work_offset], ldwork);
-
-/*              C := C - W * V */
-
-		if (lastv > *k) {
-
-/*                 C1 := C1 - W * V1 */
-
-		    i__1 = lastv - *k;
-		    z__1.r = -1., z__1.i = -0.;
-		    zgemm_("No transpose", "No transpose", &lastc, &i__1, k, &
-			    z__1, &work[work_offset], ldwork, &v[v_offset], 
-			    ldv, &c_b1, &c__[c_offset], ldc);
-		}
-
-/*              W := W * V2 */
-
-		ztrmm_("Right", "Lower", "No transpose", "Unit", &lastc, k, &
-			c_b1, &v[(lastv - *k + 1) * v_dim1 + 1], ldv, &work[
-			work_offset], ldwork);
-
-/*              C1 := C1 - W */
-
-		i__1 = *k;
-		for (j = 1; j <= i__1; ++j) {
-		    i__2 = lastc;
-		    for (i__ = 1; i__ <= i__2; ++i__) {
-			i__3 = i__ + (lastv - *k + j) * c_dim1;
-			i__4 = i__ + (lastv - *k + j) * c_dim1;
-			i__5 = i__ + j * work_dim1;
-			z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[
-				i__4].i - work[i__5].i;
-			c__[i__3].r = z__1.r, c__[i__3].i = z__1.i;
-/* L230: */
-		    }
-/* L240: */
-		}
-
-	    }
-
-	}
+        i__1 = *k;
+        for (j = 1; j <= i__1; ++j) {
+          i__2 = lastc;
+          for (i__ = 1; i__ <= i__2; ++i__) {
+            i__3 = i__ + (lastv - *k + j) * c_dim1;
+            i__4 = i__ + (lastv - *k + j) * c_dim1;
+            i__5 = i__ + j * work_dim1;
+            z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[i__4].i - work[i__5].i;
+            c__[i__3].r = z__1.r, c__[i__3].i = z__1.i;
+            /* L230: */
+          }
+          /* L240: */
+        }
+      }
     }
+  }
 
-    return 0;
-
-/*     End of ZLARFB */
+  /*     End of ZLARFB */
 
 } /* zlarfb_ */
diff --git a/lapack/zlarfg.c b/lapack/zlarfg.c
index d18efe5..ba5a1f9 100644
--- a/lapack/zlarfg.c
+++ b/lapack/zlarfg.c
@@ -1,191 +1,183 @@
 /* zlarfg.f -- translated by f2c (version 20061008).
    You must link the resulting object file with libf2c:
-	on Microsoft Windows system, link with libf2c.lib;
-	on Linux or Unix systems, link with .../path/to/libf2c.a -lm
-	or, if you install libf2c.a in a standard place, with -lf2c -lm
-	-- in that order, at the end of the command line, as in
-		cc *.o -lf2c -lm
-	Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
+        on Microsoft Windows system, link with libf2c.lib;
+        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
+        or, if you install libf2c.a in a standard place, with -lf2c -lm
+        -- in that order, at the end of the command line, as in
+                cc *.o -lf2c -lm
+        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
 
-		http://www.netlib.org/f2c/libf2c.zip
+                http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
+
+static inline doublereal d_sign(doublereal *a, doublereal *b) {
+  doublereal x;
+  x = (*a >= 0 ? *a : -*a);
+  return (*b >= 0 ? x : -x);
+}
 
 /* Table of constant values */
 
-static doublecomplex c_b5 = {1.,0.};
+static doublecomplex c_b5 = {1., 0.};
 
-/* Subroutine */ int zlarfg_(integer *n, doublecomplex *alpha, doublecomplex *
-	x, integer *incx, doublecomplex *tau)
-{
-    /* System generated locals */
-    integer i__1;
-    doublereal d__1, d__2;
-    doublecomplex z__1, z__2;
+/* Subroutine */ void zlarfg_(integer *n, doublecomplex *alpha, doublecomplex *x, integer *incx, doublecomplex *tau) {
+  /* System generated locals */
+  integer i__1;
+  doublereal d__1, d__2;
+  doublecomplex z__1, z__2;
 
-    /* Builtin functions */
-    double d_imag(doublecomplex *), d_sign(doublereal *, doublereal *);
+  /* Local variables */
+  integer j, knt;
+  doublereal beta, alphi, alphr;
+  extern /* Subroutine */ void zscal_(integer *, doublecomplex *, doublecomplex *, integer *);
+  doublereal xnorm;
+  extern doublereal dlapy3_(doublereal *, doublereal *, doublereal *), dznrm2_(integer *, doublecomplex *, integer *),
+      dlamch_(char *);
+  doublereal safmin;
+  extern /* Subroutine */ void zdscal_(integer *, doublereal *, doublecomplex *, integer *);
+  doublereal rsafmn;
+  extern /* Double Complex */ void zladiv_(doublecomplex *, doublecomplex *, doublecomplex *);
 
-    /* Local variables */
-    integer j, knt;
-    doublereal beta, alphi, alphr;
-    extern /* Subroutine */ int zscal_(integer *, doublecomplex *, 
-	    doublecomplex *, integer *);
-    doublereal xnorm;
-    extern doublereal dlapy3_(doublereal *, doublereal *, doublereal *), 
-	    dznrm2_(integer *, doublecomplex *, integer *), dlamch_(char *);
-    doublereal safmin;
-    extern /* Subroutine */ int zdscal_(integer *, doublereal *, 
-	    doublecomplex *, integer *);
-    doublereal rsafmn;
-    extern /* Double Complex */ VOID zladiv_(doublecomplex *, doublecomplex *, 
-	     doublecomplex *);
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
+  /*     .. Scalar Arguments .. */
+  /*     .. */
+  /*     .. Array Arguments .. */
+  /*     .. */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*  Purpose */
+  /*  ======= */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
-/*     .. Array Arguments .. */
-/*     .. */
+  /*  ZLARFG generates a complex elementary reflector H of order n, such */
+  /*  that */
 
-/*  Purpose */
-/*  ======= */
+  /*        H' * ( alpha ) = ( beta ),   H' * H = I. */
+  /*             (   x   )   (   0  ) */
 
-/*  ZLARFG generates a complex elementary reflector H of order n, such */
-/*  that */
+  /*  where alpha and beta are scalars, with beta real, and x is an */
+  /*  (n-1)-element complex vector. H is represented in the form */
 
-/*        H' * ( alpha ) = ( beta ),   H' * H = I. */
-/*             (   x   )   (   0  ) */
+  /*        H = I - tau * ( 1 ) * ( 1 v' ) , */
+  /*                      ( v ) */
 
-/*  where alpha and beta are scalars, with beta real, and x is an */
-/*  (n-1)-element complex vector. H is represented in the form */
+  /*  where tau is a complex scalar and v is a complex (n-1)-element */
+  /*  vector. Note that H is not hermitian. */
 
-/*        H = I - tau * ( 1 ) * ( 1 v' ) , */
-/*                      ( v ) */
+  /*  If the elements of x are all zero and alpha is real, then tau = 0 */
+  /*  and H is taken to be the unit matrix. */
 
-/*  where tau is a complex scalar and v is a complex (n-1)-element */
-/*  vector. Note that H is not hermitian. */
+  /*  Otherwise  1 <= real(tau) <= 2  and  abs(tau-1) <= 1 . */
 
-/*  If the elements of x are all zero and alpha is real, then tau = 0 */
-/*  and H is taken to be the unit matrix. */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Otherwise  1 <= real(tau) <= 2  and  abs(tau-1) <= 1 . */
+  /*  N       (input) INTEGER */
+  /*          The order of the elementary reflector. */
 
-/*  Arguments */
-/*  ========= */
+  /*  ALPHA   (input/output) COMPLEX*16 */
+  /*          On entry, the value alpha. */
+  /*          On exit, it is overwritten with the value beta. */
 
-/*  N       (input) INTEGER */
-/*          The order of the elementary reflector. */
+  /*  X       (input/output) COMPLEX*16 array, dimension */
+  /*                         (1+(N-2)*abs(INCX)) */
+  /*          On entry, the vector x. */
+  /*          On exit, it is overwritten with the vector v. */
 
-/*  ALPHA   (input/output) COMPLEX*16 */
-/*          On entry, the value alpha. */
-/*          On exit, it is overwritten with the value beta. */
+  /*  INCX    (input) INTEGER */
+  /*          The increment between elements of X. INCX > 0. */
 
-/*  X       (input/output) COMPLEX*16 array, dimension */
-/*                         (1+(N-2)*abs(INCX)) */
-/*          On entry, the vector x. */
-/*          On exit, it is overwritten with the vector v. */
+  /*  TAU     (output) COMPLEX*16 */
+  /*          The value tau. */
 
-/*  INCX    (input) INTEGER */
-/*          The increment between elements of X. INCX > 0. */
+  /*  ===================================================================== */
 
-/*  TAU     (output) COMPLEX*16 */
-/*          The value tau. */
+  /*     .. Parameters .. */
+  /*     .. */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. Intrinsic Functions .. */
+  /*     .. */
+  /*     .. External Subroutines .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*  ===================================================================== */
+  /* Parameter adjustments */
+  --x;
 
-/*     .. Parameters .. */
-/*     .. */
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. Intrinsic Functions .. */
-/*     .. */
-/*     .. External Subroutines .. */
-/*     .. */
-/*     .. Executable Statements .. */
+  /* Function Body */
+  if (*n <= 0) {
+    tau->r = 0., tau->i = 0.;
+    return;
+  }
 
-    /* Parameter adjustments */
-    --x;
+  i__1 = *n - 1;
+  xnorm = dznrm2_(&i__1, &x[1], incx);
+  alphr = alpha->r;
+  alphi = alpha->i;
 
-    /* Function Body */
-    if (*n <= 0) {
-	tau->r = 0., tau->i = 0.;
-	return 0;
+  if (xnorm == 0. && alphi == 0.) {
+    /*        H  =  I */
+
+    tau->r = 0., tau->i = 0.;
+  } else {
+    /*        general case */
+
+    d__1 = dlapy3_(&alphr, &alphi, &xnorm);
+    beta = -d_sign(&d__1, &alphr);
+    safmin = dlamch_("S") / dlamch_("E");
+    rsafmn = 1. / safmin;
+
+    knt = 0;
+    if (abs(beta) < safmin) {
+      /*           XNORM, BETA may be inaccurate; scale X and recompute them */
+
+    L10:
+      ++knt;
+      i__1 = *n - 1;
+      zdscal_(&i__1, &rsafmn, &x[1], incx);
+      beta *= rsafmn;
+      alphi *= rsafmn;
+      alphr *= rsafmn;
+      if (abs(beta) < safmin) {
+        goto L10;
+      }
+
+      /*           New BETA is at most 1, at least SAFMIN */
+
+      i__1 = *n - 1;
+      xnorm = dznrm2_(&i__1, &x[1], incx);
+      z__1.r = alphr, z__1.i = alphi;
+      alpha->r = z__1.r, alpha->i = z__1.i;
+      d__1 = dlapy3_(&alphr, &alphi, &xnorm);
+      beta = -d_sign(&d__1, &alphr);
     }
-
+    d__1 = (beta - alphr) / beta;
+    d__2 = -alphi / beta;
+    z__1.r = d__1, z__1.i = d__2;
+    tau->r = z__1.r, tau->i = z__1.i;
+    z__2.r = alpha->r - beta, z__2.i = alpha->i;
+    zladiv_(&z__1, &c_b5, &z__2);
+    alpha->r = z__1.r, alpha->i = z__1.i;
     i__1 = *n - 1;
-    xnorm = dznrm2_(&i__1, &x[1], incx);
-    alphr = alpha->r;
-    alphi = d_imag(alpha);
+    zscal_(&i__1, alpha, &x[1], incx);
 
-    if (xnorm == 0. && alphi == 0.) {
+    /*        If ALPHA is subnormal, it may lose relative accuracy */
 
-/*        H  =  I */
-
-	tau->r = 0., tau->i = 0.;
-    } else {
-
-/*        general case */
-
-	d__1 = dlapy3_(&alphr, &alphi, &xnorm);
-	beta = -d_sign(&d__1, &alphr);
-	safmin = dlamch_("S") / dlamch_("E");
-	rsafmn = 1. / safmin;
-
-	knt = 0;
-	if (abs(beta) < safmin) {
-
-/*           XNORM, BETA may be inaccurate; scale X and recompute them */
-
-L10:
-	    ++knt;
-	    i__1 = *n - 1;
-	    zdscal_(&i__1, &rsafmn, &x[1], incx);
-	    beta *= rsafmn;
-	    alphi *= rsafmn;
-	    alphr *= rsafmn;
-	    if (abs(beta) < safmin) {
-		goto L10;
-	    }
-
-/*           New BETA is at most 1, at least SAFMIN */
-
-	    i__1 = *n - 1;
-	    xnorm = dznrm2_(&i__1, &x[1], incx);
-	    z__1.r = alphr, z__1.i = alphi;
-	    alpha->r = z__1.r, alpha->i = z__1.i;
-	    d__1 = dlapy3_(&alphr, &alphi, &xnorm);
-	    beta = -d_sign(&d__1, &alphr);
-	}
-	d__1 = (beta - alphr) / beta;
-	d__2 = -alphi / beta;
-	z__1.r = d__1, z__1.i = d__2;
-	tau->r = z__1.r, tau->i = z__1.i;
-	z__2.r = alpha->r - beta, z__2.i = alpha->i;
-	zladiv_(&z__1, &c_b5, &z__2);
-	alpha->r = z__1.r, alpha->i = z__1.i;
-	i__1 = *n - 1;
-	zscal_(&i__1, alpha, &x[1], incx);
-
-/*        If ALPHA is subnormal, it may lose relative accuracy */
-
-	i__1 = knt;
-	for (j = 1; j <= i__1; ++j) {
-	    beta *= safmin;
-/* L20: */
-	}
-	alpha->r = beta, alpha->i = 0.;
+    i__1 = knt;
+    for (j = 1; j <= i__1; ++j) {
+      beta *= safmin;
+      /* L20: */
     }
+    alpha->r = beta, alpha->i = 0.;
+  }
 
-    return 0;
-
-/*     End of ZLARFG */
+  /*     End of ZLARFG */
 
 } /* zlarfg_ */
diff --git a/lapack/zlarft.c b/lapack/zlarft.c
index b55adc2..3b40c28 100644
--- a/lapack/zlarft.c
+++ b/lapack/zlarft.c
@@ -1,362 +1,347 @@
 /* zlarft.f -- translated by f2c (version 20061008).
    You must link the resulting object file with libf2c:
-	on Microsoft Windows system, link with libf2c.lib;
-	on Linux or Unix systems, link with .../path/to/libf2c.a -lm
-	or, if you install libf2c.a in a standard place, with -lf2c -lm
-	-- in that order, at the end of the command line, as in
-		cc *.o -lf2c -lm
-	Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
+        on Microsoft Windows system, link with libf2c.lib;
+        on Linux or Unix systems, link with .../path/to/libf2c.a -lm
+        or, if you install libf2c.a in a standard place, with -lf2c -lm
+        -- in that order, at the end of the command line, as in
+                cc *.o -lf2c -lm
+        Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
 
-		http://www.netlib.org/f2c/libf2c.zip
+                http://www.netlib.org/f2c/libf2c.zip
 */
 
-#include "f2c.h"
 #include "blaswrap.h"
+#include "lapack_datatypes.h"
 
 /* Table of constant values */
 
-static doublecomplex c_b2 = {0.,0.};
+static doublecomplex c_b2 = {0., 0.};
 static integer c__1 = 1;
 
-/* Subroutine */ int zlarft_(char *direct, char *storev, integer *n, integer *
-	k, doublecomplex *v, integer *ldv, doublecomplex *tau, doublecomplex *
-	t, integer *ldt)
-{
-    /* System generated locals */
-    integer t_dim1, t_offset, v_dim1, v_offset, i__1, i__2, i__3, i__4;
-    doublecomplex z__1;
+/* Subroutine */ void zlarft_(char *direct, char *storev, integer *n, integer *k, doublecomplex *v, integer *ldv,
+                              doublecomplex *tau, doublecomplex *t, integer *ldt) {
+  /* System generated locals */
+  integer t_dim1, t_offset, v_dim1, v_offset, i__1, i__2, i__3, i__4;
+  doublecomplex z__1;
 
-    /* Local variables */
-    integer i__, j, prevlastv;
-    doublecomplex vii;
-    extern logical lsame_(char *, char *);
-    extern /* Subroutine */ int zgemv_(char *, integer *, integer *, 
-	    doublecomplex *, doublecomplex *, integer *, doublecomplex *, 
-	    integer *, doublecomplex *, doublecomplex *, integer *);
-    integer lastv;
-    extern /* Subroutine */ int ztrmv_(char *, char *, char *, integer *, 
-	    doublecomplex *, integer *, doublecomplex *, integer *), zlacgv_(integer *, doublecomplex *, integer *);
+  /* Local variables */
+  integer i__, j, prevlastv;
+  doublecomplex vii;
+  extern logical lsame_(char *, char *);
+  extern /* Subroutine */ void zgemv_(const char *, const integer *, const integer *, const doublecomplex *,
+                                      const doublecomplex *, const integer *, const doublecomplex *, const integer *,
+                                      const doublecomplex *, doublecomplex *, const integer *);
+  integer lastv;
+  extern /* Subroutine */ void ztrmv_(const char *, const char *, const char *, const integer *, const doublecomplex *,
+                                      const integer *, doublecomplex *, const integer *),
+      zlacgv_(integer *, doublecomplex *, integer *);
 
+  /*  -- LAPACK auxiliary routine (version 3.2) -- */
+  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+  /*     November 2006 */
 
-/*  -- LAPACK auxiliary routine (version 3.2) -- */
-/*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
-/*     November 2006 */
+  /*     .. Scalar Arguments .. */
+  /*     .. */
+  /*     .. Array Arguments .. */
+  /*     .. */
 
-/*     .. Scalar Arguments .. */
-/*     .. */
-/*     .. Array Arguments .. */
-/*     .. */
+  /*  Purpose */
+  /*  ======= */
 
-/*  Purpose */
-/*  ======= */
+  /*  ZLARFT forms the triangular factor T of a complex block reflector H */
+  /*  of order n, which is defined as a product of k elementary reflectors. */
 
-/*  ZLARFT forms the triangular factor T of a complex block reflector H */
-/*  of order n, which is defined as a product of k elementary reflectors. */
+  /*  If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; */
 
-/*  If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; */
+  /*  If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. */
 
-/*  If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. */
+  /*  If STOREV = 'C', the vector which defines the elementary reflector */
+  /*  H(i) is stored in the i-th column of the array V, and */
 
-/*  If STOREV = 'C', the vector which defines the elementary reflector */
-/*  H(i) is stored in the i-th column of the array V, and */
+  /*     H  =  I - V * T * V' */
 
-/*     H  =  I - V * T * V' */
+  /*  If STOREV = 'R', the vector which defines the elementary reflector */
+  /*  H(i) is stored in the i-th row of the array V, and */
 
-/*  If STOREV = 'R', the vector which defines the elementary reflector */
-/*  H(i) is stored in the i-th row of the array V, and */
+  /*     H  =  I - V' * T * V */
 
-/*     H  =  I - V' * T * V */
+  /*  Arguments */
+  /*  ========= */
 
-/*  Arguments */
-/*  ========= */
+  /*  DIRECT  (input) CHARACTER*1 */
+  /*          Specifies the order in which the elementary reflectors are */
+  /*          multiplied to form the block reflector: */
+  /*          = 'F': H = H(1) H(2) . . . H(k) (Forward) */
+  /*          = 'B': H = H(k) . . . H(2) H(1) (Backward) */
 
-/*  DIRECT  (input) CHARACTER*1 */
-/*          Specifies the order in which the elementary reflectors are */
-/*          multiplied to form the block reflector: */
-/*          = 'F': H = H(1) H(2) . . . H(k) (Forward) */
-/*          = 'B': H = H(k) . . . H(2) H(1) (Backward) */
+  /*  STOREV  (input) CHARACTER*1 */
+  /*          Specifies how the vectors which define the elementary */
+  /*          reflectors are stored (see also Further Details): */
+  /*          = 'C': columnwise */
+  /*          = 'R': rowwise */
 
-/*  STOREV  (input) CHARACTER*1 */
-/*          Specifies how the vectors which define the elementary */
-/*          reflectors are stored (see also Further Details): */
-/*          = 'C': columnwise */
-/*          = 'R': rowwise */
+  /*  N       (input) INTEGER */
+  /*          The order of the block reflector H. N >= 0. */
 
-/*  N       (input) INTEGER */
-/*          The order of the block reflector H. N >= 0. */
+  /*  K       (input) INTEGER */
+  /*          The order of the triangular factor T (= the number of */
+  /*          elementary reflectors). K >= 1. */
 
-/*  K       (input) INTEGER */
-/*          The order of the triangular factor T (= the number of */
-/*          elementary reflectors). K >= 1. */
+  /*  V       (input/output) COMPLEX*16 array, dimension */
+  /*                               (LDV,K) if STOREV = 'C' */
+  /*                               (LDV,N) if STOREV = 'R' */
+  /*          The matrix V. See further details. */
 
-/*  V       (input/output) COMPLEX*16 array, dimension */
-/*                               (LDV,K) if STOREV = 'C' */
-/*                               (LDV,N) if STOREV = 'R' */
-/*          The matrix V. See further details. */
+  /*  LDV     (input) INTEGER */
+  /*          The leading dimension of the array V. */
+  /*          If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. */
 
-/*  LDV     (input) INTEGER */
-/*          The leading dimension of the array V. */
-/*          If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. */
+  /*  TAU     (input) COMPLEX*16 array, dimension (K) */
+  /*          TAU(i) must contain the scalar factor of the elementary */
+  /*          reflector H(i). */
 
-/*  TAU     (input) COMPLEX*16 array, dimension (K) */
-/*          TAU(i) must contain the scalar factor of the elementary */
-/*          reflector H(i). */
+  /*  T       (output) COMPLEX*16 array, dimension (LDT,K) */
+  /*          The k by k triangular factor T of the block reflector. */
+  /*          If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is */
+  /*          lower triangular. The rest of the array is not used. */
 
-/*  T       (output) COMPLEX*16 array, dimension (LDT,K) */
-/*          The k by k triangular factor T of the block reflector. */
-/*          If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is */
-/*          lower triangular. The rest of the array is not used. */
+  /*  LDT     (input) INTEGER */
+  /*          The leading dimension of the array T. LDT >= K. */
 
-/*  LDT     (input) INTEGER */
-/*          The leading dimension of the array T. LDT >= K. */
+  /*  Further Details */
+  /*  =============== */
 
-/*  Further Details */
-/*  =============== */
+  /*  The shape of the matrix V and the storage of the vectors which define */
+  /*  the H(i) is best illustrated by the following example with n = 5 and */
+  /*  k = 3. The elements equal to 1 are not stored; the corresponding */
+  /*  array elements are modified but restored on exit. The rest of the */
+  /*  array is not used. */
 
-/*  The shape of the matrix V and the storage of the vectors which define */
-/*  the H(i) is best illustrated by the following example with n = 5 and */
-/*  k = 3. The elements equal to 1 are not stored; the corresponding */
-/*  array elements are modified but restored on exit. The rest of the */
-/*  array is not used. */
+  /*  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R': */
 
-/*  DIRECT = 'F' and STOREV = 'C':         DIRECT = 'F' and STOREV = 'R': */
+  /*               V = (  1       )                 V = (  1 v1 v1 v1 v1 ) */
+  /*                   ( v1  1    )                     (     1 v2 v2 v2 ) */
+  /*                   ( v1 v2  1 )                     (        1 v3 v3 ) */
+  /*                   ( v1 v2 v3 ) */
+  /*                   ( v1 v2 v3 ) */
 
-/*               V = (  1       )                 V = (  1 v1 v1 v1 v1 ) */
-/*                   ( v1  1    )                     (     1 v2 v2 v2 ) */
-/*                   ( v1 v2  1 )                     (        1 v3 v3 ) */
-/*                   ( v1 v2 v3 ) */
-/*                   ( v1 v2 v3 ) */
+  /*  DIRECT = 'B' and STOREV = 'C':         DIRECT = 'B' and STOREV = 'R': */
 
-/*  DIRECT = 'B' and STOREV = 'C':         DIRECT = 'B' and STOREV = 'R': */
+  /*               V = ( v1 v2 v3 )                 V = ( v1 v1  1       ) */
+  /*                   ( v1 v2 v3 )                     ( v2 v2 v2  1    ) */
+  /*                   (  1 v2 v3 )                     ( v3 v3 v3 v3  1 ) */
+  /*                   (     1 v3 ) */
+  /*                   (        1 ) */
 
-/*               V = ( v1 v2 v3 )                 V = ( v1 v1  1       ) */
-/*                   ( v1 v2 v3 )                     ( v2 v2 v2  1    ) */
-/*                   (  1 v2 v3 )                     ( v3 v3 v3 v3  1 ) */
-/*                   (     1 v3 ) */
-/*                   (        1 ) */
+  /*  ===================================================================== */
 
-/*  ===================================================================== */
+  /*     .. Parameters .. */
+  /*     .. */
+  /*     .. Local Scalars .. */
+  /*     .. */
+  /*     .. External Subroutines .. */
+  /*     .. */
+  /*     .. External Functions .. */
+  /*     .. */
+  /*     .. Executable Statements .. */
 
-/*     .. Parameters .. */
-/*     .. */
-/*     .. Local Scalars .. */
-/*     .. */
-/*     .. External Subroutines .. */
-/*     .. */
-/*     .. External Functions .. */
-/*     .. */
-/*     .. Executable Statements .. */
+  /*     Quick return if possible */
 
-/*     Quick return if possible */
+  /* Parameter adjustments */
+  v_dim1 = *ldv;
+  v_offset = 1 + v_dim1;
+  v -= v_offset;
+  --tau;
+  t_dim1 = *ldt;
+  t_offset = 1 + t_dim1;
+  t -= t_offset;
 
-    /* Parameter adjustments */
-    v_dim1 = *ldv;
-    v_offset = 1 + v_dim1;
-    v -= v_offset;
-    --tau;
-    t_dim1 = *ldt;
-    t_offset = 1 + t_dim1;
-    t -= t_offset;
+  /* Function Body */
+  if (*n == 0) {
+    return;
+  }
 
-    /* Function Body */
-    if (*n == 0) {
-	return 0;
+  if (lsame_(direct, "F")) {
+    prevlastv = *n;
+    i__1 = *k;
+    for (i__ = 1; i__ <= i__1; ++i__) {
+      prevlastv = max(prevlastv, i__);
+      i__2 = i__;
+      if (tau[i__2].r == 0. && tau[i__2].i == 0.) {
+        /*              H(i)  =  I */
+
+        i__2 = i__;
+        for (j = 1; j <= i__2; ++j) {
+          i__3 = j + i__ * t_dim1;
+          t[i__3].r = 0., t[i__3].i = 0.;
+          /* L10: */
+        }
+      } else {
+        /*              general case */
+
+        i__2 = i__ + i__ * v_dim1;
+        vii.r = v[i__2].r, vii.i = v[i__2].i;
+        i__2 = i__ + i__ * v_dim1;
+        v[i__2].r = 1., v[i__2].i = 0.;
+        if (lsame_(storev, "C")) {
+          /*                 Skip any trailing zeros. */
+          i__2 = i__ + 1;
+          for (lastv = *n; lastv >= i__2; --lastv) {
+            i__3 = lastv + i__ * v_dim1;
+            if (v[i__3].r != 0. || v[i__3].i != 0.) {
+              break;
+            }
+          }
+          j = min(lastv, prevlastv);
+
+          /*                 T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)' * V(i:j,i) */
+
+          i__2 = j - i__ + 1;
+          i__3 = i__ - 1;
+          i__4 = i__;
+          z__1.r = -tau[i__4].r, z__1.i = -tau[i__4].i;
+          zgemv_("Conjugate transpose", &i__2, &i__3, &z__1, &v[i__ + v_dim1], ldv, &v[i__ + i__ * v_dim1], &c__1,
+                 &c_b2, &t[i__ * t_dim1 + 1], &c__1);
+        } else {
+          /*                 Skip any trailing zeros. */
+          i__2 = i__ + 1;
+          for (lastv = *n; lastv >= i__2; --lastv) {
+            i__3 = i__ + lastv * v_dim1;
+            if (v[i__3].r != 0. || v[i__3].i != 0.) {
+              break;
+            }
+          }
+          j = min(lastv, prevlastv);
+
+          /*                 T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)' */
+
+          if (i__ < j) {
+            i__2 = j - i__;
+            zlacgv_(&i__2, &v[i__ + (i__ + 1) * v_dim1], ldv);
+          }
+          i__2 = i__ - 1;
+          i__3 = j - i__ + 1;
+          i__4 = i__;
+          z__1.r = -tau[i__4].r, z__1.i = -tau[i__4].i;
+          zgemv_("No transpose", &i__2, &i__3, &z__1, &v[i__ * v_dim1 + 1], ldv, &v[i__ + i__ * v_dim1], ldv, &c_b2,
+                 &t[i__ * t_dim1 + 1], &c__1);
+          if (i__ < j) {
+            i__2 = j - i__;
+            zlacgv_(&i__2, &v[i__ + (i__ + 1) * v_dim1], ldv);
+          }
+        }
+        i__2 = i__ + i__ * v_dim1;
+        v[i__2].r = vii.r, v[i__2].i = vii.i;
+
+        /*              T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) */
+
+        i__2 = i__ - 1;
+        ztrmv_("Upper", "No transpose", "Non-unit", &i__2, &t[t_offset], ldt, &t[i__ * t_dim1 + 1], &c__1);
+        i__2 = i__ + i__ * t_dim1;
+        i__3 = i__;
+        t[i__2].r = tau[i__3].r, t[i__2].i = tau[i__3].i;
+        if (i__ > 1) {
+          prevlastv = max(prevlastv, lastv);
+        } else {
+          prevlastv = lastv;
+        }
+      }
+      /* L20: */
     }
+  } else {
+    prevlastv = 1;
+    for (i__ = *k; i__ >= 1; --i__) {
+      i__1 = i__;
+      if (tau[i__1].r == 0. && tau[i__1].i == 0.) {
+        /*              H(i)  =  I */
 
-    if (lsame_(direct, "F")) {
-	prevlastv = *n;
-	i__1 = *k;
-	for (i__ = 1; i__ <= i__1; ++i__) {
-	    prevlastv = max(prevlastv,i__);
-	    i__2 = i__;
-	    if (tau[i__2].r == 0. && tau[i__2].i == 0.) {
+        i__1 = *k;
+        for (j = i__; j <= i__1; ++j) {
+          i__2 = j + i__ * t_dim1;
+          t[i__2].r = 0., t[i__2].i = 0.;
+          /* L30: */
+        }
+      } else {
+        /*              general case */
 
-/*              H(i)  =  I */
+        if (i__ < *k) {
+          if (lsame_(storev, "C")) {
+            i__1 = *n - *k + i__ + i__ * v_dim1;
+            vii.r = v[i__1].r, vii.i = v[i__1].i;
+            i__1 = *n - *k + i__ + i__ * v_dim1;
+            v[i__1].r = 1., v[i__1].i = 0.;
+            /*                    Skip any leading zeros. */
+            i__1 = i__ - 1;
+            for (lastv = 1; lastv <= i__1; ++lastv) {
+              i__2 = lastv + i__ * v_dim1;
+              if (v[i__2].r != 0. || v[i__2].i != 0.) {
+                break;
+              }
+            }
+            j = max(lastv, prevlastv);
 
-		i__2 = i__;
-		for (j = 1; j <= i__2; ++j) {
-		    i__3 = j + i__ * t_dim1;
-		    t[i__3].r = 0., t[i__3].i = 0.;
-/* L10: */
-		}
-	    } else {
+            /*                    T(i+1:k,i) := */
+            /*                            - tau(i) * V(j:n-k+i,i+1:k)' * V(j:n-k+i,i) */
 
-/*              general case */
+            i__1 = *n - *k + i__ - j + 1;
+            i__2 = *k - i__;
+            i__3 = i__;
+            z__1.r = -tau[i__3].r, z__1.i = -tau[i__3].i;
+            zgemv_("Conjugate transpose", &i__1, &i__2, &z__1, &v[j + (i__ + 1) * v_dim1], ldv, &v[j + i__ * v_dim1],
+                   &c__1, &c_b2, &t[i__ + 1 + i__ * t_dim1], &c__1);
+            i__1 = *n - *k + i__ + i__ * v_dim1;
+            v[i__1].r = vii.r, v[i__1].i = vii.i;
+          } else {
+            i__1 = i__ + (*n - *k + i__) * v_dim1;
+            vii.r = v[i__1].r, vii.i = v[i__1].i;
+            i__1 = i__ + (*n - *k + i__) * v_dim1;
+            v[i__1].r = 1., v[i__1].i = 0.;
+            /*                    Skip any leading zeros. */
+            i__1 = i__ - 1;
+            for (lastv = 1; lastv <= i__1; ++lastv) {
+              i__2 = i__ + lastv * v_dim1;
+              if (v[i__2].r != 0. || v[i__2].i != 0.) {
+                break;
+              }
+            }
+            j = max(lastv, prevlastv);
 
-		i__2 = i__ + i__ * v_dim1;
-		vii.r = v[i__2].r, vii.i = v[i__2].i;
-		i__2 = i__ + i__ * v_dim1;
-		v[i__2].r = 1., v[i__2].i = 0.;
-		if (lsame_(storev, "C")) {
-/*                 Skip any trailing zeros. */
-		    i__2 = i__ + 1;
-		    for (lastv = *n; lastv >= i__2; --lastv) {
-			i__3 = lastv + i__ * v_dim1;
-			if (v[i__3].r != 0. || v[i__3].i != 0.) {
-			    break;
-			}
-		    }
-		    j = min(lastv,prevlastv);
+            /*                    T(i+1:k,i) := */
+            /*                            - tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)' */
 
-/*                 T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)' * V(i:j,i) */
+            i__1 = *n - *k + i__ - 1 - j + 1;
+            zlacgv_(&i__1, &v[i__ + j * v_dim1], ldv);
+            i__1 = *k - i__;
+            i__2 = *n - *k + i__ - j + 1;
+            i__3 = i__;
+            z__1.r = -tau[i__3].r, z__1.i = -tau[i__3].i;
+            zgemv_("No transpose", &i__1, &i__2, &z__1, &v[i__ + 1 + j * v_dim1], ldv, &v[i__ + j * v_dim1], ldv, &c_b2,
+                   &t[i__ + 1 + i__ * t_dim1], &c__1);
+            i__1 = *n - *k + i__ - 1 - j + 1;
+            zlacgv_(&i__1, &v[i__ + j * v_dim1], ldv);
+            i__1 = i__ + (*n - *k + i__) * v_dim1;
+            v[i__1].r = vii.r, v[i__1].i = vii.i;
+          }
 
-		    i__2 = j - i__ + 1;
-		    i__3 = i__ - 1;
-		    i__4 = i__;
-		    z__1.r = -tau[i__4].r, z__1.i = -tau[i__4].i;
-		    zgemv_("Conjugate transpose", &i__2, &i__3, &z__1, &v[i__ 
-			    + v_dim1], ldv, &v[i__ + i__ * v_dim1], &c__1, &
-			    c_b2, &t[i__ * t_dim1 + 1], &c__1);
-		} else {
-/*                 Skip any trailing zeros. */
-		    i__2 = i__ + 1;
-		    for (lastv = *n; lastv >= i__2; --lastv) {
-			i__3 = i__ + lastv * v_dim1;
-			if (v[i__3].r != 0. || v[i__3].i != 0.) {
-			    break;
-			}
-		    }
-		    j = min(lastv,prevlastv);
+          /*                 T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) */
 
-/*                 T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)' */
-
-		    if (i__ < j) {
-			i__2 = j - i__;
-			zlacgv_(&i__2, &v[i__ + (i__ + 1) * v_dim1], ldv);
-		    }
-		    i__2 = i__ - 1;
-		    i__3 = j - i__ + 1;
-		    i__4 = i__;
-		    z__1.r = -tau[i__4].r, z__1.i = -tau[i__4].i;
-		    zgemv_("No transpose", &i__2, &i__3, &z__1, &v[i__ * 
-			    v_dim1 + 1], ldv, &v[i__ + i__ * v_dim1], ldv, &
-			    c_b2, &t[i__ * t_dim1 + 1], &c__1);
-		    if (i__ < j) {
-			i__2 = j - i__;
-			zlacgv_(&i__2, &v[i__ + (i__ + 1) * v_dim1], ldv);
-		    }
-		}
-		i__2 = i__ + i__ * v_dim1;
-		v[i__2].r = vii.r, v[i__2].i = vii.i;
-
-/*              T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) */
-
-		i__2 = i__ - 1;
-		ztrmv_("Upper", "No transpose", "Non-unit", &i__2, &t[
-			t_offset], ldt, &t[i__ * t_dim1 + 1], &c__1);
-		i__2 = i__ + i__ * t_dim1;
-		i__3 = i__;
-		t[i__2].r = tau[i__3].r, t[i__2].i = tau[i__3].i;
-		if (i__ > 1) {
-		    prevlastv = max(prevlastv,lastv);
-		} else {
-		    prevlastv = lastv;
-		}
-	    }
-/* L20: */
-	}
-    } else {
-	prevlastv = 1;
-	for (i__ = *k; i__ >= 1; --i__) {
-	    i__1 = i__;
-	    if (tau[i__1].r == 0. && tau[i__1].i == 0.) {
-
-/*              H(i)  =  I */
-
-		i__1 = *k;
-		for (j = i__; j <= i__1; ++j) {
-		    i__2 = j + i__ * t_dim1;
-		    t[i__2].r = 0., t[i__2].i = 0.;
-/* L30: */
-		}
-	    } else {
-
-/*              general case */
-
-		if (i__ < *k) {
-		    if (lsame_(storev, "C")) {
-			i__1 = *n - *k + i__ + i__ * v_dim1;
-			vii.r = v[i__1].r, vii.i = v[i__1].i;
-			i__1 = *n - *k + i__ + i__ * v_dim1;
-			v[i__1].r = 1., v[i__1].i = 0.;
-/*                    Skip any leading zeros. */
-			i__1 = i__ - 1;
-			for (lastv = 1; lastv <= i__1; ++lastv) {
-			    i__2 = lastv + i__ * v_dim1;
-			    if (v[i__2].r != 0. || v[i__2].i != 0.) {
-				break;
-			    }
-			}
-			j = max(lastv,prevlastv);
-
-/*                    T(i+1:k,i) := */
-/*                            - tau(i) * V(j:n-k+i,i+1:k)' * V(j:n-k+i,i) */
-
-			i__1 = *n - *k + i__ - j + 1;
-			i__2 = *k - i__;
-			i__3 = i__;
-			z__1.r = -tau[i__3].r, z__1.i = -tau[i__3].i;
-			zgemv_("Conjugate transpose", &i__1, &i__2, &z__1, &v[
-				j + (i__ + 1) * v_dim1], ldv, &v[j + i__ * 
-				v_dim1], &c__1, &c_b2, &t[i__ + 1 + i__ * 
-				t_dim1], &c__1);
-			i__1 = *n - *k + i__ + i__ * v_dim1;
-			v[i__1].r = vii.r, v[i__1].i = vii.i;
-		    } else {
-			i__1 = i__ + (*n - *k + i__) * v_dim1;
-			vii.r = v[i__1].r, vii.i = v[i__1].i;
-			i__1 = i__ + (*n - *k + i__) * v_dim1;
-			v[i__1].r = 1., v[i__1].i = 0.;
-/*                    Skip any leading zeros. */
-			i__1 = i__ - 1;
-			for (lastv = 1; lastv <= i__1; ++lastv) {
-			    i__2 = i__ + lastv * v_dim1;
-			    if (v[i__2].r != 0. || v[i__2].i != 0.) {
-				break;
-			    }
-			}
-			j = max(lastv,prevlastv);
-
-/*                    T(i+1:k,i) := */
-/*                            - tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)' */
-
-			i__1 = *n - *k + i__ - 1 - j + 1;
-			zlacgv_(&i__1, &v[i__ + j * v_dim1], ldv);
-			i__1 = *k - i__;
-			i__2 = *n - *k + i__ - j + 1;
-			i__3 = i__;
-			z__1.r = -tau[i__3].r, z__1.i = -tau[i__3].i;
-			zgemv_("No transpose", &i__1, &i__2, &z__1, &v[i__ + 
-				1 + j * v_dim1], ldv, &v[i__ + j * v_dim1], 
-				ldv, &c_b2, &t[i__ + 1 + i__ * t_dim1], &c__1);
-			i__1 = *n - *k + i__ - 1 - j + 1;
-			zlacgv_(&i__1, &v[i__ + j * v_dim1], ldv);
-			i__1 = i__ + (*n - *k + i__) * v_dim1;
-			v[i__1].r = vii.r, v[i__1].i = vii.i;
-		    }
-
-/*                 T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) */
-
-		    i__1 = *k - i__;
-		    ztrmv_("Lower", "No transpose", "Non-unit", &i__1, &t[i__ 
-			    + 1 + (i__ + 1) * t_dim1], ldt, &t[i__ + 1 + i__ *
-			     t_dim1], &c__1)
-			    ;
-		    if (i__ > 1) {
-			prevlastv = min(prevlastv,lastv);
-		    } else {
-			prevlastv = lastv;
-		    }
-		}
-		i__1 = i__ + i__ * t_dim1;
-		i__2 = i__;
-		t[i__1].r = tau[i__2].r, t[i__1].i = tau[i__2].i;
-	    }
-/* L40: */
-	}
+          i__1 = *k - i__;
+          ztrmv_("Lower", "No transpose", "Non-unit", &i__1, &t[i__ + 1 + (i__ + 1) * t_dim1], ldt,
+                 &t[i__ + 1 + i__ * t_dim1], &c__1);
+          if (i__ > 1) {
+            prevlastv = min(prevlastv, lastv);
+          } else {
+            prevlastv = lastv;
+          }
+        }
+        i__1 = i__ + i__ * t_dim1;
+        i__2 = i__;
+        t[i__1].r = tau[i__2].r, t[i__1].i = tau[i__2].i;
+      }
+      /* L40: */
     }
-    return 0;
+  }
 
-/*     End of ZLARFT */
+  /*     End of ZLARFT */
 
 } /* zlarft_ */
