changeset 22973:aa55d32100c9

use F77_INT instead of octave_idx_type for liboctave sparse matrix classes * dSparse.cc, CSparse.cc: Use F77_INT instead of octave_idx_type for integer data passed to Fortran subroutines.
author John W. Eaton <jwe@octave.org>
date Wed, 28 Dec 2016 17:14:00 -0500
parents 8bc5d69a96f3
children ecc5eeada8dc
files liboctave/array/CSparse.cc liboctave/array/dSparse.cc
diffstat 2 files changed, 559 insertions(+), 267 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/array/CSparse.cc	Wed Dec 28 13:33:13 2016 -0500
+++ b/liboctave/array/CSparse.cc	Wed Dec 28 17:14:00 2016 -0500
@@ -3683,13 +3683,21 @@
                   }
             }
 
-          octave_idx_type b_nc = b.cols ();
+          F77_INT b_nr = to_f77_int (b.rows ());
+          F77_INT b_nc = to_f77_int (b.cols ());
+
           retval = ComplexMatrix (b);
           Complex *result = retval.fortran_vec ();
 
-          F77_XFCN (zptsv, ZPTSV, (nr, b_nc, D, F77_DBLE_CMPLX_ARG (DL),
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          F77_INT tmp_err = 0;
+
+          F77_XFCN (zptsv, ZPTSV, (tmp_nr, b_nc, D, F77_DBLE_CMPLX_ARG (DL),
                                    F77_DBLE_CMPLX_ARG (result),
-                                   b.rows (), err));
+                                   b_nr, tmp_err));
+
+          err = tmp_err;
 
           if (err != 0)
             {
@@ -3741,13 +3749,21 @@
                   }
             }
 
-          octave_idx_type b_nc = b.cols ();
+          F77_INT b_nr = to_f77_int (b.rows ());
+          F77_INT b_nc = to_f77_int (b.cols ());
+
           retval = ComplexMatrix (b);
           Complex *result = retval.fortran_vec ();
 
-          F77_XFCN (zgtsv, ZGTSV, (nr, b_nc, F77_DBLE_CMPLX_ARG (DL),
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          F77_INT tmp_err = 0;
+
+          F77_XFCN (zgtsv, ZGTSV, (tmp_nr, b_nc, F77_DBLE_CMPLX_ARG (DL),
                                    F77_DBLE_CMPLX_ARG (D), F77_DBLE_CMPLX_ARG (DU), F77_DBLE_CMPLX_ARG (result),
-                                   b.rows (), err));
+                                   b_nr, tmp_err));
+
+          err = tmp_err;
 
           if (err != 0)
             {
@@ -3808,8 +3824,8 @@
           OCTAVE_LOCAL_BUFFER (Complex, DU, nr - 1);
           OCTAVE_LOCAL_BUFFER (Complex, D, nr);
           OCTAVE_LOCAL_BUFFER (Complex, DL, nr - 1);
-          Array<octave_idx_type> ipvt (dim_vector (nr, 1));
-          octave_idx_type *pipvt = ipvt.fortran_vec ();
+          Array<F77_INT> ipvt (dim_vector (nr, 1));
+          F77_INT *pipvt = ipvt.fortran_vec ();
 
           if (mattype.is_dense ())
             {
@@ -3845,8 +3861,14 @@
                   }
             }
 
-          F77_XFCN (zgttrf, ZGTTRF, (nr, F77_DBLE_CMPLX_ARG (DL), F77_DBLE_CMPLX_ARG (D),
-                                     F77_DBLE_CMPLX_ARG (DU), F77_DBLE_CMPLX_ARG (DU2), pipvt, err));
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          F77_INT tmp_err = 0;
+
+          F77_XFCN (zgttrf, ZGTTRF, (tmp_nr, F77_DBLE_CMPLX_ARG (DL), F77_DBLE_CMPLX_ARG (D),
+                                     F77_DBLE_CMPLX_ARG (DU), F77_DBLE_CMPLX_ARG (DU2), pipvt, tmp_err));
+
+          err = tmp_err;
 
           if (err != 0)
             {
@@ -3865,6 +3887,7 @@
             {
               char job = 'N';
               volatile octave_idx_type x_nz = b.nnz ();
+              F77_INT b_nr = to_f77_int (b.rows ());
               octave_idx_type b_nc = b.cols ();
               retval = SparseComplexMatrix (nr, b_nc, x_nz);
               retval.xcidx (0) = 0;
@@ -3882,11 +3905,13 @@
 
                   F77_XFCN (zgttrs, ZGTTRS,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, 1, F77_DBLE_CMPLX_ARG (DL), F77_DBLE_CMPLX_ARG (D), F77_DBLE_CMPLX_ARG (DU),
+                             tmp_nr, 1, F77_DBLE_CMPLX_ARG (DL), F77_DBLE_CMPLX_ARG (D), F77_DBLE_CMPLX_ARG (DU),
                              F77_DBLE_CMPLX_ARG (DU2), pipvt,
-                             F77_DBLE_CMPLX_ARG (work), b.rows (), err
+                             F77_DBLE_CMPLX_ARG (work), b_nr, tmp_err
                              F77_CHAR_ARG_LEN (1)));
 
+                  err = tmp_err;
+
                   // Count nonzeros in work vector and adjust
                   // space in retval if needed
                   octave_idx_type new_nnz = 0;
@@ -3984,16 +4009,23 @@
                   }
             }
 
-          octave_idx_type b_nr = b.rows ();
-          octave_idx_type b_nc = b.cols ();
+          F77_INT b_nr = to_f77_int (b.rows ());
+          F77_INT b_nc = to_f77_int (b.cols ());
+
           rcond = 1.;
 
           retval = ComplexMatrix (b);
           Complex *result = retval.fortran_vec ();
 
-          F77_XFCN (zptsv, ZPTSV, (nr, b_nc, D, F77_DBLE_CMPLX_ARG (DL),
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          F77_INT tmp_err = 0;
+
+          F77_XFCN (zptsv, ZPTSV, (tmp_nr, b_nc, D, F77_DBLE_CMPLX_ARG (DL),
                                    F77_DBLE_CMPLX_ARG (result),
-                                   b_nr, err));
+                                   b_nr, tmp_err));
+
+          err = tmp_err;
 
           if (err != 0)
             {
@@ -4043,16 +4075,23 @@
                   }
             }
 
-          octave_idx_type b_nr = b.rows ();
-          octave_idx_type b_nc = b.cols ();
+          F77_INT b_nr = to_f77_int (b.rows ());
+          F77_INT b_nc = to_f77_int (b.cols ());
+
           rcond = 1.;
 
           retval = ComplexMatrix (b);
           Complex *result = retval.fortran_vec ();
 
-          F77_XFCN (zgtsv, ZGTSV, (nr, b_nc, F77_DBLE_CMPLX_ARG (DL),
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          F77_INT tmp_err = 0;
+
+          F77_XFCN (zgtsv, ZGTSV, (tmp_nr, b_nc, F77_DBLE_CMPLX_ARG (DL),
                                    F77_DBLE_CMPLX_ARG (D), F77_DBLE_CMPLX_ARG (DU), F77_DBLE_CMPLX_ARG (result),
-                                   b_nr, err));
+                                   b_nr, tmp_err));
+
+          err = tmp_err;
 
           if (err != 0)
             {
@@ -4111,8 +4150,8 @@
           OCTAVE_LOCAL_BUFFER (Complex, DU, nr - 1);
           OCTAVE_LOCAL_BUFFER (Complex, D, nr);
           OCTAVE_LOCAL_BUFFER (Complex, DL, nr - 1);
-          Array<octave_idx_type> ipvt (dim_vector (nr, 1));
-          octave_idx_type *pipvt = ipvt.fortran_vec ();
+          Array<F77_INT> ipvt (dim_vector (nr, 1));
+          F77_INT *pipvt = ipvt.fortran_vec ();
 
           if (mattype.is_dense ())
             {
@@ -4148,8 +4187,14 @@
                   }
             }
 
-          F77_XFCN (zgttrf, ZGTTRF, (nr, F77_DBLE_CMPLX_ARG (DL), F77_DBLE_CMPLX_ARG (D),
-                                     F77_DBLE_CMPLX_ARG (DU), F77_DBLE_CMPLX_ARG (DU2), pipvt, err));
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          F77_INT tmp_err = 0;
+
+          F77_XFCN (zgttrf, ZGTTRF, (tmp_nr, F77_DBLE_CMPLX_ARG (DL), F77_DBLE_CMPLX_ARG (D),
+                                     F77_DBLE_CMPLX_ARG (DU), F77_DBLE_CMPLX_ARG (DU2), pipvt, tmp_err));
+
+          err = tmp_err;
 
           if (err != 0)
             {
@@ -4168,7 +4213,7 @@
             {
               rcond = 1.;
               char job = 'N';
-              octave_idx_type b_nr = b.rows ();
+              F77_INT b_nr = to_f77_int (b.rows ());
               octave_idx_type b_nc = b.cols ();
               OCTAVE_LOCAL_BUFFER (Complex, Bx, b_nr);
 
@@ -4182,16 +4227,18 @@
               for (volatile octave_idx_type j = 0; j < b_nc; j++)
                 {
 
-                  for (octave_idx_type i = 0; i < b_nr; i++)
+                  for (F77_INT i = 0; i < b_nr; i++)
                     Bx[i] = b(i,j);
 
                   F77_XFCN (zgttrs, ZGTTRS,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, 1, F77_DBLE_CMPLX_ARG (DL), F77_DBLE_CMPLX_ARG (D), F77_DBLE_CMPLX_ARG (DU),
+                             tmp_nr, 1, F77_DBLE_CMPLX_ARG (DL), F77_DBLE_CMPLX_ARG (D), F77_DBLE_CMPLX_ARG (DU),
                              F77_DBLE_CMPLX_ARG (DU2), pipvt,
-                             F77_DBLE_CMPLX_ARG (Bx), b_nr, err
+                             F77_DBLE_CMPLX_ARG (Bx), b_nr, tmp_err
                              F77_CHAR_ARG_LEN (1)));
 
+                  err = tmp_err;
+
                   if (err != 0)
                     {
                       // FIXME: This should probably be a warning so that
@@ -4264,8 +4311,8 @@
 
       if (typ == MatrixType::Banded_Hermitian)
         {
-          octave_idx_type n_lower = mattype.nlower ();
-          octave_idx_type ldm = n_lower + 1;
+          F77_INT n_lower = to_f77_int (mattype.nlower ());
+          F77_INT ldm = n_lower + 1;
           ComplexMatrix m_band (ldm, nc);
           Complex *tmp_data = m_band.fortran_vec ();
 
@@ -4273,7 +4320,7 @@
             {
               octave_idx_type ii = 0;
 
-              for (octave_idx_type j = 0; j < ldm; j++)
+              for (F77_INT j = 0; j < ldm; j++)
                 for (octave_idx_type i = 0; i < nc; i++)
                   tmp_data[ii++] = 0.;
             }
@@ -4291,11 +4338,17 @@
           if (calc_cond)
             anorm = m_band.abs ().sum ().row (0).max ();
 
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          F77_INT tmp_err = 0;
+
           char job = 'L';
           F77_XFCN (zpbtrf, ZPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                     nr, n_lower, F77_DBLE_CMPLX_ARG (tmp_data), ldm, err
+                                     tmp_nr, n_lower, F77_DBLE_CMPLX_ARG (tmp_data), ldm, tmp_err
                                      F77_CHAR_ARG_LEN (1)));
 
+          err = tmp_err;
+
           if (err != 0)
             {
               rcond = 0.0;
@@ -4316,10 +4369,12 @@
 
                   F77_XFCN (zpbcon, ZPBCON,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, n_lower, F77_DBLE_CMPLX_ARG (tmp_data), ldm,
-                             anorm, rcond, F77_DBLE_CMPLX_ARG (pz), piz, err
+                             tmp_nr, n_lower, F77_DBLE_CMPLX_ARG (tmp_data), ldm,
+                             anorm, rcond, F77_DBLE_CMPLX_ARG (pz), piz, tmp_err
                              F77_CHAR_ARG_LEN (1)));
 
+                  err = tmp_err;
+
                   if (err != 0)
                     err = -2;
 
@@ -4346,14 +4401,17 @@
                   retval = ComplexMatrix (b);
                   Complex *result = retval.fortran_vec ();
 
-                  octave_idx_type b_nc = b.cols ();
+                  F77_INT b_nr = to_f77_int (b.rows ());
+                  F77_INT b_nc = to_f77_int (b.cols ());
 
                   F77_XFCN (zpbtrs, ZPBTRS,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, n_lower, b_nc, F77_DBLE_CMPLX_ARG (tmp_data),
-                             ldm, F77_DBLE_CMPLX_ARG (result), b.rows (), err
+                             tmp_nr, n_lower, b_nc, F77_DBLE_CMPLX_ARG (tmp_data),
+                             ldm, F77_DBLE_CMPLX_ARG (result), b_nr, tmp_err
                              F77_CHAR_ARG_LEN (1)));
 
+                  err = tmp_err;
+
                   if (err != 0)
                     {
                       // FIXME: Probably should be a warning.
@@ -4368,9 +4426,9 @@
       if (typ == MatrixType::Banded)
         {
           // Create the storage for the banded form of the sparse matrix
-          octave_idx_type n_upper = mattype.nupper ();
-          octave_idx_type n_lower = mattype.nlower ();
-          octave_idx_type ldm = n_upper + 2 * n_lower + 1;
+          F77_INT n_upper = to_f77_int (mattype.nupper ());
+          F77_INT n_lower = to_f77_int (mattype.nlower ());
+          F77_INT ldm = n_upper + 2 * n_lower + 1;
 
           ComplexMatrix m_band (ldm, nc);
           Complex *tmp_data = m_band.fortran_vec ();
@@ -4379,7 +4437,7 @@
             {
               octave_idx_type ii = 0;
 
-              for (octave_idx_type j = 0; j < ldm; j++)
+              for (F77_INT j = 0; j < ldm; j++)
                 for (octave_idx_type i = 0; i < nc; i++)
                   tmp_data[ii++] = 0.;
             }
@@ -4402,12 +4460,18 @@
                 }
             }
 
-          Array<octave_idx_type> ipvt (dim_vector (nr, 1));
-          octave_idx_type *pipvt = ipvt.fortran_vec ();
-
-          F77_XFCN (zgbtrf, ZGBTRF, (nr, nc, n_lower, n_upper,
+          Array<F77_INT> ipvt (dim_vector (nr, 1));
+          F77_INT *pipvt = ipvt.fortran_vec ();
+
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          F77_INT tmp_err = 0;
+
+          F77_XFCN (zgbtrf, ZGBTRF, (tmp_nr, tmp_nr, n_lower, n_upper,
                                      F77_DBLE_CMPLX_ARG (tmp_data),
-                                     ldm, pipvt, err));
+                                     ldm, pipvt, tmp_err));
+
+          err = tmp_err;
 
           // Throw-away extra info LAPACK gives so as to not
           // change output.
@@ -4434,12 +4498,16 @@
                   Array<double> iz (dim_vector (nr, 1));
                   double *piz = iz.fortran_vec ();
 
+                  F77_INT tmp_nc = to_f77_int (nc);
+
                   F77_XFCN (zgbcon, ZGBCON,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nc, n_lower, n_upper, F77_DBLE_CMPLX_ARG (tmp_data), ldm, pipvt,
-                             anorm, rcond, F77_DBLE_CMPLX_ARG (pz), piz, err
+                             tmp_nc, n_lower, n_upper, F77_DBLE_CMPLX_ARG (tmp_data), ldm, pipvt,
+                             anorm, rcond, F77_DBLE_CMPLX_ARG (pz), piz, tmp_err
                              F77_CHAR_ARG_LEN (1)));
 
+                  err = tmp_err;
+
                   if (err != 0)
                     err = -2;
 
@@ -4466,14 +4534,17 @@
                   retval = ComplexMatrix (b);
                   Complex *result = retval.fortran_vec ();
 
-                  octave_idx_type b_nc = b.cols ();
+                  F77_INT b_nr = to_f77_int (b.rows ());
+                  F77_INT b_nc = to_f77_int (b.cols ());
 
                   char job = 'N';
                   F77_XFCN (zgbtrs, ZGBTRS,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, n_lower, n_upper, b_nc, F77_DBLE_CMPLX_ARG (tmp_data),
-                             ldm, pipvt, F77_DBLE_CMPLX_ARG (result), b.rows (), err
+                             tmp_nr, n_lower, n_upper, b_nc, F77_DBLE_CMPLX_ARG (tmp_data),
+                             ldm, pipvt, F77_DBLE_CMPLX_ARG (result), b_nr, tmp_err
                              F77_CHAR_ARG_LEN (1)));
+
+                  err = tmp_err;
                 }
             }
         }
@@ -4510,8 +4581,8 @@
 
       if (typ == MatrixType::Banded_Hermitian)
         {
-          octave_idx_type n_lower = mattype.nlower ();
-          octave_idx_type ldm = n_lower + 1;
+          F77_INT n_lower = to_f77_int (mattype.nlower ());
+          F77_INT ldm = n_lower + 1;
 
           ComplexMatrix m_band (ldm, nc);
           Complex *tmp_data = m_band.fortran_vec ();
@@ -4520,7 +4591,7 @@
             {
               octave_idx_type ii = 0;
 
-              for (octave_idx_type j = 0; j < ldm; j++)
+              for (F77_INT j = 0; j < ldm; j++)
                 for (octave_idx_type i = 0; i < nc; i++)
                   tmp_data[ii++] = 0.;
             }
@@ -4538,11 +4609,17 @@
           if (calc_cond)
             anorm = m_band.abs ().sum ().row (0).max ();
 
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          F77_INT tmp_err = 0;
+
           char job = 'L';
           F77_XFCN (zpbtrf, ZPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                     nr, n_lower, F77_DBLE_CMPLX_ARG (tmp_data), ldm, err
+                                     tmp_nr, n_lower, F77_DBLE_CMPLX_ARG (tmp_data), ldm, tmp_err
                                      F77_CHAR_ARG_LEN (1)));
 
+          err = tmp_err;
+
           if (err != 0)
             {
               rcond = 0.0;
@@ -4561,10 +4638,12 @@
 
                   F77_XFCN (zpbcon, ZPBCON,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, n_lower, F77_DBLE_CMPLX_ARG (tmp_data), ldm,
-                             anorm, rcond, F77_DBLE_CMPLX_ARG (pz), piz, err
+                             tmp_nr, n_lower, F77_DBLE_CMPLX_ARG (tmp_data), ldm,
+                             anorm, rcond, F77_DBLE_CMPLX_ARG (pz), piz, tmp_err
                              F77_CHAR_ARG_LEN (1)));
 
+                  err = tmp_err;
+
                   if (err != 0)
                     err = -2;
 
@@ -4588,7 +4667,7 @@
 
               if (err == 0)
                 {
-                  octave_idx_type b_nr = b.rows ();
+                  F77_INT b_nr = to_f77_int (b.rows ());
                   octave_idx_type b_nc = b.cols ();
                   OCTAVE_LOCAL_BUFFER (Complex, Bx, b_nr);
 
@@ -4601,15 +4680,17 @@
                   retval.xcidx (0) = 0;
                   for (volatile octave_idx_type j = 0; j < b_nc; j++)
                     {
-                      for (octave_idx_type i = 0; i < b_nr; i++)
+                      for (F77_INT i = 0; i < b_nr; i++)
                         Bx[i] = b.elem (i, j);
 
                       F77_XFCN (zpbtrs, ZPBTRS,
                                 (F77_CONST_CHAR_ARG2 (&job, 1),
-                                 nr, n_lower, 1, F77_DBLE_CMPLX_ARG (tmp_data),
-                                 ldm, F77_DBLE_CMPLX_ARG (Bx), b_nr, err
+                                 tmp_nr, n_lower, 1, F77_DBLE_CMPLX_ARG (tmp_data),
+                                 ldm, F77_DBLE_CMPLX_ARG (Bx), b_nr, tmp_err
                                  F77_CHAR_ARG_LEN (1)));
 
+                      err = tmp_err;
+
                       if (err != 0)
                         {
                           // FIXME: Probably should be a warning.
@@ -4648,9 +4729,9 @@
       if (typ == MatrixType::Banded)
         {
           // Create the storage for the banded form of the sparse matrix
-          octave_idx_type n_upper = mattype.nupper ();
-          octave_idx_type n_lower = mattype.nlower ();
-          octave_idx_type ldm = n_upper + 2 * n_lower + 1;
+          F77_INT n_upper = to_f77_int (mattype.nupper ());
+          F77_INT n_lower = to_f77_int (mattype.nlower ());
+          F77_INT ldm = n_upper + 2 * n_lower + 1;
 
           ComplexMatrix m_band (ldm, nc);
           Complex *tmp_data = m_band.fortran_vec ();
@@ -4659,7 +4740,7 @@
             {
               octave_idx_type ii = 0;
 
-              for (octave_idx_type j = 0; j < ldm; j++)
+              for (F77_INT j = 0; j < ldm; j++)
                 for (octave_idx_type i = 0; i < nc; i++)
                   tmp_data[ii++] = 0.;
             }
@@ -4682,12 +4763,18 @@
                 }
             }
 
-          Array<octave_idx_type> ipvt (dim_vector (nr, 1));
-          octave_idx_type *pipvt = ipvt.fortran_vec ();
-
-          F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper,
+          Array<F77_INT> ipvt (dim_vector (nr, 1));
+          F77_INT *pipvt = ipvt.fortran_vec ();
+
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          F77_INT tmp_err = 0;
+
+          F77_XFCN (zgbtrf, ZGBTRF, (tmp_nr, tmp_nr, n_lower, n_upper,
                                      F77_DBLE_CMPLX_ARG (tmp_data),
-                                     ldm, pipvt, err));
+                                     ldm, pipvt, tmp_err));
+
+          err = tmp_err;
 
           if (err != 0)
             {
@@ -4712,12 +4799,16 @@
                   Array<double> iz (dim_vector (nr, 1));
                   double *piz = iz.fortran_vec ();
 
+                  F77_INT tmp_nc = to_f77_int (nc);
+
                   F77_XFCN (zgbcon, ZGBCON,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nc, n_lower, n_upper, F77_DBLE_CMPLX_ARG (tmp_data), ldm, pipvt,
-                             anorm, rcond, F77_DBLE_CMPLX_ARG (pz), piz, err
+                             tmp_nc, n_lower, n_upper, F77_DBLE_CMPLX_ARG (tmp_data), ldm, pipvt,
+                             anorm, rcond, F77_DBLE_CMPLX_ARG (pz), piz, tmp_err
                              F77_CHAR_ARG_LEN (1)));
 
+                  err = tmp_err;
+
                   if (err != 0)
                     err = -2;
 
@@ -4743,6 +4834,7 @@
                 {
                   char job = 'N';
                   volatile octave_idx_type x_nz = b.nnz ();
+                  F77_INT b_nr = to_f77_int (b.rows ());
                   octave_idx_type b_nc = b.cols ();
                   retval = SparseComplexMatrix (nr, b_nc, x_nz);
                   retval.xcidx (0) = 0;
@@ -4760,10 +4852,12 @@
 
                       F77_XFCN (zgbtrs, ZGBTRS,
                                 (F77_CONST_CHAR_ARG2 (&job, 1),
-                                 nr, n_lower, n_upper, 1, F77_DBLE_CMPLX_ARG (tmp_data),
-                                 ldm, pipvt, F77_DBLE_CMPLX_ARG (work), b.rows (), err
+                                 tmp_nr, n_lower, n_upper, 1, F77_DBLE_CMPLX_ARG (tmp_data),
+                                 ldm, pipvt, F77_DBLE_CMPLX_ARG (work), b_nr, tmp_err
                                  F77_CHAR_ARG_LEN (1)));
 
+                      err = tmp_err;
+
                       // Count nonzeros in work vector and adjust
                       // space in retval if needed
                       octave_idx_type new_nnz = 0;
@@ -4825,8 +4919,8 @@
 
       if (typ == MatrixType::Banded_Hermitian)
         {
-          octave_idx_type n_lower = mattype.nlower ();
-          octave_idx_type ldm = n_lower + 1;
+          F77_INT n_lower = to_f77_int (mattype.nlower ());
+          F77_INT ldm = n_lower + 1;
 
           ComplexMatrix m_band (ldm, nc);
           Complex *tmp_data = m_band.fortran_vec ();
@@ -4835,7 +4929,7 @@
             {
               octave_idx_type ii = 0;
 
-              for (octave_idx_type j = 0; j < ldm; j++)
+              for (F77_INT j = 0; j < ldm; j++)
                 for (octave_idx_type i = 0; i < nc; i++)
                   tmp_data[ii++] = 0.;
             }
@@ -4853,11 +4947,17 @@
           if (calc_cond)
             anorm = m_band.abs ().sum ().row (0).max ();
 
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          F77_INT tmp_err = 0;
+
           char job = 'L';
           F77_XFCN (zpbtrf, ZPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                     nr, n_lower, F77_DBLE_CMPLX_ARG (tmp_data), ldm, err
+                                     tmp_nr, n_lower, F77_DBLE_CMPLX_ARG (tmp_data), ldm, tmp_err
                                      F77_CHAR_ARG_LEN (1)));
 
+          err = tmp_err;
+
           if (err != 0)
             {
               // Matrix is not positive definite!! Fall through to
@@ -4878,10 +4978,12 @@
 
                   F77_XFCN (zpbcon, ZPBCON,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, n_lower, F77_DBLE_CMPLX_ARG (tmp_data), ldm,
-                             anorm, rcond, F77_DBLE_CMPLX_ARG (pz), piz, err
+                             tmp_nr, n_lower, F77_DBLE_CMPLX_ARG (tmp_data), ldm,
+                             anorm, rcond, F77_DBLE_CMPLX_ARG (pz), piz, tmp_err
                              F77_CHAR_ARG_LEN (1)));
 
+                  err = tmp_err;
+
                   if (err != 0)
                     err = -2;
 
@@ -4905,17 +5007,19 @@
 
               if (err == 0)
                 {
-                  octave_idx_type b_nr = b.rows ();
-                  octave_idx_type b_nc = b.cols ();
+                  F77_INT b_nr = to_f77_int (b.rows ());
+                  F77_INT b_nc = to_f77_int (b.cols ());
                   retval = ComplexMatrix (b);
                   Complex *result = retval.fortran_vec ();
 
                   F77_XFCN (zpbtrs, ZPBTRS,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, n_lower, b_nc, F77_DBLE_CMPLX_ARG (tmp_data),
-                             ldm, F77_DBLE_CMPLX_ARG (result), b_nr, err
+                             tmp_nr, n_lower, b_nc, F77_DBLE_CMPLX_ARG (tmp_data),
+                             ldm, F77_DBLE_CMPLX_ARG (result), b_nr, tmp_err
                              F77_CHAR_ARG_LEN (1)));
 
+                  err = tmp_err;
+
                   if (err != 0)
                     {
                       // FIXME: Probably should be a warning.
@@ -4930,9 +5034,9 @@
       if (typ == MatrixType::Banded)
         {
           // Create the storage for the banded form of the sparse matrix
-          octave_idx_type n_upper = mattype.nupper ();
-          octave_idx_type n_lower = mattype.nlower ();
-          octave_idx_type ldm = n_upper + 2 * n_lower + 1;
+          F77_INT n_upper = to_f77_int (mattype.nupper ());
+          F77_INT n_lower = to_f77_int (mattype.nlower ());
+          F77_INT ldm = n_upper + 2 * n_lower + 1;
 
           ComplexMatrix m_band (ldm, nc);
           Complex *tmp_data = m_band.fortran_vec ();
@@ -4941,7 +5045,7 @@
             {
               octave_idx_type ii = 0;
 
-              for (octave_idx_type j = 0; j < ldm; j++)
+              for (F77_INT j = 0; j < ldm; j++)
                 for (octave_idx_type i = 0; i < nc; i++)
                   tmp_data[ii++] = 0.;
             }
@@ -4964,12 +5068,18 @@
                 }
             }
 
-          Array<octave_idx_type> ipvt (dim_vector (nr, 1));
-          octave_idx_type *pipvt = ipvt.fortran_vec ();
-
-          F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper,
+          Array<F77_INT> ipvt (dim_vector (nr, 1));
+          F77_INT *pipvt = ipvt.fortran_vec ();
+
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          F77_INT tmp_err = 0;
+
+          F77_XFCN (zgbtrf, ZGBTRF, (tmp_nr, tmp_nr, n_lower, n_upper,
                                      F77_DBLE_CMPLX_ARG (tmp_data),
-                                     ldm, pipvt, err));
+                                     ldm, pipvt, tmp_err));
+
+          err = tmp_err;
 
           if (err != 0)
             {
@@ -4994,12 +5104,16 @@
                   Array<double> iz (dim_vector (nr, 1));
                   double *piz = iz.fortran_vec ();
 
+                  F77_INT tmp_nc = to_f77_int (nc);
+
                   F77_XFCN (zgbcon, ZGBCON,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nc, n_lower, n_upper, F77_DBLE_CMPLX_ARG (tmp_data), ldm, pipvt,
-                             anorm, rcond, F77_DBLE_CMPLX_ARG (pz), piz, err
+                             tmp_nc, n_lower, n_upper, F77_DBLE_CMPLX_ARG (tmp_data), ldm, pipvt,
+                             anorm, rcond, F77_DBLE_CMPLX_ARG (pz), piz, tmp_err
                              F77_CHAR_ARG_LEN (1)));
 
+                  err = tmp_err;
+
                   if (err != 0)
                     err = -2;
 
@@ -5024,15 +5138,18 @@
               if (err == 0)
                 {
                   char job = 'N';
-                  octave_idx_type b_nc = b.cols ();
+                  F77_INT b_nr = to_f77_int (b.rows ());
+                  F77_INT b_nc = to_f77_int (b.cols ());
                   retval = ComplexMatrix (b);
                   Complex *result = retval.fortran_vec ();
 
                   F77_XFCN (zgbtrs, ZGBTRS,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, n_lower, n_upper, b_nc, F77_DBLE_CMPLX_ARG (tmp_data),
-                             ldm, pipvt, F77_DBLE_CMPLX_ARG (result), b.rows (), err
+                             tmp_nr, n_lower, n_upper, b_nc, F77_DBLE_CMPLX_ARG (tmp_data),
+                             ldm, pipvt, F77_DBLE_CMPLX_ARG (result), b_nr, tmp_err
                              F77_CHAR_ARG_LEN (1)));
+
+                  err = tmp_err;
                 }
             }
         }
@@ -5069,8 +5186,8 @@
 
       if (typ == MatrixType::Banded_Hermitian)
         {
-          octave_idx_type n_lower = mattype.nlower ();
-          octave_idx_type ldm = n_lower + 1;
+          F77_INT n_lower = to_f77_int (mattype.nlower ());
+          F77_INT ldm = n_lower + 1;
 
           ComplexMatrix m_band (ldm, nc);
           Complex *tmp_data = m_band.fortran_vec ();
@@ -5079,7 +5196,7 @@
             {
               octave_idx_type ii = 0;
 
-              for (octave_idx_type j = 0; j < ldm; j++)
+              for (F77_INT j = 0; j < ldm; j++)
                 for (octave_idx_type i = 0; i < nc; i++)
                   tmp_data[ii++] = 0.;
             }
@@ -5097,11 +5214,17 @@
           if (calc_cond)
             anorm = m_band.abs ().sum ().row (0).max ();
 
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          F77_INT tmp_err = 0;
+
           char job = 'L';
           F77_XFCN (zpbtrf, ZPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                     nr, n_lower, F77_DBLE_CMPLX_ARG (tmp_data), ldm, err
+                                     tmp_nr, n_lower, F77_DBLE_CMPLX_ARG (tmp_data), ldm, tmp_err
                                      F77_CHAR_ARG_LEN (1)));
 
+          err = tmp_err;
+
           if (err != 0)
             {
               // Matrix is not positive definite!! Fall through to
@@ -5123,10 +5246,12 @@
 
                   F77_XFCN (zpbcon, ZPBCON,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, n_lower, F77_DBLE_CMPLX_ARG (tmp_data), ldm,
-                             anorm, rcond, F77_DBLE_CMPLX_ARG (pz), piz, err
+                             tmp_nr, n_lower, F77_DBLE_CMPLX_ARG (tmp_data), ldm,
+                             anorm, rcond, F77_DBLE_CMPLX_ARG (pz), piz, tmp_err
                              F77_CHAR_ARG_LEN (1)));
 
+                  err = tmp_err;
+
                   if (err != 0)
                     err = -2;
 
@@ -5150,7 +5275,7 @@
 
               if (err == 0)
                 {
-                  octave_idx_type b_nr = b.rows ();
+                  F77_INT b_nr = to_f77_int (b.rows ());
                   octave_idx_type b_nc = b.cols ();
                   OCTAVE_LOCAL_BUFFER (Complex, Bx, b_nr);
 
@@ -5164,15 +5289,17 @@
                   for (volatile octave_idx_type j = 0; j < b_nc; j++)
                     {
 
-                      for (octave_idx_type i = 0; i < b_nr; i++)
+                      for (F77_INT i = 0; i < b_nr; i++)
                         Bx[i] = b(i,j);
 
                       F77_XFCN (zpbtrs, ZPBTRS,
                                 (F77_CONST_CHAR_ARG2 (&job, 1),
-                                 nr, n_lower, 1, F77_DBLE_CMPLX_ARG (tmp_data),
-                                 ldm, F77_DBLE_CMPLX_ARG (Bx), b_nr, err
+                                 tmp_nr, n_lower, 1, F77_DBLE_CMPLX_ARG (tmp_data),
+                                 ldm, F77_DBLE_CMPLX_ARG (Bx), b_nr, tmp_err
                                  F77_CHAR_ARG_LEN (1)));
 
+                      err = tmp_err;
+
                       if (err != 0)
                         {
                           // FIXME: Probably should be a warning.
@@ -5215,9 +5342,9 @@
       if (typ == MatrixType::Banded)
         {
           // Create the storage for the banded form of the sparse matrix
-          octave_idx_type n_upper = mattype.nupper ();
-          octave_idx_type n_lower = mattype.nlower ();
-          octave_idx_type ldm = n_upper + 2 * n_lower + 1;
+          F77_INT n_upper = to_f77_int (mattype.nupper ());
+          F77_INT n_lower = to_f77_int (mattype.nlower ());
+          F77_INT ldm = n_upper + 2 * n_lower + 1;
 
           ComplexMatrix m_band (ldm, nc);
           Complex *tmp_data = m_band.fortran_vec ();
@@ -5226,7 +5353,7 @@
             {
               octave_idx_type ii = 0;
 
-              for (octave_idx_type j = 0; j < ldm; j++)
+              for (F77_INT j = 0; j < ldm; j++)
                 for (octave_idx_type i = 0; i < nc; i++)
                   tmp_data[ii++] = 0.;
             }
@@ -5249,12 +5376,18 @@
                 }
             }
 
-          Array<octave_idx_type> ipvt (dim_vector (nr, 1));
-          octave_idx_type *pipvt = ipvt.fortran_vec ();
-
-          F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper,
+          Array<F77_INT> ipvt (dim_vector (nr, 1));
+          F77_INT *pipvt = ipvt.fortran_vec ();
+
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          F77_INT tmp_err = 0;
+
+          F77_XFCN (zgbtrf, ZGBTRF, (tmp_nr, tmp_nr, n_lower, n_upper,
                                      F77_DBLE_CMPLX_ARG (tmp_data),
-                                     ldm, pipvt, err));
+                                     ldm, pipvt, tmp_err));
+
+          err = tmp_err;
 
           if (err != 0)
             {
@@ -5279,12 +5412,16 @@
                   Array<double> iz (dim_vector (nr, 1));
                   double *piz = iz.fortran_vec ();
 
+                  F77_INT tmp_nc = to_f77_int (nc);
+
                   F77_XFCN (zgbcon, ZGBCON,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nc, n_lower, n_upper, F77_DBLE_CMPLX_ARG (tmp_data), ldm, pipvt,
-                             anorm, rcond, F77_DBLE_CMPLX_ARG (pz), piz, err
+                             tmp_nc, n_lower, n_upper, F77_DBLE_CMPLX_ARG (tmp_data), ldm, pipvt,
+                             anorm, rcond, F77_DBLE_CMPLX_ARG (pz), piz, tmp_err
                              F77_CHAR_ARG_LEN (1)));
 
+                  err = tmp_err;
+
                   if (err != 0)
                     err = -2;
 
@@ -5310,6 +5447,7 @@
                 {
                   char job = 'N';
                   volatile octave_idx_type x_nz = b.nnz ();
+                  F77_INT b_nr = to_f77_int (b.rows ());
                   octave_idx_type b_nc = b.cols ();
                   retval = SparseComplexMatrix (nr, b_nc, x_nz);
                   retval.xcidx (0) = 0;
@@ -5328,10 +5466,12 @@
 
                       F77_XFCN (zgbtrs, ZGBTRS,
                                 (F77_CONST_CHAR_ARG2 (&job, 1),
-                                 nr, n_lower, n_upper, 1, F77_DBLE_CMPLX_ARG (tmp_data),
-                                 ldm, pipvt, F77_DBLE_CMPLX_ARG (Bx), b.rows (), err
+                                 tmp_nr, n_lower, n_upper, 1, F77_DBLE_CMPLX_ARG (tmp_data),
+                                 ldm, pipvt, F77_DBLE_CMPLX_ARG (Bx), b_nr, tmp_err
                                  F77_CHAR_ARG_LEN (1)));
 
+                      err = tmp_err;
+
                       // Count nonzeros in work vector and adjust
                       // space in retval if needed
                       octave_idx_type new_nnz = 0;
--- a/liboctave/array/dSparse.cc	Wed Dec 28 13:33:13 2016 -0500
+++ b/liboctave/array/dSparse.cc	Wed Dec 28 17:14:00 2016 -0500
@@ -3762,12 +3762,20 @@
                   }
             }
 
-          octave_idx_type b_nc = b.cols ();
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          F77_INT b_nr = to_f77_int (b.rows ());
+          F77_INT b_nc = to_f77_int (b.cols ());
+
           retval = b;
           double *result = retval.fortran_vec ();
 
-          F77_XFCN (dptsv, DPTSV, (nr, b_nc, D, DL, result,
-                                   b.rows (), err));
+          F77_INT tmp_err = 0;
+
+          F77_XFCN (dptsv, DPTSV, (tmp_nr, b_nc, D, DL, result,
+                                   b_nr, tmp_err));
+
+          err = tmp_err;
 
           if (err != 0)
             {
@@ -3819,12 +3827,20 @@
                   }
             }
 
-          octave_idx_type b_nc = b.cols ();
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          F77_INT b_nr = to_f77_int (b.rows ());
+          F77_INT b_nc = to_f77_int (b.cols ());
+
           retval = b;
           double *result = retval.fortran_vec ();
 
-          F77_XFCN (dgtsv, DGTSV, (nr, b_nc, DL, D, DU, result,
-                                   b.rows (), err));
+          F77_INT tmp_err = 0;
+
+          F77_XFCN (dgtsv, DGTSV, (tmp_nr, b_nc, DL, D, DU, result,
+                                   b_nr, tmp_err));
+
+          err = tmp_err;
 
           if (err != 0)
             {
@@ -3884,8 +3900,8 @@
           OCTAVE_LOCAL_BUFFER (double, DU, nr - 1);
           OCTAVE_LOCAL_BUFFER (double, D, nr);
           OCTAVE_LOCAL_BUFFER (double, DL, nr - 1);
-          Array<octave_idx_type> ipvt (dim_vector (nr, 1));
-          octave_idx_type *pipvt = ipvt.fortran_vec ();
+          Array<F77_INT> ipvt (dim_vector (nr, 1));
+          F77_INT *pipvt = ipvt.fortran_vec ();
 
           if (mattype.is_dense ())
             {
@@ -3921,7 +3937,11 @@
                   }
             }
 
-          F77_XFCN (dgttrf, DGTTRF, (nr, DL, D, DU, DU2, pipvt, err));
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          F77_INT tmp_err = 0;
+
+          F77_XFCN (dgttrf, DGTTRF, (tmp_nr, DL, D, DU, DU2, pipvt, tmp_err));
 
           if (err != 0)
             {
@@ -3955,12 +3975,16 @@
                   for (octave_idx_type i = b.cidx (j); i < b.cidx (j+1); i++)
                     work[b.ridx (i)] = b.data (i);
 
+                  F77_INT b_nr = to_f77_int (b.rows ());
+
                   F77_XFCN (dgttrs, DGTTRS,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, 1, DL, D, DU, DU2, pipvt,
-                             work, b.rows (), err
+                             tmp_nr, 1, DL, D, DU, DU2, pipvt,
+                             work, b_nr, tmp_err
                              F77_CHAR_ARG_LEN (1)));
 
+                  err = tmp_err;
+
                   // Count nonzeros in work vector and adjust
                   // space in retval if needed
                   octave_idx_type new_nnz = 0;
@@ -4058,16 +4082,23 @@
                   }
             }
 
-          octave_idx_type b_nr = b.rows ();
-          octave_idx_type b_nc = b.cols ();
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          F77_INT b_nr = to_f77_int (b.rows ());
+          F77_INT b_nc = to_f77_int (b.cols ());
+
           rcond = 1.;
 
           retval = b;
           Complex *result = retval.fortran_vec ();
 
-          F77_XFCN (zptsv, ZPTSV, (nr, b_nc, D, F77_DBLE_CMPLX_ARG (DL),
+          F77_INT tmp_err = 0;
+
+          F77_XFCN (zptsv, ZPTSV, (tmp_nr, b_nc, D, F77_DBLE_CMPLX_ARG (DL),
                                    F77_DBLE_CMPLX_ARG (result),
-                                   b_nr, err));
+                                   b_nr, tmp_err));
+
+          err = tmp_err;
 
           if (err != 0)
             {
@@ -4117,16 +4148,25 @@
                   }
             }
 
-          octave_idx_type b_nr = b.rows ();
-          octave_idx_type b_nc = b.cols ();
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          F77_INT b_nr = to_f77_int (b.rows ());
+          F77_INT b_nc = to_f77_int (b.cols ());
+
           rcond = 1.;
 
           retval = b;
           Complex *result = retval.fortran_vec ();
 
-          F77_XFCN (zgtsv, ZGTSV, (nr, b_nc, F77_DBLE_CMPLX_ARG (DL),
-                                   F77_DBLE_CMPLX_ARG (D), F77_DBLE_CMPLX_ARG (DU), F77_DBLE_CMPLX_ARG (result),
-                                   b_nr, err));
+          F77_INT tmp_err = 0;
+
+          F77_XFCN (zgtsv, ZGTSV, (tmp_nr, b_nc, F77_DBLE_CMPLX_ARG (DL),
+                                   F77_DBLE_CMPLX_ARG (D),
+                                   F77_DBLE_CMPLX_ARG (DU),
+                                   F77_DBLE_CMPLX_ARG (result),
+                                   b_nr, tmp_err));
+
+          err = tmp_err;
 
           if (err != 0)
             {
@@ -4184,8 +4224,8 @@
           OCTAVE_LOCAL_BUFFER (double, DU, nr - 1);
           OCTAVE_LOCAL_BUFFER (double, D, nr);
           OCTAVE_LOCAL_BUFFER (double, DL, nr - 1);
-          Array<octave_idx_type> ipvt (dim_vector (nr, 1));
-          octave_idx_type *pipvt = ipvt.fortran_vec ();
+          Array<F77_INT> ipvt (dim_vector (nr, 1));
+          F77_INT *pipvt = ipvt.fortran_vec ();
 
           if (mattype.is_dense ())
             {
@@ -4221,7 +4261,13 @@
                   }
             }
 
-          F77_XFCN (dgttrf, DGTTRF, (nr, DL, D, DU, DU2, pipvt, err));
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          F77_INT tmp_err = 0;
+
+          F77_XFCN (dgttrf, DGTTRF, (tmp_nr, DL, D, DU, DU2, pipvt, tmp_err));
+
+          err = tmp_err;
 
           if (err != 0)
             {
@@ -4240,7 +4286,7 @@
             {
               rcond = 1.;
               char job = 'N';
-              octave_idx_type b_nr = b.rows ();
+              F77_INT b_nr = to_f77_int (b.rows ());
               octave_idx_type b_nc = b.cols ();
               OCTAVE_LOCAL_BUFFER (double, Bx, b_nr);
               OCTAVE_LOCAL_BUFFER (double, Bz, b_nr);
@@ -4255,7 +4301,7 @@
               for (volatile octave_idx_type j = 0; j < b_nc; j++)
                 {
 
-                  for (octave_idx_type i = 0; i < b_nr; i++)
+                  for (F77_INT i = 0; i < b_nr; i++)
                     {
                       Complex c = b(i,j);
                       Bx[i] = c.real ();
@@ -4264,10 +4310,12 @@
 
                   F77_XFCN (dgttrs, DGTTRS,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, 1, DL, D, DU, DU2, pipvt,
-                             Bx, b_nr, err
+                             tmp_nr, 1, DL, D, DU, DU2, pipvt,
+                             Bx, b_nr, tmp_err
                              F77_CHAR_ARG_LEN (1)));
 
+                  err = tmp_err;
+
                   if (err != 0)
                     {
                       // FIXME: Should this be a warning?
@@ -4280,10 +4328,12 @@
 
                   F77_XFCN (dgttrs, DGTTRS,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, 1, DL, D, DU, DU2, pipvt,
-                             Bz, b_nr, err
+                             tmp_nr, 1, DL, D, DU, DU2, pipvt,
+                             Bz, b_nr, tmp_err
                              F77_CHAR_ARG_LEN (1)));
 
+                  err = tmp_err;
+
                   if (err != 0)
                     {
                       // FIXME: Should this be a warning?
@@ -4356,8 +4406,8 @@
 
       if (typ == MatrixType::Banded_Hermitian)
         {
-          octave_idx_type n_lower = mattype.nlower ();
-          octave_idx_type ldm = n_lower + 1;
+          F77_INT n_lower = to_f77_int (mattype.nlower ());
+          F77_INT ldm = n_lower + 1;
           Matrix m_band (ldm, nc);
           double *tmp_data = m_band.fortran_vec ();
 
@@ -4383,11 +4433,17 @@
           if (calc_cond)
             anorm = m_band.abs ().sum ().row (0).max ();
 
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          F77_INT tmp_err = 0;
+
           char job = 'L';
           F77_XFCN (dpbtrf, DPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                     nr, n_lower, tmp_data, ldm, err
+                                     tmp_nr, n_lower, tmp_data, ldm, tmp_err
                                      F77_CHAR_ARG_LEN (1)));
 
+          err = tmp_err;
+
           if (err != 0)
             {
               // Matrix is not positive definite!! Fall through to
@@ -4403,15 +4459,17 @@
                 {
                   Array<double> z (dim_vector (3 * nr, 1));
                   double *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (dim_vector (nr, 1));
-                  octave_idx_type *piz = iz.fortran_vec ();
+                  Array<F77_INT> iz (dim_vector (nr, 1));
+                  F77_INT *piz = iz.fortran_vec ();
 
                   F77_XFCN (dpbcon, DPBCON,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, n_lower, tmp_data, ldm,
-                             anorm, rcond, pz, piz, err
+                             tmp_nr, n_lower, tmp_data, ldm,
+                             anorm, rcond, pz, piz, tmp_err
                              F77_CHAR_ARG_LEN (1)));
 
+                  err = tmp_err;
+
                   if (err != 0)
                     err = -2;
 
@@ -4438,14 +4496,17 @@
                   retval = b;
                   double *result = retval.fortran_vec ();
 
-                  octave_idx_type b_nc = b.cols ();
+                  F77_INT b_nr = to_f77_int (b.rows ());
+                  F77_INT b_nc = to_f77_int (b.cols ());
 
                   F77_XFCN (dpbtrs, DPBTRS,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, n_lower, b_nc, tmp_data,
-                             ldm, result, b.rows (), err
+                             tmp_nr, n_lower, b_nc, tmp_data,
+                             ldm, result, b_nr, tmp_err
                              F77_CHAR_ARG_LEN (1)));
 
+                  err = tmp_err;
+
                   if (err != 0)
                     {
                       // FIXME: Should this be a warning?
@@ -4460,9 +4521,9 @@
       if (typ == MatrixType::Banded)
         {
           // Create the storage for the banded form of the sparse matrix
-          octave_idx_type n_upper = mattype.nupper ();
-          octave_idx_type n_lower = mattype.nlower ();
-          octave_idx_type ldm = n_upper + 2 * n_lower + 1;
+          F77_INT n_upper = to_f77_int (mattype.nupper ());
+          F77_INT n_lower = to_f77_int (mattype.nlower ());
+          F77_INT ldm = n_upper + 2 * n_lower + 1;
 
           Matrix m_band (ldm, nc);
           double *tmp_data = m_band.fortran_vec ();
@@ -4471,7 +4532,7 @@
             {
               octave_idx_type ii = 0;
 
-              for (octave_idx_type j = 0; j < ldm; j++)
+              for (F77_INT j = 0; j < ldm; j++)
                 for (octave_idx_type i = 0; i < nc; i++)
                   tmp_data[ii++] = 0.;
             }
@@ -4494,11 +4555,17 @@
                 }
             }
 
-          Array<octave_idx_type> ipvt (dim_vector (nr, 1));
-          octave_idx_type *pipvt = ipvt.fortran_vec ();
-
-          F77_XFCN (dgbtrf, DGBTRF, (nr, nr, n_lower, n_upper, tmp_data,
-                                     ldm, pipvt, err));
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          Array<F77_INT> ipvt (dim_vector (nr, 1));
+          F77_INT *pipvt = ipvt.fortran_vec ();
+
+          F77_INT tmp_err = 0;
+
+          F77_XFCN (dgbtrf, DGBTRF, (tmp_nr, tmp_nr, n_lower, n_upper,
+                                     tmp_data, ldm, pipvt, tmp_err));
+
+          err = tmp_err;
 
           // Throw-away extra info LAPACK gives so as to not
           // change output.
@@ -4522,15 +4589,19 @@
                   char job = '1';
                   Array<double> z (dim_vector (3 * nr, 1));
                   double *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (dim_vector (nr, 1));
-                  octave_idx_type *piz = iz.fortran_vec ();
+                  Array<F77_INT> iz (dim_vector (nr, 1));
+                  F77_INT *piz = iz.fortran_vec ();
+
+                  F77_INT tmp_nc = to_f77_int (nc);
 
                   F77_XFCN (dgbcon, DGBCON,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nc, n_lower, n_upper, tmp_data, ldm, pipvt,
-                             anorm, rcond, pz, piz, err
+                             tmp_nc, n_lower, n_upper, tmp_data, ldm, pipvt,
+                             anorm, rcond, pz, piz, tmp_err
                              F77_CHAR_ARG_LEN (1)));
 
+                  err = tmp_err;
+
                   if (err != 0)
                     err = -2;
 
@@ -4557,14 +4628,17 @@
                   retval = b;
                   double *result = retval.fortran_vec ();
 
-                  octave_idx_type b_nc = b.cols ();
+                  F77_INT b_nr = to_f77_int (b.rows ());
+                  F77_INT b_nc = to_f77_int (b.cols ());
 
                   char job = 'N';
                   F77_XFCN (dgbtrs, DGBTRS,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, n_lower, n_upper, b_nc, tmp_data,
-                             ldm, pipvt, result, b.rows (), err
+                             tmp_nr, n_lower, n_upper, b_nc, tmp_data,
+                             ldm, pipvt, result, b_nr, tmp_err
                              F77_CHAR_ARG_LEN (1)));
+
+                  err = tmp_err;
                 }
             }
         }
@@ -4601,8 +4675,8 @@
 
       if (typ == MatrixType::Banded_Hermitian)
         {
-          octave_idx_type n_lower = mattype.nlower ();
-          octave_idx_type ldm = n_lower + 1;
+          F77_INT n_lower = to_f77_int (mattype.nlower ());
+          F77_INT ldm = to_f77_int (n_lower + 1);
 
           Matrix m_band (ldm, nc);
           double *tmp_data = m_band.fortran_vec ();
@@ -4611,7 +4685,7 @@
             {
               octave_idx_type ii = 0;
 
-              for (octave_idx_type j = 0; j < ldm; j++)
+              for (F77_INT j = 0; j < ldm; j++)
                 for (octave_idx_type i = 0; i < nc; i++)
                   tmp_data[ii++] = 0.;
             }
@@ -4629,11 +4703,17 @@
           if (calc_cond)
             anorm = m_band.abs ().sum ().row (0).max ();
 
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          F77_INT tmp_err = 0;
+
           char job = 'L';
           F77_XFCN (dpbtrf, DPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                     nr, n_lower, tmp_data, ldm, err
+                                     tmp_nr, n_lower, tmp_data, ldm, tmp_err
                                      F77_CHAR_ARG_LEN (1)));
 
+          err = tmp_err;
+
           if (err != 0)
             {
               mattype.mark_as_unsymmetric ();
@@ -4647,15 +4727,17 @@
                 {
                   Array<double> z (dim_vector (3 * nr, 1));
                   double *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (dim_vector (nr, 1));
-                  octave_idx_type *piz = iz.fortran_vec ();
+                  Array<F77_INT> iz (dim_vector (nr, 1));
+                  F77_INT *piz = iz.fortran_vec ();
 
                   F77_XFCN (dpbcon, DPBCON,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, n_lower, tmp_data, ldm,
-                             anorm, rcond, pz, piz, err
+                             tmp_nr, n_lower, tmp_data, ldm,
+                             anorm, rcond, pz, piz, tmp_err
                              F77_CHAR_ARG_LEN (1)));
 
+                  err = tmp_err;
+
                   if (err != 0)
                     err = -2;
 
@@ -4679,7 +4761,7 @@
 
               if (err == 0)
                 {
-                  octave_idx_type b_nr = b.rows ();
+                  F77_INT b_nr = to_f77_int (b.rows ());
                   octave_idx_type b_nc = b.cols ();
                   OCTAVE_LOCAL_BUFFER (double, Bx, b_nr);
 
@@ -4692,15 +4774,17 @@
                   retval.xcidx (0) = 0;
                   for (volatile octave_idx_type j = 0; j < b_nc; j++)
                     {
-                      for (octave_idx_type i = 0; i < b_nr; i++)
+                      for (F77_INT i = 0; i < b_nr; i++)
                         Bx[i] = b.elem (i, j);
 
                       F77_XFCN (dpbtrs, DPBTRS,
                                 (F77_CONST_CHAR_ARG2 (&job, 1),
-                                 nr, n_lower, 1, tmp_data,
-                                 ldm, Bx, b_nr, err
+                                 tmp_nr, n_lower, 1, tmp_data,
+                                 ldm, Bx, b_nr, tmp_err
                                  F77_CHAR_ARG_LEN (1)));
 
+                      err = tmp_err;
+
                       if (err != 0)
                         {
                           // FIXME: Should this be a warning?
@@ -4710,7 +4794,7 @@
                           break;
                         }
 
-                      for (octave_idx_type i = 0; i < b_nr; i++)
+                      for (F77_INT i = 0; i < b_nr; i++)
                         {
                           double tmp = Bx[i];
                           if (tmp != 0.0)
@@ -4739,9 +4823,9 @@
       if (typ == MatrixType::Banded)
         {
           // Create the storage for the banded form of the sparse matrix
-          octave_idx_type n_upper = mattype.nupper ();
-          octave_idx_type n_lower = mattype.nlower ();
-          octave_idx_type ldm = n_upper + 2 * n_lower + 1;
+          F77_INT n_upper = to_f77_int (mattype.nupper ());
+          F77_INT n_lower = to_f77_int (mattype.nlower ());
+          F77_INT ldm = to_f77_int (n_upper + 2 * n_lower + 1);
 
           Matrix m_band (ldm, nc);
           double *tmp_data = m_band.fortran_vec ();
@@ -4773,11 +4857,17 @@
                 }
             }
 
-          Array<octave_idx_type> ipvt (dim_vector (nr, 1));
-          octave_idx_type *pipvt = ipvt.fortran_vec ();
-
-          F77_XFCN (dgbtrf, DGBTRF, (nr, nr, n_lower, n_upper, tmp_data,
-                                     ldm, pipvt, err));
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          Array<F77_INT> ipvt (dim_vector (nr, 1));
+          F77_INT *pipvt = ipvt.fortran_vec ();
+
+          F77_INT tmp_err = 0;
+
+          F77_XFCN (dgbtrf, DGBTRF, (tmp_nr, tmp_nr, n_lower, n_upper,
+                                     tmp_data, ldm, pipvt, tmp_err));
+
+          err = tmp_err;
 
           if (err != 0)
             {
@@ -4799,15 +4889,19 @@
                   char job = '1';
                   Array<double> z (dim_vector (3 * nr, 1));
                   double *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (dim_vector (nr, 1));
-                  octave_idx_type *piz = iz.fortran_vec ();
+                  Array<F77_INT> iz (dim_vector (nr, 1));
+                  F77_INT *piz = iz.fortran_vec ();
+
+                  F77_INT tmp_nc = to_f77_int (nc);
 
                   F77_XFCN (dgbcon, DGBCON,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nc, n_lower, n_upper, tmp_data, ldm, pipvt,
-                             anorm, rcond, pz, piz, err
+                             tmp_nc, n_lower, n_upper, tmp_data, ldm, pipvt,
+                             anorm, rcond, pz, piz, tmp_err
                              F77_CHAR_ARG_LEN (1)));
 
+                  err = tmp_err;
+
                   if (err != 0)
                     err = -2;
 
@@ -4848,12 +4942,16 @@
                            i < b.cidx (j+1); i++)
                         work[b.ridx (i)] = b.data (i);
 
+                      F77_INT b_nr = to_f77_int (b.rows ());
+
                       F77_XFCN (dgbtrs, DGBTRS,
                                 (F77_CONST_CHAR_ARG2 (&job, 1),
-                                 nr, n_lower, n_upper, 1, tmp_data,
-                                 ldm, pipvt, work, b.rows (), err
+                                 tmp_nr, n_lower, n_upper, 1, tmp_data,
+                                 ldm, pipvt, work, b_nr, tmp_err
                                  F77_CHAR_ARG_LEN (1)));
 
+                      err = tmp_err;
+
                       // Count nonzeros in work vector and adjust
                       // space in retval if needed
                       octave_idx_type new_nnz = 0;
@@ -4915,8 +5013,8 @@
 
       if (typ == MatrixType::Banded_Hermitian)
         {
-          octave_idx_type n_lower = mattype.nlower ();
-          octave_idx_type ldm = n_lower + 1;
+          F77_INT n_lower = to_f77_int (mattype.nlower ());
+          F77_INT ldm = n_lower + 1;
 
           Matrix m_band (ldm, nc);
           double *tmp_data = m_band.fortran_vec ();
@@ -4925,7 +5023,7 @@
             {
               octave_idx_type ii = 0;
 
-              for (octave_idx_type j = 0; j < ldm; j++)
+              for (F77_INT j = 0; j < ldm; j++)
                 for (octave_idx_type i = 0; i < nc; i++)
                   tmp_data[ii++] = 0.;
             }
@@ -4943,11 +5041,17 @@
           if (calc_cond)
             anorm = m_band.abs ().sum ().row (0).max ();
 
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          F77_INT tmp_err = 0;
+
           char job = 'L';
           F77_XFCN (dpbtrf, DPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                     nr, n_lower, tmp_data, ldm, err
+                                     tmp_nr, n_lower, tmp_data, ldm, tmp_err
                                      F77_CHAR_ARG_LEN (1)));
 
+          err = tmp_err;
+
           if (err != 0)
             {
               // Matrix is not positive definite!! Fall through to
@@ -4963,15 +5067,17 @@
                 {
                   Array<double> z (dim_vector (3 * nr, 1));
                   double *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (dim_vector (nr, 1));
-                  octave_idx_type *piz = iz.fortran_vec ();
+                  Array<F77_INT> iz (dim_vector (nr, 1));
+                  F77_INT *piz = iz.fortran_vec ();
 
                   F77_XFCN (dpbcon, DPBCON,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, n_lower, tmp_data, ldm,
-                             anorm, rcond, pz, piz, err
+                             tmp_nr, n_lower, tmp_data, ldm,
+                             anorm, rcond, pz, piz, tmp_err
                              F77_CHAR_ARG_LEN (1)));
 
+                  err = tmp_err;
+
                   if (err != 0)
                     err = -2;
 
@@ -4995,7 +5101,7 @@
 
               if (err == 0)
                 {
-                  octave_idx_type b_nr = b.rows ();
+                  F77_INT b_nr = to_f77_int (b.rows ());
                   octave_idx_type b_nc = b.cols ();
 
                   OCTAVE_LOCAL_BUFFER (double, Bx, b_nr);
@@ -5005,7 +5111,7 @@
 
                   for (volatile octave_idx_type j = 0; j < b_nc; j++)
                     {
-                      for (octave_idx_type i = 0; i < b_nr; i++)
+                      for (F77_INT i = 0; i < b_nr; i++)
                         {
                           Complex c = b(i,j);
                           Bx[i] = c.real ();
@@ -5014,10 +5120,12 @@
 
                       F77_XFCN (dpbtrs, DPBTRS,
                                 (F77_CONST_CHAR_ARG2 (&job, 1),
-                                 nr, n_lower, 1, tmp_data,
-                                 ldm, Bx, b_nr, err
+                                 tmp_nr, n_lower, 1, tmp_data,
+                                 ldm, Bx, b_nr, tmp_err
                                  F77_CHAR_ARG_LEN (1)));
 
+                      err = tmp_err;
+
                       if (err != 0)
                         {
                           // FIXME: Should this be a warning?
@@ -5029,10 +5137,12 @@
 
                       F77_XFCN (dpbtrs, DPBTRS,
                                 (F77_CONST_CHAR_ARG2 (&job, 1),
-                                 nr, n_lower, 1, tmp_data,
-                                 ldm, Bz, b.rows (), err
+                                 tmp_nr, n_lower, 1, tmp_data,
+                                 ldm, Bz, b_nr, tmp_err
                                  F77_CHAR_ARG_LEN (1)));
 
+                      err = tmp_err;
+
                       if (err != 0)
                         {
                           // FIXME: Should this be a warning?
@@ -5052,9 +5162,9 @@
       if (typ == MatrixType::Banded)
         {
           // Create the storage for the banded form of the sparse matrix
-          octave_idx_type n_upper = mattype.nupper ();
-          octave_idx_type n_lower = mattype.nlower ();
-          octave_idx_type ldm = n_upper + 2 * n_lower + 1;
+          F77_INT n_upper = to_f77_int (mattype.nupper ());
+          F77_INT n_lower = to_f77_int (mattype.nlower ());
+          F77_INT ldm = n_upper + 2 * n_lower + 1;
 
           Matrix m_band (ldm, nc);
           double *tmp_data = m_band.fortran_vec ();
@@ -5063,7 +5173,7 @@
             {
               octave_idx_type ii = 0;
 
-              for (octave_idx_type j = 0; j < ldm; j++)
+              for (F77_INT j = 0; j < ldm; j++)
                 for (octave_idx_type i = 0; i < nc; i++)
                   tmp_data[ii++] = 0.;
             }
@@ -5086,11 +5196,17 @@
                 }
             }
 
-          Array<octave_idx_type> ipvt (dim_vector (nr, 1));
-          octave_idx_type *pipvt = ipvt.fortran_vec ();
-
-          F77_XFCN (dgbtrf, DGBTRF, (nr, nr, n_lower, n_upper, tmp_data,
-                                     ldm, pipvt, err));
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          Array<F77_INT> ipvt (dim_vector (nr, 1));
+          F77_INT *pipvt = ipvt.fortran_vec ();
+
+          F77_INT tmp_err = 0;
+
+          F77_XFCN (dgbtrf, DGBTRF, (tmp_nr, tmp_nr, n_lower, n_upper,
+                                     tmp_data, ldm, pipvt, tmp_err));
+
+          err = tmp_err;
 
           if (err != 0)
             {
@@ -5112,15 +5228,19 @@
                   char job = '1';
                   Array<double> z (dim_vector (3 * nr, 1));
                   double *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (dim_vector (nr, 1));
-                  octave_idx_type *piz = iz.fortran_vec ();
-
-                  F77_XFCN (dpbcon, DPBCON,
+                  Array<F77_INT> iz (dim_vector (nr, 1));
+                  F77_INT *piz = iz.fortran_vec ();
+
+                  F77_INT tmp_nc = to_f77_int (nc);
+
+                  F77_XFCN (dgbcon, DGBCON,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, n_lower, tmp_data, ldm,
-                             anorm, rcond, pz, piz, err
+                             tmp_nc, n_lower, n_upper, tmp_data, ldm, pipvt,
+                             anorm, rcond, pz, piz, tmp_err
                              F77_CHAR_ARG_LEN (1)));
 
+                  err = tmp_err;
+
                   if (err != 0)
                     err = -2;
 
@@ -5145,6 +5265,7 @@
               if (err == 0)
                 {
                   char job = 'N';
+                  F77_INT b_nr = to_f77_int (b.rows ());
                   octave_idx_type b_nc = b.cols ();
                   retval.resize (nr,b_nc);
 
@@ -5162,16 +5283,20 @@
 
                       F77_XFCN (dgbtrs, DGBTRS,
                                 (F77_CONST_CHAR_ARG2 (&job, 1),
-                                 nr, n_lower, n_upper, 1, tmp_data,
-                                 ldm, pipvt, Bx, b.rows (), err
+                                 tmp_nr, n_lower, n_upper, 1, tmp_data,
+                                 ldm, pipvt, Bx, b_nr, tmp_err
                                  F77_CHAR_ARG_LEN (1)));
 
+                      err = tmp_err;
+
                       F77_XFCN (dgbtrs, DGBTRS,
                                 (F77_CONST_CHAR_ARG2 (&job, 1),
-                                 nr, n_lower, n_upper, 1, tmp_data,
-                                 ldm, pipvt, Bz, b.rows (), err
+                                 tmp_nr, n_lower, n_upper, 1, tmp_data,
+                                 ldm, pipvt, Bz, b_nr, tmp_err
                                  F77_CHAR_ARG_LEN (1)));
 
+                      err = tmp_err;
+
                       for (octave_idx_type i = 0; i < nr; i++)
                         retval(i, j) = Complex (Bx[i], Bz[i]);
                     }
@@ -5211,8 +5336,8 @@
 
       if (typ == MatrixType::Banded_Hermitian)
         {
-          octave_idx_type n_lower = mattype.nlower ();
-          octave_idx_type ldm = n_lower + 1;
+          F77_INT n_lower = to_f77_int (mattype.nlower ());
+          F77_INT ldm = n_lower + 1;
 
           Matrix m_band (ldm, nc);
           double *tmp_data = m_band.fortran_vec ();
@@ -5221,7 +5346,7 @@
             {
               octave_idx_type ii = 0;
 
-              for (octave_idx_type j = 0; j < ldm; j++)
+              for (F77_INT j = 0; j < ldm; j++)
                 for (octave_idx_type i = 0; i < nc; i++)
                   tmp_data[ii++] = 0.;
             }
@@ -5239,11 +5364,17 @@
           if (calc_cond)
             anorm = m_band.abs ().sum ().row (0).max ();
 
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          F77_INT tmp_err = 0;
+
           char job = 'L';
           F77_XFCN (dpbtrf, DPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                     nr, n_lower, tmp_data, ldm, err
+                                     tmp_nr, n_lower, tmp_data, ldm, tmp_err
                                      F77_CHAR_ARG_LEN (1)));
 
+          err = tmp_err;
+
           if (err != 0)
             {
               // Matrix is not positive definite!! Fall through to
@@ -5260,15 +5391,17 @@
                 {
                   Array<double> z (dim_vector (3 * nr, 1));
                   double *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (dim_vector (nr, 1));
-                  octave_idx_type *piz = iz.fortran_vec ();
+                  Array<F77_INT> iz (dim_vector (nr, 1));
+                  F77_INT *piz = iz.fortran_vec ();
 
                   F77_XFCN (dpbcon, DPBCON,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, n_lower, tmp_data, ldm,
-                             anorm, rcond, pz, piz, err
+                             tmp_nr, n_lower, tmp_data, ldm,
+                             anorm, rcond, pz, piz, tmp_err
                              F77_CHAR_ARG_LEN (1)));
 
+                  err = tmp_err;
+
                   if (err != 0)
                     err = -2;
 
@@ -5292,7 +5425,7 @@
 
               if (err == 0)
                 {
-                  octave_idx_type b_nr = b.rows ();
+                  F77_INT b_nr = to_f77_int (b.rows ());
                   octave_idx_type b_nc = b.cols ();
                   OCTAVE_LOCAL_BUFFER (double, Bx, b_nr);
                   OCTAVE_LOCAL_BUFFER (double, Bz, b_nr);
@@ -5307,7 +5440,7 @@
                   for (volatile octave_idx_type j = 0; j < b_nc; j++)
                     {
 
-                      for (octave_idx_type i = 0; i < b_nr; i++)
+                      for (F77_INT i = 0; i < b_nr; i++)
                         {
                           Complex c = b(i,j);
                           Bx[i] = c.real ();
@@ -5316,10 +5449,12 @@
 
                       F77_XFCN (dpbtrs, DPBTRS,
                                 (F77_CONST_CHAR_ARG2 (&job, 1),
-                                 nr, n_lower, 1, tmp_data,
-                                 ldm, Bx, b_nr, err
+                                 tmp_nr, n_lower, 1, tmp_data,
+                                 ldm, Bx, b_nr, tmp_err
                                  F77_CHAR_ARG_LEN (1)));
 
+                      err = tmp_err;
+
                       if (err != 0)
                         {
                           // FIXME: Should this be a warning?
@@ -5331,10 +5466,12 @@
 
                       F77_XFCN (dpbtrs, DPBTRS,
                                 (F77_CONST_CHAR_ARG2 (&job, 1),
-                                 nr, n_lower, 1, tmp_data,
-                                 ldm, Bz, b_nr, err
+                                 tmp_nr, n_lower, 1, tmp_data,
+                                 ldm, Bz, b_nr, tmp_err
                                  F77_CHAR_ARG_LEN (1)));
 
+                      err = tmp_err;
+
                       if (err != 0)
                         {
                           // FIXME: Should this be a warning?
@@ -5379,9 +5516,9 @@
       if (typ == MatrixType::Banded)
         {
           // Create the storage for the banded form of the sparse matrix
-          octave_idx_type n_upper = mattype.nupper ();
-          octave_idx_type n_lower = mattype.nlower ();
-          octave_idx_type ldm = n_upper + 2 * n_lower + 1;
+          F77_INT n_upper = to_f77_int (mattype.nupper ());
+          F77_INT n_lower = to_f77_int (mattype.nlower ());
+          F77_INT ldm = n_upper + 2 * n_lower + 1;
 
           Matrix m_band (ldm, nc);
           double *tmp_data = m_band.fortran_vec ();
@@ -5390,7 +5527,7 @@
             {
               octave_idx_type ii = 0;
 
-              for (octave_idx_type j = 0; j < ldm; j++)
+              for (F77_INT j = 0; j < ldm; j++)
                 for (octave_idx_type i = 0; i < nc; i++)
                   tmp_data[ii++] = 0.;
             }
@@ -5413,11 +5550,17 @@
                 }
             }
 
-          Array<octave_idx_type> ipvt (dim_vector (nr, 1));
-          octave_idx_type *pipvt = ipvt.fortran_vec ();
-
-          F77_XFCN (dgbtrf, DGBTRF, (nr, nr, n_lower, n_upper, tmp_data,
-                                     ldm, pipvt, err));
+          F77_INT tmp_nr = to_f77_int (nr);
+
+          Array<F77_INT> ipvt (dim_vector (nr, 1));
+          F77_INT *pipvt = ipvt.fortran_vec ();
+
+          F77_INT tmp_err = 0;
+
+          F77_XFCN (dgbtrf, DGBTRF, (tmp_nr, tmp_nr, n_lower, n_upper,
+                                     tmp_data, ldm, pipvt, tmp_err));
+
+          err = tmp_err;
 
           if (err != 0)
             {
@@ -5439,15 +5582,19 @@
                   char job = '1';
                   Array<double> z (dim_vector (3 * nr, 1));
                   double *pz = z.fortran_vec ();
-                  Array<octave_idx_type> iz (dim_vector (nr, 1));
-                  octave_idx_type *piz = iz.fortran_vec ();
+                  Array<F77_INT> iz (dim_vector (nr, 1));
+                  F77_INT *piz = iz.fortran_vec ();
+
+                  F77_INT tmp_nc = to_f77_int (nc);
 
                   F77_XFCN (dgbcon, DGBCON,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nc, n_lower, n_upper, tmp_data, ldm, pipvt,
-                             anorm, rcond, pz, piz, err
+                             tmp_nc, n_lower, n_upper, tmp_data, ldm, pipvt,
+                             anorm, rcond, pz, piz, tmp_err
                              F77_CHAR_ARG_LEN (1)));
 
+                  err = tmp_err;
+
                   if (err != 0)
                     err = -2;
 
@@ -5473,6 +5620,7 @@
                 {
                   char job = 'N';
                   volatile octave_idx_type x_nz = b.nnz ();
+                  F77_INT b_nr = to_f77_int (b.rows ());
                   octave_idx_type b_nc = b.cols ();
                   retval = SparseComplexMatrix (nr, b_nc, x_nz);
                   retval.xcidx (0) = 0;
@@ -5498,16 +5646,20 @@
 
                       F77_XFCN (dgbtrs, DGBTRS,
                                 (F77_CONST_CHAR_ARG2 (&job, 1),
-                                 nr, n_lower, n_upper, 1, tmp_data,
-                                 ldm, pipvt, Bx, b.rows (), err
+                                 tmp_nr, n_lower, n_upper, 1, tmp_data,
+                                 ldm, pipvt, Bx, b_nr, tmp_err
                                  F77_CHAR_ARG_LEN (1)));
 
+                      err = tmp_err;
+
                       F77_XFCN (dgbtrs, DGBTRS,
                                 (F77_CONST_CHAR_ARG2 (&job, 1),
-                                 nr, n_lower, n_upper, 1, tmp_data,
-                                 ldm, pipvt, Bz, b.rows (), err
+                                 tmp_nr, n_lower, n_upper, 1, tmp_data,
+                                 ldm, pipvt, Bz, b_nr, tmp_err
                                  F77_CHAR_ARG_LEN (1)));
 
+                      err = tmp_err;
+
                       // Count nonzeros in work vector and adjust
                       // space in retval if needed
                       octave_idx_type new_nnz = 0;