Jelajahi Sumber

corrected optimization path after new structure

Alexander Freytag 12 tahun lalu
induk
melakukan
99793a1548
38 mengubah file dengan 20 tambahan dan 26379 penghapusan
  1. 1 1
      classifier/kernelclassifier/GPLaplaceOptimizationProblem.h
  2. 2 2
      classifier/kernelclassifier/KCGPLaplace.cpp
  3. 3 3
      classifier/kernelclassifier/KCGPLaplaceOneVsAll.cpp
  4. 3 3
      classifier/kernelclassifier/KCGPRegOneVsAll.cpp
  5. 0 657
      matlabAccess/MatFileIO.cpp
  6. 0 134
      matlabAccess/MatFileIO.h
  7. 0 2
      matlabAccess/libdepend.inc
  8. 0 103
      matlabAccess/matio/Makefile.inc
  9. 0 79
      matlabAccess/matio/README
  10. TEMPAT SAMPAH
      matlabAccess/matio/src/.libs/libmatio.a
  11. 0 1
      matlabAccess/matio/src/.libs/libmatio.la
  12. 0 41
      matlabAccess/matio/src/.libs/libmatio.lai
  13. 0 103
      matlabAccess/matio/src/Makefile.inc
  14. 0 248
      matlabAccess/matio/src/endian.c
  15. 0 840
      matlabAccess/matio/src/inflate.c
  16. 0 423
      matlabAccess/matio/src/io.c
  17. 0 1932
      matlabAccess/matio/src/mat.c
  18. 0 744
      matlabAccess/matio/src/mat4.c
  19. 0 30
      matlabAccess/matio/src/mat4.h
  20. 0 7103
      matlabAccess/matio/src/mat5.c
  21. 0 7103
      matlabAccess/matio/src/mat5.c.orig
  22. 0 62
      matlabAccess/matio/src/mat5.h
  23. 0 323
      matlabAccess/matio/src/matio.h
  24. 0 55
      matlabAccess/matio/src/matioConfig.h
  25. 0 92
      matlabAccess/matio/src/matio_private.h
  26. 0 5285
      matlabAccess/matio/src/read_data.c
  27. 0 852
      matlabAccess/matio/src/snprintf.c
  28. 0 151
      matlabAccess/progs/testMatFileIO.cpp
  29. 0 0
      matlabAccessHighLevel/ImageNetData.cpp
  30. 1 1
      matlabAccessHighLevel/ImageNetData.h
  31. 0 0
      matlabAccessHighLevel/Makefile
  32. 0 0
      matlabAccessHighLevel/Makefile.inc
  33. 4 0
      matlabAccessHighLevel/libdepend.inc
  34. 0 0
      matlabAccessHighLevel/progs/Makefile.inc
  35. 1 1
      regression/gpregression/GPRegressionOptimizationProblem.h
  36. 3 3
      regression/gpregression/RegGaussianProcess.cpp
  37. 1 1
      regression/gpregression/modelselcrit/GPMSCLooEstimates.cpp
  38. 1 1
      regression/gpregression/modelselcrit/GPMSCLooEstimates.h

+ 1 - 1
classifier/kernelclassifier/GPLaplaceOptimizationProblem.h

@@ -9,7 +9,7 @@
 
 #include "core/vector/VVector.h"
 #include "vislearning/math/kernels/ParameterizedKernel.h"
-#include "core/optimization/OptimizationProblemFirst.h"
+#include "core/optimization/limun/OptimizationProblemFirst.h"
 
 #include "vislearning/math/kernels/KernelData.h"
 

+ 2 - 2
classifier/kernelclassifier/KCGPLaplace.cpp

@@ -15,8 +15,8 @@
 #include "LHCumulativeGauss.h"
 
 #include "vislearning/classifier/kernelclassifier/GPLaplaceOptimizationProblem.h"
-#include "core/optimization/FirstOrderTrustRegion.h"
-#include "core/optimization/FirstOrderRasmussen.h"
+#include "core/optimization/limun/FirstOrderTrustRegion.h"
+#include "core/optimization/limun/FirstOrderRasmussen.h"
 
 using namespace std;
 using namespace NICE;

+ 3 - 3
classifier/kernelclassifier/KCGPLaplaceOneVsAll.cpp

@@ -10,9 +10,9 @@
 
 #include "core/vector/Algorithms.h"
 
-#include "core/optimization/OptimizationAlgorithmFirst.h"
-#include "core/optimization/FirstOrderTrustRegion.h"
-#include "core/optimization/FirstOrderRasmussen.h"
+#include "core/optimization/limun/OptimizationAlgorithmFirst.h"
+#include "core/optimization/limun/FirstOrderTrustRegion.h"
+#include "core/optimization/limun/FirstOrderRasmussen.h"
 
 #include "vislearning/classifier/kernelclassifier/GPLaplaceOptimizationProblem.h"
 #include "core/algebra/CholeskyRobust.h"

+ 3 - 3
classifier/kernelclassifier/KCGPRegOneVsAll.cpp

@@ -14,9 +14,9 @@
 
 #include "core/vector/Algorithms.h"
 
-#include "core/optimization/OptimizationAlgorithmFirst.h"
-#include "core/optimization/FirstOrderTrustRegion.h"
-#include "core/optimization/FirstOrderRasmussen.h"
+#include "core/optimization/limun/OptimizationAlgorithmFirst.h"
+#include "core/optimization/limun/FirstOrderTrustRegion.h"
+#include "core/optimization/limun/FirstOrderRasmussen.h"
 
 #include "vislearning/regression/gpregression/GPRegressionOptimizationProblem.h"
 #include "core/algebra/CholeskyRobust.h"

+ 0 - 657
matlabAccess/MatFileIO.cpp

@@ -1,657 +0,0 @@
-/** 
-* @file MatFileIO.cpp
-* @brief Read and write mat-files
-* @author Paul Bodesheim
-* @date 06-01-2012 (dd-mm-yyyy)
-*/
-
-#include "MatFileIO.h"
-
-namespace NICE {
-  
-      //------------------------------------------------------
-      // several constructors and destructors
-      //------------------------------------------------------
-
-       
-      // Default constructor
-      MatFileIO::MatFileIO() { mat = 0; }
-      
-      // Recommended constructor
-      MatFileIO::MatFileIO(std::string _filename, const mat_acc mode) { 
-	
-	mat = Mat_Open(_filename.c_str(),mode); 
-	
-	if (mat == NULL && mode == MAT_ACC_RDONLY) {
-	 
-	  fthrow(Exception, "MatFileIO::MatFileIO(const char * _filename, int mode): mat-file does not exist");
-	  
-	}
-      } 
-      
-      // Default destructor
-      MatFileIO::~MatFileIO() {}
-      
-      //------------------------------------------------------
-      // count number of stored variables
-      //------------------------------------------------------     
-      
-      int MatFileIO::getNumberOfVariables() {
-	
-	Mat_Rewind(mat); // get back to first variable
-	int count = 0;
-	matvar_t * matvar = Mat_VarReadNextInfo(mat);
-	
-	while (matvar != NULL) {
-	  
-	  count++;
-	  matvar = Mat_VarReadNextInfo(mat);
-	}
-	
-	Mat_VarFree(matvar);
-	
-	return count;
-      }
-      
-      //------------------------------------------------------
-      // several methods for reading data
-      //------------------------------------------------------     
-      
-      matvar_t * MatFileIO::getVariableViaName(std::string _name) {
-      
-// 	std::cout << "MatFileIO::getVariableViaName: method entered" << std::endl;
-	char * cString = new char[256];
-// 	std::cout << "MatFileIO::getVariableViaName: cString init done" << std::endl;
-	return Mat_VarRead(mat,strcpy(cString,_name.c_str()));
-	
-      }
-      
-      void MatFileIO::getSparseVariableViaName(sparse_t & sparseVariable, std::string _name) {
-	
-	matvar_t * matvar = getVariableViaName(_name);
-	
-	if (matvar == NULL) {
-	  
-	  fthrow(Exception, "MatFileIO::getSparseVariableViaName(sparse_t & sparseVariable, std::string _name): variable with specified name does not exist");
-	  return;
-	}
-
-	if (matvar->class_type != MAT_C_SPARSE) {
-	  
-	  fthrow(Exception, "MatFileIO::getSparseVariableViaName(sparse_t & sparseVariable, std::string _name): format of variable is not sparse");
-	  return;
-	}
-	
-	sparseVariable = *((sparse_t*)matvar->data);
-	sparseVariable.data = (double*) sparseVariable.data;
-      }
-
-      
-      void MatFileIO::getFeatureMatrixViaName(std::vector<std::vector<double> > & features, std::string _name, const feature_matrix_order order) {
-	
-	matvar_t * matvar = getVariableViaName(_name);
-	
-	if (matvar == NULL) {
-	  
-	  fthrow(Exception, "MatFileIO::getFeatureMatrixViaName(char * _name, feature_matrix_order order): variable with specified name does not exist");
-	  return;
-	}
-	
-	if (matvar->rank != 2) {
-	  
-	  fthrow(Exception, "MatFileIO::getFeatureMatrixViaName(char * _name, feature_matrix_order order): dimension of variable != 2");
-	  return;
-	}
-	
-	features.clear();
-	std::vector<double> currentFeature;
-	currentFeature.clear();
-	
-	// case 1: feature vectors in the rows of matrix
-	if (order == NxD) {
-	  
-	  // depending on the class type of data elements, we have to treat several cases and cast the data elements correctly
-          switch (matvar->data_type) {
-	    
-            case MAT_T_DOUBLE:
-	      
-  
-	      for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		  
-		  currentFeature.push_back( ((double*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-		  
-		  features.push_back(currentFeature);
-		  currentFeature.clear();
-	      }
-	      
-	      break;
-	      
-            case MAT_T_SINGLE:
-	  
-	      for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		  
-		  currentFeature.push_back( ((float*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-		  
-		  features.push_back(currentFeature);
-		  currentFeature.clear();
-	      }
-	      
-	      break;
-	      
-#ifdef HAVE_MAT_INT64_T
-            case MAT_T_INT64:
-	      
-	      for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		  
-		  currentFeature.push_back( ((signed long long*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-		  
-		  features.push_back(currentFeature);
-		  currentFeature.clear();
-	      }	            
-
-	      break;
-#endif
-#ifdef HAVE_MAT_UINT64_T	      
-            case MAT_T_UINT64:
-
-	      for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		  
-		  currentFeature.push_back( ((unsigned long long*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-		  
-		  features.push_back(currentFeature);
-		  currentFeature.clear();
-	      }	
-
-	      break; 
-#endif
-            case MAT_T_INT32:
-	      
-	      for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		  
-		  currentFeature.push_back( ((signed long*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-		  
-		  features.push_back(currentFeature);
-		  currentFeature.clear();
-	      }
-	      
-	      break;	      
-
-            case MAT_T_UINT32:
-	      
-	      for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		  
-		  currentFeature.push_back( ((unsigned long*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-		  
-		  features.push_back(currentFeature);
-		  currentFeature.clear();
-	      }
-	      
-	      break;	      
-	      
-            case MAT_T_INT16:
-
-	      for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		  
-		  currentFeature.push_back( ((signed short*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-		  
-		  features.push_back(currentFeature);
-		  currentFeature.clear();
-	      }
-	      
-	      break;
-	      
-            case MAT_T_UINT16:
-	      
-	      for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		  
-		  currentFeature.push_back( ((unsigned short*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-		  
-		  features.push_back(currentFeature);
-		  currentFeature.clear();
-	      }
-	      
-	      break;	      
-	      
-            case MAT_T_INT8:
-	      
-	      for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		  
-		  currentFeature.push_back( ((signed char*)matvar->data)[matvar->dims[0]*j+i] );
-		}
-		  
-		  features.push_back(currentFeature);
-		  currentFeature.clear();
-	      }
-	      
-	      break;	      
-
-            case MAT_T_UINT8:
-	      
-	      for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		  
-		  currentFeature.push_back( ((unsigned char*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-		  
-		  features.push_back(currentFeature);
-		  currentFeature.clear();
-	      }
-	      
-	      break;
-	  }   
-
-	// case 2: feature vectors in the columns of matrix
-	} else if (order == DxN) {
-	  
-	  // depending on the class type of data elements, we have to treat several cases and cast the data elements correctly
-          switch (matvar->data_type) {
-	    
-            case MAT_T_DOUBLE:
-	  
-	      for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		  
-		  currentFeature.push_back( ((double*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-		  
-		  features.push_back(currentFeature);
-		  currentFeature.clear();
-	      }
-	      
-	      break;
-	      
-            case MAT_T_SINGLE:
-	  
-	      for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		  
-		  currentFeature.push_back( ((float*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-		  
-		  features.push_back(currentFeature);
-		  currentFeature.clear();
-	      }
-	      
-	      break;
-	      
-#ifdef HAVE_MAT_INT64_T
-            case MAT_T_INT64:
-	      
-	      for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		  
-		  currentFeature.push_back( ((signed long long*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-		  
-		  features.push_back(currentFeature);
-		  currentFeature.clear();
-	      }	            
-
-	      break;
-#endif
-#ifdef HAVE_MAT_UINT64_T	      
-            case MAT_T_UINT64:
-
-	      for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		  
-		  currentFeature.push_back( ((unsigned long long*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-		  
-		  features.push_back(currentFeature);
-		  currentFeature.clear();
-	      }	
-
-	      break;
-#endif
-            case MAT_T_INT32:
-	      
-	      for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		  
-		  currentFeature.push_back( ((signed long*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-		  
-		  features.push_back(currentFeature);
-		  currentFeature.clear();
-	      }
-	      
-	      break;	      
-
-            case MAT_T_UINT32:
-	      
-	      for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		  
-		  currentFeature.push_back( ((unsigned long*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-		  
-		  features.push_back(currentFeature);
-		  currentFeature.clear();
-	      }
-	      
-	      break;	      
-	      
-            case MAT_T_INT16:
-
-	      for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		  
-		  currentFeature.push_back( ((signed short*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-		  
-		  features.push_back(currentFeature);
-		  currentFeature.clear();
-	      }
-	      
-	      break;
-	      
-            case MAT_T_UINT16:
-	      
-	      for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		  
-		  currentFeature.push_back( ((unsigned short*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-		  
-		  features.push_back(currentFeature);
-		  currentFeature.clear();
-	      }
-	      
-	      break;	      
-	      
-            case MAT_T_INT8:
-	      
-	      for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		  
-		  currentFeature.push_back( ((signed char*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-		  
-		  features.push_back(currentFeature);
-		  currentFeature.clear();
-	      }
-	      
-	      break;	      
-
-            case MAT_T_UINT8:
-	      
-	      for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		  
-		  currentFeature.push_back( ((unsigned char*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-		  
-		  features.push_back(currentFeature);
-		  currentFeature.clear();
-	      }
-	      
-	      break;
-	  }            
-          
-	} else {
-	  
-	  fthrow(Exception, "MatFileIO::getFeatureMatrixViaName(char * _name, feature_matrix_order order): wrong feature_matrix_order specified");
-	  return;
-	}	
-	
-      }
-      
-      void MatFileIO::getVectorViaName(NICE::Vector & vec, std::string _name) {
-	
-	matvar_t * matvar = getVariableViaName(_name);
-	
-	if (matvar == NULL) {
-	  
-	  fthrow(Exception, "MatFileIO::getFeatureMatrixViaName(char * _name, feature_matrix_order order): variable with specified name does not exist");
-	  return;
-	}
-	
-	// it can happen that a vector is treated as (N x 1) or (1 x N) matrix with two dimensions
-	if (matvar->rank > 2 || ( (matvar->rank == 2) && (matvar->dims[0] != 1) && (matvar->dims[1] != 1) ) ) {
-	  
-	  fthrow(Exception, "MatFileIO::getFeatureMatrixViaName(char * _name, feature_matrix_order order): dimension of variable > 1");
-	  return;
-	}  
-	
-	std::vector<double> v;
-	v.clear();
-	
-	// vector is stored as a variable with one dimensional 
-	if (matvar->rank == 1) {
-	  
-          switch( matvar->data_type ) {
-	    
-            case MAT_T_DOUBLE:
-	  
-	      for ( int i = 0; i < matvar->nbytes/matvar->data_size; i++ ) {
-		  
-		  v.push_back( ((double*)matvar->data)[i] );	      
-	      }
-	      
-	      break;
-	      
-            case MAT_T_SINGLE:
-	  
-	      for ( int i = 0; i < matvar->nbytes/matvar->data_size; i++ ) {
-		  
-		  v.push_back( ((float*)matvar->data)[i] );	      
-	      }
-	      
-	      break;
-	      
-#ifdef HAVE_MAT_INT64_T
-            case MAT_T_INT64:
-	      
-	      for ( int i = 0; i < matvar->nbytes/matvar->data_size; i++ ) {
-		  
-		  v.push_back( ((signed long long*)matvar->data)[i] );	      
-	      }            
-
-	      break;
-#endif
-#ifdef HAVE_MAT_UINT64_T	      
-            case MAT_T_UINT64:
-
-	      for ( int i = 0; i < matvar->nbytes/matvar->data_size; i++ ) {
-		  
-		  v.push_back( ((unsigned long long*)matvar->data)[i] );	      
-	      }
-
-	      break;
-#endif
-            case MAT_T_INT32:
-	      
-	      for ( int i = 0; i < matvar->nbytes/matvar->data_size; i++ ) {
-		  
-		  v.push_back( ((signed long*)matvar->data)[i] );	      
-	      }
-	      
-	      break;	      
-
-            case MAT_T_UINT32:
-	      
-	      for ( int i = 0; i < matvar->nbytes/matvar->data_size; i++ ) {
-		  
-		  v.push_back( ((unsigned long*)matvar->data)[i] );	      
-	      }
-	      
-	      break;	      
-	      
-            case MAT_T_INT16:
-
-	      for ( int i = 0; i < matvar->nbytes/matvar->data_size; i++ ) {
-		  
-		  v.push_back( ((signed short*)matvar->data)[i] );	      
-	      }
-	      
-	      break;
-	      
-            case MAT_T_UINT16:
-	      
-	      for ( int i = 0; i < matvar->nbytes/matvar->data_size; i++ ) {
-		  
-		  v.push_back( ((unsigned short*)matvar->data)[i] );	      
-	      }
-	      
-	      break;	      
-	      
-            case MAT_T_INT8:
-	      
-	      for ( int i = 0; i < matvar->nbytes/matvar->data_size; i++ ) {
-		  
-		  v.push_back( ((signed char*)matvar->data)[i] );	      
-	      }
-	      
-	      break;	      
-
-            case MAT_T_UINT8:
-	      
-	      for ( int i = 0; i < matvar->nbytes/matvar->data_size; i++ ) {
-		  
-		  v.push_back( ((unsigned char*)matvar->data)[i] );	      
-	      }
-	      
-	      break;
-	  } 	  
-	  
-	// it can happen that a vector is treated as (N x 1) or (1 x N) matrix with two dimensions, here we handle this case
-	} else {
-	  
-          switch( matvar->data_type ) {
-	    
-            case MAT_T_DOUBLE:
-	  
-	      for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		  
-		  v.push_back( ((double*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-	      }
-	      
-	      break;
-	      
-            case MAT_T_SINGLE:
-	  
-	      for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		  
-		  v.push_back( ((float*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-	      }
-	      
-	      break;
-	      
-#ifdef HAVE_MAT_INT64_T
-            case MAT_T_INT64:
-	      
-	      for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		  
-		  v.push_back( ((signed long long*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-	      }	            
-
-	      break;
-#endif
-#ifdef HAVE_MAT_UINT64_T	      
-            case MAT_T_UINT64:
-
-	      for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		  
-		  v.push_back( ((unsigned long long*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-	      }	
-
-	      break;
-#endif
-            case MAT_T_INT32:
-	      
-	      for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		  
-		  v.push_back( ((signed long*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-	      }
-	      
-	      break;	      
-
-            case MAT_T_UINT32:
-	      
-	      for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		  
-		  v.push_back( ((unsigned long*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-	      }
-	      
-	      break;	      
-	      
-            case MAT_T_INT16:
-
-	      for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		  
-		  v.push_back( ((signed short*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-	      }
-	      
-	      break;
-	      
-            case MAT_T_UINT16:
-	      
-	      for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		  
-		  v.push_back( ((unsigned short*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-	      }
-	      
-	      break;	      
-	      
-            case MAT_T_INT8:
-	      
-	      for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		  
-		  v.push_back( ((signed char*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-	      }
-	      
-	      break;	      
-
-            case MAT_T_UINT8:
-	      
-	      for ( int i = 0; i < matvar->dims[0]; i++ ) {
-		for ( int j = 0; j < matvar->dims[1]; j++ ) {
-		  
-		  v.push_back( ((unsigned char*)matvar->data)[matvar->dims[0]*j+i] );	      
-		}
-	      }
-	      
-	      break;
-	  } 	  
-	  
-	}
-	
-	vec = NICE::Vector(v);	
-      }
-}

+ 0 - 134
matlabAccess/MatFileIO.h

@@ -1,134 +0,0 @@
-/** 
-* @file MatFileIO.h
-* @brief Read and write mat-files
-* @author Paul Bodesheim
-* @date 06-01-2012 (dd-mm-yyyy)
-*/
-#ifndef MATFILEIOH_INCLUDE
-#define MATFILEIOH_INCLUDE
-
-#include <cstdlib>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <string.h>
-#include <math.h>
-#include "matio/src/matio.h"
-
-#include "vector"
-#include <core/basics/Exception.h>
-#include "core/vector/VectorT.h"
-
-
-namespace NICE {
-  
-  class MatFileIO {
-       
-    protected:
-      
-      mat_t *mat; // struct for the mat-file, defined in matio.h
-      
-    public:
-
-      //------------------------------------------------------
-      // several constructors and destructors
-      //------------------------------------------------------
-
-      /** 
-      * @brief Default constructor
-      * @author Paul Bodesheim
-      * @date 06-01-2012 (dd-mm-yyyy)
-      */
-      MatFileIO(); 
-      
-      /** 
-      * @brief Recommended constructor
-      * @author Paul Bodesheim
-      * @date 06-01-2012 (dd-mm-yyyy)
-      * @param _filename name of the mat-file, if mode = MAT_ACC_RDWR and _filename does not exist, a new file will be created
-      * @param mode file access mode: MAT_ACC_RDONLY (read only) or MAT_ACC_RDWR (read + write)
-      */
-      MatFileIO(std::string _filename, const mat_acc mode);  
-      
-      /** 
-      * @brief Default destructor
-      * @author Paul Bodesheim
-      * @date 06-01-2012 (dd-mm-yyyy)
-      */
-      ~MatFileIO();
-             
-      //------------------------------------------------------
-      // enumeration
-      //------------------------------------------------------           
-      
-      /** 
-      * @brief feature matrix order
-      * @author Paul Bodesheim
-      * @date 09-01-2012 (dd-mm-yyyy)
-      */
-      enum feature_matrix_order {
-	NxD = 1,  /**< @brief Read only file access                */
-	DxN   = 2   /**< @brief Read/Write file access               */
-      };
-            
-      //------------------------------------------------------
-      // count number of stored variables
-      //------------------------------------------------------     
-      
-      /** 
-      * @brief get the number of variables stored in the mat-file referenced by mat
-      * @author Paul Bodesheim
-      * @date 06-01-2012 (dd-mm-yyyy)
-      * @return number of variables
-      */
-      int getNumberOfVariables();
-      
-      //------------------------------------------------------
-      // several methods for reading data
-      //------------------------------------------------------     
- 
-      /** 
-      * @brief get the variable with name _name stored in the mat-file referenced by mat
-      * @author Paul Bodesheim
-      * @date 06-01-2012 (dd-mm-yyyy)
-      * @param _name name of the variable
-      * @return variable with name _name in the matvar_t format
-      */  
-      matvar_t * getVariableViaName(std::string _name);
-      
-      
-      /**
-       * @brief get the sparsely stored variable with name _name stored in the mat-file referenced by mat
-       * @author Paul Bodesheim
-       * @date 10-01-2012 (dd-mm-yyyy)
-       * @param sparseVariable result: sparse variable with name _name in sparse matio-format sparse_t (see matio/src/matio.h)
-       * @param _name name of the variable
-       **/
-      void getSparseVariableViaName(sparse_t & sparseVariable, std::string _name);
-      
-      /** 
-      * @brief get the feature matrix with name _name stored in the mat-file referenced by mat
-      * @author Paul Bodesheim
-      * @date 09-01-2012 (dd-mm-yyyy)
-      * @param _name name of the variable
-      * @param order organization of the feature matrix: NxD (each feature in a row and each feature dimension in a coliumn)or DxN (vice versa)
-      * @param features result: feature matrix with name _name in the fast-HIK format: std::vector<std::vector<double> >
-      */  
-      void getFeatureMatrixViaName(std::vector<std::vector<double> > & features, std::string _name, const feature_matrix_order order = NxD);
- 
-      /** 
-      * @brief get vector with name _name stored in the mat-file referenced by mat
-      * @author Paul Bodesheim
-      * @date 09-01-2012 (dd-mm-yyyy)
-      * @param _name name of the variable
-      * @param vec result: vector with name _name in format NICE::Vector 
-      */ 
-      void getVectorViaName(NICE::Vector & vec, std::string _name);
-      
-      
-  }; // class
-  
-} // namespace
-
-
-#endif

+ 0 - 2
matlabAccess/libdepend.inc

@@ -1,2 +0,0 @@
-$(call PKG_DEPEND_INT,core/)
-$(call PKG_DEPEND_INT,vislearning/cbaselib/)

+ 0 - 103
matlabAccess/matio/Makefile.inc

@@ -1,103 +0,0 @@
-# LIBRARY-DIRECTORY-MAKEFILE
-# conventions:
-# - all subdirectories containing a "Makefile.inc" are considered sublibraries
-#   exception: "progs/" and "tests/" subdirectories!
-# - all ".C", ".cpp" and ".c" files in the current directory are linked to a
-#   library
-# - the library depends on all sublibraries 
-# - the library name is created with $(LIBNAME), i.e. it will be somehow
-#   related to the directory name and with the extension .a
-#   (e.g. lib1/sublib -> lib1_sublib.a)
-# - the library will be added to the default build list ALL_LIBRARIES
-
-# --------------------------------
-# - remember the last subdirectory
-#
-# set the variable $(SUBDIR) correctly to the current subdirectory. this
-# variable can be used throughout the current makefile.inc. The many 
-# SUBDIR_before, _add, and everything are only required so that we can recover
-# the previous content of SUBDIR before exitting the makefile.inc
-
-SUBDIR_add:=$(dir $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)))
-SUBDIR_before:=$(SUBDIR)
-SUBDIR:=$(strip $(SUBDIR_add))
-SUBDIR_before_$(SUBDIR):=$(SUBDIR_before)
-ifeq "$(SUBDIR)" "./"
-SUBDIR:=
-endif
-
-# ------------------------
-# - include subdirectories
-#
-# note the variables $(SUBDIRS_OF_$(SUBDIR)) are required later on to recover
-# the dependencies automatically. if you handle dependencies on your own, you
-# can also dump the $(SUBDIRS_OF_$(SUBDIR)) variable, and include the
-# makefile.inc of the subdirectories on your own...
-
-SUBDIRS_OF_$(SUBDIR):=$(patsubst %/Makefile.inc,%,$(wildcard $(SUBDIR)*/Makefile.inc))
-include $(SUBDIRS_OF_$(SUBDIR):%=%/Makefile.inc)
-
-# ----------------------------
-# - include local dependencies
-#
-# you can specify libraries needed by the individual objects or by the whole
-# directory. the object specific additional libraries are only considered
-# when compiling the specific object files
-# TODO: update documentation...
-
--include $(SUBDIR)libdepend.inc
-
-$(foreach d,$(filter-out %progs %tests,$(SUBDIRS_OF_$(SUBDIR))),$(eval $(call PKG_DEPEND_INT,$(d))))
-
-# ---------------------------
-# - objects in this directory
-#
-# the use of the variable $(OBJS) is not mandatory. it is mandatory however
-# to update $(ALL_OBJS) in a way that it contains the path and name of
-# all objects. otherwise we can not include the appropriate .d files.
-
-OBJS:=$(patsubst %.cpp,$(OBJDIR)%.o,$(notdir $(wildcard $(SUBDIR)*.cpp))) \
-      $(patsubst %.C,$(OBJDIR)%.o,$(notdir $(wildcard $(SUBDIR)*.C))) \
-	  $(shell grep -ls Q_OBJECT $(SUBDIR)*.h | sed -e's@^@/@;s@.*/@$(OBJDIR)moc_@;s@\.h$$@.o@') \
-      $(patsubst %.c,$(OBJDIR)%.o,$(notdir $(wildcard $(SUBDIR)*.c)))
-ALL_OBJS += $(OBJS)
-
-# ----------------------------
-# - binaries in this directory
-#
-# output of binaries in this directory. none of the variables has to be used.
-# but everything you add to $(ALL_LIBRARIES) and $(ALL_BINARIES) will be
-# compiled with `make all`. be sure again to add the files with full path.
-
-LIBRARY_BASENAME:=$(call LIBNAME,$(SUBDIR))
-ifneq "$(SUBDIR)" ""
-ALL_LIBRARIES+=$(LIBDIR)$(LIBRARY_BASENAME).$(LINK_FILE_EXTENSION)
-endif
-
-# ---------------------
-# - binary dependencies
-#
-# there is no way of determining the binary dependencies automatically, so we
-# follow conventions. the current library depends on all sublibraries.
-# all other dependencies have to be added manually by specifying, that the
-# current .pc file depends on some other .pc file. binaries depending on
-# libraries should exclusivelly use the .pc files as well.
-
-ifeq "$(SKIP_BUILD_$(OBJDIR))" "1"
-$(LIBDIR)$(LIBRARY_BASENAME).a:
-else
-$(LIBDIR)$(LIBRARY_BASENAME).a:$(OBJS) \
-	$(call PRINT_INTLIB_DEPS,$(PKGDIR)$(LIBRARY_BASENAME).a,.$(LINK_FILE_EXTENSION))
-endif
-
-$(PKGDIR)$(LIBRARY_BASENAME).pc: \
-	$(call PRINT_INTLIB_DEPS,$(PKGDIR)$(LIBRARY_BASENAME).pc,.pc)
-
-# -------------------
-# - subdir management
-#
-# as the last step, always add this line to correctly recover the subdirectory
-# of the makefile including this one!
-
-SUBDIR:=$(SUBDIR_before_$(SUBDIR))
-

+ 0 - 79
matlabAccess/matio/README

@@ -1,79 +0,0 @@
-LIBMATIO Matlab MAT file I/O library
-
-libmatio is an open-source library for reading/writing Matlab MAT files.  This
-library is designed for use by programs/libraries that do not have access or
-do not want to rely on Matlab's libmat shared library.
-
-Contact:
-    You can contact me (Christopher Hulbert) through email at cch@isl-inc.com
-
-Acknowledgements:
-    Thank you to Jacco van Beek for helping me get the software running under
-solaris and for providing test files to get byteswapping verified.
-
-Contributing:
-    Part of my reason for releasing this software is I have many other projects
-to work on and have many features I would still like to implement.  If you
-make changes, I would appreciate your contributions and more than likely will
-include them in future releases.  If you are interested in collaborations,
-contact me via email at cch@isl-inc.com.
-
-Building:
-    Four of the builds currently supported make use of the GNU autotools,
-and thus you should have them.  There is a build script in the top-level
-directory for the four builds including the following supported platforms:
-cygwin, mingw, linux, and solaris.  You can of course configure and build
-your own way.  A Visual C 7 Solution has been created in the build-vc7
-direcotry and a Visual C 6 workspace in the build-vc6 directory.
-These should be self containing, just open and build.  There are multiple
-configurations supported, but I recommend the LIB Release or the
-DLL Release.  The build-windows directory contains a batch file to build using
-nmake.  This makes it easier to set variables and install the software.
-Doxygen is required to build the documentation.  Since not all platforms
-support doxygen (mingw and Visual C come to mind) I have included the API
-documentation in the top-level directory as a pdf.
-
-ZLIB:
-    To support compressed MAT files, zlib 1.2.2 or greater is required.  If zlib
-1.2.2 is used, there is a bug in inflate.c.  A patch file (inflate.patch) is
-included in the patches directory and should be applied before creating the zlib
-library or libmatio will likely crash at some point.  The latest release of zlib
-already has this patch applied. A minimal zlib 1.2.3 has been included.  This
-does not have ALL build targets and does not include the contrib directory.
-This is simply because of size requirements on the File Exchange.
-    Due to some linking problems under linux/solaris, when shared libraries are
-compiled against the static zlib and a program (like Matlab) loads in zlib
-symbols, it uses those symbols instead of the static ones.  This should not
-affect stand-alone programs or static libraries (unless linked against from
-something like a mex file).  Therefore, when building libmatio, it is
-recommended to use the built-in zlib 1.2.3 or to compile the zlib with
--DZ_PREFIX which only changes the symbol names to add z_ to external symbols.
-This eliminates the possibility of using zlib symbols from a shared library.  To
-build zlib with the z prefix, you can use:
-CFLAGS=-DZ_PREFIX ./configure;make;make install
-
-the build scripts provided already make the zlib that is included with this
-distribution and set the flags to use that as appropriate.
-
-Targets:
-    The library has been tested/used on linux and windows little-endian
-architectures, as well as solarix big-endian.  Again, thanks to Jacco for using
-a big-endian system and providing some test files for that as well as testing
-reading little-endian files on a big-endian system.
-
-Copyright Notice:
-    Copyright (C) 2005-2006   Christopher C. Hulbert
-
-     This library is free software; you can redistribute it and/or
-     modify it under the terms of the GNU Lesser General Public
-     License as published by the Free Software Foundation; either
-     version 2.1 of the License, or (at your option) any later version.
-
-     This library is distributed in the hope that it will be useful,
-     but WITHOUT ANY WARRANTY; without even the implied warranty of
-     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-     Lesser General Public License for more details.
-
-     You should have received a copy of the GNU Lesser General Public
-     License along with this library; if not, write to the Free Software
-     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

TEMPAT SAMPAH
matlabAccess/matio/src/.libs/libmatio.a


+ 0 - 1
matlabAccess/matio/src/.libs/libmatio.la

@@ -1 +0,0 @@
-../libmatio.la

+ 0 - 41
matlabAccess/matio/src/.libs/libmatio.lai

@@ -1,41 +0,0 @@
-# libmatio.la - a libtool library file
-# Generated by ltmain.sh (GNU libtool) 2.2.6b Debian-2.2.6b-2
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# The name that we can dlopen(3).
-dlname=''
-
-# Names of this library.
-library_names=''
-
-# The name of the static archive.
-old_library='libmatio.a'
-
-# Linker flags that can not go in dependency_libs.
-inherited_linker_flags=''
-
-# Libraries that this one depends upon.
-dependency_libs=' -lm'
-
-# Names of additional weak libraries provided by this library
-weak_library_names=''
-
-# Version information for libmatio.
-current=0
-age=0
-revision=0
-
-# Is this an already installed library?
-installed=yes
-
-# Should we warn about portability when linking against -modules?
-shouldnotlink=no
-
-# Files to dlopen/dlpreopen
-dlopen=''
-dlpreopen=''
-
-# Directory that this library needs to be installed in:
-libdir='/usr/local/lib'

+ 0 - 103
matlabAccess/matio/src/Makefile.inc

@@ -1,103 +0,0 @@
-# LIBRARY-DIRECTORY-MAKEFILE
-# conventions:
-# - all subdirectories containing a "Makefile.inc" are considered sublibraries
-#   exception: "progs/" and "tests/" subdirectories!
-# - all ".C", ".cpp" and ".c" files in the current directory are linked to a
-#   library
-# - the library depends on all sublibraries 
-# - the library name is created with $(LIBNAME), i.e. it will be somehow
-#   related to the directory name and with the extension .a
-#   (e.g. lib1/sublib -> lib1_sublib.a)
-# - the library will be added to the default build list ALL_LIBRARIES
-
-# --------------------------------
-# - remember the last subdirectory
-#
-# set the variable $(SUBDIR) correctly to the current subdirectory. this
-# variable can be used throughout the current makefile.inc. The many 
-# SUBDIR_before, _add, and everything are only required so that we can recover
-# the previous content of SUBDIR before exitting the makefile.inc
-
-SUBDIR_add:=$(dir $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)))
-SUBDIR_before:=$(SUBDIR)
-SUBDIR:=$(strip $(SUBDIR_add))
-SUBDIR_before_$(SUBDIR):=$(SUBDIR_before)
-ifeq "$(SUBDIR)" "./"
-SUBDIR:=
-endif
-
-# ------------------------
-# - include subdirectories
-#
-# note the variables $(SUBDIRS_OF_$(SUBDIR)) are required later on to recover
-# the dependencies automatically. if you handle dependencies on your own, you
-# can also dump the $(SUBDIRS_OF_$(SUBDIR)) variable, and include the
-# makefile.inc of the subdirectories on your own...
-
-SUBDIRS_OF_$(SUBDIR):=$(patsubst %/Makefile.inc,%,$(wildcard $(SUBDIR)*/Makefile.inc))
-include $(SUBDIRS_OF_$(SUBDIR):%=%/Makefile.inc)
-
-# ----------------------------
-# - include local dependencies
-#
-# you can specify libraries needed by the individual objects or by the whole
-# directory. the object specific additional libraries are only considered
-# when compiling the specific object files
-# TODO: update documentation...
-
--include $(SUBDIR)libdepend.inc
-
-$(foreach d,$(filter-out %progs %tests,$(SUBDIRS_OF_$(SUBDIR))),$(eval $(call PKG_DEPEND_INT,$(d))))
-
-# ---------------------------
-# - objects in this directory
-#
-# the use of the variable $(OBJS) is not mandatory. it is mandatory however
-# to update $(ALL_OBJS) in a way that it contains the path and name of
-# all objects. otherwise we can not include the appropriate .d files.
-
-OBJS:=$(patsubst %.cpp,$(OBJDIR)%.o,$(notdir $(wildcard $(SUBDIR)*.cpp))) \
-      $(patsubst %.C,$(OBJDIR)%.o,$(notdir $(wildcard $(SUBDIR)*.C))) \
-	  $(shell grep -ls Q_OBJECT $(SUBDIR)*.h | sed -e's@^@/@;s@.*/@$(OBJDIR)moc_@;s@\.h$$@.o@') \
-      $(patsubst %.c,$(OBJDIR)%.o,$(notdir $(wildcard $(SUBDIR)*.c)))
-ALL_OBJS += $(OBJS)
-
-# ----------------------------
-# - binaries in this directory
-#
-# output of binaries in this directory. none of the variables has to be used.
-# but everything you add to $(ALL_LIBRARIES) and $(ALL_BINARIES) will be
-# compiled with `make all`. be sure again to add the files with full path.
-
-LIBRARY_BASENAME:=$(call LIBNAME,$(SUBDIR))
-ifneq "$(SUBDIR)" ""
-ALL_LIBRARIES+=$(LIBDIR)$(LIBRARY_BASENAME).$(LINK_FILE_EXTENSION)
-endif
-
-# ---------------------
-# - binary dependencies
-#
-# there is no way of determining the binary dependencies automatically, so we
-# follow conventions. the current library depends on all sublibraries.
-# all other dependencies have to be added manually by specifying, that the
-# current .pc file depends on some other .pc file. binaries depending on
-# libraries should exclusivelly use the .pc files as well.
-
-ifeq "$(SKIP_BUILD_$(OBJDIR))" "1"
-$(LIBDIR)$(LIBRARY_BASENAME).a:
-else
-$(LIBDIR)$(LIBRARY_BASENAME).a:$(OBJS) \
-	$(call PRINT_INTLIB_DEPS,$(PKGDIR)$(LIBRARY_BASENAME).a,.$(LINK_FILE_EXTENSION))
-endif
-
-$(PKGDIR)$(LIBRARY_BASENAME).pc: \
-	$(call PRINT_INTLIB_DEPS,$(PKGDIR)$(LIBRARY_BASENAME).pc,.pc)
-
-# -------------------
-# - subdir management
-#
-# as the last step, always add this line to correctly recover the subdirectory
-# of the makefile including this one!
-
-SUBDIR:=$(SUBDIR_before_$(SUBDIR))
-

+ 0 - 248
matlabAccess/matio/src/endian.c

@@ -1,248 +0,0 @@
-/** @file endian.c
- * @brief Functions to handle endian specifics
- */
-/*
- * Copyright (C) 2005-2006   Christopher C. Hulbert
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public
- *  License as published by the Free Software Foundation; either
- *  version 2.1 of the License, or (at your option) any later version.
- *
- *  This library is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this library; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-#include <stdlib.h>
-#include "matio.h"
-#include "matio_private.h"
-
-/** @brief swap the bytes @c a and @c b
- * @ingroup mat_internal
- */
-#define swap(a,b)   a^=b;b^=a;a^=b
-
-#ifdef HAVE_MAT_INT64_T
-/** @brief swap the bytes of a 64-bit signed integer
- * @ingroup mat_internal
- * @param a pointer to integer to swap
- * @return the swapped integer
- */
-mat_int64_t
-Mat_int64Swap( mat_int64_t *a )
-{
-
-    union {
-        mat_int8_t    i1[8]; 
-        mat_int64_t   i8;
-    } tmp;
-
-    tmp.i8 = *a;
-
-    swap( tmp.i1[0], tmp.i1[7] );
-    swap( tmp.i1[1], tmp.i1[6] );
-    swap( tmp.i1[2], tmp.i1[5] );
-    swap( tmp.i1[3], tmp.i1[4] );
-
-    *a = tmp.i8;
-
-    return *a;
-
-}
-#endif /* HAVE_MAT_INT64_T */
-
-#ifdef HAVE_MAT_UINT64_T
-/** @brief swap the bytes of a 64-bit unsigned integer
- * @ingroup mat_internal
- * @param a pointer to integer to swap
- * @return the swapped integer
- */
-mat_uint64_t
-Mat_uint64Swap( mat_uint64_t *a )
-{
-
-    union {
-        mat_uint8_t    i1[8]; 
-        mat_uint64_t   i8;
-    } tmp;
-
-    tmp.i8 = *a;
-
-    swap( tmp.i1[0], tmp.i1[7] );
-    swap( tmp.i1[1], tmp.i1[6] );
-    swap( tmp.i1[2], tmp.i1[5] );
-    swap( tmp.i1[3], tmp.i1[4] );
-
-    *a = tmp.i8;
-
-    return *a;
-
-}
-#endif /* HAVE_MAT_UINT64_T */
-
-/** @brief swap the bytes of a 32-bit signed integer
- * @ingroup mat_internal
- * @param a pointer to integer to swap
- * @return the swapped integer
- */
-mat_int32_t
-Mat_int32Swap( mat_int32_t *a )
-{
-
-    union {
-        mat_int8_t    i1[4]; 
-        mat_int32_t   i4;
-    } tmp;
-
-    tmp.i4 = *a;
-
-    swap( tmp.i1[0], tmp.i1[3] );
-    swap( tmp.i1[1], tmp.i1[2] );
-
-    *a = tmp.i4;
-
-    return *a;
-
-}
-
-/** @brief swap the bytes of a 32-bit unsigned integer
- * @ingroup mat_internal
- * @param a pointer to integer to swap
- * @return the swapped integer
- */
-mat_uint32_t
-Mat_uint32Swap( mat_uint32_t *a )
-{
-
-    union {
-        mat_uint8_t    i1[4]; 
-        mat_uint32_t   i4;
-    } tmp;
-
-    tmp.i4 = *a;
-
-    swap( tmp.i1[0], tmp.i1[3] );
-    swap( tmp.i1[1], tmp.i1[2] );
-
-    *a = tmp.i4;
-
-    return *a;
-
-}
-
-/** @brief swap the bytes of a 16-bit signed integer
- * @ingroup mat_internal
- * @param a pointer to integer to swap
- * @return the swapped integer
- */
-mat_int16_t
-Mat_int16Swap( mat_int16_t *a ) 
-{
-
-    union {
-        mat_int8_t   i1[2];
-        mat_int16_t  i2;
-    } tmp;
-
-    tmp.i2 = *a;
-
-    swap( tmp.i1[0], tmp.i1[1] );
-
-    *a = tmp.i2;
-    return *a;
-
-}
-
-/** @brief swap the bytes of a 16-bit unsigned integer
- * @ingroup mat_internal
- * @param a pointer to integer to swap
- * @return the swapped integer
- */
-mat_uint16_t
-Mat_uint16Swap( mat_uint16_t *a ) 
-{
-
-    union {
-        mat_uint8_t   i1[2];
-        mat_uint16_t  i2;
-    } tmp;
-
-    tmp.i2 = *a;
-
-    swap( tmp.i1[0], tmp.i1[1] );
-
-    *a = tmp.i2;
-    return *a;
-
-}
-
-/** @brief swap the bytes of a 4 byte single-precision float
- * @ingroup mat_internal
- * @param a pointer to integer to swap
- * @return the swapped integer
- */
-float
-Mat_floatSwap( float *a )
-{
-
-    union {
-        char  i1[4];
-        float r4;
-    } tmp;
-
-    tmp.r4 = *a;
-
-    swap( tmp.i1[0], tmp.i1[3] );
-    swap( tmp.i1[1], tmp.i1[2] );
-
-    *a = tmp.r4;
-    return *a;
-
-}
-
-/** @brief swap the bytes of a 4 or 8 byte double-precision float
- * @ingroup mat_internal
- * @param a pointer to integer to swap
- * @return the swapped integer
- */
-double
-Mat_doubleSwap( double *a )
-{
-#ifndef SIZEOF_DOUBLE
-#define SIZEOF_DOUBLE 8
-#endif
-
-    union {
-        char   a[SIZEOF_DOUBLE];
-        double b;
-    } tmp;
-
-    tmp.b = *a;
-
-#if SIZEOF_DOUBLE == 4
-    swap( tmp.a[0], tmp.a[3] );
-    swap( tmp.a[1], tmp.a[2] );
-#elif SIZEOF_DOUBLE == 8
-    swap( tmp.a[0], tmp.a[7] );
-    swap( tmp.a[1], tmp.a[6] );
-    swap( tmp.a[2], tmp.a[5] );
-    swap( tmp.a[3], tmp.a[4] );
-#elif SIZEOF_DOUBLE == 16
-    swap( tmp.a[0], tmp.a[15] );
-    swap( tmp.a[1], tmp.a[14] );
-    swap( tmp.a[2], tmp.a[13] );
-    swap( tmp.a[3], tmp.a[12] );
-    swap( tmp.a[4], tmp.a[11] );
-    swap( tmp.a[5], tmp.a[10] );
-    swap( tmp.a[6], tmp.a[9] );
-    swap( tmp.a[7], tmp.a[8] );
-#endif
-    *a = tmp.b;
-    return *a;
-
-}

+ 0 - 840
matlabAccess/matio/src/inflate.c

@@ -1,840 +0,0 @@
-/** @file inflate.c
- * @brief Functions to inflate data/tags
- * @ingroup MAT
- */
-/*
- * Copyright (C) 2005-2006   Christopher C. Hulbert
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public
- *  License as published by the Free Software Foundation; either
- *  version 2.1 of the License, or (at your option) any later version.
- *
- *  This library is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this library; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-#include <stdlib.h>
-#include "matio.h"
-#include "matio_private.h"
-
-/** @brief Inflate the data until @c nbytes of uncompressed data has been
- *         inflated
- *
- * @ingroup mat_internal
- * @param mat Pointer to the MAT file
- * @param z zlib compression stream
- * @param nbytes Number of uncompressed bytes to skip
- * @return Number of bytes read from the file
- */
-int 
-InflateSkip(mat_t *mat, z_stream *z, int nbytes)
-{
-    mat_uint8_t comp_buf[512],uncomp_buf[512];
-    int     bytesread = 0, n,err, cnt = 0;
-
-    if ( nbytes < 1 )
-        return 0;
-
-    n = (nbytes<512) ? nbytes : 512;
-    if ( !z->avail_in ) {
-        z->next_in = comp_buf;
-        z->avail_in += fread(comp_buf,1,n,mat->fp);
-        bytesread   += z->avail_in;
-    }
-    z->avail_out = n;
-    z->next_out  = uncomp_buf;
-    err = inflate(z,Z_FULL_FLUSH);
-    if ( err == Z_STREAM_END ) {
-        return bytesread;
-    } else if ( err != Z_OK ) {
-        Mat_Critical("InflateSkip: inflate returned %d",err);
-        return bytesread;
-    }
-    if ( !z->avail_out ) {
-        cnt += n;
-        n = ((nbytes-cnt)<512) ? nbytes-cnt : 512;
-        z->avail_out = n;
-        z->next_out  = uncomp_buf;
-    }
-    while ( cnt < nbytes ) {
-        if ( !z->avail_in ) {
-            z->next_in   = comp_buf;
-            z->avail_in += fread(comp_buf,1,n,mat->fp);
-            bytesread   += z->avail_in;
-        }
-        err = inflate(z,Z_FULL_FLUSH);
-        if ( err == Z_STREAM_END ) {
-            break;
-        } else if ( err != Z_OK ) {
-            Mat_Critical("InflateSkip: inflate returned %d",err);
-            break;
-        }
-        if ( !z->avail_out ) {
-            cnt         += n;
-            n            = ((nbytes-cnt)<512) ? nbytes-cnt : 512;
-            z->avail_out = n;
-            z->next_out  = uncomp_buf;
-        }
-    }
-
-    if ( z->avail_in ) {
-        long offset = -(long)z->avail_in;
-        fseek(mat->fp,offset,SEEK_CUR);
-        bytesread -= z->avail_in;
-        z->avail_in = 0;
-    }
-
-    return bytesread;
-}
-
-/** @brief Inflate the data until @c nbytes of compressed data has been
- *         inflated
- *
- * @ingroup mat_internal
- * @param mat Pointer to the MAT file
- * @param z zlib compression stream
- * @param nbytes Number of uncompressed bytes to skip
- * @return Number of bytes read from the file
- */
-int
-InflateSkip2(mat_t *mat, matvar_t *matvar, int nbytes)
-{
-    mat_uint8_t comp_buf[32],uncomp_buf[32];
-    int     bytesread = 0, err, cnt = 0;
-
-    if ( !matvar->z->avail_in ) {
-        matvar->z->avail_in = 1;
-        matvar->z->next_in = comp_buf;
-        bytesread += fread(comp_buf,1,1,mat->fp);
-    }
-    matvar->z->avail_out = 1;
-    matvar->z->next_out = uncomp_buf;
-    err = inflate(matvar->z,Z_NO_FLUSH);
-    if ( err != Z_OK ) {
-        Mat_Critical("InflateSkip2: %s - inflate returned %d",matvar->name,err);
-        return bytesread;
-    }
-    if ( !matvar->z->avail_out ) {
-        matvar->z->avail_out = 1;
-        matvar->z->next_out = uncomp_buf;
-    }
-    while ( cnt < nbytes ) {
-        if ( !matvar->z->avail_in ) {
-            matvar->z->avail_in = 1;
-            matvar->z->next_in = comp_buf;
-            bytesread += fread(comp_buf,1,1,mat->fp);
-            cnt++;
-        }
-        err = inflate(matvar->z,Z_NO_FLUSH);
-        if ( err != Z_OK ) {
-            Mat_Critical("InflateSkip2: %s - inflate returned %d",matvar->name,err);
-            return bytesread;
-        }
-        if ( !matvar->z->avail_out ) {
-            matvar->z->avail_out = 1;
-            matvar->z->next_out = uncomp_buf;
-        }
-    }
-
-    if ( matvar->z->avail_in ) {
-        fseek(mat->fp,-(int)matvar->z->avail_in,SEEK_CUR);
-        bytesread -= matvar->z->avail_in;
-        matvar->z->avail_in = 0;
-    }
-
-    return bytesread;
-}
-
-/** @brief Inflate the data until @c len elements of compressed data with data
- *         type @c data_type has been inflated
- *
- * @ingroup mat_internal
- * @param mat Pointer to the MAT file
- * @param z zlib compression stream
- * @param data_type Data type (matio_types enumerations)
- * @param len Number of elements of datatype @c data_type to skip
- * @return Number of bytes read from the file
- */
-int
-InflateSkipData(mat_t *mat,z_stream *z,int data_type,int len)
-{
-    int data_size = 0;
-
-    if ( (mat == NULL) || (z == NULL) )
-        return 0;
-    else if ( len < 1 )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-            data_size = sizeof(double);
-            break;
-        case MAT_T_SINGLE:
-            data_size = sizeof(float);
-            break;
-#ifdef HAVE_MAT_INT64_T
-        case MAT_T_INT64:
-            data_size = sizeof(mat_int64_t);
-            break;
-#endif /* HAVE_MAT_INT64_T */
-#ifdef HAVE_MAT_UINT64_T
-        case MAT_T_UINT64:
-            data_size = sizeof(mat_uint64_t);
-            break;
-#endif /* HAVE_MAT_UINT64_T */
-        case MAT_T_INT32:
-            data_size = sizeof(mat_int32_t);
-            break;
-        case MAT_T_UINT32:
-            data_size = sizeof(mat_uint32_t);
-            break;
-        case MAT_T_INT16:
-            data_size = sizeof(mat_int16_t);
-            break;
-        case MAT_T_UINT16:
-            data_size = sizeof(mat_uint16_t);
-            break;
-        case MAT_T_UINT8:
-            data_size = sizeof(mat_uint8_t);
-            break;
-        case MAT_T_INT8:
-            data_size = sizeof(mat_int8_t);
-            break;
-    }
-    InflateSkip(mat,z,len*data_size);
-    return len;
-}
-
-/** @brief Inflates the variable's tag.
- *
- * @c buf must hold at least 8 bytes
- * @ingroup mat_internal
- * @param mat Pointer to the MAT file
- * @param matvar Pointer to the MAT variable
- * @param buf Pointer to store the 8-byte variable tag 
- * @return Number of bytes read from the file
- */
-int
-InflateVarTag(mat_t *mat, matvar_t *matvar, void *buf)
-{
-    mat_uint8_t comp_buf[32];
-    int     bytesread = 0, err;
-
-    if (buf == NULL)
-        return 0;
-
-    if ( !matvar->z->avail_in ) {
-        matvar->z->avail_in = 1;
-        matvar->z->next_in = comp_buf;
-        bytesread += fread(comp_buf,1,1,mat->fp);
-    }
-    matvar->z->avail_out = 8;
-    matvar->z->next_out = buf;
-    err = inflate(matvar->z,Z_NO_FLUSH);
-    if ( err != Z_OK ) {
-        Mat_Critical("InflateVarTag: inflate returned %d",err);
-        return bytesread;
-    }
-    while ( matvar->z->avail_out && !matvar->z->avail_in ) {
-        matvar->z->avail_in = 1;
-        matvar->z->next_in = comp_buf;
-        bytesread += fread(comp_buf,1,1,mat->fp);
-        err = inflate(matvar->z,Z_NO_FLUSH);
-        if ( err != Z_OK ) {
-            Mat_Critical("InflateVarTag: inflate returned %d",err);
-            return bytesread;
-        }
-    }
-
-    if ( matvar->z->avail_in ) {
-        fseek(mat->fp,-(int)matvar->z->avail_in,SEEK_CUR);
-        bytesread -= matvar->z->avail_in;
-        matvar->z->avail_in = 0;
-    }
-
-    return bytesread;
-}
-
-/** @brief Inflates the Array Flags Tag and the Array Flags data.
- *
- * @c buf must hold at least 16 bytes
- * @ingroup mat_internal
- * @param mat Pointer to the MAT file
- * @param matvar Pointer to the MAT variable
- * @param buf Pointer to store the 16-byte array flags tag and data 
- * @return Number of bytes read from the file
- */
-int
-InflateArrayFlags(mat_t *mat, matvar_t *matvar, void *buf)
-{
-    mat_uint8_t comp_buf[32];
-    int     bytesread = 0, err;
-
-    if (buf == NULL) return 0;
-
-    if ( !matvar->z->avail_in ) {
-        matvar->z->avail_in = 1;
-        matvar->z->next_in = comp_buf;
-        bytesread += fread(comp_buf,1,1,mat->fp);
-    }
-    matvar->z->avail_out = 16;
-    matvar->z->next_out = buf;
-    err = inflate(matvar->z,Z_NO_FLUSH);
-    if ( err != Z_OK ) {
-        Mat_Critical("InflateArrayFlags: inflate returned %d",err);
-        return bytesread;
-    }
-    while ( matvar->z->avail_out && !matvar->z->avail_in ) {
-        matvar->z->avail_in = 1;
-        matvar->z->next_in = comp_buf;
-        bytesread += fread(comp_buf,1,1,mat->fp);
-        err = inflate(matvar->z,Z_NO_FLUSH);
-        if ( err != Z_OK ) {
-            Mat_Critical("InflateArrayFlags: inflate returned %d",err);
-            return bytesread;
-        }
-    }
-
-    if ( matvar->z->avail_in ) {
-        fseek(mat->fp,-(int)matvar->z->avail_in,SEEK_CUR);
-        bytesread -= matvar->z->avail_in;
-        matvar->z->avail_in = 0;
-    }
-
-    return bytesread;
-}
-
-/** @brief Inflates the dimensions tag and the dimensions data
- *
- * @c buf must hold at least (8+4*rank) bytes where rank is the number of
- * dimensions. If the end of the dimensions data is not aligned on an 8-byte
- * boundary, this function eats up those bytes and stores then in @c buf.
- * @ingroup mat_internal
- * @param mat Pointer to the MAT file
- * @param matvar Pointer to the MAT variable
- * @param buf Pointer to store the dimensions flag and data 
- * @return Number of bytes read from the file
- */
-int
-InflateDimensions(mat_t *mat, matvar_t *matvar, void *buf)
-{
-    mat_uint8_t comp_buf[32];
-    mat_int32_t tag[2];
-    int     bytesread = 0, err, rank, i;
-
-    if ( buf == NULL )
-        return 0;
-
-    if ( !matvar->z->avail_in ) {
-        matvar->z->avail_in = 1;
-        matvar->z->next_in = comp_buf;
-        bytesread += fread(comp_buf,1,1,mat->fp);
-    }
-    matvar->z->avail_out = 8;
-    matvar->z->next_out = buf;
-    err = inflate(matvar->z,Z_NO_FLUSH);
-    if ( err != Z_OK ) {
-        Mat_Critical("InflateDimensions: inflate returned %d",err);
-        return bytesread;
-    }
-    while ( matvar->z->avail_out && !matvar->z->avail_in ) {
-        matvar->z->avail_in = 1;
-        matvar->z->next_in = comp_buf;
-        bytesread += fread(comp_buf,1,1,mat->fp);
-        err = inflate(matvar->z,Z_NO_FLUSH);
-        if ( err != Z_OK ) {
-            Mat_Critical("InflateDimensions: inflate returned %d",err);
-            return bytesread;
-        }
-    }
-    tag[0] = *(int *)buf;
-    tag[1] = *((int *)buf+1);
-    if ( mat->byteswap ) {
-        Mat_int32Swap(tag);
-        Mat_int32Swap(tag+1);
-    }
-    if ( (tag[0] & 0x0000ffff) != MAT_T_INT32 ) {
-        Mat_Critical("InflateDimensions: Reading dimensions expected type MAT_T_INT32");
-        return bytesread;
-    }
-    rank = tag[1];
-    if ( rank % 8 != 0 )
-        i = 8-(rank %8);
-    else
-        i = 0;
-    rank+=i;
-
-    if ( !matvar->z->avail_in ) {
-        matvar->z->avail_in = 1;
-        matvar->z->next_in = comp_buf;
-        bytesread += fread(comp_buf,1,1,mat->fp);
-    }
-    matvar->z->avail_out = rank;
-    matvar->z->next_out = (void *)((mat_int32_t *)buf+2);
-    err = inflate(matvar->z,Z_NO_FLUSH);
-    if ( err != Z_OK ) {
-        Mat_Critical("InflateDimensions: inflate returned %d",err);
-        return bytesread;
-    }
-    while ( matvar->z->avail_out && !matvar->z->avail_in ) {
-        matvar->z->avail_in = 1;
-        matvar->z->next_in = comp_buf;
-        bytesread += fread(comp_buf,1,1,mat->fp);
-        err = inflate(matvar->z,Z_NO_FLUSH);
-        if ( err != Z_OK ) {
-            Mat_Critical("InflateDimensions: inflate returned %d",err);
-            return bytesread;
-        }
-    }
-
-    if ( matvar->z->avail_in ) {
-        fseek(mat->fp,-(int)matvar->z->avail_in,SEEK_CUR);
-        bytesread -= matvar->z->avail_in;
-        matvar->z->avail_in = 0;
-    }
-
-    return bytesread;
-}
-
-/** @brief Inflates the variable name tag
- *
- * @ingroup mat_internal
- * @param mat Pointer to the MAT file
- * @param matvar Pointer to the MAT variable
- * @param buf Pointer to store the variables name tag 
- * @return Number of bytes read from the file
- */
-int
-InflateVarNameTag(mat_t *mat, matvar_t *matvar, void *buf)
-{
-    mat_uint8_t comp_buf[32];
-    int     bytesread = 0, err;
-
-    if ( buf == NULL )
-        return 0;
-
-    if ( !matvar->z->avail_in ) {
-        matvar->z->avail_in = 1;
-        matvar->z->next_in = comp_buf;
-        bytesread += fread(comp_buf,1,1,mat->fp);
-    }
-    matvar->z->avail_out = 8;
-    matvar->z->next_out = buf;
-    err = inflate(matvar->z,Z_NO_FLUSH);
-    if ( err != Z_OK ) {
-        Mat_Critical("InflateVarNameTag: inflate returned %d",err);
-        return bytesread;
-    }
-    while ( matvar->z->avail_out && !matvar->z->avail_in ) {
-        matvar->z->avail_in = 1;
-        matvar->z->next_in = comp_buf;
-        bytesread += fread(comp_buf,1,1,mat->fp);
-        err = inflate(matvar->z,Z_NO_FLUSH);
-        if ( err != Z_OK ) {
-            Mat_Critical("InflateVarNameTag: inflate returned %d",err);
-            return bytesread;
-        }
-    }
-
-    if ( matvar->z->avail_in ) {
-        fseek(mat->fp,-(int)matvar->z->avail_in,SEEK_CUR);
-        bytesread -= matvar->z->avail_in;
-        matvar->z->avail_in = 0;
-    }
-
-    return bytesread;
-}
-
-/** @brief Inflates the variable name
- *
- * @ingroup mat_internal
- * @param mat Pointer to the MAT file
- * @param matvar Pointer to the MAT variable
- * @param buf Pointer to store the variables name 
- * @param N Number of characters in the name
- * @return Number of bytes read from the file
- */
-int
-InflateVarName(mat_t *mat, matvar_t *matvar, void *buf, int N)
-{
-    mat_uint8_t comp_buf[32];
-    int     bytesread = 0, err;
-
-    if ( buf == NULL )
-        return 0;
-
-    if ( !matvar->z->avail_in ) {
-        matvar->z->avail_in = 1;
-        matvar->z->next_in = comp_buf;
-        bytesread += fread(comp_buf,1,1,mat->fp);
-    }
-    matvar->z->avail_out = N;
-    matvar->z->next_out = buf;
-    err = inflate(matvar->z,Z_NO_FLUSH);
-    if ( err != Z_OK ) {
-        Mat_Critical("InflateVarName: inflate returned %d",err);
-        return bytesread;
-    }
-    while ( matvar->z->avail_out && !matvar->z->avail_in ) {
-        matvar->z->avail_in = 1;
-        matvar->z->next_in = comp_buf;
-        bytesread += fread(comp_buf,1,1,mat->fp);
-        err = inflate(matvar->z,Z_NO_FLUSH);
-        if ( err != Z_OK ) {
-            Mat_Critical("InflateVarName: inflate returned %d",err);
-            return bytesread;
-        }
-    }
-
-    if ( matvar->z->avail_in ) {
-        fseek(mat->fp,-(int)matvar->z->avail_in,SEEK_CUR);
-        bytesread -= matvar->z->avail_in;
-        matvar->z->avail_in = 0;
-    }
-
-    return bytesread;
-}
-
-/** @brief Inflates the data's tag
- *
- * buf must hold at least 8 bytes
- * @ingroup mat_internal
- * @param mat Pointer to the MAT file
- * @param matvar Pointer to the MAT variable
- * @param buf Pointer to store the data tag 
- * @return Number of bytes read from the file
- */
-int
-InflateDataTag(mat_t *mat, matvar_t *matvar, void *buf)
-{
-    mat_uint8_t comp_buf[32];
-    int     bytesread = 0, err;
-
-    if ( buf == NULL )
-        return 0;
-
-   if ( !matvar->z->avail_in ) {
-        matvar->z->avail_in = 1;
-        matvar->z->next_in = comp_buf;
-        bytesread += fread(comp_buf,1,1,mat->fp);
-    }
-    matvar->z->avail_out = 8;
-    matvar->z->next_out = buf;
-    err = inflate(matvar->z,Z_NO_FLUSH);
-    if ( err == Z_STREAM_END ) {
-        return bytesread;
-    } else if ( err != Z_OK ) {
-        Mat_Critical("InflateDataTag: %s - inflate returned %d",matvar->name,err);
-        return bytesread;
-    }
-    while ( matvar->z->avail_out && !matvar->z->avail_in ) {
-        matvar->z->avail_in = 1;
-        matvar->z->next_in = comp_buf;
-        bytesread += fread(comp_buf,1,1,mat->fp);
-        err = inflate(matvar->z,Z_NO_FLUSH);
-        if ( err == Z_STREAM_END ) {
-            break;
-        } else if ( err != Z_OK ) {
-            Mat_Critical("InflateDataTag: %s - inflate returned %d",matvar->name,err);
-            return bytesread;
-        }
-    }
-
-    if ( matvar->z->avail_in ) {
-        fseek(mat->fp,-(int)matvar->z->avail_in,SEEK_CUR);
-        bytesread -= matvar->z->avail_in;
-        matvar->z->avail_in = 0;
-    }
-
-    return bytesread;
-}
-
-/** @brief Inflates the data's type
- *
- * buf must hold at least 4 bytes
- * @ingroup mat_internal
- * @param mat Pointer to the MAT file
- * @param matvar Pointer to the MAT variable
- * @param buf Pointer to store the data type 
- * @return Number of bytes read from the file
- */
-int
-InflateDataType(mat_t *mat, z_stream *z, void *buf)
-{
-    mat_uint8_t comp_buf[32];
-    int     bytesread = 0, err;
-
-    if ( buf == NULL )
-        return 0;
-
-    if ( !z->avail_in ) {
-        z->avail_in = 1;
-        z->next_in = comp_buf;
-        bytesread += fread(comp_buf,1,1,mat->fp);
-    }
-    z->avail_out = 4;
-    z->next_out = buf;
-    err = inflate(z,Z_NO_FLUSH);
-    if ( err != Z_OK ) {
-        Mat_Critical("InflateDataType: inflate returned %d",err);
-        return bytesread;
-    }
-    while ( z->avail_out && !z->avail_in ) {
-        z->avail_in = 1;
-        z->next_in = comp_buf;
-        bytesread += fread(comp_buf,1,1,mat->fp);
-        err = inflate(z,Z_NO_FLUSH);
-        if ( err != Z_OK ) {
-            Mat_Critical("InflateDataType: inflate returned %d",err);
-            return bytesread;
-        }
-    }
-
-    if ( z->avail_in ) {
-        fseek(mat->fp,-(int)z->avail_in,SEEK_CUR);
-        bytesread -= z->avail_in;
-        z->avail_in = 0;
-    }
-
-    return bytesread;
-}
-
-/** @brief Inflates the data
- *
- * buf must hold at least @c nBytes bytes
- * @ingroup mat_internal
- * @param mat Pointer to the MAT file
- * @param z zlib compression stream
- * @param buf Pointer to store the data type 
- * @param nBytes Number of bytes to inflate
- * @return Number of bytes read from the file
- */
-int
-InflateData(mat_t *mat, z_stream *z, void *buf, int nBytes)
-{
-    mat_uint8_t comp_buf[1024];
-    int     bytesread = 0, err;
-
-    if ( buf == NULL )
-        return 0;
-    if ( nBytes < 1 ) {
-        Mat_Critical("InflateData: nBytes must be > 0");
-        return bytesread;
-    }
-
-    if ( !z->avail_in ) {
-        if ( nBytes > 1024 ) {
-            z->avail_in = fread(comp_buf,1,1024,mat->fp);
-            bytesread += z->avail_in;
-            z->next_in = comp_buf;
-        } else {
-            z->avail_in = fread(comp_buf,1,nBytes,mat->fp);
-            bytesread  += z->avail_in;
-            z->next_in  = comp_buf;
-        }
-    }
-    z->avail_out = nBytes;
-    z->next_out = buf;
-    err = inflate(z,Z_FULL_FLUSH);
-    if ( err == Z_STREAM_END ) {
-        return bytesread;
-    } else if ( err != Z_OK ) {
-        Mat_Critical("InflateData: inflate returned %d",err);
-        return bytesread;
-    }
-    while ( z->avail_out && !z->avail_in ) {
-        if ( (nBytes-bytesread) > 1024 ) {
-            z->avail_in = fread(comp_buf,1,1024,mat->fp);
-            bytesread += z->avail_in;
-            z->next_in = comp_buf;
-        } else if ( (nBytes-bytesread) < 1 ) { /* Read a byte at a time */
-            z->avail_in = fread(comp_buf,1,1,mat->fp);
-            bytesread  += z->avail_in;
-            z->next_in  = comp_buf;
-        } else {
-            z->avail_in = fread(comp_buf,1,nBytes,mat->fp);
-            bytesread  += z->avail_in;
-            z->next_in  = comp_buf;
-        }
-        err = inflate(z,Z_FULL_FLUSH);
-        if ( err == Z_STREAM_END ) {
-            break;
-        } else if ( err != Z_OK && err != Z_BUF_ERROR ) {
-            Mat_Critical("InflateData: inflate returned %d",err);
-            break;
-        }
-    }
-
-    if ( z->avail_in ) {
-        long offset = -(long)z->avail_in;
-        fseek(mat->fp,offset,SEEK_CUR);
-        bytesread -= z->avail_in;
-        z->avail_in = 0;
-    }
-
-    return bytesread;
-}
-
-/** @brief Inflates the structure's fieldname length
- *
- * buf must hold at least 8 bytes
- * @ingroup mat_internal
- * @param mat Pointer to the MAT file
- * @param matvar Pointer to the MAT variable
- * @param buf Pointer to store the fieldname length 
- * @return Number of bytes read from the file
- */
-int
-InflateFieldNameLength(mat_t *mat, matvar_t *matvar, void *buf)
-{
-    mat_uint8_t comp_buf[32];
-    int     bytesread = 0, err;
-
-    if ( buf == NULL )
-        return 0;
-
-    if ( !matvar->z->avail_in ) {
-        matvar->z->avail_in = 1;
-        matvar->z->next_in = comp_buf;
-        bytesread += fread(comp_buf,1,1,mat->fp);
-    }
-    matvar->z->avail_out = 8;
-    matvar->z->next_out = buf;
-    err = inflate(matvar->z,Z_NO_FLUSH);
-    if ( err != Z_OK ) {
-        Mat_Critical("InflateFieldNameLength: inflate returned %d",err);
-        return bytesread;
-    }
-    while ( matvar->z->avail_out && !matvar->z->avail_in ) {
-        matvar->z->avail_in = 1;
-        matvar->z->next_in = comp_buf;
-        bytesread += fread(comp_buf,1,1,mat->fp);
-        err = inflate(matvar->z,Z_NO_FLUSH);
-        if ( err != Z_OK ) {
-            Mat_Critical("InflateFieldNameLength: inflate returned %d",err);
-            return bytesread;
-        }
-    }
-
-    if ( matvar->z->avail_in ) {
-        fseek(mat->fp,-(int)matvar->z->avail_in,SEEK_CUR);
-        bytesread -= matvar->z->avail_in;
-        matvar->z->avail_in = 0;
-    }
-
-    return bytesread;
-}
-
-/** @brief Inflates the structure's fieldname tag
- *
- * buf must hold at least 8 bytes
- * @ingroup mat_internal
- * @param mat Pointer to the MAT file
- * @param matvar Pointer to the MAT variable
- * @param buf Pointer to store the fieldname tag 
- * @return Number of bytes read from the file
- */
-int
-InflateFieldNamesTag(mat_t *mat, matvar_t *matvar, void *buf)
-{
-    mat_uint8_t comp_buf[32];
-    int     bytesread = 0, err;
-
-    if ( buf == NULL )
-        return 0;
-
-    if ( !matvar->z->avail_in ) {
-        matvar->z->avail_in = 1;
-        matvar->z->next_in = comp_buf;
-        bytesread += fread(comp_buf,1,1,mat->fp);
-    }
-    matvar->z->avail_out = 8;
-    matvar->z->next_out = buf;
-    err = inflate(matvar->z,Z_NO_FLUSH);
-    if ( err != Z_OK ) {
-        Mat_Critical("InflateFieldNamesTag: inflate returned %d",err);
-        return bytesread;
-    }
-    while ( matvar->z->avail_out && !matvar->z->avail_in ) {
-        matvar->z->avail_in = 1;
-        matvar->z->next_in = comp_buf;
-        bytesread += fread(comp_buf,1,1,mat->fp);
-        err = inflate(matvar->z,Z_NO_FLUSH);
-        if ( err != Z_OK ) {
-            Mat_Critical("InflateFieldNamesTag: inflate returned %d",err);
-            return bytesread;
-        }
-    }
-
-    if ( matvar->z->avail_in ) {
-        fseek(mat->fp,-(int)matvar->z->avail_in,SEEK_CUR);
-        bytesread -= matvar->z->avail_in;
-        matvar->z->avail_in = 0;
-    }
-
-    return bytesread;
-}
-
-/*
- * Inflates the structure's fieldname length.  buf must hold at least
- * nfields*fieldname_length bytes
- */
-/** @brief Inflates the structure's fieldnames
- *
- * buf must hold at least @c nfields * @c fieldname_length bytes
- * @ingroup mat_internal
- * @param mat Pointer to the MAT file
- * @param matvar Pointer to the MAT variable
- * @param buf Pointer to store the fieldnames 
- * @param nfields Number of fields
- * @param fieldname_length Maximum length in bytes of each field
- * @param padding Number of padding bytes
- * @return Number of bytes read from the file
- */
-int
-InflateFieldNames(mat_t *mat,matvar_t *matvar,void *buf,int nfields,
-                  int fieldname_length,int padding)
-{
-    mat_uint8_t comp_buf[32];
-    int     bytesread = 0, err;
-
-    if ( buf == NULL )
-        return 0;
-
-    if ( !matvar->z->avail_in ) {
-        matvar->z->avail_in = 1;
-        matvar->z->next_in = comp_buf;
-        bytesread += fread(comp_buf,1,1,mat->fp);
-    }
-    matvar->z->avail_out = nfields*fieldname_length+padding;
-    matvar->z->next_out = buf;
-    err = inflate(matvar->z,Z_NO_FLUSH);
-    if ( err != Z_OK ) {
-        Mat_Critical("InflateFieldNames: inflate returned %d",err);
-        return bytesread;
-    }
-    while ( matvar->z->avail_out && !matvar->z->avail_in ) {
-        matvar->z->avail_in = 1;
-        matvar->z->next_in = comp_buf;
-        bytesread += fread(comp_buf,1,1,mat->fp);
-        err = inflate(matvar->z,Z_NO_FLUSH);
-        if ( err != Z_OK ) {
-            Mat_Critical("InflateFieldNames: inflate returned %d",err);
-            return bytesread;
-        }
-    }
-
-    if ( matvar->z->avail_in ) {
-        fseek(mat->fp,-(int)matvar->z->avail_in,SEEK_CUR);
-        bytesread -= matvar->z->avail_in;
-        matvar->z->avail_in = 0;
-    }
-
-    return bytesread;
-}

+ 0 - 423
matlabAccess/matio/src/io.c

@@ -1,423 +0,0 @@
-/** @file io.c
- * MAT I/O Functions
- * @ingroup MAT
- */
-/*
- * Copyright (C) 2005-2006   Christopher C. Hulbert
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public
- *  License as published by the Free Software Foundation; either
- *  version 2.1 of the License, or (at your option) any later version.
- *
- *  This library is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this library; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#include <stdlib.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <string.h>
-#include "matio.h"
-
-#if !defined(HAVE_VA_COPY) && defined(HAVE___VA_COPY)
-#    define va_copy(d,s) __va_copy(d,s)
-#elif !defined(HAVE_VA_COPY)
-#    define va_copy(d,s) memcpy(&(d),&(s),sizeof(va_list))
-#endif
-#ifndef HAVE_VSNPRINTF
-#    define vsnprintf mat_vsnprintf
-#    ifdef  __cplusplus
-         extern "C" int vsnprintf(char *,size_t,const char *,va_list);
-#    else
-         extern int vsnprintf(char *,size_t,const char *,va_list);
-#    endif
-#endif
-#ifndef HAVE_SNPRINTF
-#    define snprintf mat_snprintf
-#    ifdef  __cplusplus
-         extern "C" int snprintf(char *str,size_t size,const char *format,...);
-#    else
-         extern int snprintf(char *str,size_t size,const char *format,...);
-#    endif
-#endif
-#ifndef HAVE_VASPRINTF
-#    define vasprintf mat_vasprintf
-#endif
-#ifndef HAVE_ASPRINTF
-#    define asprintf mat_asprintf
-#endif
-
-/** @cond 0 */
-#define LOG_LEVEL_ERROR    1
-#define LOG_LEVEL_CRITICAL 1 << 1
-#define LOG_LEVEL_WARNING  1 << 2
-#define LOG_LEVEL_MESSAGE  1 << 3
-#define LOG_LEVEL_DEBUG    1 << 4
-/** @endif */
-
-static void (*logfunc)(int log_level, char *message ) = NULL;
-static char *progname = NULL;
-
-/** @brief Allocates and prints to a new string
- *
- * @param format format string
- * @param ap variable argument list
- * @return Newly allocated string with format printed to it
- */
-char *
-strdup_vprintf(const char* format, va_list ap)
-{
-  va_list ap2;
-  int size;
-  char* buffer;
-
-  va_copy(ap2, ap);
-  size = vsnprintf(NULL, 0, format, ap2)+1;
-  va_end(ap2);
-
-  buffer = malloc(size+1);
-  if ( !buffer )
-      return NULL;
-
-  vsnprintf(buffer, size, format, ap);
-  return buffer;
-}
-
-char *
-strdup_printf(const char* format, ...)
-{
-  char* buffer;
-  va_list ap;
-  va_start(ap, format);
-  buffer = strdup_vprintf(format, ap);
-  va_end(ap);
-  return buffer;
-}
-
-static void
-matio_error_func( int log_level, char *message )
-{
-
-    if ( progname ) {
-        if ( log_level & LOG_LEVEL_CRITICAL) {
-            fprintf(stderr,"-E- %s: %s\n", progname, message);
-            fflush(stderr);
-        } else if ( log_level & LOG_LEVEL_ERROR ) {
-            fprintf(stderr,"-E- %s: %s\n", progname, message);
-            fflush(stderr);
-            abort();
-        } else if ( log_level & LOG_LEVEL_WARNING ) {
-            fprintf(stderr,"-W- %s: %s\n", progname, message);
-            fflush(stderr);
-        } else if ( log_level & LOG_LEVEL_DEBUG ) {
-            fprintf(stderr,"-D- %s: %s\n", progname, message);
-            fflush(stderr);
-        } else if ( log_level & LOG_LEVEL_MESSAGE ) {
-            fprintf(stdout,"%s\n", message);
-            fflush(stdout);
-        }
-    } else {
-        if ( log_level & LOG_LEVEL_CRITICAL) {
-            fprintf(stderr,"-E- : %s\n", message);
-            fflush(stderr);
-        } else if ( log_level & LOG_LEVEL_ERROR ) {
-            fprintf(stderr,"-E- : %s\n", message);
-            fflush(stderr);
-            abort();
-        } else if ( log_level & LOG_LEVEL_WARNING ) {
-            fprintf(stderr,"-W- : %s\n", message);
-            fflush(stderr);
-        } else if ( log_level & LOG_LEVEL_DEBUG ) {
-            fprintf(stderr,"-D- : %s\n", message);
-            fflush(stderr);
-        } else if ( log_level & LOG_LEVEL_MESSAGE ) {
-            fprintf(stdout,"%s\n", message);
-            fflush(stdout);
-        }
-    }
-
-}
-
-static void
-scats_log(int loglevel, const char *format, va_list ap)
-{
-    char* buffer;
-
-    if ( !logfunc ) return;
-    buffer = strdup_vprintf(format, ap);
-    (*logfunc)(loglevel,buffer);
-    free(buffer);
-    return;
-}
-
-
-/** @var debug
- *  @brief holds the verbose level set in @ref SetVerbose
- *  This variable is used to determine if information should be printed to
- *  the screen
- *  @ingroup libscatsio
- */
-static int debug = 0;
-
-/** @var verbose
- *  @brief holds the verbose level set in @ref SetVerbose
- *  This variable is used to determine if information should be printed to
- *  the screen
- *  @ingroup libscatsio
- */
-static int verbose = 0;
-/** @var silent
- *  @brief holds the silent level set in @ref SetVerbose
- *  If set, all output which is not an error is not displayed regardless
- *  of verbose level
- *  @ingroup libscatsio
- */
-static int silent = 0;
-/** @brief Sets verbose parameters
- *
- *  Sets the verbose level and silent level.  These values are used by
- *  programs to determine what information should be printed to the screen
- *  @ingroup libscatsio
- *  @param verb sets logging verbosity level
- *  @param s sets logging silent level
- */
-int Mat_SetVerbose( int verb, int s )
-{
-
-    verbose = verb;
-    silent  = s;
-
-    return 0;
-}
-
-/** @brief Sets verbose parameters
- *
- *  Sets the verbose level and silent level.  These values are used by
- *  programs to determine what information should be printed to the screen
- *  @ingroup libscatsio
- *  @param verb sets logging verbosity level
- *  @param s sets logging silent level
- */
-int Mat_SetDebug( int d )
-{
-    debug = d;
-    return 0;
-}
-
-/** @brief Log a message unless silent
- *
- * Logs the message unless the silent option is set (See @ref SetVerbose).
- * To log a message based on the verbose level, use @ref Mat_VerbMessage
- * @ingroup libscatsio
- * @param format message format
- */
-int Mat_Message( const char *format, ... )
-{
-    va_list ap;
-
-    if ( silent ) return 0;
-    if ( !logfunc ) return 0;
-
-    va_start(ap, format );
-    scats_log(LOG_LEVEL_MESSAGE, format, ap );
-    va_end(ap);
-    return 0;
-}
-
-/** @brief Log a message based on verbose level
- *
- *  If @e level is less than or equal to the set verbose level, the message
- *  is printed.  If the level is higher than the set verbose level nothing
- *  is displayed.
- *  @ingroup libscatsio
- *  @param level verbose level
- *  @param format message format
- */
-int Mat_DebugMessage( int level, const char *format, ... )
-{
-    va_list ap;
-
-    if ( silent ) return 0;
-    if ( level > debug ) return 0;
-
-    va_start(ap, format );
-    scats_log(LOG_LEVEL_DEBUG, format, ap );
-    va_end(ap);
-    return 0;
-}
-
-/** @brief Log a message based on verbose level
- *
- *  If @e level is less than or equal to the set verbose level, the message
- *  is printed.  If the level is higher than the set verbose level nothing
- *  is displayed.
- *  @ingroup libscatsio
- *  @param level verbose level
- *  @param format message format
- */
-int Mat_VerbMessage( int level, const char *format, ... )
-{
-    va_list ap;
-
-    if ( silent ) return 0;
-    if ( level > verbose ) return 0;
-
-    va_start(ap, format );
-    scats_log(LOG_LEVEL_MESSAGE, format, ap );
-    va_end(ap);
-    return 0;
-}
-
-/** @brief Logs a Critical message and returns to the user
- *
- * Logs a Critical message and returns to the user.  If the program should
- * stop running, use @ref Mat_Error
- * @ingroup libscatsio
- * @param format format string identical to printf format
- * @param ... arguments to the format string
- */
-void Mat_Critical( const char *format, ... )
-{
-    va_list ap;
-
-    va_start(ap, format );
-    scats_log(LOG_LEVEL_CRITICAL, format, ap );
-    va_end(ap);
-}
-
-/** @brief Logs a Critical message and aborts the program
- *
- * Logs an Error message and aborts
- * @ingroup libscatsio
- * @param format format string identical to printf format
- * @param ... arguments to the format string
- */
-void Mat_Error( const char *format, ... )
-{
-    va_list ap;
-
-    va_start(ap, format );
-    scats_log( LOG_LEVEL_ERROR, format, ap );
-    va_end(ap);
-}
-
-/** @brief Prints a helpstring to stdout and exits with status 1
- *
- * Prints the array of strings to stdout and exits with status 1.  The array
- * of strings should have NULL as its last element
- * @code
- * char *helpstr[] = {"My Help string line1","My help string line 2",NULL};
- * Mat_Help(helpstr);
- * @endcode
- * @ingroup libscatsio
- * @param helpstr array of strings with NULL as its last element
- */
-void Mat_Help( const char *helpstr[] )
-{
-    int i;
-    for (i = 0; helpstr[i] != NULL; i++)
-        printf("%s\n",helpstr[i]);
-    exit(EXIT_SUCCESS);
-}
-
-/** @brief Closes the logging system
- *
- * @retval 1
- */
-int
-Mat_LogClose( )
-{
-    logfunc = NULL;
-    return 1;
-}
-
-/** @brief Intializes the logging system
- *
- * @ingroup libscatsio
- * @param prog_name Name of the program initializing the logging functions
- * @return 0 on success
- */
-int
-Mat_LogInit( char *prog_name )
-{
-    logfunc = &matio_error_func;
-
-    verbose = 0;
-    silent  = 0;
-
-    return 0;
-}
-
-/** @brief Intializes the logging system
- *
- * @ingroup libscatsio
- * @param prog_name Name of the program initializing the logging functions
- * @param log_func pointer to the function to do the logging
- * @return 0 on success
- */
-int
-Mat_LogInitFunc(char *prog_name,void (*log_func)(int log_level,char *message))
-{
-    logfunc = log_func;
-    progname = prog_name;
-
-    verbose = 0;
-    silent  = 0;
-    return 0;
-}
-
-/** @brief Prints a warning message to stdout
- *
- * Logs a warning message then returns
- * @ingroup libscatsio
- * @param format format string identical to printf format
- * @param ... arguments to the format string
- */
-void Mat_Warning( const char *format, ... )
-{
-    va_list ap;
-
-    va_start(ap, format );
-    scats_log(LOG_LEVEL_WARNING, format, ap );
-    va_end(ap);
-}
-
-size_t
-Mat_SizeOf(int data_type)
-{
-    switch (data_type) {
-        case MAT_T_DOUBLE:
-            return sizeof(double);
-        case MAT_T_SINGLE:
-            return sizeof(float);
-#ifdef HAVE_MAT_INT64_T
-        case MAT_T_INT64:
-            return sizeof(mat_int64_t);
-#endif
-#ifdef HAVE_MAT_INT64_T
-        case MAT_T_UINT64:
-            return sizeof(mat_uint64_t);
-#endif
-        case MAT_T_INT32:
-            return sizeof(mat_int32_t);
-        case MAT_T_UINT32:
-            return sizeof(mat_uint32_t);
-        case MAT_T_INT16:
-            return sizeof(mat_int16_t);
-        case MAT_T_UINT16:
-            return sizeof(mat_uint16_t);
-        case MAT_T_INT8:
-            return sizeof(mat_int8_t);
-        case MAT_T_UINT8:
-            return sizeof(mat_uint8_t);
-        default:
-            return 0;
-    }
-}

+ 0 - 1932
matlabAccess/matio/src/mat.c

@@ -1,1932 +0,0 @@
-/** @file mat.c
- * Matlab MAT version 5 file functions
- * @ingroup MAT
- */
-/*
- * Copyright (C) 2005-2006   Christopher C. Hulbert
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public
- *  License as published by the Free Software Foundation; either
- *  version 2.1 of the License, or (at your option) any later version.
- *
- *  This library is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this library; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-/* FIXME: Implement Unicode support */
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <math.h>
-#include <time.h>
-#include "matio.h"
-#include "mat5.h"
-#include "mat4.h"
-#include "matio_private.h"
-
-static void
-ReadData(mat_t *mat, matvar_t *matvar)
-{
-    if ( mat == NULL || matvar == NULL || mat->fp == NULL )
-        return;
-    else if ( mat->version != MAT_FT_MAT4 )
-        Read5(mat,matvar);
-    else if ( mat->version == MAT_FT_MAT4 )
-        Read4(mat,matvar);
-    return;
-}
-
-/*
- *====================================================================
- *                 Public Functions
- *====================================================================
- */
-
-/** @brief Creates a new Matlab MAT file
- *
- * Tries to create a new Matlab MAT file with the given name and optional
- * header string.  If no header string is given, the default string
- * is used containing the software, version, and date in it.  If a header
- * string is given, at most the first 116 characters is written to the file.
- * The given header string need not be the full 116 characters, but MUST be
- * NULL terminated.
- * @ingroup MAT
- * @param matname Name of MAT file to create
- * @param hdr_str Optional header string, NULL to use default
- * @return A pointer to the MAT file or NULL if it failed.  This is not a
- * simple FILE * and should not be used as one.
- */
-mat_t *
-Mat_Create(const char *matname,const char *hdr_str)
-{
-    FILE *fp = NULL;
-    mat_int16_t endian = 0, version;
-    mat_t *mat = NULL;
-    size_t err;
-    time_t t;
-
-    fp = fopen(matname,"wb");
-    if ( !fp )
-        return NULL;
-
-    mat = malloc(sizeof(*mat));
-    if ( !mat ) {
-        fclose(fp);
-        return NULL;
-    }
-
-    mat->fp            = NULL;
-    mat->header        = NULL;
-    mat->subsys_offset = NULL;
-    mat->filename      = NULL;
-    mat->version       = 0;
-    mat->byteswap      = 0;
-    mat->mode          = 0;
-    mat->bof           = 0;
-
-    t = time(NULL);
-    mat->fp = fp;
-    mat->filename = strdup_printf("%s",matname);
-    mat->mode     = MAT_ACC_RDWR;
-    mat->byteswap = 0;
-    mat->header   = calloc(1,128);
-    mat->subsys_offset = calloc(1,16);
-    memset(mat->header,' ',128);
-    if ( hdr_str == NULL ) {
-        err = mat_snprintf(mat->header,116,"MATLAB 5.0 MAT-file, Platform: %s, "
-                "Created By: libmatio v%d.%d.%d on %s", MATIO_PLATFORM,
-                MATIO_MAJOR_VERSION, MATIO_MINOR_VERSION, MATIO_RELEASE_LEVEL,
-                ctime(&t));
-        mat->header[115] = '\0';    /* Just to make sure it's NULL terminated */
-    } else {
-        err = mat_snprintf(mat->header,116,"%s",hdr_str);
-    }
-    mat->header[err] = ' ';
-    mat_snprintf(mat->subsys_offset,15,"            ");
-    mat->version = (int)0x0100;
-    endian = 0x4d49;
-
-    version = 0x0100;
-
-    err = fwrite(mat->header,1,116,mat->fp);
-    err = fwrite(mat->subsys_offset,1,8,mat->fp);
-    err = fwrite(&version,2,1,mat->fp);
-    err = fwrite(&endian,2,1,mat->fp);
-
-    return mat;
-}
-
-/** @brief Opens an existing Matlab MAT file
- *
- * Tries to open a Matlab MAT file with the given name
- * @ingroup MAT
- * @param matname Name of MAT file to open
- * @param mode File access mode (MAT_ACC_RDONLY,MAT_ACC_RDWR,etc).
- * @return A pointer to the MAT file or NULL if it failed.  This is not a
- * simple FILE * and should not be used as one.
- */
-mat_t *
-Mat_Open(const char *matname,int mode)
-{
-    FILE *fp = NULL;
-    mat_int16_t tmp, tmp2;
-    int     err;
-    mat_t *mat = NULL;
-
-    if ( (mode & 0x000000ff) == MAT_ACC_RDONLY ) {
-        fp = fopen( matname, "rb" );
-        if ( !fp )
-            return NULL;
-    } else if ( (mode & 0x000000ff) == MAT_ACC_RDWR ) {
-        fp = fopen( matname, "r+b" );
-        if ( !fp ) {
-            mat = Mat_Create(matname,NULL);
-            return mat;
-        }
-    } else {
-        mat = Mat_Create(matname,NULL);
-        return mat;
-    }
-
-    mat = malloc(sizeof(mat_t));
-    if ( !mat ) {
-        Mat_Critical("Couldn't allocate memory for the MAT file");
-        fclose(fp);
-        return NULL;
-    }
-
-    mat->fp = fp;
-    if ( mode & MAT_FT_MAT4 ) {
-        mat->header        = NULL;
-        mat->subsys_offset = NULL;
-        mat->version       = MAT_FT_MAT4;
-        mat->byteswap      = 0;
-        mat->mode          = mode;
-        mat->filename = strdup_printf("%s",matname);
-        mat->bof           = ftell(mat->fp);
-    } else {
-        mat->header        = malloc(128);
-        mat->subsys_offset = malloc(8);
-        mat->filename      = NULL;
-
-        err = fread(mat->header,1,116,fp);
-        mat->header[116] = '\0';
-        err = fread(mat->subsys_offset,1,8,fp);
-        err = fread(&tmp2,2,1,fp);
-        fread (&tmp,1,2,fp);
-        mat->bof = ftell(mat->fp);
-
-        mat->byteswap = -1;
-        if (tmp == 0x4d49)
-            mat->byteswap = 0;
-        else if (tmp == 0x494d) {
-            mat->byteswap = 1;
-            Mat_int16Swap(&tmp2);
-        }
-        mat->version = (int)tmp2;
-
-        if ( mat->byteswap < 0 ) {
-            Mat_Critical("%s does not seem to be a valid MAT file",matname);
-            Mat_Close(mat);
-            mat=NULL;
-        } else if ( mat->version != 0x0100 ) {
-            Mat_Critical("%s is not a version 5 MAT file", matname);
-            Mat_Close(mat);
-            mat=NULL;
-        } else {
-            mat->filename = strdup_printf("%s",matname);
-            mat->mode = mode;
-        }
-    }
-
-    return mat;
-}
-
-/** @brief Closes an open Matlab MAT file
- *
- * Closes the given Matlab MAT file and frees any memory with it.
- * @ingroup MAT
- * @param mat Pointer to the MAT file
- * @retval 0
- */
-int
-Mat_Close( mat_t *mat )
-{
-    if ( NULL != mat ) {
-        if ( mat->fp )
-            fclose(mat->fp);
-        if ( mat->header )
-            free(mat->header);
-        if ( mat->subsys_offset )
-            free(mat->subsys_offset);
-        if ( mat->filename )
-            free(mat->filename);
-        free(mat);
-    }
-    return 0;
-}
-
-/** @brief Rewinds a Matlab MAT file to the first variable
- *
- * Rewinds a Matlab MAT file to the first variable
- * @ingroup MAT
- * @param mat Pointer to the MAT file
- * @retval 0 on success
- */
-int
-Mat_Rewind( mat_t *mat )
-{
-    if ( mat->version != MAT_FT_MAT4 )
-        fseek(mat->fp,128L,SEEK_SET);
-    else
-        fseek(mat->fp,0L,SEEK_SET);
-    return 0;
-}
-
-/** @brief Returns the size of a Matlab Class
- *
- * Returns the size (in bytes) of the matlab class class_type
- * @ingroup MAT
- * @param class_type Matlab class type (MAT_C_*)
- * @returns Size of the class
- */
-size_t
-Mat_SizeOfClass(int class_type)
-{
-    switch (class_type) {
-        case MAT_C_DOUBLE:
-            return sizeof(double);
-        case MAT_C_SINGLE:
-            return sizeof(float);
-#ifdef HAVE_MAT_INT64_T
-        case MAT_C_INT64:
-            return sizeof(mat_int64_t);
-#endif
-#ifdef HAVE_MAT_UINT64_T
-        case MAT_C_UINT64:
-            return sizeof(mat_uint64_t);
-#endif
-        case MAT_C_INT32:
-            return sizeof(mat_int32_t);
-        case MAT_C_UINT32:
-            return sizeof(mat_uint32_t);
-        case MAT_C_INT16:
-            return sizeof(mat_int16_t);
-        case MAT_C_UINT16:
-            return sizeof(mat_uint16_t);
-        case MAT_C_INT8:
-            return sizeof(mat_int8_t);
-        case MAT_C_UINT8:
-            return sizeof(mat_uint8_t);
-        case MAT_C_CHAR:
-            return sizeof(mat_int16_t);
-        default:
-            return 0;
-    }
-}
-
-/*
- *===================================================================
- *    MAT Variable Functions
- *===================================================================
- */
-
-/** @brief Allocates memory for a new matvar_t and initializes all the fields
- *
- * @ingroup MAT
- * @return A newly allocated matvar_t
- */
-matvar_t *
-Mat_VarCalloc(void)
-{
-    matvar_t *matvar;
-
-    matvar = malloc(sizeof(*matvar));
-
-    if ( NULL != matvar ) {
-        matvar->nbytes       = 0;
-        matvar->rank         = 0;
-        matvar->data_type    = 0;
-        matvar->data_size    = 0;
-        matvar->class_type   = 0;
-        matvar->isComplex    = 0;
-        matvar->isGlobal     = 0;
-        matvar->isLogical    = 0;
-        matvar->dims         = NULL;
-        matvar->name         = NULL;
-        matvar->data         = NULL;
-        matvar->mem_conserve = 0;
-        matvar->compression  = 0;
-        matvar->fpos         = 0;
-        matvar->datapos      = 0;
-        matvar->fp           = NULL;
-#if defined(HAVE_ZLIB)
-        matvar->z            = NULL;
-#endif
-    }
-
-    return matvar;
-}
-
-/** @brief Creates a MAT Variable with the given name and (optionally) data
- *
- * Creates a MAT variable that can be written to a Matlab MAT file with the
- * given name, data type, dimensions and data.  Rank should always be 2 or more.
- * i.e. Scalar values would have rank=2 and dims[2] = {1,1}.  Data type is
- * one of the MAT_T types.  MAT adds MAT_T_STRUCT and MAT_T_CELL to create
- * Structures and Cell Arrays respectively.  For MAT_T_STRUCT, data should be a
- * NULL terminated array of matvar_t * variables (i.e. for a 3x2 structure with
- * 10 fields, there should be 61 matvar_t * variables where the last one is
- * NULL).  For cell arrays, the NULL termination isn't necessary.  So to create
- * a cell array of size 3x2, data would be the address of an array of 6
- * matvar_t * variables.
- *
- * EXAMPLE:
- *   To create a struct of size 3x2 with 3 fields:
- * @code
- *     int rank=2, dims[2] = {3,2}, nfields = 3;
- *     matvar_t **vars;
- *
- *     vars = malloc((3*2*nfields+1)*sizeof(matvar_t *));
- *     vars[0]             = Mat_VarCreate(...);
- *        :
- *     vars[3*2*nfields-1] = Mat_VarCreate(...);
- *     vars[3*2*nfields]   = NULL;
- * @endcode
- *
- * EXAMPLE:
- *   To create a cell array of size 3x2:
- * @code
- *     int rank=2, dims[2] = {3,2};
- *     matvar_t **vars;
- *
- *     vars = malloc(3*2*sizeof(matvar_t *));
- *     vars[0]             = Mat_VarCreate(...);
- *        :
- *     vars[5] = Mat_VarCreate(...);
- * @endcode
- *
- * @ingroup MAT
- * @param name Name of the variable to create
- * @param class_type class type of the variable in Matlab(one of the mx Classes)
- * @param data_type data type of the variable (one of the MAT_T_ Types)
- * @param rank Rank of the variable
- * @param dims array of dimensions of the variable of size rank
- * @param data pointer to the data
- * @param opt 0, or bitwise or of the following options:
- * - MEM_CONSERVE to just use the pointer to the data and not copy the data
- *       itself.  Note that the pointer should not be freed until you are done
- *       with the mat variable.  The Mat_VarFree function will NOT free
- *       data that was created with MEM_CONSERVE, so free it yourself.
- * - MAT_F_COMPLEX to specify that the data is complex.  The data variable should
- *       be a contigouse piece of memory with the real part written first and
- *       the imaginary second
- * - MAT_F_GLOBAL to assign the variable as a global variable
- * - MAT_F_LOGICAL to specify that it is a logical variable
- * @return A MAT variable that can be written to a file or otherwise used
- */
-matvar_t *
-Mat_VarCreate(const char *name,int class_type,int data_type,int rank,int *dims,
-      void *data,int opt)
-{
-    int i, nmemb = 1, nfields = 0;
-    matvar_t *matvar = NULL;
-
-    if (dims == NULL) return NULL;
-
-    matvar = Mat_VarCalloc();
-    if ( NULL == matvar )
-        return NULL;
-
-    matvar->compression = COMPRESSION_NONE;
-    matvar->isComplex   = opt & MAT_F_COMPLEX;
-    matvar->isGlobal    = opt & MAT_F_GLOBAL;
-    matvar->isLogical   = opt & MAT_F_LOGICAL;
-    if ( name )
-        matvar->name = strdup_printf("%s",name);
-    matvar->rank = rank;
-    matvar->dims = malloc(matvar->rank*sizeof(int));
-    for ( i = 0; i < matvar->rank; i++ ) {
-        matvar->dims[i] = dims[i];
-        nmemb *= dims[i];
-    }
-    matvar->class_type = class_type;
-    matvar->data_type  = data_type;
-    switch ( data_type ) {
-        case MAT_T_INT8:
-            matvar->data_size = 1;
-            break;
-        case MAT_T_UINT8:
-            matvar->data_size = 1;
-            break;
-        case MAT_T_INT16:
-            matvar->data_size = 2;
-            break;
-        case MAT_T_UINT16:
-            matvar->data_size = 2;
-            break;
-        case MAT_T_INT64:
-            matvar->data_size = 8;
-            break;
-        case MAT_T_UINT64:
-            matvar->data_size = 8;
-            break;
-        case MAT_T_INT32:
-            matvar->data_size = 4;
-            break;
-        case MAT_T_UINT32:
-            matvar->data_size = 4;
-            break;
-        case MAT_T_SINGLE:
-            matvar->data_size = sizeof(float);
-            break;
-        case MAT_T_DOUBLE:
-            matvar->data_size = sizeof(double);
-            break;
-        case MAT_T_UTF8:
-            matvar->data_size = 1;
-            break;
-        case MAT_T_UTF16:
-            matvar->data_size = 2;
-            break;
-        case MAT_T_UTF32:
-            matvar->data_size = 4;
-            break;
-        case MAT_T_CELL:
-            matvar->data_size = sizeof(matvar_t **);
-            break;
-        case MAT_T_STRUCT:
-        {
-            matvar_t **fields;
-
-            if ( data == NULL )
-                break;
-            fields = data;
-            nfields = 0;
-            while ( fields[nfields] != NULL )
-                nfields++;
-            matvar->data_size = sizeof(matvar_t **);
-            nmemb = nfields; /* nfields is really nmemb*nfields */
-            break;
-        }
-        default:
-            Mat_Error("Unrecognized data_type");
-            Mat_VarFree(matvar);
-            return NULL;
-    }
-    if ( matvar->class_type == MAT_C_CHAR ) {
-#if 0
-        matvar->data_size = 1;
-        nmemb++;
-#endif
-        matvar->nbytes = nmemb*matvar->data_size;
-    } else if ( matvar->class_type == MAT_C_SPARSE ) {
-        matvar->data_size = sizeof(sparse_t);
-        matvar->nbytes = nmemb*matvar->data_size;
-    } else {
-        matvar->nbytes = nmemb*matvar->data_size;
-    }
-    if ( data == NULL ) {
-        matvar->data = NULL;
-    } else if ( opt & MEM_CONSERVE ) {
-        if ( matvar->isComplex ) {
-            matvar->data   = malloc(sizeof(struct ComplexSplit));
-            if ( NULL != data ) {
-                struct ComplexSplit *complex_data    = matvar->data;
-                struct ComplexSplit *complex_data_in = data;
-
-                *complex_data = *complex_data_in;
-            }
-        } else {
-            matvar->data         = (void*)data;
-        }
-        matvar->mem_conserve = 1;
-    } else {
-        if ( matvar->isComplex ) {
-            matvar->data   = malloc(sizeof(struct ComplexSplit));
-            if ( NULL != matvar->data ) {
-                struct ComplexSplit *complex_data    = matvar->data;
-                struct ComplexSplit *complex_data_in = data;
-
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                if ( NULL != complex_data->Re )
-                    memcpy(complex_data->Re,complex_data_in->Re,matvar->nbytes);
-                if ( NULL != complex_data->Im )
-                    memcpy(complex_data->Im,complex_data_in->Im,matvar->nbytes);
-            }
-        } else {
-            matvar->data   = malloc(matvar->nbytes);
-            if ( NULL != matvar->data )
-                memcpy(matvar->data,data,matvar->nbytes);
-        }
-        matvar->mem_conserve = 0;
-    }
-
-    return matvar;
-}
-
-/** @brief Deletes a variable from a file
- *
- * @ingroup MAT
- * @param mat Pointer to the mat_t file structure
- * @param name Name of the variable to delete
- * @returns 0 on success
- */
-int
-Mat_VarDelete(mat_t *mat, char *name)
-{
-    int   err = 1;
-    char *tmp_name, *new_name, *temp;
-    mat_t *tmp;
-    matvar_t *matvar;
-
-    temp     = strdup_printf("XXXXXX");
-    tmp_name = mktemp(temp);
-    tmp      = Mat_Create(tmp_name,mat->header);
-    if ( tmp != NULL ) {
-        while ( NULL != (matvar = Mat_VarReadNext(mat)) ) {
-            if ( strcmp(matvar->name,name) )
-                Mat_VarWrite(tmp,matvar,0);
-            else
-                err = 0;
-            Mat_VarFree(matvar);
-        }
-        /* FIXME: Memory leak */
-        new_name = strdup_printf("%s",mat->filename);
-        fclose(mat->fp);
-		
-        if ( (err = remove(new_name)) == -1 ) {
-            Mat_Critical("remove of %s failed",new_name);
-        } else if ( !Mat_Close(tmp) && (err=rename(tmp_name,new_name))==-1) {
-            Mat_Critical("rename failed oldname=%s,newname=%s",tmp_name,
-                new_name);
-        } else {
-            tmp = Mat_Open(new_name,mat->mode);
-            memcpy(mat,tmp,sizeof(mat_t));
-        }
-        free(tmp);
-        free(new_name);
-    }
-    free(temp);
-    return err;
-}
-
-/** @brief Duplicates a matvar_t structure
- *
- * Provides a clean function for duplicating a matvar_t structure.
- * @ingroup MAT
- * @param in pointer to the matvar_t structure to be duplicated
- * @param opt 0 does a shallow duplicate and only assigns the data pointer to
- *            the duplicated array.  1 will do a deep duplicate and actually
- *            duplicate the contents of the data.  Warning: If you do a shallow
- *            copy and free both structures, the data will be freed twice and
- *            memory will be corrupted.  This may be fixed in a later release.
- * @returns Pointer to the duplicated matvar_t structure.
- */
-matvar_t *
-Mat_VarDuplicate(const matvar_t *in, int opt)
-{
-    matvar_t *out;
-    int i;
-
-    out = malloc(sizeof(matvar_t));
-    if ( out == NULL )
-        return NULL;
-
-    out->nbytes       = in->nbytes;
-    out->rank         = in->rank;
-    out->data_type    = in->data_type;
-    out->data_size    = in->data_size;
-    out->class_type   = in->class_type;
-    out->isComplex    = in->isComplex;
-    out->isGlobal     = in->isGlobal;
-    out->isLogical    = in->isLogical;
-    out->mem_conserve = in->mem_conserve;
-    out->compression  = in->compression;
-    out->fpos         = in->fpos;
-    out->datapos      = in->datapos;
-
-    out->name = NULL;
-    out->dims = NULL;
-    out->data = NULL;
-#if defined(HAVE_ZLIB)
-    out->z    = NULL;
-#endif
-
-    if (in->name != NULL && (NULL != (out->name = malloc(strlen(in->name)+1))))
-        memcpy(out->name,in->name,strlen(in->name)+1);
-
-    out->dims = malloc(in->rank*sizeof(int));
-    if ( out->dims != NULL )
-        memcpy(out->dims,in->dims,in->rank*sizeof(int));
-#if defined(HAVE_ZLIB)
-    if ( (in->z != NULL) && (NULL != (out->z = malloc(sizeof(z_stream)))) )
-        inflateCopy(out->z,in->z);
-#endif
-
-    if ( !opt ) {
-        out->data = in->data;
-    } else if ( (in->data != NULL) && (in->class_type == MAT_C_STRUCT) ) {
-        matvar_t **infields, **outfields;
-        int nfields = 0; 
-
-        out->data = malloc(in->nbytes);
-        if ( out->data != NULL && in->data_size > 0 ) {
-            nfields   = in->nbytes / in->data_size;
-            infields  = (matvar_t **)in->data;
-            outfields = (matvar_t **)out->data;
-            for ( i = 0; i < nfields; i++ ) {
-                outfields[i] = Mat_VarDuplicate(infields[i],opt);
-            } 
-        }
-    } else if ( (in->data != NULL) && (in->class_type == MAT_C_CELL) ) {
-        matvar_t **incells, **outcells;
-        int ncells = 0; 
-
-        out->data = malloc(in->nbytes);
-        if ( out->data != NULL && in->data_size > 0 ) {
-            ncells   = in->nbytes / in->data_size;
-            incells  = (matvar_t **)in->data;
-            outcells = (matvar_t **)out->data;
-            for ( i = 0; i < ncells; i++ ) {
-                outcells[i] = Mat_VarDuplicate(incells[i],opt);
-            } 
-        }
-    } else if ( in->data != NULL ) {
-        if ( out->isComplex ) {
-            out->data = malloc(sizeof(struct ComplexSplit));
-            if ( out->data != NULL ) {
-                struct ComplexSplit *out_data = out->data;
-                struct ComplexSplit *in_data  = in->data;
-                out_data->Re = malloc(out->nbytes);
-                if ( NULL != out_data->Re )
-                    memcpy(out_data->Re,in_data->Re,out->nbytes);
-                out_data->Im = malloc(out->nbytes);
-                if ( NULL != out_data->Im )
-                    memcpy(out_data->Im,in_data->Im,out->nbytes);
-            }
-        } else {
-            out->data = malloc(in->nbytes);
-            if ( out->data != NULL )
-                memcpy(out->data,in->data,in->nbytes);
-        }
-    }
-    return out;
-}
-
-/** @brief Frees all the allocated memory associated with the structure
- *
- * Frees memory used by a MAT variable.  Frees the data associated with a
- * MAT variable if it's non-NULL and MEM_CONSERVE was not used.
- * @ingroup MAT
- * @param matvar Pointer to the matvar_t structure
- */
-void
-Mat_VarFree(matvar_t *matvar)
-{
-    if ( !matvar )
-        return;
-    if ( matvar->dims )
-        free(matvar->dims);
-    if ( matvar->name )
-        free(matvar->name);
-    if ( (matvar->data != NULL) && (matvar->class_type == MAT_C_STRUCT || 
-          matvar->class_type == MAT_C_CELL) && matvar->data_size > 0 ) {
-        int i;
-        matvar_t **fields = matvar->data;
-        int nfields = matvar->nbytes / matvar->data_size;
-        for ( i = 0; i < nfields; i++ )
-            Mat_VarFree(fields[i]);
-        free(matvar->data);
-    } else if ( (matvar->data != NULL) && (!matvar->mem_conserve) &&
-                (matvar->class_type == MAT_C_SPARSE) ) {
-        sparse_t *sparse;
-        sparse = matvar->data;
-        if ( sparse->ir != NULL )
-            free(sparse->ir);
-        if ( sparse->jc != NULL )
-            free(sparse->jc);
-        if ( sparse->data != NULL )
-            free(sparse->data);
-        free(sparse);
-    } else {
-        if ( matvar->isComplex && NULL != matvar->data ) {
-            struct ComplexSplit *complex_data = matvar->data;
-            if ( !matvar->mem_conserve ) {
-                free(complex_data->Re);
-                free(complex_data->Im);
-            }
-            free(complex_data);
-        } else {
-            if ( matvar->data && !matvar->mem_conserve )
-                free(matvar->data);
-        }
-    }
-#if defined(HAVE_ZLIB)
-    if ( matvar->compression == COMPRESSION_ZLIB ) {
-        inflateEnd(matvar->z);
-        free(matvar->z);
-    }
-#endif
-    /* FIXME: Why does this cause a SEGV? */
-#if 0
-    memset(matvar,0,sizeof(matvar_t));
-#endif
-    free(matvar);
-}
-
-void
-Mat_VarFree2(matvar_t *matvar)
-{
-    if ( !matvar )
-        return;
-    if ( matvar->dims )
-        free(matvar->dims);
-    if ( matvar->name )
-        free(matvar->name);
-    if ( (matvar->data != NULL) && (matvar->class_type == MAT_C_STRUCT || 
-          matvar->class_type == MAT_C_CELL) && matvar->data_size > 0 ) {
-        int i;
-        matvar_t **fields = (matvar_t **)matvar->data;
-        int nfields = matvar->nbytes / matvar->data_size;
-        for ( i = 0; i < nfields; i++ )
-            Mat_VarFree(fields[i]);
-        free(matvar->data);
-    } else if ( (matvar->data != NULL) && (!matvar->mem_conserve) &&
-                (matvar->class_type == MAT_C_SPARSE) ) {
-        sparse_t *sparse;
-        sparse = matvar->data;
-        if ( sparse->ir != NULL )
-            free(sparse->ir);
-        if ( sparse->jc != NULL )
-            free(sparse->jc);
-        if ( sparse->data != NULL )
-            free(sparse->data);
-        free(sparse);
-    } else {
-        if ( matvar->data && !matvar->mem_conserve )
-            free(matvar->data);
-    }
-#if defined(HAVE_ZLIB)
-    if ( matvar->compression == COMPRESSION_ZLIB )
-        inflateEnd(matvar->z);
-#endif
-    /* FIXME: Why does this cause a SEGV? */
-#if 0
-    memset(matvar,0,sizeof(matvar_t));
-#endif
-}
-
-/** @brief Calculate a single subscript from a set of subscript values
- *
- * Calculates a single linear subscript (0-relative) given a 1-relative
- * subscript for each dimension.  The calculation uses the formula below where
- * index is the linear index, s is an array of length RANK where each element
- * is the subscript for the correspondind dimension, D is an array whose
- * elements are the dimensions of the variable.
- * \f[
- *   index = \sum\limits_{k=0}^{RANK-1} [(s_k - 1) \prod\limits_{l=0}^{k} D_l ]
- * \f]
- * @ingroup MAT
- * @param rank Rank of the variable
- * @param dims dimensions of the variable
- * @param subs Dimension subscripts
- * @return Single (linear) subscript
- */
-int
-Mat_CalcSingleSubscript(int rank,int *dims,int *subs)
-{
-    int index = 0, i, j, k, err = 0;
-
-    for ( i = 0; i < rank; i++ ) {
-        k = subs[i];
-        if ( k > dims[i] ) {
-            err = 1;
-            Mat_Critical("Mat_CalcSingleSubscript: index out of bounds");
-            break;
-        } else if ( k < 1 ) {
-            err = 1;
-            break;
-        }
-        k--;
-        for ( j = i; j--; )
-            k *= dims[j];
-        index += k;
-    }
-    if ( err )
-        index = -1;
-
-    return index;
-}
-
-
-/** @brief Calculate a set of subscript values from a single(linear) subscript
- *
- * Calculates 1-relative subscripts for each dimension given a 0-relative
- * linear index.  Subscripts are calculated as follows where s is the array
- * of dimension subscripts, D is the array of dimensions, and index is the
- * linear index.
- * \f[
- *   s_k = \lfloor\frac{1}{L} \prod\limits_{l = 0}^{k} D_l\rfloor + 1
- * \f]
- * \f[
- *   L = index - \sum\limits_{l = k}^{RANK - 1} s_k \prod\limits_{m = 0}^{k} D_m
- * \f]
- * @ingroup MAT
- * @param rank Rank of the variable
- * @param dims dimensions of the variable
- * @param index linear index
- * @return Array of dimension subscripts
- */
-int *
-Mat_CalcSubscripts(int rank,int *dims,int index)
-{
-    int i, j, k, *subs;
-    double l;
-
-    subs = malloc(rank*sizeof(int));
-    l = index;
-    for ( i = rank; i--; ) {
-        k = 1;
-        for ( j = i; j--; )
-            k *= dims[j];
-        subs[i] = floor(l / (double)k);
-        l -= subs[i]*k;
-        subs[i]++;
-    }
-
-    return subs;
-}
-
-/** @brief Returns a pointer to the Cell array at a specific index
- *
- * Returns a pointer to the Cell Array Field at the given 1-relative index.
- * MAT file must be a version 5 matlab file.
- * @ingroup MAT
- * @param matvar Pointer to the Cell Array MAT variable
- * @param index linear index of cell to return
- * @return Pointer to the Cell Array Field on success, NULL on error
- */
-matvar_t *
-Mat_VarGetCell(matvar_t *matvar,int index)
-{
-    int       nmemb = 1, i;
-    matvar_t *cell = NULL;
-
-    if ( matvar == NULL )
-        return NULL;
-
-    for ( i = 0; i < matvar->rank; i++ )
-        nmemb *= matvar->dims[i];
-
-    if ( index < nmemb )
-        cell = *((matvar_t **)matvar->data + index);
-
-    return cell;
-}
-
-/** @brief Indexes a cell array
- *
- * Finds cells of a cell array given a start, stride, and edge for each.
- * dimension.  The cells are placed in a pointer array.  The cells should not
- * be freed, but the array of pointers should be.  If copies are needed,
- * use Mat_VarDuplicate on each cell.
- * MAT File version must be 5.
- * @ingroup MAT
- * @param matvar Cell Array matlab variable
- * @param start vector of length rank with 0-relative starting coordinates for
- *              each diemnsion.
- * @param stride vector of length rank with strides for each diemnsion.
- * @param edge vector of length rank with the number of elements to read in
- *              each diemnsion.
- * @returns an array of pointers to the cells
- */
-matvar_t **
-Mat_VarGetCells(matvar_t *matvar,int *start,
-    int *stride,int *edge)
-{
-    int i, j, N, I = 0;
-    int inc[10] = {0,}, cnt[10] = {0,}, dimp[10] = {0,};
-    matvar_t **cells;
-
-    if ( (matvar == NULL) || (start == NULL) || (stride == NULL) ||  
-         (edge == NULL) ) {
-        return NULL;
-    } else if ( matvar->rank > 10 ) {
-        return NULL;
-    }
-
-    inc[0] = stride[0]-1;
-    dimp[0] = matvar->dims[0];
-    N = edge[0];
-    I = start[0];
-    for ( i = 1; i < matvar->rank; i++ ) {
-        inc[i]  = stride[i]-1;
-        dimp[i] = matvar->dims[i-1];
-        for ( j = i ; j--; ) {
-            inc[i]  *= matvar->dims[j];
-            dimp[i] *= matvar->dims[j+1];
-        }
-        N *= edge[i];
-        if ( start[i] > 0 )
-            I += start[i]*dimp[i-1];
-    }
-    cells = malloc(N*sizeof(matvar_t *));
-    for ( i = 0; i < N; i+=edge[0] ) {
-        for ( j = 0; j < edge[0]; j++ ) {
-            cells[i+j] = *((matvar_t **)matvar->data + I);
-            I += stride[0];
-        }
-        for ( j = 1; j < matvar->rank-1; j++ ) {
-            cnt[j]++;
-            if ( (cnt[j] % edge[j]) == 0 ) {
-                cnt[j] = 0;
-                if ( (I % dimp[j]) != 0 ) {
-                    I += dimp[j]-(I % dimp[j]);
-                }
-            } else {
-                I += matvar->dims[0]-edge[0]*stride[0]-start[0];
-                I += inc[j];
-                break;
-            }
-        }
-    }
-    return cells;
-}
-
-/** @brief Indexes a cell array
- *
- * Finds cells of a cell array given a linear indexed start, stride, and edge.
- * The cells are placed in a pointer array.  The cells themself should not
- * be freed as they are part of the original cell array, but the pointer array
- * should be.  If copies are needed, use Mat_VarDuplicate on each of the cells.
- * MAT file version must be 5.
- * @ingroup MAT
- * @param matvar Cell Array matlab variable
- * @param start starting index
- * @param stride stride
- * @param edge Number of cells to get
- * @returns an array of pointers to the cells
- */
-matvar_t **
-Mat_VarGetCellsLinear(matvar_t *matvar,int start,int stride,int edge)
-{
-    int i, I = 0;
-    matvar_t **cells;
-
-    if ( matvar == NULL || matvar->rank > 10 ) {
-        cells = NULL;
-    } else {
-        cells = malloc(edge*sizeof(matvar_t *));
-        for ( i = 0; i < edge; i++ ) {
-            cells[i] = *((matvar_t **)matvar->data + I);
-            I += stride;
-        }
-    }
-    return cells;
-}
-
-/** @brief Calculates the size of a matlab variable in bytes
- *
- * @ingroup MAT
- * @param matvar matlab variable
- * @returns size of the variable in bytes
- */
-size_t
-Mat_VarGetSize(matvar_t *matvar)
-{
-    int nmemb, i;
-    size_t bytes = 0;
-
-    if ( matvar->class_type == MAT_C_STRUCT ) {
-        int nfields;
-        matvar_t **fields;
-        /* This is really nmemb*nfields, but we'll get a 
-         * more accurate count of the bytes by loopoing over all of them
-         */
-        nfields = matvar->nbytes / matvar->data_size;
-        fields  = matvar->data;
-        for ( i = 0; i < nfields; i++ )
-            bytes += Mat_VarGetSize(fields[i]);
-    } else if ( matvar->class_type == MAT_C_CELL ) {
-        int ncells;
-        matvar_t **cells;
-
-        ncells = matvar->nbytes / matvar->data_size;
-        cells  = matvar->data;
-        for ( i = 0; i < ncells; i++ )
-            bytes += Mat_VarGetSize(cells[i]);
-    } else {
-        nmemb = 1;
-        for ( i = 0; i < matvar->rank; i++ )
-            nmemb *= matvar->dims[i];
-        bytes += nmemb*Mat_SizeOfClass(matvar->class_type);
-    }
-    return bytes;
-}
-
-/** @brief Adds a field to a structure
- *
- * Adds the given field to the structure. fields should be an array of matvar_t
- * pointers of the same size as the structure (i.e. 1 field per structure
- * element).
- * @ingroup MAT
- * @param matvar Pointer to the Structure MAT variable
- * @param fields Array of fields to be added
- * @retval 0 on success
- */
-int
-Mat_VarAddStructField(matvar_t *matvar,matvar_t **fields)
-{
-    int       i, f, nfields, nmemb, cnt = 0;
-    matvar_t **new_data,**old_data;
-
-    if ( matvar == NULL || fields == NULL )
-        return -1;
-    nmemb = 1;
-    for ( i = 0; i < matvar->rank; i++ )
-        nmemb *= matvar->dims[i];
-
-    nfields = matvar->nbytes / (nmemb*sizeof(matvar_t *));
-
-    new_data = malloc((nfields+1)*nmemb*sizeof(matvar_t *));
-    if ( new_data == NULL )
-        return -1;
-
-    old_data = matvar->data;
-    for ( i = 0; i < nmemb; i++ ) {
-        for ( f = 0; f < nfields; f++ )
-            new_data[cnt++] = old_data[i*nfields+f];
-        new_data[cnt++] = fields[i];
-    }
-
-    free(matvar->data);
-    matvar->data = new_data;
-    matvar->nbytes = (nfields+1)*nmemb*sizeof(matvar_t *);
-
-    return 0;
-}
-
-/** @brief Returns the number of fields in a structure variable
- *
- * Returns the number of fields in the given structure.
- * MAT file version must be 5.
- * @ingroup MAT
- * @param matvar Structure matlab variable
- * @returns Number of fields, or a negative number on error
- */
-int
-Mat_VarGetNumberOfFields(matvar_t *matvar)
-{
-    int i, nfields, nmemb = 1;
-    if ( matvar == NULL || matvar->class_type != MAT_C_STRUCT   ||
-         matvar->data_size == 0 ) {
-        nfields = -1;
-    } else {
-        for ( i = 0; i < matvar->rank; i++ )
-            nmemb *= matvar->dims[i];
-        nfields = matvar->nbytes / (nmemb*matvar->data_size);
-    }
-    return nfields;
-}
-
-/** @brief Finds a field of a structure
- *
- * Returns a pointer to the structure field at the given 0-relative index. MAT
- * file version must be 5.
- * @ingroup MAT
- * @param matvar Pointer to the Structure MAT variable
- * @param name_or_index Name of the field, or the 1-relative index of the field.
- * If the index is used, it should be the address of an integer variable whose
- * value is the index number.
- * @param opt BY_NAME if the name_or_index is the name or BY_INDEX if the index
- * was passed.
- * @param index linear index of the structure to find the field of
- * @return Pointer to the Structure Field on success, NULL on error
- */
-matvar_t *
-Mat_VarGetStructField(matvar_t *matvar,void *name_or_index,int opt,int index)
-{
-    int       i, err = 0, nfields, nmemb;
-    matvar_t *field = NULL;
-
-    nmemb = 1;
-    for ( i = 0; i < matvar->rank; i++ )
-        nmemb *= matvar->dims[i];
-
-    nfields = matvar->nbytes / (nmemb*sizeof(matvar_t *));
-
-    if ( index >= nmemb || index < 0)
-        err = 1;
-
-    if ( !err && (opt == BY_INDEX) ) {
-        int field_index;
-
-        field_index = *(int *)name_or_index;
-
-        if ( field_index > nfields || field_index < 1 )
-            Mat_Critical("Mat_VarGetStructField: field index out of bounds");
-        else
-            field = *((matvar_t **)matvar->data+index*nfields+field_index - 1);
-    } else if ( !err && (opt == BY_NAME) ) {
-        char *field_name;
-
-        field_name = (char *)name_or_index;
-
-        for ( i = 0; i < nfields; i++ ) {
-            field = *((matvar_t **)matvar->data+index*nfields+i);
-            if ( !strcmp(field->name,field_name) )
-                break;
-            else
-                field = NULL;
-        }
-    }
-
-    return field;
-}
-
-/** @brief Indexes a structure
- *
- * Finds structures of a structure array given a start, stride, and edge for
- * each dimension.  The structures are placed in a new structure array.  If
- * copy_fields is non-zero, the indexed structures are copied and should be
- * freed, but if copy_fields is zero, the indexed structures are pointers to
- * the original, but should still be freed since the mem_conserve flag is set
- * so that the structures are not freed.
- * MAT File version must be 5.
- * @ingroup MAT
- * @param matvar Structure matlab variable
- * @param start vector of length rank with 0-relative starting coordinates for
- *              each diemnsion.
- * @param stride vector of length rank with strides for each diemnsion.
- * @param edge vector of length rank with the number of elements to read in
- *              each diemnsion.
- * @param copy_fields 1 to copy the fields, 0 to just set pointers to them.
- *        If 0 is used, the fields should not be freed themselves.
- * @returns A new structure with fields indexed from matvar.
- */
-matvar_t *
-Mat_VarGetStructs(matvar_t *matvar,int *start,int *stride,int *edge,
-    int copy_fields)
-{
-    int i, j, N, I = 0;
-    int inc[10] = {0,}, cnt[10] = {0,}, dimp[10] = {0,};
-    int nfields, field;
-    matvar_t **fields, *struct_slab;
-
-    if ( (matvar == NULL) || (start == NULL) || (stride == NULL) ||  
-         (edge == NULL) ) {
-        return NULL;
-    } else if ( matvar->rank > 10 ) {
-        return NULL;
-    } else if ( matvar->class_type != MAT_C_STRUCT ) {
-        return NULL;
-    }
-
-    struct_slab = Mat_VarDuplicate(matvar,0);
-    if ( !copy_fields )
-        struct_slab->mem_conserve = 1;
-
-    nfields = matvar->nbytes / matvar->data_size;
-    for ( i = 0; i < matvar->rank; i++ )
-        nfields = nfields / matvar->dims[i];
-
-    inc[0] = stride[0]-1;
-    dimp[0] = matvar->dims[0];
-    N = edge[0];
-    I = start[0]*nfields;
-    for ( i = 1; i < matvar->rank; i++ ) {
-        inc[i]  = stride[i]-1;
-        dimp[i] = matvar->dims[i-1];
-        for ( j = i ; j--; ) {
-            inc[i]  *= matvar->dims[j]*nfields;
-            dimp[i] *= matvar->dims[j+1];
-        }
-        N *= edge[i];
-        if ( start[i] > 0 )
-            I += start[i]*dimp[i-1]*nfields;
-    }
-    struct_slab->nbytes    = N*nfields*sizeof(matvar_t *);
-    struct_slab->data = malloc(struct_slab->nbytes);
-    if ( struct_slab->data == NULL ) {
-        Mat_VarFree(struct_slab);
-        return NULL;
-    }
-    fields = struct_slab->data;
-    for ( i = 0; i < N; i+=edge[0] ) {
-        for ( j = 0; j < edge[0]; j++ ) {
-            for ( field = 0; field < nfields; field++ ) {
-                if ( copy_fields )
-                    fields[(i+j)*nfields+field] = 
-                         Mat_VarDuplicate(*((matvar_t **)matvar->data + I),1);
-                else
-                    fields[(i+j)*nfields+field] = 
-                                               *((matvar_t **)matvar->data + I);
-                I++;
-            }
-            I += stride[0]*nfields;
-        }
-        for ( j = 1; j < matvar->rank-1; j++ ) {
-            cnt[j]++;
-            if ( (cnt[j] % edge[j]) == 0 ) {
-                cnt[j] = 0;
-                if ( (I % dimp[j]) != 0 ) {
-                    I += dimp[j]-(I % dimp[j]);
-                }
-            } else {
-                I += matvar->dims[0]-edge[0]*stride[0]-start[0];
-                I += inc[j];
-                break;
-            }
-        }
-    }
-    return struct_slab;
-}
-
-/** @brief Indexes a structure
- *
- * Finds structures of a structure array given a single (linear)start, stride,
- * and edge.  The structures are placed in a new structure array.  If
- * copy_fields is non-zero, the indexed structures are copied and should be
- * freed, but if copy_fields is zero, the indexed structures are pointers to
- * the original, but should still be freed since the mem_conserve flag is set
- * so that the structures are not freed.
- * MAT File version must be 5.
- * @ingroup MAT
- * @param matvar Structure matlab variable
- * @param start starting index
- * @param stride stride
- * @param edge Number of structures to get
- * @param copy_fields 1 to copy the fields, 0 to just set pointers to them.
- *        If 0 is used, the fields should not be freed themselves.
- * @returns A new structure with fields indexed from matvar
- */
-matvar_t *
-Mat_VarGetStructsLinear(matvar_t *matvar,int start,int stride,int edge,
-    int copy_fields)
-{
-    int i, I = 0, field, nfields;
-    matvar_t *struct_slab, **fields;
-
-    /* FIXME: Check allocations */
-    if ( matvar == NULL || matvar->rank > 10 ) {
-       struct_slab = NULL;
-    } else {
-
-        struct_slab = Mat_VarDuplicate(matvar,0);
-        if ( !copy_fields )
-            struct_slab->mem_conserve = 1;
-
-        nfields = matvar->nbytes / matvar->data_size;
-        for ( i = 0; i < matvar->rank; i++ )
-            nfields = nfields / matvar->dims[i];
-
-        struct_slab->nbytes = edge*nfields*sizeof(matvar_t *);
-        struct_slab->data = malloc(struct_slab->nbytes);
-        fields = struct_slab->data;
-        for ( i = 0; i < edge; i++ ) {
-            if ( copy_fields ) {
-                for ( field = 0; field < nfields; field++ ) {
-                    fields[i*nfields+field] = 
-                        Mat_VarDuplicate(*((matvar_t **)matvar->data+I),1);
-                    I++;
-                }
-            } else {
-                for ( field = 0; field < nfields; field++ ) {
-                    fields[i+field] = *((matvar_t **)matvar->data + I);
-                    I++;
-                }
-            }
-            I += stride;
-        }
-    }
-    return struct_slab;
-}
-
-/** @brief Prints the variable information
- *
- * Prints to stdout the values of the @ref matvar_t structure
- * @ingroup MAT
- * @param matvar Pointer to the matvar_t structure
- * @param printdata set to 1 if the Variables data should be printed, else 0
- */
-void
-Mat_VarPrint( matvar_t *matvar, int printdata )
-{
-    if ( matvar == NULL || matvar->fp == NULL )
-        return;
-    else if ( matvar->fp->version != MAT_FT_MAT4 )
-        Mat_VarPrint5(matvar,printdata);
-    else if ( matvar->fp->version == MAT_FT_MAT4 )
-        Mat_VarPrint4(matvar,printdata);
-    return;
-}
-
-/** @brief Reads MAT variable data from a file
- *
- * Reads data from a MAT variable.  The variable must have been read by
- * Mat_VarReadInfo.
- * @ingroup MAT
- * @param mat MAT file to read data from
- * @param matvar MAT variable information
- * @param data pointer to store data in (must be pre-allocated)
- * @param start array of starting indeces
- * @param stride stride of data
- * @param edge array specifying the number to read in each direction
- * @retval 0 on success
- */
-int
-Mat_VarReadData(mat_t *mat,matvar_t *matvar,void *data,
-      int *start,int *stride,int *edge)
-{
-    int err = 0;
-
-    if ( mat->version != MAT_FT_MAT4 )
-        err = ReadData5(mat,matvar,data,start,stride,edge);
-    else
-        err = ReadData4(mat,matvar,data,start,stride,edge);
-    return err;
-}
-
-/** @brief Reads all the data for a matlab variable
- *
- * Allocates memory for an reads the data for a given matlab variable.
- * @ingroup MAT
- * @param mat Matlab MAT file structure pointer
- * @param matvar Variable whose data is to be read
- * @returns non-zero on error
- */
-int
-Mat_VarReadDataAll(mat_t *mat,matvar_t *matvar)
-{
-    int err = 0;
-
-    if ( (mat == NULL) || (matvar == NULL) )
-        err = 1;
-    else
-        ReadData(mat,matvar);
-
-    return err;
-}
-
-/** @brief Reads MAT variable data from a file
- *
- * Reads data from a MAT variable using a linear indexingmode. The variable
- * must have been read by Mat_VarReadInfo.
- * @ingroup MAT
- * @param mat MAT file to read data from
- * @param matvar MAT variable information
- * @param data pointer to store data in (must be pre-allocated)
- * @param start starting index
- * @param stride stride of data
- * @param edge number of elements to read
- * @retval 0 on success
- */
-int
-Mat_VarReadDataLinear(mat_t *mat,matvar_t *matvar,void *data,int start,
-    int stride,int edge)
-{
-    int err = 0, nmemb = 1, i, data_type;
-    mat_int32_t tag[2];
-
-    if ( mat->version == MAT_FT_MAT4 )
-        return -1;
-    fseek(mat->fp,matvar->datapos,SEEK_SET);
-    if ( matvar->compression == COMPRESSION_NONE ) {
-        fread(tag,4,2,mat->fp);
-        if ( mat->byteswap ) {
-            Mat_int32Swap(tag);
-            Mat_int32Swap(tag+1);
-        }
-        data_type = tag[0] & 0x000000ff;
-        if ( tag[0] & 0xffff0000 ) { /* Data is packed in the tag */
-            fseek(mat->fp,-4,SEEK_CUR);
-        }
-#if defined(HAVE_ZLIB)
-    } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-        matvar->z->avail_in = 0;
-        InflateDataType(mat,matvar,tag);
-        if ( mat->byteswap ) {
-            Mat_int32Swap(tag);
-            Mat_int32Swap(tag+1);
-        }
-        data_type = tag[0] & 0x000000ff;
-        if ( !(tag[0] & 0xffff0000) ) {/* Data is NOT packed in the tag */
-            InflateSkip(mat,matvar->z,4);
-        }
-#endif
-    }
-
-    for ( i = 0; i < matvar->rank; i++ )
-        nmemb *= matvar->dims[i];
-
-    if ( stride*(edge-1)+start+1 > nmemb ) {
-        err = 1;
-    } else {
-        stride--;
-        switch(matvar->class_type) {
-            case MAT_C_DOUBLE:
-                matvar->data_type = MAT_T_DOUBLE;
-                matvar->data_size = sizeof(double);
-                if ( matvar->compression == COMPRESSION_NONE ) {
-                    stride *= Mat_SizeOf(data_type);
-                    fseek(mat->fp,start,SEEK_CUR);
-                    for ( i = 0; i < edge; i++ ) {
-                        ReadDoubleData(mat,(double*)data+i,data_type,1);
-                        fseek(mat->fp,stride,SEEK_CUR);
-                    }
-#if defined(HAVE_ZLIB)
-                } else {
-                    z_stream z_copy;
-
-                    err = inflateCopy(&z_copy,matvar->z);
-                    InflateSkipData(mat,&z_copy,data_type,start);
-                    for ( i = 0; i < edge; i++ ) {
-                        ReadCompressedDoubleData(mat,&z_copy,(double*)data+i,
-                            data_type,1);
-                        InflateSkipData(mat,&z_copy,data_type,stride);
-                    }
-                    inflateEnd(&z_copy);
-#endif
-                }
-                break;
-            case MAT_C_SINGLE:
-                matvar->data_type = MAT_T_SINGLE;
-                matvar->data_size = sizeof(float);
-                if ( matvar->compression == COMPRESSION_NONE ) {
-                    stride *= Mat_SizeOf(data_type);
-                    for ( i = 0; i < edge; i++ ) {
-                        ReadSingleData(mat,(float*)data+i,data_type,1);
-                        fseek(mat->fp,stride,SEEK_CUR);
-                    }
-#if defined(HAVE_ZLIB)
-                } else {
-                    z_stream z_copy;
-
-                    err = inflateCopy(&z_copy,matvar->z);
-                    InflateSkipData(mat,&z_copy,data_type,start);
-                    for ( i = 0; i < edge; i++ ) {
-                        ReadCompressedSingleData(mat,&z_copy,(float*)data+i,
-                            data_type,1);
-                        InflateSkipData(mat,&z_copy,data_type,stride);
-                    }
-                    inflateEnd(&z_copy);
-#endif
-                }
-                break;
-#ifdef HAVE_MAT_INT64_T
-            case MAT_C_INT64:
-                matvar->data_type = MAT_T_INT64;
-                matvar->data_size = sizeof(mat_int64_t);
-                if ( matvar->compression == COMPRESSION_NONE ) {
-                    stride *= Mat_SizeOf(data_type);
-                    for ( i = 0; i < edge; i++ ) {
-                        ReadInt64Data(mat,(mat_int64_t*)data+i,data_type,1);
-                        fseek(mat->fp,stride,SEEK_CUR);
-                    }
-#if defined(HAVE_ZLIB)
-                } else {
-                    z_stream z_copy;
-
-                    err = inflateCopy(&z_copy,matvar->z);
-                    InflateSkipData(mat,&z_copy,data_type,start);
-                    for ( i = 0; i < edge; i++ ) {
-                        ReadCompressedInt64Data(mat,&z_copy,(mat_int64_t*)data+i,
-                            data_type,1);
-                        InflateSkipData(mat,&z_copy,data_type,stride);
-                    }
-                    inflateEnd(&z_copy);
-#endif
-                }
-                break;
-#endif /* HAVE_MAT_INT64_T */
-#ifdef HAVE_MAT_UINT64_T
-            case MAT_C_UINT64:
-                matvar->data_type = MAT_T_UINT64;
-                matvar->data_size = sizeof(mat_uint64_t);
-                if ( matvar->compression == COMPRESSION_NONE ) {
-                    stride *= Mat_SizeOf(data_type);
-                    for ( i = 0; i < edge; i++ ) {
-                        ReadInt64Data(mat,(mat_int64_t*)data+i,data_type,1);
-                        fseek(mat->fp,stride,SEEK_CUR);
-                    }
-#if defined(HAVE_ZLIB)
-                } else {
-                    z_stream z_copy;
-
-                    err = inflateCopy(&z_copy,matvar->z);
-                    InflateSkipData(mat,&z_copy,data_type,start);
-                    for ( i = 0; i < edge; i++ ) {
-                        ReadCompressedInt64Data(mat,&z_copy,(mat_int64_t*)data+i,
-                            data_type,1);
-                        InflateSkipData(mat,&z_copy,data_type,stride);
-                    }
-                    inflateEnd(&z_copy);
-#endif
-                }
-                break;
-#endif /* HAVE_MAT_UINT64_T */
-            case MAT_C_INT32:
-                matvar->data_type = MAT_T_INT32;
-                matvar->data_size = sizeof(mat_int32_t);
-                if ( matvar->compression == COMPRESSION_NONE ) {
-                    stride *= Mat_SizeOf(data_type);
-                    for ( i = 0; i < edge; i++ ) {
-                        ReadInt32Data(mat,(mat_int32_t*)data+i,data_type,1);
-                        fseek(mat->fp,stride,SEEK_CUR);
-                    }
-#if defined(HAVE_ZLIB)
-                } else {
-                    z_stream z_copy;
-
-                    err = inflateCopy(&z_copy,matvar->z);
-                    InflateSkipData(mat,&z_copy,data_type,start);
-                    for ( i = 0; i < edge; i++ ) {
-                        ReadCompressedInt32Data(mat,&z_copy,(mat_int32_t*)data+i,
-                            data_type,1);
-                        InflateSkipData(mat,&z_copy,data_type,stride);
-                    }
-                    inflateEnd(&z_copy);
-#endif
-                }
-                break;
-            case MAT_C_UINT32:
-                matvar->data_type = MAT_T_UINT32;
-                matvar->data_size = sizeof(mat_uint32_t);
-                if ( matvar->compression == COMPRESSION_NONE ) {
-                    stride *= Mat_SizeOf(data_type);
-                    for ( i = 0; i < edge; i++ ) {
-                        ReadInt32Data(mat,(mat_int32_t*)data+i,data_type,1);
-                        fseek(mat->fp,stride,SEEK_CUR);
-                    }
-#if defined(HAVE_ZLIB)
-                } else {
-                    z_stream z_copy;
-
-                    err = inflateCopy(&z_copy,matvar->z);
-                    InflateSkipData(mat,&z_copy,data_type,start);
-                    for ( i = 0; i < edge; i++ ) {
-                        ReadCompressedInt32Data(mat,&z_copy,(mat_int32_t*)data+i,
-                            data_type,1);
-                        InflateSkipData(mat,&z_copy,data_type,stride);
-                    }
-                    inflateEnd(&z_copy);
-#endif
-                }
-                break;
-            case MAT_C_INT16:
-                matvar->data_type = MAT_T_INT16;
-                matvar->data_size = sizeof(mat_int16_t);
-                if ( matvar->compression == COMPRESSION_NONE ) {
-                    stride *= Mat_SizeOf(data_type);
-                    for ( i = 0; i < edge; i++ ) {
-                        ReadInt16Data(mat,(mat_int16_t*)data+i,data_type,1);
-                        fseek(mat->fp,stride,SEEK_CUR);
-                    }
-#if defined(HAVE_ZLIB)
-                } else {
-                    z_stream z_copy;
-
-                    err = inflateCopy(&z_copy,matvar->z);
-                    InflateSkipData(mat,&z_copy,data_type,start);
-                    for ( i = 0; i < edge; i++ ) {
-                        ReadCompressedInt16Data(mat,&z_copy,(mat_int16_t*)data+i,
-                            data_type,1);
-                        InflateSkipData(mat,&z_copy,data_type,stride);
-                    }
-                    inflateEnd(&z_copy);
-#endif
-                }
-                break;
-            case MAT_C_UINT16:
-                matvar->data_type = MAT_T_UINT16;
-                matvar->data_size = sizeof(mat_uint16_t);
-                if ( matvar->compression == COMPRESSION_NONE ) {
-                    stride *= Mat_SizeOf(data_type);
-                    for ( i = 0; i < edge; i++ ) {
-                        ReadInt16Data(mat,(mat_int16_t*)data+i,data_type,1);
-                        fseek(mat->fp,stride,SEEK_CUR);
-                    }
-#if defined(HAVE_ZLIB)
-                } else {
-                    z_stream z_copy;
-
-                    err = inflateCopy(&z_copy,matvar->z);
-                    InflateSkipData(mat,&z_copy,data_type,start);
-                    for ( i = 0; i < edge; i++ ) {
-                        ReadCompressedInt16Data(mat,&z_copy,(mat_int16_t*)data+i,
-                            data_type,1);
-                        InflateSkipData(mat,&z_copy,data_type,stride);
-                    }
-                    inflateEnd(&z_copy);
-#endif
-                }
-                break;
-            case MAT_C_INT8:
-                matvar->data_type = MAT_T_INT8;
-                matvar->data_size = sizeof(mat_int8_t);
-                if ( matvar->compression == COMPRESSION_NONE ) {
-                    stride *= Mat_SizeOf(data_type);
-                    for ( i = 0; i < edge; i++ ) {
-                        ReadInt8Data(mat,(mat_int8_t*)data+i,data_type,1);
-                        fseek(mat->fp,stride,SEEK_CUR);
-                    }
-#if defined(HAVE_ZLIB)
-                } else {
-                    z_stream z_copy;
-
-                    err = inflateCopy(&z_copy,matvar->z);
-                    InflateSkipData(mat,&z_copy,data_type,start);
-                    for ( i = 0; i < edge; i++ ) {
-                        ReadCompressedInt8Data(mat,&z_copy,(mat_int8_t*)data+i,
-                            data_type,1);
-                        InflateSkipData(mat,&z_copy,data_type,stride);
-                    }
-                    inflateEnd(&z_copy);
-#endif
-                }
-                break;
-            case MAT_C_UINT8:
-                matvar->data_type = MAT_T_UINT8;
-                matvar->data_size = sizeof(mat_uint8_t);
-                if ( matvar->compression == COMPRESSION_NONE ) {
-                    stride *= Mat_SizeOf(data_type);
-                    for ( i = 0; i < edge; i++ ) {
-                        ReadInt8Data(mat,(mat_int8_t*)data+i,data_type,1);
-                        fseek(mat->fp,stride,SEEK_CUR);
-                    }
-#if defined(HAVE_ZLIB)
-                } else {
-                    z_stream z_copy;
-
-                    err = inflateCopy(&z_copy,matvar->z);
-                    InflateSkipData(mat,&z_copy,data_type,start);
-                    for ( i = 0; i < edge; i++ ) {
-                        ReadCompressedInt8Data(mat,&z_copy,(mat_int8_t*)data+i,
-                            data_type,1);
-                        InflateSkipData(mat,&z_copy,data_type,stride);
-                    }
-                    inflateEnd(&z_copy);
-#endif
-                }
-                break;
-        }
-    }
-
-    return err;
-}
-
-/** @brief Reads the information of the next variable in a MAT file
- *
- * Reads the next variable's information (class,flags-complex/global/logical,
- * rank,dimensions, name, etc) from the Matlab MAT file.  After reading, the MAT
- * file is positioned past the current variable.
- * @ingroup MAT
- * @param mat Pointer to the MAT file
- * @return Pointer to the @ref matvar_t structure containing the MAT
- * variable information
- */
-matvar_t *
-Mat_VarReadNextInfo( mat_t *mat )
-{
-    if( mat == NULL )
-        return NULL;
-    else if ( mat->version == 0x0100 )
-        return Mat_VarReadNextInfo5(mat);
-    else
-        return Mat_VarReadNextInfo4(mat);
-
-    return NULL;
-}
-
-/** @brief Reads the information of a variable with the given name from a MAT file
- *
- * Reads the named variable (or the next variable if name is NULL) information
- * (class,flags-complex/global/logical,rank,dimensions,and name) from the
- * Matlab MAT file
- * @ingroup MAT
- * @param mat Pointer to the MAT file
- * @param name Name of the variable to read
- * @return Pointer to the @ref matvar_t structure containing the MAT
- * variable information
- */
-matvar_t *
-Mat_VarReadInfo( mat_t *mat, char *name )
-{
-
-    long  fpos;
-    matvar_t *matvar = NULL;
-
-    if ( (mat == NULL) || (name == NULL) )
-        return NULL;
-
-    fpos = ftell(mat->fp);
-
-    fseek(mat->fp,mat->bof,SEEK_SET);
-    do {
-#if 0
-        err = fread(&data_type,4,1,mat->fp);
-        if ( !err )
-            return NULL;
-        err = fread(&nBytes,4,1,mat->fp);
-        if ( mat->byteswap ) {
-            Mat_int32Swap(&data_type);
-            Mat_int32Swap(&nBytes);
-        }
-        curpos = ftell(mat->fp);
-        fseek(mat->fp,-8,SEEK_CUR);
-#endif
-        matvar = Mat_VarReadNextInfo(mat);
-        if ( matvar != NULL ) {
-            if ( !matvar->name ) {
-                Mat_VarFree(matvar);
-                matvar = NULL;
-            } else if ( strcmp(matvar->name,name) ) {
-                Mat_VarFree(matvar);
-                matvar = NULL;
-            }
-        } else {
-            Mat_Critical("An error occurred in reading the MAT file");
-            break;
-        }
-#if 0
-        fseek(mat->fp,curpos+nBytes,SEEK_SET);
-#endif
-    } while ( !matvar && !feof(mat->fp) );
-
-    fseek(mat->fp,fpos,SEEK_SET);
-    return matvar;
-}
-
-/** @brief Reads the variable with the given name from a MAT file
- *
- * Reads the next variable in the Matlab MAT file
- * @ingroup MAT
- * @param mat Pointer to the MAT file
- * @param name Name of the variable to read
- * @return Pointer to the @ref matvar_t structure containing the MAT
- * variable information
- */
-matvar_t *
-Mat_VarRead( mat_t *mat, char *name )
-{
-    long  fpos;
-    matvar_t *matvar = NULL;;
-
-    if ( (mat == NULL) || (name == NULL) )
-        return NULL;
-
-    fpos = ftell(mat->fp);
-    matvar = Mat_VarReadInfo(mat,name);
-    if ( matvar )
-        ReadData(mat,matvar);
-    fseek(mat->fp,fpos,SEEK_SET);
-    return matvar;
-}
-
-/** @brief Reads the next variable in a MAT file
- *
- * Reads the next variable in the Matlab MAT file
- * @ingroup MAT
- * @param mat Pointer to the MAT file
- * @return Pointer to the @ref matvar_t structure containing the MAT
- * variable information
- */
-matvar_t *
-Mat_VarReadNext( mat_t *mat )
-{
-    long fpos;
-    matvar_t *matvar = NULL;
-
-    if ( feof(mat->fp) )
-        return NULL;
-    /* Read position so we can reset the file position if an error occurs */
-    fpos = ftell(mat->fp);
-    matvar = Mat_VarReadNextInfo(mat);
-    if ( matvar != NULL)
-        ReadData(mat,matvar);
-    else
-        fseek(mat->fp,fpos,SEEK_SET);
-    return matvar;
-}
-
-/** @brief Writes the given MAT variable to a MAT file
- *
- * Writes the MAT variable information stored in matvar to the given MAT file.
- * The variable will be written to the end of the file.
- * @ingroup MAT
- * @param mat MAT file to write to
- * @param matvar MAT variable information to write
- * @retval 0 on success
- */
-int
-Mat_VarWriteInfo(mat_t *mat, matvar_t *matvar )
-{
-    if ( mat == NULL || matvar == NULL || mat->fp == NULL )
-        return -1;
-    else if ( mat->version != MAT_FT_MAT4 )
-        WriteInfo5(mat,matvar);
-#if 0
-    else if ( mat->version == MAT_FT_MAT4 )
-        WriteInfo4(mat,matvar);
-#endif
-
-    return 0;
-}
-
-/** @brief Writes the given data to the MAT variable
- *
- * Writes data to a MAT variable.  The variable must have previously been
- * written with Mat_VarWriteInfo.
- * @ingroup MAT
- * @param mat MAT file to write to
- * @param matvar MAT variable information to write
- * @param data pointer to the data to write
- * @param start array of starting indeces
- * @param stride stride of data
- * @param edge array specifying the number to read in each direction
- * @retval 0 on success
- */
-int
-Mat_VarWriteData(mat_t *mat,matvar_t *matvar,void *data,
-      int *start,int *stride,int *edge)
-{
-    int err = 0, k, N = 1;
-
-    fseek(mat->fp,matvar->datapos+8,SEEK_SET);
-
-    if ( mat == NULL || matvar == NULL || data == NULL ) {
-        err = -1;
-    } else if ( start == NULL && stride == NULL && edge == NULL ) {
-        for ( k = 0; k < matvar->rank; k++ )
-            N *= matvar->dims[k];
-        if ( matvar->compression == COMPRESSION_NONE )
-            WriteData(mat,data,N,matvar->data_type);
-#if 0
-        else if ( matvar->compression == COMPRESSION_ZLIB ) {
-            WriteCompressedData(mat,matvar->z,data,N,matvar->data_type);
-            (void)deflateEnd(matvar->z);
-            free(matvar->z);
-            matvar->z = NULL;
-        }
-#endif
-    } else if ( matvar->rank == 2 ) {
-        if ( stride[0]*(edge[0]-1)+start[0]+1 > matvar->dims[0] ) {
-            err = 1;
-        } else if ( stride[1]*(edge[1]-1)+start[1]+1 > matvar->dims[1] ) {
-            err = 1;
-        } else {
-            switch ( matvar->class_type ) {
-                case MAT_C_DOUBLE:
-                case MAT_C_SINGLE:
-                case MAT_C_INT64:
-                case MAT_C_UINT64:
-                case MAT_C_INT32:
-                case MAT_C_UINT32:
-                case MAT_C_INT16:
-                case MAT_C_UINT16:
-                case MAT_C_INT8:
-                case MAT_C_UINT8:
-                    WriteDataSlab2(mat,data,matvar->data_type,matvar->dims,
-                                   start,stride,edge);
-                    break;
-                case MAT_C_CHAR:
-                    WriteCharDataSlab2(mat,data,matvar->data_type,matvar->dims,
-                                   start,stride,edge);
-                    break;
-            }
-        }
-    }
-
-    return err;
-}
-
-/** @brief Writes the given MAT variable to a MAT file
- *
- * Writes the MAT variable information stored in matvar to the given MAT file.
- * The variable will be written to the end of the file.
- * @ingroup MAT
- * @param mat MAT file to write to
- * @param matvar MAT variable information to write
- * @param compress Whether or not to compress the data
- *        (Only valid for version 5 MAT files and variables with numeric data)
- * @retval 0 on success
- */
-int
-Mat_VarWrite( mat_t *mat, matvar_t *matvar, int compress )
-{
-    if ( mat == NULL || matvar == NULL )
-        return -1;
-    else if ( mat->version != MAT_FT_MAT4 )
-        Write5(mat,matvar,compress);
-
-    return 0;
-}

+ 0 - 744
matlabAccess/matio/src/mat4.c

@@ -1,744 +0,0 @@
-/** @file mat4.c
- * Matlab MAT version 4 file functions
- * @ingroup MAT
- */
-/*
- * Copyright (C) 2005-2006   Christopher C. Hulbert
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public
- *  License as published by the Free Software Foundation; either
- *  version 2.1 of the License, or (at your option) any later version.
- *
- *  This library is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this library; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-#include <stdlib.h>
-#include <stdio.h>
-#include <math.h>
-#include "matio.h"
-#include "mat4.h"
-#include "matio_private.h"
-
-static const char *v4_class_type_desc[16] = {
-       "Undefined","Cell Array","Structure",
-       "Object","Character Array","Sparse Array","Double Precision Array",
-       "Single Precision Array", "8-bit, signed Integer Array",
-       "8-bit, Unsigned Integer Array","16-bit, signed Integer Array",
-       "16-bit, unsigned Integer Array","32-bit, signed Integer Array",
-       "32-bit, unsigned Integer Array","Matlab Array","Compressed Data"
-};
-static const char *v4_data_type_desc[23] = {
-       "Unknown","8-bit, signed integer",
-       "8-bit, unsigned integer","16-bit, signed integer",
-       "16-bit, unsigned integer","32-bit, signed integer",
-       "32-bit, unsigned integer","IEEE 754 single-precision","RESERVED",
-       "IEEE 754 double-precision","RESERVED","RESERVED",
-       "64-bit, signed integer","64-bit, unsigned integer", "Matlab Array",
-       "Compressed Data","Unicode UTF-8 Encoded Character Data",
-       "Unicode UTF-16 Encoded Character Data",
-       "Unicode UTF-32 Encoded Character Data","","String","Cell Array",
-       "Structure"
-};
-
-void
-Read4(mat_t *mat,matvar_t *matvar)
-{
-    unsigned int N;
-    if ( fseek(mat->fp,matvar->datapos,SEEK_SET) )
-        return;
-
-    N = matvar->dims[0]*matvar->dims[1];
-    switch ( matvar->data_type ) {
-        case MAT_T_DOUBLE:
-            matvar->data_size = sizeof(double);
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes   = N*sizeof(double);
-                complex_data     = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                matvar->data     = complex_data;
-                if ( complex_data != NULL &&
-                     complex_data->Re != NULL && complex_data->Im != NULL ) {
-                    fread(complex_data->Re,N,sizeof(double),mat->fp);
-                    fread(complex_data->Im,N,sizeof(double),mat->fp);
-                }
-            } else {
-                matvar->nbytes = N*sizeof(double);
-                matvar->data   = malloc(matvar->nbytes);
-                if ( matvar->data != NULL )
-                    fread(matvar->data,N,sizeof(double),mat->fp);
-            }
-            break;
-        case MAT_T_SINGLE:
-            matvar->data_size = sizeof(float);
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes   = N*sizeof(float);
-                complex_data     = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                matvar->data     = complex_data;
-                if ( complex_data != NULL &&
-                     complex_data->Re != NULL && complex_data->Im != NULL ) {
-                    fread(complex_data->Re,N,sizeof(float),mat->fp);
-                    fread(complex_data->Im,N,sizeof(float),mat->fp);
-                }
-            } else {
-                matvar->nbytes = N*sizeof(float);
-                matvar->data   = malloc(matvar->nbytes);
-                if ( matvar->data != NULL )
-                    fread(matvar->data,N,sizeof(float),mat->fp);
-            }
-            break;
-        case MAT_T_INT32:
-            matvar->data_size = sizeof(mat_int32_t);
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes   = N*sizeof(mat_int32_t);
-                complex_data     = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                matvar->data     = complex_data;
-                if ( complex_data != NULL &&
-                     complex_data->Re != NULL && complex_data->Im != NULL ) {
-                    fread(complex_data->Re,N,sizeof(mat_int32_t),mat->fp);
-                    fread(complex_data->Im,N,sizeof(mat_int32_t),mat->fp);
-                }
-            } else {
-                matvar->nbytes = N*sizeof(mat_int32_t);
-                matvar->data   = malloc(matvar->nbytes);
-                if ( matvar->data != NULL )
-                    fread(matvar->data,N,sizeof(mat_int32_t),mat->fp);
-            }
-            break;
-        case MAT_T_INT16:
-            matvar->data_size = sizeof(mat_int16_t);
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes   = N*sizeof(mat_int16_t);
-                complex_data     = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                matvar->data     = complex_data;
-                if ( complex_data != NULL &&
-                     complex_data->Re != NULL && complex_data->Im != NULL ) {
-                    fread(complex_data->Re,N,sizeof(mat_int16_t),mat->fp);
-                    fread(complex_data->Im,N,sizeof(mat_int16_t),mat->fp);
-                }
-            } else {
-                matvar->nbytes = N*sizeof(mat_int16_t);
-                matvar->data   = malloc(matvar->nbytes);
-                if ( matvar->data != NULL )
-                    fread(matvar->data,N,sizeof(mat_int16_t),mat->fp);
-            }
-            break;
-        case MAT_T_UINT16:
-            matvar->data_size = sizeof(mat_uint16_t);
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes   = N*sizeof(mat_uint16_t);
-                complex_data     = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                matvar->data     = complex_data;
-                if ( complex_data != NULL &&
-                     complex_data->Re != NULL && complex_data->Im != NULL ) {
-                    fread(complex_data->Re,N,sizeof(mat_uint16_t),mat->fp);
-                    fread(complex_data->Im,N,sizeof(mat_uint16_t),mat->fp);
-                }
-            } else {
-                matvar->nbytes = N*sizeof(mat_uint16_t);
-                matvar->data   = malloc(matvar->nbytes);
-                if ( matvar->data != NULL )
-                    fread(matvar->data,N,sizeof(mat_uint16_t),mat->fp);
-            }
-            break;
-        case MAT_T_UINT8:
-            matvar->data_size = sizeof(mat_uint8_t);
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes   = N*sizeof(mat_uint8_t);
-                complex_data     = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                matvar->data     = complex_data;
-                if ( complex_data != NULL &&
-                     complex_data->Re != NULL && complex_data->Im != NULL ) {
-                    fread(complex_data->Re,N,sizeof(mat_uint8_t),mat->fp);
-                    fread(complex_data->Im,N,sizeof(mat_uint8_t),mat->fp);
-                }
-            } else {
-                matvar->nbytes = N*sizeof(mat_uint8_t);
-                matvar->data   = malloc(matvar->nbytes);
-                if ( matvar->data != NULL )
-                    fread(matvar->data,N,sizeof(mat_uint8_t),mat->fp);
-            }
-            break;
-        default:
-            Mat_Critical("MAT V4 data type error");
-            return;
-    }
-
-    return;
-}
-
-/* Reads a slab of data from the variable */
-int
-ReadData4(mat_t *mat,matvar_t *matvar,void *data,
-      int *start,int *stride,int *edge)
-{
-    int err = 0, class_type;
-
-    fseek(mat->fp,matvar->datapos,SEEK_SET);
-
-    switch( matvar->data_type ) {
-        case MAT_T_DOUBLE:
-            class_type = MAT_C_DOUBLE;
-            break;
-        case MAT_T_SINGLE:
-            class_type = MAT_C_SINGLE;
-            break;
-        case MAT_T_INT32:
-            class_type = MAT_C_INT32;
-            break;
-        case MAT_T_INT16:
-            class_type = MAT_C_INT16;
-            break;
-        case MAT_T_UINT16:
-            class_type = MAT_C_UINT16;
-            break;
-        case MAT_T_UINT8:
-            class_type = MAT_C_UINT8;
-            break;
-    }
-
-    if ( matvar->rank == 2 ) {
-        if ( stride[0]*(edge[0]-1)+start[0]+1 > matvar->dims[0] )
-            err = 1;
-        else if ( stride[1]*(edge[1]-1)+start[1]+1 > matvar->dims[1] )
-            err = 1;
-        if ( matvar->isComplex ) {
-            struct ComplexSplit *cdata = data;
-            long nbytes = edge[0]*edge[1]*Mat_SizeOf(matvar->data_type);
-
-            ReadDataSlab2(mat,cdata->Re,class_type,matvar->data_type,
-                    matvar->dims,start,stride,edge);
-            fseek(mat->fp,matvar->datapos+nbytes,SEEK_SET);
-            ReadDataSlab2(mat,cdata->Im,class_type,
-                matvar->data_type,matvar->dims,start,stride,edge);
-        } else {
-            ReadDataSlab2(mat,data,class_type,matvar->data_type,
-                    matvar->dims,start,stride,edge);
-        }
-    } else {
-        if ( matvar->isComplex ) {
-            int i;
-            struct ComplexSplit *cdata = data;
-            long nbytes = Mat_SizeOf(matvar->data_type);
-
-            for ( i = 0; i < matvar->rank; i++ )
-                nbytes *= edge[i];
-
-            ReadDataSlabN(mat,cdata->Re,class_type,matvar->data_type,
-                matvar->rank,matvar->dims,start,stride,edge);
-            fseek(mat->fp,matvar->datapos+nbytes,SEEK_SET);
-            ReadDataSlab2(mat,cdata->Im,class_type,
-                matvar->data_type,matvar->dims,start,stride,edge);
-        } else {
-            ReadDataSlabN(mat,data,class_type,matvar->data_type,
-                matvar->rank,matvar->dims,start,stride,edge);
-        }
-    }
-    return err;
-}
-
-matvar_t *
-Mat_VarReadNextInfo4(mat_t *mat)
-{       
-    int       tmp;
-    int       M,O;
-    long      nBytes;
-    size_t    err;
-    matvar_t *matvar = NULL;
-
-    if ( mat == NULL || mat->fp == NULL )
-        return NULL;
-    else if ( NULL == (matvar = calloc(1,sizeof(*matvar))) )
-        return NULL;
-
-    matvar->dims = NULL;
-    matvar->data = NULL;
-    matvar->name = NULL;
-    matvar->fp   = mat;
-#if defined(HAVE_ZLIB)
-    matvar->z    = NULL;
-#endif
-
-    matvar->fpos = ftell(mat->fp);
-
-    err = fread(&tmp,sizeof(int),1,mat->fp);
-    if ( !err ) {
-        free(matvar);
-        return NULL;
-    }
-    M = floor(tmp / 1000.0);
-    tmp -= M*1000;
-    O = floor(tmp / 100.0);
-    tmp -= O*100;
-    matvar->data_type = floor(tmp / 10.0);
-    tmp -= matvar->data_type*10;
-    /* Convert the V4 data type */
-    switch ( matvar->data_type ) {
-        case 0:
-            matvar->data_type = MAT_T_DOUBLE;
-            break;
-        case 1:
-            matvar->data_type = MAT_T_SINGLE;
-            break;
-        case 2:
-            matvar->data_type = MAT_T_INT32;
-            break;
-        case 3:
-            matvar->data_type = MAT_T_INT16;
-            break;
-        case 4:
-            matvar->data_type = MAT_T_UINT16;
-            break;
-        case 5:
-            matvar->data_type = MAT_T_UINT8;
-            break;
-        default:
-            matvar->data_type = -1;
-            break;
-    }
-    matvar->class_type = floor(tmp);
-    switch ( matvar->class_type ) {
-        case 0:
-            matvar->class_type = MAT_C_DOUBLE;
-            break;
-        case 1:
-            matvar->class_type = MAT_C_CHAR;
-            break;
-        case 2:
-            matvar->class_type = MAT_C_SPARSE;
-            break;
-    }
-    matvar->rank = 2;
-    /* FIXME: Check allocation */
-    matvar->dims = malloc(2*sizeof(int));
-    err = fread(matvar->dims,sizeof(int),1,mat->fp);
-    if ( !err ) {
-        Mat_VarFree(matvar);
-        return NULL;
-    }
-    err = fread(matvar->dims+1,sizeof(int),1,mat->fp);
-    if ( !err ) {
-        Mat_VarFree(matvar);
-        return NULL;
-    }
-    err = fread(&(matvar->isComplex),sizeof(int),1,mat->fp);
-    if ( !err ) {
-        Mat_VarFree(matvar);
-        return NULL;
-    }
-    err = fread(&tmp,sizeof(int),1,mat->fp);
-    if ( !err ) {
-        Mat_VarFree(matvar);
-        return NULL;
-    }
-    /* FIXME: Check allocation */
-    matvar->name = malloc(tmp);
-    err = fread(matvar->name,1,tmp,mat->fp);
-    if ( !err ) {
-        Mat_VarFree(matvar);
-        return NULL;
-    }
-
-    matvar->datapos = ftell(mat->fp);
-    nBytes = matvar->dims[0]*matvar->dims[1]*Mat_SizeOf(matvar->data_type);
-    if ( matvar->isComplex )
-        nBytes *= 2;
-    fseek(mat->fp,nBytes,SEEK_CUR);
-                
-    return matvar;  
-}
-
-void
-Mat_VarPrint4(matvar_t *matvar,int printdata)
-{
-    int i, j;
-
-    if ( matvar == NULL )
-        return;
-    if ( matvar->name )
-        Mat_Message("      Name: %s", matvar->name);
-    Mat_Message("      Rank: %d", matvar->rank);
-    if ( matvar->rank == 0 )
-        return;
-    if ( matvar->isComplex )
-        Mat_Message("Class Type: %s (complex)",v4_class_type_desc[matvar->class_type]);
-    else
-        Mat_Message("Class Type: %s",v4_class_type_desc[matvar->class_type]);
-    if ( matvar->data_type )
-        Mat_Message(" Data Type: %s",v4_data_type_desc[matvar->data_type]);
-    if ( matvar->data != NULL && matvar->data_size > 0 ) {
-        switch( matvar->class_type ) {
-            case MAT_C_DOUBLE:
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if (matvar->rank == 2 &&
-                           (matvar->dims[0] > 15 || matvar->dims[1] > 15) && 
-                           matvar->isComplex ) {
-                    int N;
-                    struct ComplexSplit *cdata = matvar->data;
-                    double *re = cdata->Re,*im = cdata->Im;
-                    N = matvar->dims[0]*matvar->dims[1];
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%f + %fi ",re[matvar->dims[0]*j+i],
-                                               im[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if (matvar->rank == 2 &&
-                           (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%f ", ((double*)matvar->data)[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 && matvar->isComplex) {
-                    int N;
-                    struct ComplexSplit *cdata = matvar->data;
-                    double *re = cdata->Re,*im = cdata->Im;
-                    N = matvar->dims[0]*matvar->dims[1];
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%f + %fi ",re[matvar->dims[0]*j+i],
-                                               im[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else if ( matvar->rank == 2 ) {
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%f ", ((double*)matvar->data)[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                }
-                break;
-            case MAT_C_SINGLE:
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if (matvar->rank == 2 &&
-                           (matvar->dims[0] > 15 || matvar->dims[1] > 15) && 
-                           matvar->isComplex ) {
-                    int N;
-                    struct ComplexSplit *cdata = matvar->data;
-                    float *re = cdata->Re,*im = cdata->Im;
-                    N = matvar->dims[0]*matvar->dims[1];
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%f + %fi",
-                                re[matvar->dims[0]*j+i],
-                                im[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if (matvar->rank == 2 &&
-                           (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%f ", ((float*)matvar->data)[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 && matvar->isComplex) {
-                    int N;
-                    struct ComplexSplit *cdata = matvar->data;
-                    float *re = cdata->Re,*im = cdata->Im;
-                    N = matvar->dims[0]*matvar->dims[1];
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%f + %fi ",re[matvar->dims[0]*j+i],
-                                               im[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else if ( matvar->rank == 2 ) {
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%f ", ((float*)matvar->data)[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                }
-                break;
-            case MAT_C_INT32:
-            {
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if (matvar->rank == 2 &&
-                           (matvar->dims[0] > 15 || matvar->dims[1] > 15) && 
-                           matvar->isComplex ) {
-                    int N;
-                    struct ComplexSplit *cdata = matvar->data;
-                    mat_int32_t *re = cdata->Re,*im = cdata->Im;
-                    N = matvar->dims[0]*matvar->dims[1];
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%d + %di ",re[matvar->dims[0]*j+i],
-                                               im[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if (matvar->rank == 2 &&
-                           (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    mat_int32_t *data = matvar->data;
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%d ",data[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 && matvar->isComplex) {
-                    int N;
-                    struct ComplexSplit *cdata = matvar->data;
-                    mat_int32_t *re = cdata->Re,*im = cdata->Im;
-                    N = matvar->dims[0]*matvar->dims[1];
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%d + %di ",re[matvar->dims[0]*j+i],
-                                               im[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else if ( matvar->rank == 2 ) {
-                    mat_int32_t *data = matvar->data;
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%d ", data[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                }
-                break;
-            }
-            case MAT_C_INT16:
-            {
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if (matvar->rank == 2 &&
-                           (matvar->dims[0] > 15 || matvar->dims[1] > 15) && 
-                           matvar->isComplex ) {
-                    int N;
-                    struct ComplexSplit *cdata = matvar->data;
-                    mat_int16_t *re = cdata->Re,*im = cdata->Im;
-                    N = matvar->dims[0]*matvar->dims[1];
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%hd + %hdi ",re[matvar->dims[0]*j+i],
-                                   im[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if (matvar->rank == 2 &&
-                           (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    mat_int16_t *data = matvar->data;
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%hd ",data[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 && matvar->isComplex) {
-                    int N;
-                    struct ComplexSplit *cdata = matvar->data;
-                    mat_int16_t *re = cdata->Re,*im = cdata->Im;
-                    N = matvar->dims[0]*matvar->dims[1];
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%hd + %hdi ",re[matvar->dims[0]*j+i],
-                                im[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else if ( matvar->rank == 2 ) {
-                    mat_int16_t *data = matvar->data;
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%hd ", data[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                }
-                break;
-            }
-            case MAT_C_UINT16:
-            {
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if (matvar->rank == 2 &&
-                           (matvar->dims[0] > 15 || matvar->dims[1] > 15) && 
-                           matvar->isComplex ) {
-                    int N;
-                    struct ComplexSplit *cdata = matvar->data;
-                    mat_uint16_t *re = cdata->Re,*im = cdata->Im;
-                    N = matvar->dims[0]*matvar->dims[1];
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%hu + %hui ",re[matvar->dims[0]*j+i],
-                                                 im[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if (matvar->rank == 2 &&
-                           (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    mat_int16_t *data = matvar->data;
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%hu ",data[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 && matvar->isComplex) {
-                    int N;
-                    struct ComplexSplit *cdata = matvar->data;
-                    mat_uint16_t *re = cdata->Re,*im = cdata->Im;
-                    N = matvar->dims[0]*matvar->dims[1];
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%hu + %hui ",re[matvar->dims[0]*j+i],
-                                                 im[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else if ( matvar->rank == 2 ) {
-                    mat_int16_t *data = matvar->data;
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%hu ", data[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                }
-                break;
-            }
-            case MAT_C_UINT8:
-            {
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if (matvar->rank == 2 &&
-                           (matvar->dims[0] > 15 || matvar->dims[1] > 15) && 
-                           matvar->isComplex ) {
-                    int N;
-                    struct ComplexSplit *cdata = matvar->data;
-                    mat_int8_t *re = cdata->Re,*im = cdata->Im;
-                    N = matvar->dims[0]*matvar->dims[1];
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%hu + %hui ",re[matvar->dims[0]*j+i],
-                                                 im[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if (matvar->rank == 2 &&
-                           (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    mat_int8_t *data = matvar->data;
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%hu ",(mat_uint16_t)data[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 && matvar->isComplex) {
-                    int N;
-                    struct ComplexSplit *cdata = matvar->data;
-                    mat_int8_t *re = cdata->Re,*im = cdata->Im;
-                    N = matvar->dims[0]*matvar->dims[1];
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%hu + %hui ",re[matvar->dims[0]*j+i],
-                                                 im[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else if ( matvar->rank == 2 ) {
-                    mat_int8_t *data = matvar->data;
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%hu ",(mat_uint16_t)data[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                }
-                break;
-            }
-        }
-    }
-    return;
-}

+ 0 - 30
matlabAccess/matio/src/mat4.h

@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2008   Christopher C. Hulbert
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public
- *  License as published by the Free Software Foundation; either
- *  version 2.1 of the License, or (at your option) any later version.
- *
- *  This library is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this library; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-#ifndef MAT4_H
-#define MAT4_H
-
-#include "matio.h"
-
-void Read4(mat_t *mat, matvar_t *matvar);
-int  ReadData4(mat_t *mat,matvar_t *matvar,void *data,
-         int *start,int *stride,int *edge);
-
-void Mat_VarPrint4( matvar_t *matvar, int printdata );
-matvar_t *Mat_VarReadNextInfo4(mat_t *mat);
-
-#endif

+ 0 - 7103
matlabAccess/matio/src/mat5.c

@@ -1,7103 +0,0 @@
-/** @file mat5.c
- * Matlab MAT version 5 file functions
- * @ingroup MAT
- */
-/*
- * Copyright (C) 2005-2006   Christopher C. Hulbert
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public
- *  License as published by the Free Software Foundation; either
- *  version 2.1 of the License, or (at your option) any later version.
- *
- *  This library is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this library; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-/* FIXME: Implement Unicode support */
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <math.h>
-#include <time.h>
-#include "matio.h"
-#include "mat5.h"
-#include "matio_private.h"
-
-static const char *class_type_desc[16] = {"Undefined","Cell Array","Structure",
-       "Object","Character Array","Sparse Array","Double Precision Array",
-       "Single Precision Array", "8-bit, signed Integer Array",
-       "8-bit, Unsigned Integer Array","16-bit, signed Integer Array",
-       "16-bit, unsigned Integer Array","32-bit, signed Integer Array",
-       "32-bit, unsigned Integer Array","Matlab Array","Compressed Data"};
-static const char *data_type_desc[23] = {"Unknown","8-bit, signed integer",
-       "8-bit, unsigned integer","16-bit, signed integer",
-       "16-bit, unsigned integer","32-bit, signed integer",
-       "32-bit, unsigned integer","IEEE 754 single-precision","RESERVED",
-       "IEEE 754 double-precision","RESERVED","RESERVED",
-       "64-bit, signed integer","64-bit, unsigned integer", "Matlab Array",
-       "Compressed Data","Unicode UTF-8 Encoded Character Data",
-       "Unicode UTF-16 Encoded Character Data",
-       "Unicode UTF-32 Encoded Character Data","","String","Cell Array",
-       "Structure"};
-
-/*
- * -------------------------------------------------------------
- *   Private Functions
- * -------------------------------------------------------------
- */
-
-static size_t GetMatrixMaxBufSize(matvar_t *matvar);
-static size_t GetStructFieldBufSize(matvar_t *matvar);
-static size_t GetCellArrayFieldBufSize(matvar_t *matvar);
-
-/** @brief determines the number of bytes needed to store the given struct field
- *
- * @ingroup mat_internal
- * @param matvar field of a structure
- * @return the number of bytes needed to store the struct field
- */
-static size_t
-GetStructFieldBufSize(matvar_t *matvar)
-{
-    size_t nBytes = 0,len;
-    size_t tag_size = 8, array_flags_size = 8;
-    int    nmemb = 1, i;
-
-    if ( matvar == NULL )
-        return nBytes;
-
-    /* Have to account for the matrix tag in a struct field */
-    nBytes += tag_size;
-
-    /* Add the Array Flags tag and space to the number of bytes */
-    nBytes += tag_size + array_flags_size;
-
-    /* In a struct field, the name is just a tag with 0 bytes */
-    nBytes += tag_size;
-
-    /* Add rank and dimensions, padded to an 8 byte block */
-    for ( i = 0, len = 0; i < matvar->rank; i++ )
-        nmemb *= matvar->dims[i];
-    if ( matvar->rank % 2 )
-        nBytes += tag_size + matvar->rank*4 + 4;
-    else
-        nBytes += tag_size + matvar->rank*4;
-
-    if ( matvar->class_type == MAT_C_STRUCT ) {
-        matvar_t **fields = matvar->data;
-        int i, nfields;
-        size_t maxlen = 0;
-
-        nfields = matvar->nbytes / (nmemb*matvar->data_size);
-        for ( i = 0; i < nfields; i++ ) {
-            if ( NULL != fields[i]->name && strlen(fields[i]->name) > maxlen )
-                maxlen = strlen(fields[i]->name);
-        }
-        maxlen++;
-        while ( nfields*maxlen % 8 != 0 )
-            maxlen++;
-
-        nBytes += tag_size + tag_size + maxlen*nfields;
-
-        /* FIXME: Add bytes for the fieldnames */
-        if ( NULL != fields && nfields > 0 ) {
-            for ( i = 0; i < nfields*nmemb; i++ )
-                nBytes += GetStructFieldBufSize(fields[i]);
-        }
-    } else if ( matvar->class_type == MAT_C_CELL ) {
-        matvar_t **cells = matvar->data;
-        int i, ncells = matvar->nbytes / matvar->data_size;
-
-        if ( NULL != cells && ncells > 0 ) {
-            for ( i = 0; i < ncells; i++ )
-                nBytes += GetCellArrayFieldBufSize(cells[i]);
-        }
-    } else if ( matvar->class_type == MAT_C_SPARSE ) {
-        sparse_t *sparse = matvar->data;
-
-        nBytes += tag_size + sparse->njc*sizeof(mat_int32_t) +
-                  tag_size + sparse->nir*sizeof(mat_int32_t) +
-                  tag_size + sparse->ndata*Mat_SizeOf(matvar->data_type);
-        if ( matvar->isComplex )
-            nBytes += tag_size + sparse->ndata*Mat_SizeOf(matvar->data_type);
-    } else {
-        nBytes += tag_size + nmemb*Mat_SizeOf(matvar->data_type);
-        if (nmemb*Mat_SizeOf(matvar->data_type) % 8) {
-            nBytes += (8 - (nmemb*Mat_SizeOf(matvar->data_type) % 8));
-          }
-        if ( matvar->isComplex ) {
-            nBytes += tag_size + nmemb*Mat_SizeOf(matvar->data_type);
-            if (nmemb*Mat_SizeOf(matvar->data_type) % 8) {
-                nBytes += (8 - (nmemb*Mat_SizeOf(matvar->data_type) % 8));
-              }
-          }
-    }
-    
-    return nBytes;
-}
-
-/** @brief determines the number of bytes needed to store the cell array element
- *
- * @ingroup mat_internal
- * @param matvar MAT variable
- * @return the number of bytes needed to store the variable
- */
-static size_t
-GetCellArrayFieldBufSize(matvar_t *matvar)
-{
-    size_t nBytes = 0,len;
-    size_t tag_size = 8, array_flags_size = 8;
-    int    nmemb = 1, i;
-
-    if ( matvar == NULL )
-        return nBytes;
-
-    /* Have to account for the matrix tag in a struct field */
-    nBytes += tag_size;
-
-    /* Add the Array Flags tag and space to the number of bytes */
-    nBytes += tag_size + array_flags_size;
-
-    /* Get size of variable name, pad it to an 8 byte block, and add it to nBytes */
-    if ( NULL != matvar->name )
-        len = strlen(matvar->name);
-    else
-        len=4;
-
-    if ( len <= 4 ) {
-        nBytes += tag_size;
-    } else {
-        if ( len % 8 )
-            len = len + (8 - len % 8);
-        nBytes += tag_size + len;
-    }
-
-    /* Add rank and dimensions, padded to an 8 byte block */
-    for ( i = 0, len = 0; i < matvar->rank; i++ )
-        nmemb *= matvar->dims[i];
-    if ( matvar->rank % 2 )
-        nBytes += tag_size + matvar->rank*4 + 4;
-    else
-        nBytes += tag_size + matvar->rank*4;
-
-    if ( matvar->class_type == MAT_C_STRUCT ) {
-        matvar_t **fields = matvar->data;
-        int i, nfields;
-        size_t maxlen = 0;
-
-        nfields = matvar->nbytes / (nmemb*matvar->data_size);
-        for ( i = 0; i < nfields; i++ ) {
-            if ( NULL != fields[i]->name && strlen(fields[i]->name) > maxlen )
-                maxlen = strlen(fields[i]->name);
-        }
-        maxlen++;
-        while ( nfields*maxlen % 8 != 0 )
-            maxlen++;
-
-        nBytes += tag_size + tag_size + maxlen*nfields;
-
-        if ( NULL != fields && nfields > 0 ) {
-            for ( i = 0; i < nfields*nmemb; i++ )
-                nBytes += GetStructFieldBufSize(fields[i]);
-        }
-    } else if ( matvar->class_type == MAT_C_CELL ) {
-        matvar_t **cells = matvar->data;
-        int i, ncells = matvar->nbytes / matvar->data_size;
-
-        if ( NULL != cells && ncells > 0 ) {
-            for ( i = 0; i < ncells; i++ )
-                nBytes += GetCellArrayFieldBufSize(cells[i]);
-        }
-    } else if ( matvar->class_type == MAT_C_SPARSE ) {
-        sparse_t *sparse = matvar->data;
-
-        nBytes += tag_size + sparse->njc*sizeof(mat_int32_t) +
-                  tag_size + sparse->nir*sizeof(mat_int32_t) +
-                  tag_size + sparse->ndata*Mat_SizeOf(matvar->data_type);
-        if ( matvar->isComplex )
-            nBytes += tag_size + sparse->ndata*Mat_SizeOf(matvar->data_type);
-    } else {
-        nBytes += tag_size + nmemb*Mat_SizeOf(matvar->data_type);
-        if ( nmemb*Mat_SizeOf(matvar->data_type) % 8 ) {
-            nBytes += (8 - (nmemb*Mat_SizeOf(matvar->data_type) % 8));
-          }
-        if ( matvar->isComplex ) {
-            nBytes += tag_size + nmemb*Mat_SizeOf(matvar->data_type);
-            if ( nmemb*Mat_SizeOf(matvar->data_type) % 8 ) {
-                nBytes += (8 - (nmemb*Mat_SizeOf(matvar->data_type) % 8));
-              }
-          }
-    }
-    
-    return nBytes;
-}
-
-/** @brief determines the number of bytes needed to store the given variable
- *
- * @ingroup mat_internal
- * @param matvar MAT variable
- * @return the number of bytes needed to store the variable
- */
-static size_t
-GetMatrixMaxBufSize(matvar_t *matvar)
-{
-    size_t nBytes = 0,len;
-    size_t tag_size = 8, array_flags_size = 8;
-    int    nmemb = 1, i;
-
-    if ( matvar == NULL )
-        return nBytes;
-
-    /* Add the Array Flags tag and space to the number of bytes */
-    nBytes += tag_size + array_flags_size;
-
-    /* Get size of variable name, pad it to an 8 byte block, and add it to nBytes */
-    if ( NULL != matvar->name )
-        len = strlen(matvar->name);
-    else
-        len=8;
-
-    if ( len <= 4 ) {
-        nBytes += tag_size;
-    } else {
-        if ( len % 8 )
-            len = len + (8 - len % 8);
-        nBytes += tag_size + len;
-    }
-
-    /* Add rank and dimensions, padded to an 8 byte block */
-    for ( i = 0, len = 0; i < matvar->rank; i++ )
-        nmemb *= matvar->dims[i];
-    if ( matvar->rank % 2 )
-        nBytes += tag_size + matvar->rank*4 + 4;
-    else
-        nBytes += tag_size + matvar->rank*4;
-
-    if ( matvar->class_type == MAT_C_STRUCT ) {
-        matvar_t **fields = matvar->data;
-        int i, nfields;
-        size_t maxlen = 0;
-
-        nfields = matvar->nbytes / (nmemb*matvar->data_size);
-        for ( i = 0; i < nfields; i++ ) {
-            if ( NULL != fields[i]->name && strlen(fields[i]->name) > maxlen )
-                maxlen = strlen(fields[i]->name);
-        }
-        maxlen++;
-        while ( nfields*maxlen % 8 != 0 )
-            maxlen++;
-
-        nBytes += tag_size + tag_size + maxlen*nfields;
-
-        /* FIXME: Add bytes for the fieldnames */
-        if ( NULL != fields && nfields > 0 ) {
-            for ( i = 0; i < nfields*nmemb; i++ )
-                nBytes += GetStructFieldBufSize(fields[i]);
-        }
-    } else if ( matvar->class_type == MAT_C_CELL ) {
-        matvar_t **cells = matvar->data;
-        int i, ncells = matvar->nbytes / matvar->data_size;
-
-        if ( NULL != cells && ncells > 0 ) {
-            for ( i = 0; i < ncells; i++ )
-                nBytes += GetCellArrayFieldBufSize(cells[i]);
-        }
-    } else if ( matvar->class_type == MAT_C_SPARSE ) {
-        sparse_t *sparse = matvar->data;
-
-        nBytes += tag_size + sparse->njc*sizeof(mat_int32_t) +
-                  tag_size + sparse->nir*sizeof(mat_int32_t) +
-                  tag_size + sparse->ndata*Mat_SizeOf(matvar->data_type);
-        if ( matvar->isComplex )
-            nBytes += tag_size + sparse->ndata*Mat_SizeOf(matvar->data_type);
-    } else {
-        nBytes += tag_size + nmemb*Mat_SizeOf(matvar->data_type);
-        if ( nmemb*Mat_SizeOf(matvar->data_type) % 8 ) {
-            nBytes += (8 - (nmemb*Mat_SizeOf(matvar->data_type) % 8));
-          }
-        if ( matvar->isComplex ) {
-            nBytes += tag_size + nmemb*Mat_SizeOf(matvar->data_type);
-            if ( nmemb*Mat_SizeOf(matvar->data_type) % 8 ) {
-                nBytes += (8 - (nmemb*Mat_SizeOf(matvar->data_type) % 8));
-              }
-          }
-    }
-    
-    return nBytes;
-}
-
-/** @brief Writes @c data as character data
- *
- * This function uses the knowledge that the data is part of a character class
- * to avoid some pitfalls with Matlab listed below.
- *   @li Matlab character data cannot be unsigned 8-bit integers, it needs at
- *       least unsigned 16-bit integers
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param data character data to write
- * @param N Number of elements to write
- * @param data_type character data type (enum matio_types)
- * @return number of bytes written
- */ 
-int
-WriteCharData(mat_t *mat, void *data, int N,int data_type)
-{
-    int nBytes = 0, bytesread = 0, i;
-    mat_int8_t pad1 = 0;
-
-    switch ( data_type ) {
-        case MAT_T_UINT16:
-        {
-            nBytes = N*2;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            fwrite(data,2,N,mat->fp);
-            if ( nBytes % 8 )
-                for ( i = nBytes % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-            break;
-        }
-        case MAT_T_INT8:
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t *ptr;
-            mat_uint16_t c;
-
-            /* Matlab can't read MAT_C_CHAR as uint8, needs uint16 */
-            nBytes = N*2;
-            data_type = MAT_T_UINT16;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            ptr = data;
-            for ( i = 0; i < N; i++ ) {
-                c = (mat_uint16_t)*(char *)ptr;
-                fwrite(&c,2,1,mat->fp);
-                ptr++;
-            }
-            if ( nBytes % 8 )
-                for ( i = nBytes % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-            break;
-        }
-        case MAT_T_UTF8:
-        {
-            mat_uint8_t *ptr;
-
-            nBytes = N;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            ptr = data;
-            fwrite(ptr,1,nBytes,mat->fp);
-            if ( nBytes % 8 )
-                for ( i = nBytes % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-            break;
-        }
-    }
-    bytesread+=nBytes;
-    return bytesread;
-}
-
-#if defined(HAVE_ZLIB)
-/** @brief Writes @c data as compressed character data
- *
- * This function uses the knowledge that the data is part of a character class
- * to avoid some pitfalls with Matlab listed below.
- *   @li Matlab character data cannot be unsigned 8-bit integers, it needs at
- *       least unsigned 16-bit integers
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param z pointer to the zlib compression stream
- * @param data character data to write
- * @param N Number of elements to write
- * @param data_type character data type (enum matio_types)
- * @return number of bytes written
- */ 
-size_t
-WriteCompressedCharData(mat_t *mat,z_stream *z,void *data,int N,int data_type)
-{
-    int nBytes = 0, data_size, data_tag[2], err, byteswritten = 0;
-    int buf_size = 1024, i;
-    mat_uint8_t   buf[1024], pad[8] = {0,};
-
-    if ((mat == NULL) || (data == NULL) || (mat->fp == NULL))
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_UINT16:
-        {
-            data_size = 2;
-            data_tag[0]  = MAT_T_UINT16;
-            data_tag[1]  = N*data_size;
-            z->next_in   = data_tag;
-            z->avail_in  = 8;
-            z->next_out  = buf;
-            z->avail_out = buf_size;
-            err = deflate(z,Z_NO_FLUSH);
-            byteswritten += fwrite(buf,1,buf_size-z->avail_out,mat->fp);
-            z->next_in   = data;
-            z->avail_in  = data_size*N;
-            do {
-                z->next_out  = buf;
-                z->avail_out = buf_size;
-                err = deflate(z,Z_NO_FLUSH);
-                byteswritten += fwrite(buf,1,buf_size-z->avail_out,mat->fp);
-            } while ( z->avail_out == 0 );
-            /* Add/Compress padding to pad to 8-byte boundary */
-            if ( N*data_size % 8 ) {
-                z->next_in   = pad;
-                z->avail_in  = 8 - (N*data_size % 8);
-                z->next_out  = buf;
-                z->avail_out = buf_size;
-                err = deflate(z,Z_NO_FLUSH);
-                byteswritten += fwrite(buf,1,buf_size-z->avail_out,mat->fp);
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t *ptr;
-            mat_uint16_t c;
-
-            /* Matlab can't read MAT_C_CHAR as uint8, needs uint16 */
-            data_size    = 2;
-            data_tag[0]  = MAT_T_UINT16;
-            data_tag[1]  = N*data_size;
-            z->next_in   = data_tag;
-            z->avail_in  = 8;
-            z->next_out  = buf;
-            z->avail_out = buf_size;
-            err = deflate(z,Z_NO_FLUSH);
-            byteswritten += fwrite(buf,1,buf_size-z->avail_out,mat->fp);
-            z->next_in   = data;
-            z->avail_in  = data_size*N;
-            ptr = data;
-            for ( i = 0; i < N; i++ ) {
-                c = (mat_uint16_t)*(char *)ptr;
-                z->next_in   = &c;
-                z->avail_in  = 2;
-                z->next_out  = buf;
-                z->avail_out = buf_size;
-                err = deflate(z,Z_NO_FLUSH);
-                byteswritten += fwrite(buf,1,buf_size-z->avail_out,mat->fp);
-                ptr++;
-            }
-            /* Add/Compress padding to pad to 8-byte boundary */
-            if ( N*data_size % 8 ) {
-                z->next_in   = pad;
-                z->avail_in  = 8 - (N*data_size % 8);
-                z->next_out  = buf;
-                z->avail_out = buf_size;
-                err = deflate(z,Z_NO_FLUSH);
-                byteswritten += fwrite(buf,1,buf_size-z->avail_out,mat->fp);
-            }
-            break;
-        }
-        case MAT_T_UTF8:
-        {
-            data_size = 1;
-            data_tag[0]  = MAT_T_UTF8;
-            data_tag[1]  = N*data_size;
-            z->next_in   = data_tag;
-            z->avail_in  = 8;
-            z->next_out  = buf;
-            z->avail_out = buf_size;
-            err = deflate(z,Z_NO_FLUSH);
-            byteswritten += fwrite(buf,1,buf_size-z->avail_out,mat->fp);
-            z->next_in   = data;
-            z->avail_in  = data_size*N;
-            do {
-                z->next_out  = buf;
-                z->avail_out = buf_size;
-                err = deflate(z,Z_NO_FLUSH);
-                byteswritten += fwrite(buf,1,buf_size-z->avail_out,mat->fp);
-            } while ( z->avail_out == 0 );
-            /* Add/Compress padding to pad to 8-byte boundary */
-            if ( N*data_size % 8 ) {
-                z->next_in   = pad;
-                z->avail_in  = 8 - (N*data_size % 8);
-                z->next_out  = buf;
-                z->avail_out = buf_size;
-                err = deflate(z,Z_NO_FLUSH);
-                byteswritten += fwrite(buf,1,buf_size-z->avail_out,mat->fp);
-            }
-            break;
-        }
-    }
-    return byteswritten;
-}
-#endif
-
-/** @brief Writes empty characters to the MAT file
- *
- * This function uses the knowledge that the data is part of a character class
- * to avoid some pitfalls with Matlab listed below.
- *   @li Matlab character data cannot be unsigned 8-bit integers, it needs at
- *       least unsigned 16-bit integers
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param data character data to write
- * @param N Number of elements to write
- * @param data_type character data type (enum matio_types)
- * @return number of bytes written
- */ 
-int
-WriteEmptyCharData(mat_t *mat, int N, int data_type)
-{
-    int nBytes = 0, bytesread = 0, i;
-    mat_int8_t pad1 = 0;
-
-    switch ( data_type ) {
-        case MAT_T_UINT8: /* Matlab MAT_C_CHAR needs uint16 */
-        case MAT_T_INT8:  /* Matlab MAT_C_CHAR needs uint16 */
-            data_type = MAT_T_UINT16;
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t u16 = 0;
-            nBytes = N*sizeof(mat_uint16_t);
-            fwrite(&data_type,sizeof(mat_int32_t),1,mat->fp);
-            fwrite(&nBytes,sizeof(mat_int32_t),1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&u16,sizeof(mat_uint16_t),1,mat->fp);
-            if ( nBytes % 8 )
-                for ( i = nBytes % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-            break;
-        }
-        case MAT_T_UTF8:
-        {
-            mat_uint8_t u8 = 0;
-            nBytes = N;
-            fwrite(&data_type,sizeof(mat_int32_t),1,mat->fp);
-            fwrite(&nBytes,sizeof(mat_int32_t),1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&u8,sizeof(mat_uint8_t),1,mat->fp);
-            if ( nBytes % 8 )
-                for ( i = nBytes % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-            break;
-        }
-    }
-    bytesread+=nBytes;
-    return bytesread;
-}
-
-/* @brief Writes the data tags and empty data to the file
- *
- * Writes the data tags and empty data to the file to save space for the
- * variable when the actual data is written
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param N number of elements to write
- * @param data_type data type to write
- * @return Number of bytes written
- */
-int
-WriteEmptyData(mat_t *mat,int N,int data_type)
-{
-    int nBytes = 0, data_size, i;
-
-    if ( (mat == NULL) || (mat->fp == NULL) )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            double d = 0.0;
-
-            data_size = sizeof(double);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&d,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_SINGLE:
-        {
-            float f = 0.0;
-
-            data_size = sizeof(float);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&f,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            mat_int8_t i8 = 0;
-
-            data_size = sizeof(mat_int8_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&i8,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t ui8 = 0;
-
-            data_size = sizeof(mat_uint8_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&ui8,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            mat_int16_t i16 = 0;
-
-            data_size = sizeof(mat_int16_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&i16,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t ui16 = 0;
-
-            data_size = sizeof(mat_uint16_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&ui16,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_INT32:
-        {
-            mat_int32_t i32 = 0;
-
-            data_size = sizeof(mat_int32_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&i32,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            mat_uint32_t ui32 = 0;
-
-            data_size = sizeof(mat_uint32_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&ui32,data_size,1,mat->fp);
-            break;
-        }
-#ifdef HAVE_MAT_INT64_T
-        case MAT_T_INT64:
-        {
-            mat_int64_t i64 = 0;
-
-            data_size = sizeof(mat_int64_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&i64,data_size,1,mat->fp);
-            break;
-        }
-#endif
-#ifdef HAVE_MAT_UINT64_T
-        case MAT_T_UINT64:
-        {
-            mat_uint64_t ui64 = 0;
-
-            data_size = sizeof(mat_uint64_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&ui64,data_size,1,mat->fp);
-            break;
-        }
-#endif
-        default:
-            nBytes = 0;
-    }
-    return nBytes;
-}
-
-#if defined(HAVE_ZLIB)
-int
-WriteCompressedEmptyData(mat_t *mat,z_stream *z,int N,int data_type)
-{
-    int nBytes = 0, data_size, i, err, byteswritten = 0;
-
-    if ( (mat == NULL) || (mat->fp == NULL) )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            mat_uint32_t uncomp_buf[32] = {0,};
-            mat_uint32_t comp_buf[32] = {0,};
-            double data_uncomp_buf[4] = {0.0,};
-
-            data_size = sizeof(double);
-            nBytes = N*data_size;
-            uncomp_buf[0] = data_type;
-            uncomp_buf[1] = 0;
-            z->next_out  = comp_buf;
-            z->next_in   = uncomp_buf;
-            z->avail_out = 32*sizeof(*comp_buf);
-            z->avail_in  = 8;
-            err = deflate(z,Z_NO_FLUSH);
-            byteswritten += fwrite(comp_buf,1,32*sizeof(*comp_buf)-z->avail_out,mat->fp);
-            for ( i = 0; i < N; i++ ) {
-                z->next_out  = comp_buf;
-                z->next_in   = data_uncomp_buf;
-                z->avail_out = 32*sizeof(*comp_buf);
-                z->avail_in  = 8;
-                err = deflate(z,Z_NO_FLUSH);
-                byteswritten += fwrite(comp_buf,32*sizeof(*comp_buf)-z->avail_out,1,mat->fp);
-            }
-            break;
-        }
-        case MAT_T_SINGLE:
-        {
-            float f = 0.0;
-
-            data_size = sizeof(float);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&f,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            mat_int8_t i8 = 0;
-
-            data_size = sizeof(mat_int8_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&i8,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t ui8 = 0;
-
-            data_size = sizeof(mat_uint8_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&ui8,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            mat_int16_t i16 = 0;
-
-            data_size = sizeof(mat_int16_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&i16,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t ui16 = 0;
-
-            data_size = sizeof(mat_uint16_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&ui16,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_INT32:
-        {
-            mat_int32_t i32 = 0;
-
-            data_size = sizeof(mat_int32_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&i32,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            mat_uint32_t ui32 = 0;
-
-            data_size = sizeof(mat_uint32_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&ui32,data_size,1,mat->fp);
-            break;
-        }
-#ifdef HAVE_MAT_INT64_T
-        case MAT_T_INT64:
-        {
-            mat_int64_t i64 = 0;
-
-            data_size = sizeof(mat_int64_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&i64,data_size,1,mat->fp);
-            break;
-        }
-#endif
-#ifdef HAVE_MAT_UINT64_T
-        case MAT_T_UINT64:
-        {
-            mat_uint64_t ui64 = 0;
-
-            data_size = sizeof(mat_uint64_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&ui64,data_size,1,mat->fp);
-            break;
-        }
-#endif
-        default:
-            nBytes = 0;
-    }
-    return byteswritten;
-}
-#endif
-
-/** @param Writes a 2-D slab of data to the MAT file
- *
- * @ingroup mat_internal
- * @fixme should return the number of bytes written, but currently returns 0
- * @param mat MAT file pointer
- * @param data pointer to the slab of data
- * @param data_type data type of the data (enum matio_types)
- * @param dims dimensions of the dataset
- * @param start index to start writing the data in each dimension
- * @param stride write data every @c stride elements
- * @param edge number of elements to write in each dimension
- * @return number of byteswritten
- */
-int
-WriteDataSlab2(mat_t *mat,void *data,int data_type,int *dims,int *start,
-              int *stride,int *edge)
-{
-    int nBytes = 0, data_size, i, j;
-    long pos, row_stride, col_stride;
-
-    if ( (mat   == NULL) || (data   == NULL) || (mat->fp == NULL) ||
-         (start == NULL) || (stride == NULL) || (edge    == NULL) ) {
-        return 0;
-    }
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            double *ptr;
-
-            data_size = sizeof(double);
-            ptr = (double *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    fwrite(ptr++,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        case MAT_T_SINGLE:
-        {
-            float *ptr;
-
-            data_size = sizeof(float);
-            ptr = (float *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    fwrite(ptr++,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-#ifdef HAVE_MAT_INT64_T
-        case MAT_T_INT64:
-        {
-            mat_int64_t *ptr;
-
-            data_size = sizeof(mat_int64_t);
-            ptr = (mat_int64_t *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    fwrite(ptr++,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-#endif
-#ifdef HAVE_MAT_UINT64_T
-        case MAT_T_UINT64:
-        {
-            mat_uint64_t *ptr;
-
-            data_size = sizeof(mat_uint64_t);
-            ptr = (mat_uint64_t *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    fwrite(ptr++,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-#endif
-        case MAT_T_INT32:
-        {
-            mat_int32_t *ptr;
-
-            data_size = sizeof(mat_int32_t);
-            ptr = (mat_int32_t *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    fwrite(ptr++,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            mat_uint32_t *ptr;
-
-            data_size = sizeof(mat_uint32_t);
-            ptr = (mat_uint32_t *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    fwrite(ptr++,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            mat_int16_t *ptr;
-
-            data_size = sizeof(mat_int16_t);
-            ptr = (mat_int16_t *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    fwrite(ptr++,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t *ptr;
-
-            data_size = sizeof(mat_uint16_t);
-            ptr = (mat_uint16_t *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    fwrite(ptr++,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            mat_int8_t *ptr;
-
-            data_size = sizeof(mat_int8_t);
-            ptr = (mat_int8_t *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    fwrite(ptr++,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t *ptr;
-
-            data_size = sizeof(mat_uint8_t);
-            ptr = (mat_uint8_t *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    fwrite(ptr++,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        default:
-            nBytes = 0;
-    }
-    return nBytes;
-}
-
-/** @param Writes a 2-D slab of character data to the MAT file
- *
- * This function uses the knowledge that the data is part of a character class
- * to avoid some pitfalls with Matlab listed below.
- *   @li Matlab character data cannot be unsigned 8-bit integers, it needs at
- *       least unsigned 16-bit integers
- * @ingroup mat_internal
- * @fixme should return the number of bytes written, but currently returns 0
- * @param mat MAT file pointer
- * @param data pointer to the slab of data
- * @param data_type data type of the data (enum matio_types)
- * @param dims dimensions of the dataset
- * @param start index to start writing the data in each dimension
- * @param stride write data every @c stride elements
- * @param edge number of elements to write in each dimension
- * @return number of byteswritten
- */
-int
-WriteCharDataSlab2(mat_t *mat,void *data,int data_type,int *dims,int *start,
-              int *stride,int *edge)
-{
-    int nBytes = 0, data_size, i, j;
-    long pos, row_stride, col_stride;
-
-    if ( (mat   == NULL) || (data   == NULL) || (mat->fp == NULL) ||
-         (start == NULL) || (stride == NULL) || (edge    == NULL) ) {
-        return 0;
-    }
-
-    switch ( data_type ) {
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t *ptr;
-
-            data_size = sizeof(mat_uint16_t);
-            ptr = data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    fwrite(ptr++,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        case MAT_T_UINT8:
-        {
-            /* Matlab can't read MAT_C_CHAR as uint8, needs uint16 */
-            mat_uint8_t *ptr;
-            mat_uint16_t c;
-
-            data_size = sizeof(mat_uint16_t);
-            ptr = data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++,ptr++ ) {
-                    c = *ptr;
-                    fwrite(&c,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        case MAT_T_UTF8:
-        {
-            mat_uint8_t *ptr;
-
-            data_size = sizeof(mat_uint8_t);
-            ptr = data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++,ptr++ ) {
-                    fwrite(ptr,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        default:
-            nBytes = 0;
-    }
-    return nBytes;
-}
-
-/** @brief Writes the data buffer to the file
- *
- * @param mat MAT file pointer
- * @param data pointer to the data to write
- * @param N number of elements to write
- * @param data_type data type of the data
- * @return number of bytes written
- */
-int
-WriteData(mat_t *mat,void *data,int N,int data_type)
-{
-    int nBytes = 0, data_size;
-
-    if ((mat == NULL) || (mat->fp == NULL) || (data == NULL && N > 0))
-        return 0;
-
-    data_size = Mat_SizeOf(data_type);
-    nBytes    = N*data_size;
-    fwrite(&data_type,4,1,mat->fp);
-    fwrite(&nBytes,4,1,mat->fp);
-    fwrite(data,data_size,N,mat->fp);
-
-    return nBytes;
-}
-
-#if defined(HAVE_ZLIB)
-/* Compresses the data buffer and writes it to the file */
-size_t
-WriteCompressedData(mat_t *mat,z_stream *z,void *data,int N,int data_type)
-{
-    int nBytes = 0, data_size, data_tag[2], err, byteswritten = 0;
-    int buf_size = 1024;
-    mat_uint8_t   buf[1024], pad[8] = {0,};
-
-    if ((mat == NULL) || (data == NULL) || (mat->fp == NULL))
-        return 0;
-
-    data_size = Mat_SizeOf(data_type);
-
-    data_tag[0]  = data_type;
-    data_tag[1]  = data_size*N;
-    z->next_in   = data_tag;
-    z->avail_in  = 8;
-    z->next_out  = buf;
-    z->avail_out = buf_size;
-    err = deflate(z,Z_NO_FLUSH);
-    byteswritten += fwrite(buf,1,buf_size-z->avail_out,mat->fp);
-    z->next_in   = data;
-    z->avail_in  = N*data_size;
-    do {
-        z->next_out  = buf;
-        z->avail_out = buf_size;
-        err = deflate(z,Z_NO_FLUSH);
-        byteswritten += fwrite(buf,1,buf_size-z->avail_out,mat->fp);
-    } while ( z->avail_out == 0 );
-    /* Add/Compress padding to pad to 8-byte boundary */
-    if ( N*data_size % 8 ) {
-        z->next_in   = pad;
-        z->avail_in  = 8 - (N*data_size % 8);
-        z->next_out  = buf;
-        z->avail_out = buf_size;
-        err = deflate(z,Z_NO_FLUSH);
-        byteswritten += fwrite(buf,1,buf_size-z->avail_out,mat->fp);
-    }
-    nBytes = byteswritten;
-    return nBytes;
-}
-#endif
-
-/** @brief Reads the next cell of the cell array in @c matvar
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param matvar MAT variable pointer
- * @return Number of bytes read
- */
-int
-ReadNextCell( mat_t *mat, matvar_t *matvar )
-{
-    int ncells, bytesread = 0, i, err;
-    matvar_t **cells = NULL;
-
-    if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-        mat_uint32_t uncomp_buf[16] = {0,};
-        int      nbytes;
-        mat_uint32_t array_flags; 
-
-        ncells = 1;
-        for ( i = 0; i < matvar->rank; i++ )
-            ncells *= matvar->dims[i];
-        matvar->data_size = sizeof(matvar_t *);
-        matvar->nbytes    = ncells*matvar->data_size;
-        matvar->data = malloc(matvar->nbytes);
-        if ( !matvar->data )
-            return bytesread;
-        cells = matvar->data;
-        for ( i = 0; i < ncells; i++ ) {
-            cells[i] = Mat_VarCalloc();
-            if ( NULL == cells[i] ) {
-                Mat_Critical("Couldn't allocate memory for cell %d", i);
-                continue;
-            }
-
-            cells[i]->fpos = ftell(mat->fp)-matvar->z->avail_in;
-
-            /* Read variable tag for cell */
-            bytesread += InflateVarTag(mat,matvar,uncomp_buf);
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(uncomp_buf);
-                (void)Mat_uint32Swap(uncomp_buf+1);
-            }
-            nbytes = uncomp_buf[1];
-            if ( uncomp_buf[0] != MAT_T_MATRIX ) {
-                Mat_Critical("cells[%d], Uncompressed type not MAT_T_MATRIX",i);
-                Mat_VarFree(cells[i]);
-                cells[i] = NULL;
-                return -1;
-            }
-            cells[i]->compression = 1;
-            bytesread += InflateArrayFlags(mat,matvar,uncomp_buf);
-            nbytes -= 16;
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(uncomp_buf);
-                (void)Mat_uint32Swap(uncomp_buf+1);
-                (void)Mat_uint32Swap(uncomp_buf+2);
-                (void)Mat_uint32Swap(uncomp_buf+3);
-            }
-            /* Array Flags */
-            if ( uncomp_buf[0] == MAT_T_UINT32 ) {
-               array_flags = uncomp_buf[2];
-               cells[i]->class_type  = (array_flags & MAT_F_CLASS_T);
-               cells[i]->isComplex   = (array_flags & MAT_F_COMPLEX);
-               cells[i]->isGlobal    = (array_flags & MAT_F_GLOBAL);
-               cells[i]->isLogical   = (array_flags & MAT_F_LOGICAL);
-               if ( cells[i]->class_type == MAT_C_SPARSE ) {
-                   /* Need to find a more appropriate place to store nzmax */
-                   cells[i]->nbytes      = uncomp_buf[3];
-               }
-            } else {
-                Mat_Critical("Expected MAT_T_UINT32 for Array Tags, got %d",
-                               uncomp_buf[0]);
-                bytesread+=InflateSkip(mat,matvar->z,nbytes);
-            }
-            bytesread += InflateDimensions(mat,matvar,uncomp_buf);
-            nbytes -= 8;
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(uncomp_buf);
-                (void)Mat_uint32Swap(uncomp_buf+1);
-            }
-            /* Rank and Dimension */
-            if ( uncomp_buf[0] == MAT_T_INT32 ) {
-                int j = 0;
-
-                cells[i]->rank = uncomp_buf[1];
-                nbytes -= cells[i]->rank;
-                cells[i]->rank /= 4;
-                cells[i]->dims = malloc(cells[i]->rank*sizeof(int));
-                if ( mat->byteswap ) {
-                    for ( j = 0; j < cells[i]->rank; j++ )
-                        cells[i]->dims[j] = Mat_uint32Swap(uncomp_buf+2+j);
-                } else {
-                    for ( j = 0; j < cells[i]->rank; j++ )
-                        cells[i]->dims[j] = uncomp_buf[2+j];
-                }
-                if ( cells[i]->rank % 2 != 0 )
-                    nbytes -= 4;
-            }
-            bytesread += InflateVarNameTag(mat,matvar,uncomp_buf);
-            nbytes -= 8;
-            cells[i]->z = calloc(1,sizeof(z_stream));
-            err = inflateCopy(cells[i]->z,matvar->z);
-            if ( err != Z_OK )
-                Mat_Critical("inflateCopy returned error %d",err);
-            cells[i]->datapos = ftell(mat->fp)-matvar->z->avail_in;
-            if ( cells[i]->class_type == MAT_C_STRUCT )
-                bytesread+=ReadNextStructField(mat,cells[i]);
-            else if ( cells[i]->class_type == MAT_C_CELL )
-                bytesread+=ReadNextCell(mat,cells[i]);
-            fseek(mat->fp,cells[i]->datapos,SEEK_SET);
-            bytesread+=InflateSkip(mat,matvar->z,nbytes);
-        }
-#else
-        Mat_Critical("Not compiled with zlib support");
-#endif
-
-    } else {
-        int ncells;
-        mat_uint32_t buf[16];
-        int      nbytes,nBytes;
-        mat_uint32_t array_flags; 
-
-        ncells = 1;
-        for ( i = 0; i < matvar->rank; i++ )
-            ncells *= matvar->dims[i];
-        matvar->data_size = sizeof(matvar_t *);
-        matvar->nbytes    = ncells*matvar->data_size;
-        matvar->data = malloc(matvar->nbytes);
-        if ( !matvar->data ) {
-            Mat_Critical("Couldn't allocate memory for %s->data",matvar->name);
-            return bytesread;
-        }
-        cells = (matvar_t **)matvar->data;
-        for ( i = 0; i < ncells; i++ ) {
-            cells[i] = Mat_VarCalloc();
-            if ( !cells[i] ) {
-                Mat_Critical("Couldn't allocate memory for cell %d", i);
-                continue;
-            }
-
-            cells[i]->fpos = ftell(mat->fp);
-
-            /* Read variable tag for cell */
-            bytesread += fread(buf,4,2,mat->fp);
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(buf);
-                (void)Mat_uint32Swap(buf+1);
-            }
-            nBytes = buf[1];
-            if ( buf[0] != MAT_T_MATRIX ) {
-                Mat_Critical("cells[%d] not MAT_T_MATRIX, fpos = %ld",i,ftell(mat->fp));
-                Mat_VarFree(cells[i]);
-                cells[i] = NULL;
-                continue;
-            }
-            cells[i]->compression = 0;
-#if defined(HAVE_ZLIB)
-            cells[i]->z = NULL;
-#endif
-
-            /* Read Array Flags and The Dimensions Tag */
-            bytesread  += fread(buf,4,6,mat->fp);
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(buf);
-                (void)Mat_uint32Swap(buf+1);
-                (void)Mat_uint32Swap(buf+2);
-                (void)Mat_uint32Swap(buf+3);
-                (void)Mat_uint32Swap(buf+4);
-                (void)Mat_uint32Swap(buf+5);
-            }
-            nBytes-=24;
-            /* Array Flags */
-            if ( buf[0] == MAT_T_UINT32 ) {
-               array_flags = buf[2];
-               cells[i]->class_type  = (array_flags & MAT_F_CLASS_T);
-               cells[i]->isComplex   = (array_flags & MAT_F_COMPLEX);
-               cells[i]->isGlobal    = (array_flags & MAT_F_GLOBAL);
-               cells[i]->isLogical   = (array_flags & MAT_F_LOGICAL);
-               if ( cells[i]->class_type == MAT_C_SPARSE ) {
-                   /* Need to find a more appropriate place to store nzmax */
-                   cells[i]->nbytes      = buf[3];
-               }
-            }
-            /* Rank and Dimension */
-            if ( buf[4] == MAT_T_INT32 ) {
-                int j;
-                nbytes = buf[5];
-                nBytes-=nbytes;
-
-                cells[i]->rank = nbytes / 4;
-                cells[i]->dims = malloc(cells[i]->rank*sizeof(int));
-
-                /* Assumes rank <= 16 */
-                if ( cells[i]->rank % 2 != 0 ) {
-                    bytesread+=fread(buf,4,cells[i]->rank+1,mat->fp);
-                    nBytes-=4;
-                } else
-                    bytesread+=fread(buf,4,cells[i]->rank,mat->fp);
-
-                if ( mat->byteswap ) {
-                    for ( j = 0; j < cells[i]->rank; j++ )
-                        cells[i]->dims[j] = Mat_uint32Swap(buf+j);
-                } else {
-                    for ( j = 0; j < cells[i]->rank; j++ )
-                        cells[i]->dims[j] = buf[j];
-                }
-            }
-            /* Variable Name Tag */
-            bytesread+=fread(buf,1,8,mat->fp);
-            nBytes-=8;
-            cells[i]->datapos = ftell(mat->fp);
-            if ( cells[i]->class_type == MAT_C_STRUCT )
-                bytesread+=ReadNextStructField(mat,cells[i]);
-            if ( cells[i]->class_type == MAT_C_CELL )
-                bytesread+=ReadNextCell(mat,cells[i]);
-            fseek(mat->fp,cells[i]->datapos+nBytes,SEEK_SET);
-        }
-    }
-
-    return bytesread;
-}
-
-/** @brief Reads the next struct field of the structure in @c matvar
- *
- * Reads the next struct fields (fieldname length,names,data headers for all
- * the fields
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param matvar MAT variable pointer
- * @return Number of bytes read
- */
-int
-ReadNextStructField( mat_t *mat, matvar_t *matvar )
-{
-    int fieldname_size,nfields, bytesread = 0, i, err;
-    matvar_t **fields = NULL;
-
-    if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-        char    *ptr;
-        mat_uint32_t uncomp_buf[16] = {0,};
-        int      nbytes, j, nmemb = 1;
-        mat_uint32_t array_flags; 
-
-        for ( i = 0; i < matvar->rank; i++ )
-            nmemb *= matvar->dims[i];
-
-        /* Inflate Field name length */
-        bytesread += InflateFieldNameLength(mat,matvar,uncomp_buf);
-        if ( mat->byteswap ) {
-            (void)Mat_uint32Swap(uncomp_buf);
-            (void)Mat_uint32Swap(uncomp_buf+1);
-        }
-        if ( (uncomp_buf[0] & 0x0000ffff) == MAT_T_INT32 ) {
-            fieldname_size = uncomp_buf[1];
-        } else {
-            Mat_Warning("Error getting fieldname size");
-            return bytesread;
-        }
-
-        bytesread += InflateFieldNamesTag(mat,matvar,uncomp_buf);
-        if ( mat->byteswap ) {
-            (void)Mat_uint32Swap(uncomp_buf);
-            (void)Mat_uint32Swap(uncomp_buf+1);
-        }
-        nfields = uncomp_buf[1];
-        nfields = nfields / fieldname_size;
-        matvar->data_size = sizeof(matvar_t *);
-        matvar->nbytes    = nmemb*nfields*matvar->data_size;
-        matvar->data      = malloc(matvar->nbytes);
-        if ( !matvar->data )
-            return 1;
-        fields = matvar->data;
-        if ( nfields*fieldname_size % 8 != 0 )
-            i = 8-(nfields*fieldname_size % 8);
-        else
-            i = 0;
-        ptr = malloc(nfields*fieldname_size+i);
-        bytesread += InflateFieldNames(mat,matvar,ptr,nfields,fieldname_size,i);
-        for ( i = 0; i < nfields; i++ ) {
-            fields[i]       = calloc(1,sizeof(matvar_t));
-            fields[i]->name = malloc(fieldname_size);
-            memcpy(fields[i]->name,ptr+i*fieldname_size,fieldname_size);
-            fields[i]->name[fieldname_size-1] = '\0';
-        }
-        for ( i = 1; i < nmemb; i++ ) {
-            for ( j = 0; j < nfields; j++ ) {
-                fields[i*nfields+j] = calloc(1,sizeof(matvar_t));
-                fields[i*nfields+j]->name = strdup_printf("%s",fields[j]->name);
-            }
-        }
-
-        for ( i = 0; i < nmemb*nfields; i++ ) {
-            fields[i]->fpos = ftell(mat->fp)-matvar->z->avail_in;
-            /* Read variable tag for struct field */
-            bytesread += InflateVarTag(mat,matvar,uncomp_buf);
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(uncomp_buf);
-                (void)Mat_uint32Swap(uncomp_buf+1);
-            }
-            nbytes = uncomp_buf[1];
-            if ( uncomp_buf[0] != MAT_T_MATRIX ) {
-                Mat_Critical("fields[%d], Uncompressed type not MAT_T_MATRIX",i);
-                Mat_VarFree(fields[i]);
-                fields[i] = NULL;
-                continue;
-            } else if ( nbytes == 0 ) {
-                fields[i]->rank = 0;
-                continue;
-            }
-            fields[i]->compression = COMPRESSION_ZLIB;
-            bytesread += InflateArrayFlags(mat,matvar,uncomp_buf);
-            nbytes -= 16;
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(uncomp_buf);
-                (void)Mat_uint32Swap(uncomp_buf+1);
-                (void)Mat_uint32Swap(uncomp_buf+2);
-                (void)Mat_uint32Swap(uncomp_buf+3);
-            }
-            /* Array Flags */
-            if ( uncomp_buf[0] == MAT_T_UINT32 ) {
-               array_flags = uncomp_buf[2];
-               fields[i]->class_type  = (array_flags & MAT_F_CLASS_T);
-               fields[i]->isComplex   = (array_flags & MAT_F_COMPLEX);
-               fields[i]->isGlobal    = (array_flags & MAT_F_GLOBAL);
-               fields[i]->isLogical   = (array_flags & MAT_F_LOGICAL);
-               if ( fields[i]->class_type == MAT_C_SPARSE ) {
-                   /* Need to find a more appropriate place to store nzmax */
-                   fields[i]->nbytes      = uncomp_buf[3];
-               }
-            } else {
-                Mat_Critical("Expected MAT_T_UINT32 for Array Tags, got %d",
-                    uncomp_buf[0]);
-                bytesread+=InflateSkip(mat,matvar->z,nbytes);
-            }
-            bytesread += InflateDimensions(mat,matvar,uncomp_buf);
-            nbytes -= 8;
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(uncomp_buf);
-                (void)Mat_uint32Swap(uncomp_buf+1);
-            }
-            /* Rank and Dimension */
-            if ( uncomp_buf[0] == MAT_T_INT32 ) {
-                int j = 0;
-
-                fields[i]->rank = uncomp_buf[1];
-                nbytes -= fields[i]->rank;
-                fields[i]->rank /= 4;
-                fields[i]->dims = malloc(fields[i]->rank*sizeof(int));
-                if ( mat->byteswap ) {
-                    for ( j = 0; j < fields[i]->rank; j++ )
-                        fields[i]->dims[j] = Mat_uint32Swap(uncomp_buf+2+j);
-                } else {
-                    for ( j = 0; j < fields[i]->rank; j++ )
-                        fields[i]->dims[j] = uncomp_buf[2+j];
-                }
-                if ( fields[i]->rank % 2 != 0 )
-                    nbytes -= 4;
-            }
-            bytesread += InflateVarNameTag(mat,matvar,uncomp_buf);
-            nbytes -= 8;
-            fields[i]->z = calloc(1,sizeof(z_stream));
-            err = inflateCopy(fields[i]->z,matvar->z);
-            if ( err != Z_OK ) {
-                Mat_Critical("inflateCopy returned error %d",err);
-            }
-            fields[i]->datapos = ftell(mat->fp)-matvar->z->avail_in;
-            if ( fields[i]->class_type == MAT_C_STRUCT )
-                bytesread+=ReadNextStructField(mat,fields[i]);
-            else if ( fields[i]->class_type == MAT_C_CELL )
-                bytesread+=ReadNextCell(mat,fields[i]);
-            fseek(mat->fp,fields[i]->datapos,SEEK_SET);
-            bytesread+=InflateSkip(mat,matvar->z,nbytes);
-        }
-        free(ptr);
-#else
-        Mat_Critical("Not compiled with zlib support");
-#endif
-    } else {
-        int fieldname_size,nfields;
-        mat_uint32_t buf[16] = {0,};
-        int      nbytes,nBytes,nmemb=1,j;
-        mat_uint32_t array_flags; 
-
-        for ( i = 0; i < matvar->rank; i++ )
-            nmemb *= matvar->dims[i];
-
-        bytesread+=fread(buf,4,2,mat->fp);
-        if ( mat->byteswap ) {
-            (void)Mat_uint32Swap(buf);
-            (void)Mat_uint32Swap(buf+1);
-        }
-        if ( (buf[0] & 0x0000ffff) == MAT_T_INT32 ) {
-            fieldname_size = buf[1];
-        } else {
-            Mat_Warning("Error getting fieldname size");
-            return bytesread;
-        }
-        bytesread+=fread(buf,4,2,mat->fp);
-        if ( mat->byteswap ) {
-            (void)Mat_uint32Swap(buf);
-            (void)Mat_uint32Swap(buf+1);
-        }
-        nfields = buf[1];
-        nfields = nfields / fieldname_size;
-        matvar->data_size = sizeof(matvar_t *);
-        matvar->nbytes    = nmemb*nfields*matvar->data_size;
-        matvar->data = malloc(matvar->nbytes);
-        if ( !matvar->data )
-            return bytesread;
-        fields = (matvar_t **)matvar->data;
-        for ( i = 0; i < nfields; i++ ) {
-            fields[i] = calloc(1,sizeof(matvar_t));
-            fields[i]->name = malloc(fieldname_size);
-            bytesread+=fread(fields[i]->name,1,fieldname_size,mat->fp);
-            fields[i]->name[fieldname_size-1] = '\0';
-        }
-        for ( i = 1; i < nmemb; i++ ) {
-            for ( j = 0; j < nfields; j++ ) {
-                fields[i*nfields+j] = calloc(1,sizeof(matvar_t));
-                fields[i*nfields+j]->name = strdup_printf("%s",fields[j]->name);
-            }
-        }
-        if ( (nfields*fieldname_size) % 8 ) {
-            fseek(mat->fp,8-((nfields*fieldname_size) % 8),SEEK_CUR);
-            bytesread+=8-((nfields*fieldname_size) % 8);
-        }
-        for ( i = 0; i < nmemb*nfields; i++ ) {
-
-            fields[i]->fpos = ftell(mat->fp);
-
-            /* Read variable tag for struct field */
-            bytesread += fread(buf,4,2,mat->fp);
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(buf);
-                (void)Mat_uint32Swap(buf+1);
-            }
-            nBytes = buf[1];
-            if ( buf[0] != MAT_T_MATRIX ) {
-                Mat_Critical("fields[%d] not MAT_T_MATRIX, fpos = %ld",i,ftell(mat->fp));
-                Mat_VarFree(fields[i]);
-                fields[i] = NULL;
-                return bytesread;
-            } else if ( nBytes == 0 ) {
-                fields[i]->rank = 0;
-                continue;
-            }
-            fields[i]->compression = 0;
-#if defined(HAVE_ZLIB)
-            fields[i]->z = NULL;
-#endif
-
-            /* Read Array Flags and The Dimensions Tag */
-            bytesread  += fread(buf,4,6,mat->fp);
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(buf);
-                (void)Mat_uint32Swap(buf+1);
-                (void)Mat_uint32Swap(buf+2);
-                (void)Mat_uint32Swap(buf+3);
-                (void)Mat_uint32Swap(buf+4);
-                (void)Mat_uint32Swap(buf+5);
-            }
-            nBytes-=24;
-            /* Array Flags */
-            if ( buf[0] == MAT_T_UINT32 ) {
-               array_flags = buf[2];
-               fields[i]->class_type  = (array_flags & MAT_F_CLASS_T);
-               fields[i]->isComplex   = (array_flags & MAT_F_COMPLEX);
-               fields[i]->isGlobal    = (array_flags & MAT_F_GLOBAL);
-               fields[i]->isLogical   = (array_flags & MAT_F_LOGICAL);
-               if ( fields[i]->class_type == MAT_C_SPARSE ) {
-                   /* Need to find a more appropriate place to store nzmax */
-                   fields[i]->nbytes      = buf[3];
-               }
-            }
-            /* Rank and Dimension */
-            if ( buf[4] == MAT_T_INT32 ) {
-                int j;
-
-                nbytes = buf[5];
-                nBytes-=nbytes;
-
-                fields[i]->rank = nbytes / 4;
-                fields[i]->dims = malloc(fields[i]->rank*sizeof(int));
-
-                /* Assumes rank <= 16 */
-                if ( fields[i]->rank % 2 != 0 ) {
-                    bytesread+=fread(buf,4,fields[i]->rank+1,mat->fp);
-                    nBytes-=4;
-                } else
-                    bytesread+=fread(buf,4,fields[i]->rank,mat->fp);
-
-                if ( mat->byteswap ) {
-                    for ( j = 0; j < fields[i]->rank; j++ )
-                        fields[i]->dims[j] = Mat_uint32Swap(buf+j);
-                } else {
-                    for ( j = 0; j < fields[i]->rank; j++ )
-                        fields[i]->dims[j] = buf[j];
-                }
-            }
-            /* Variable Name Tag */
-            bytesread+=fread(buf,1,8,mat->fp);
-            nBytes-=8;
-            fields[i]->datapos = ftell(mat->fp);
-            if ( fields[i]->class_type == MAT_C_STRUCT )
-                bytesread+=ReadNextStructField(mat,fields[i]);
-            else if ( fields[i]->class_type == MAT_C_CELL )
-                bytesread+=ReadNextCell(mat,fields[i]);
-            fseek(mat->fp,fields[i]->datapos+nBytes,SEEK_SET);
-        }
-    }
-
-    return bytesread;
-}
-
-/** @brief Reads the function handle data of the function handle in @c matvar
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param matvar MAT variable pointer
- * @return Number of bytes read
- */
-int
-ReadNextFunctionHandle(mat_t *mat, matvar_t *matvar)
-{
-    int nfunctions = 1, bytesread = 0, i;
-    matvar_t **functions = NULL;
-
-    for ( i = 0; i < matvar->rank; i++ )
-        nfunctions *= matvar->dims[i];
-
-    matvar->data = malloc(nfunctions*sizeof(matvar_t *));
-    if ( matvar->data != NULL ) {
-        matvar->data_size = sizeof(matvar_t *);
-        matvar->nbytes    = nfunctions*matvar->data_size;
-        functions = matvar->data;
-        for ( i = 0 ; i < nfunctions; i++ )
-            functions[i] = Mat_VarReadNextInfo(mat);
-    } else {
-        bytesread = 0;
-        matvar->data_size = 0;
-        matvar->nbytes    = 0;
-    }
-
-    return bytesread;
-}
-
-/** @brief Writes the header and blank data for a cell array
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param matvar pointer to the mat variable
- * @return number of bytes written
- */
-int
-WriteCellArrayFieldInfo(mat_t *mat,matvar_t *matvar)
-{
-    mat_uint32_t array_flags = 0x0; 
-    mat_int16_t  array_name_type = MAT_T_INT8;
-    int      array_flags_type = MAT_T_UINT32, dims_array_type = MAT_T_INT32;
-    int      array_flags_size = 8, pad4 = 0, matrix_type = MAT_T_MATRIX;
-    mat_int8_t   pad1 = 0;
-    int      nBytes, i, nmemb = 1;
-    long     start = 0, end = 0;
-
-    if ((matvar == NULL) || (mat == NULL))
-        return 0;
-
-#if 0
-    nBytes = GetMatrixMaxBufSize(matvar);
-#endif
-
-    fwrite(&matrix_type,4,1,mat->fp);
-    fwrite(&pad4,4,1,mat->fp);
-    start = ftell(mat->fp);
-
-    /* Array Flags */
-    if ( matvar->rank > 1 && ( matvar->dims[0] > 1 || matvar->dims[1] > 1 ) &&
-         matvar->class_type == MAT_C_INT32 ) {
-        array_flags = MAT_C_DOUBLE & MAT_F_CLASS_T;
-    } else {
-        array_flags = matvar->class_type & MAT_F_CLASS_T;
-    }
-    if ( matvar->isComplex )
-        array_flags |= MAT_F_COMPLEX;
-    if ( matvar->isGlobal )
-        array_flags |= MAT_F_GLOBAL;
-    if ( matvar->isLogical )
-        array_flags |= MAT_F_LOGICAL;
-
-    if ( mat->byteswap )
-        array_flags = Mat_int32Swap((mat_int32_t*)&array_flags);
-    fwrite(&array_flags_type,4,1,mat->fp);
-    fwrite(&array_flags_size,4,1,mat->fp);
-    fwrite(&array_flags,4,1,mat->fp);
-    fwrite(&pad4,4,1,mat->fp);
-    /* Rank and Dimension */
-    nBytes = matvar->rank * 4;
-    fwrite(&dims_array_type,4,1,mat->fp);
-    fwrite(&nBytes,4,1,mat->fp);
-    for ( i = 0; i < matvar->rank; i++ ) {
-        mat_int32_t dim;
-        dim = matvar->dims[i];
-        nmemb *= dim;
-        fwrite(&dim,4,1,mat->fp);
-    }
-    if ( matvar->rank % 2 != 0 )
-        fwrite(&pad4,4,1,mat->fp);
-    /* Name of variable */
-    if ( !matvar->name ) {
-        fwrite(&array_name_type,2,1,mat->fp);
-        fwrite(&pad1,1,1,mat->fp);
-        fwrite(&pad1,1,1,mat->fp);
-        fwrite(&pad4,4,1,mat->fp);
-    } else if ( strlen(matvar->name) <= 4 ) {
-        mat_int16_t array_name_len = (mat_int16_t)strlen(matvar->name);
-        mat_int8_t  pad1 = 0;
-        fwrite(&array_name_type,2,1,mat->fp);
-        fwrite(&array_name_len,2,1,mat->fp);
-        fwrite(matvar->name,1,array_name_len,mat->fp);
-        for ( i = array_name_len; i < 4; i++ )
-            fwrite(&pad1,1,1,mat->fp);
-    } else {
-        mat_int32_t array_name_len = (mat_int32_t)strlen(matvar->name);
-        mat_int8_t  pad1 = 0;
-
-        fwrite(&array_name_type,2,1,mat->fp);
-        fwrite(&pad1,1,1,mat->fp);
-        fwrite(&pad1,1,1,mat->fp);
-        fwrite(&array_name_len,4,1,mat->fp);
-        fwrite(matvar->name,1,array_name_len,mat->fp);
-        if ( array_name_len % 8 )
-            for ( i = array_name_len % 8; i < 8; i++ )
-                fwrite(&pad1,1,1,mat->fp);
-    }
-
-    matvar->datapos = ftell(mat->fp);
-    switch ( matvar->class_type ) {
-        case MAT_C_DOUBLE:
-        case MAT_C_SINGLE:
-        case MAT_C_INT64:
-        case MAT_C_UINT64:
-        case MAT_C_INT32:
-        case MAT_C_UINT32:
-        case MAT_C_INT16:
-        case MAT_C_UINT16:
-        case MAT_C_INT8:
-        case MAT_C_UINT8:
-            nBytes = WriteEmptyData(mat,nmemb,matvar->data_type);
-            if ( nBytes % 8 )
-                for ( i = nBytes % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-            if ( matvar->isComplex ) {
-                nBytes = WriteEmptyData(mat,nmemb,matvar->data_type);
-                if ( nBytes % 8 )
-                    for ( i = nBytes % 8; i < 8; i++ )
-                        fwrite(&pad1,1,1,mat->fp);
-            }
-            break;
-        case MAT_C_CHAR:
-        {
-            WriteEmptyCharData(mat,nmemb,matvar->data_type);
-            break;
-        }
-        case MAT_C_CELL:
-        {
-            int nfields = matvar->nbytes / matvar->data_size;
-            matvar_t **fields = (matvar_t **)matvar->data;
-
-            for ( i = 0; i < nfields; i++ )
-                WriteCellArrayFieldInfo(mat,fields[i]);
-            break;
-        }
-        /* FIXME: Structures */
-    }
-    end = ftell(mat->fp);
-    nBytes = (int)(end-start);
-    fseek(mat->fp,(long)-(nBytes+4),SEEK_CUR);
-    fwrite(&nBytes,4,1,mat->fp);
-    fseek(mat->fp,end,SEEK_SET);
-    return 0;
-}
-
-/** @brief Writes the header and data for an element of a cell array
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param matvar pointer to the mat variable
- * @retval 0 on success
- */
-int
-WriteCellArrayField(mat_t *mat,matvar_t *matvar )
-{
-    mat_uint32_t array_flags = 0x0; 
-    mat_int16_t  array_name_type = MAT_T_INT8,fieldname_type = MAT_T_INT32,fieldname_data_size=4;
-    int      array_flags_type = MAT_T_UINT32, dims_array_type = MAT_T_INT32;
-    int      array_flags_size = 8, pad4 = 0, matrix_type = MAT_T_MATRIX;
-    mat_int8_t   pad1 = 0;
-    int      nBytes, i, nmemb = 1, nzmax = 0;
-    long     start = 0, end = 0;
-
-    if ((matvar == NULL) || (mat == NULL))
-        return 1;
-
-#if 0
-    nBytes = GetMatrixMaxBufSize(matvar);
-#endif
-
-    fwrite(&matrix_type,4,1,mat->fp);
-    fwrite(&pad4,4,1,mat->fp);
-    start = ftell(mat->fp);
-
-    /* Array Flags */
-    if ( matvar->rank > 1 && ( matvar->dims[0] > 1 || matvar->dims[1] > 1 ) &&
-         matvar->class_type == MAT_C_INT32 ) {
-        array_flags = MAT_C_DOUBLE & MAT_F_CLASS_T;
-    } else {
-        array_flags = matvar->class_type & MAT_F_CLASS_T;
-    }
-    if ( matvar->isComplex )
-        array_flags |= MAT_F_COMPLEX;
-    if ( matvar->isGlobal )
-        array_flags |= MAT_F_GLOBAL;
-    if ( matvar->isLogical )
-        array_flags |= MAT_F_LOGICAL;
-    if ( matvar->class_type == MAT_C_SPARSE )
-        nzmax = ((sparse_t *)matvar->data)->nzmax;
-
-    if ( mat->byteswap )
-        array_flags = Mat_int32Swap((mat_int32_t*)&array_flags);
-    fwrite(&array_flags_type,4,1,mat->fp);
-    fwrite(&array_flags_size,4,1,mat->fp);
-    fwrite(&array_flags,4,1,mat->fp);
-    fwrite(&nzmax,4,1,mat->fp);
-    /* Rank and Dimension */
-    nBytes = matvar->rank * 4;
-    fwrite(&dims_array_type,4,1,mat->fp);
-    fwrite(&nBytes,4,1,mat->fp);
-    for ( i = 0; i < matvar->rank; i++ ) {
-        mat_int32_t dim;
-        dim = matvar->dims[i];
-        nmemb *= dim;
-        fwrite(&dim,4,1,mat->fp);
-    }
-    if ( matvar->rank % 2 != 0 )
-        fwrite(&pad4,4,1,mat->fp);
-    /* Name of variable */
-    if ( !matvar->name ) {
-        fwrite(&array_name_type,2,1,mat->fp);
-        fwrite(&pad1,1,1,mat->fp);
-        fwrite(&pad1,1,1,mat->fp);
-        fwrite(&pad4,4,1,mat->fp);
-    } else if ( strlen(matvar->name) <= 4 ) {
-        mat_int16_t array_name_len = (mat_int16_t)strlen(matvar->name);
-        mat_int8_t  pad1 = 0;
-        fwrite(&array_name_type,2,1,mat->fp);
-        fwrite(&array_name_len,2,1,mat->fp);
-        fwrite(matvar->name,1,array_name_len,mat->fp);
-        for ( i = array_name_len; i < 4; i++ )
-            fwrite(&pad1,1,1,mat->fp);
-    } else {
-        mat_int32_t array_name_len = (mat_int32_t)strlen(matvar->name);
-        mat_int8_t  pad1 = 0;
-
-        fwrite(&array_name_type,2,1,mat->fp);
-        fwrite(&pad1,1,1,mat->fp);
-        fwrite(&pad1,1,1,mat->fp);
-        fwrite(&array_name_len,4,1,mat->fp);
-        fwrite(matvar->name,1,array_name_len,mat->fp);
-        if ( array_name_len % 8 )
-            for ( i = array_name_len % 8; i < 8; i++ )
-                fwrite(&pad1,1,1,mat->fp);
-    }
-
-    switch ( matvar->class_type ) {
-        case MAT_C_DOUBLE:
-        case MAT_C_SINGLE:
-        case MAT_C_INT64:
-        case MAT_C_UINT64:
-        case MAT_C_INT32:
-        case MAT_C_UINT32:
-        case MAT_C_INT16:
-        case MAT_C_UINT16:
-        case MAT_C_INT8:
-        case MAT_C_UINT8:
-        {
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data = matvar->data;
-
-
-                nBytes=WriteData(mat,complex_data->Re,nmemb,matvar->data_type);
-                if ( nBytes % 8 )
-                    for ( i = nBytes % 8; i < 8; i++ )
-                        fwrite(&pad1,1,1,mat->fp);
-                nBytes=WriteData(mat,complex_data->Im,nmemb,matvar->data_type);
-                if ( nBytes % 8 )
-                    for ( i = nBytes % 8; i < 8; i++ )
-                        fwrite(&pad1,1,1,mat->fp);
-            } else {
-                nBytes = WriteData(mat,matvar->data,nmemb,matvar->data_type);
-                if ( nBytes % 8 )
-                    for ( i = nBytes % 8; i < 8; i++ )
-                        fwrite(&pad1,1,1,mat->fp);
-            }
-            break;
-        }
-        case MAT_C_CHAR:
-            WriteCharData(mat,matvar->data,nmemb,matvar->data_type);
-            break;
-        case MAT_C_CELL:
-        {
-            int nfields = matvar->nbytes / matvar->data_size;
-            matvar_t **fields = (matvar_t **)matvar->data;
-
-            for ( i = 0; i < nfields; i++ )
-                WriteCellArrayField(mat,fields[i]);
-            break;
-        }
-        case MAT_C_STRUCT:
-        {
-            char **fieldnames, *padzero;
-            int    fieldname_size, nfields;
-            size_t maxlen = 0;
-            matvar_t **fields = (matvar_t **)matvar->data;
-            unsigned fieldname;
-
-            nfields = matvar->nbytes / (nmemb*matvar->data_size);
-            fieldnames = malloc(nfields*sizeof(char *));
-            for ( i = 0; i < nfields; i++ ) {
-                fieldnames[i] = fields[i]->name;
-                if ( strlen(fieldnames[i]) > maxlen )
-                    maxlen = strlen(fieldnames[i]);
-            }
-            maxlen++;
-            fieldname_size = maxlen;
-            while ( nfields*fieldname_size % 8 != 0 )
-                fieldname_size++;
-#if 0
-            fwrite(&fieldname_type,2,1,mat->fp);
-            fwrite(&fieldname_data_size,2,1,mat->fp);
-#else
-            fieldname = (fieldname_data_size<<16) | fieldname_type;
-            fwrite(&fieldname,4,1,mat->fp);
-#endif
-            fwrite(&fieldname_size,4,1,mat->fp);
-            fwrite(&array_name_type,2,1,mat->fp);
-            fwrite(&pad1,1,1,mat->fp);
-            fwrite(&pad1,1,1,mat->fp);
-            nBytes = nfields*fieldname_size;
-            fwrite(&nBytes,4,1,mat->fp);
-            padzero = calloc(fieldname_size,1);
-            for ( i = 0; i < nfields; i++ ) {
-                fwrite(fieldnames[i],1,strlen(fieldnames[i]),mat->fp);
-                fwrite(padzero,1,fieldname_size-strlen(fieldnames[i]),mat->fp);
-            }
-            free(fieldnames);
-            free(padzero);
-            for ( i = 0; i < nmemb*nfields; i++ )
-                WriteStructField(mat,fields[i]);
-            break;
-        }
-        case MAT_C_SPARSE:
-        {
-            sparse_t *sparse = matvar->data;
-
-            nBytes = WriteData(mat,sparse->ir,sparse->nir,MAT_T_INT32);
-            if ( nBytes % 8 )
-                for ( i = nBytes % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-            nBytes = WriteData(mat,sparse->jc,sparse->njc,MAT_T_INT32);
-            if ( nBytes % 8 )
-                for ( i = nBytes % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-            nBytes = WriteData(mat,sparse->data,sparse->ndata,matvar->data_type);
-            if ( nBytes % 8 )
-                for ( i = nBytes % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-        }
-    }
-    end = ftell(mat->fp);
-    nBytes = (int)(end-start);
-    fseek(mat->fp,(long)-(nBytes+4),SEEK_CUR);
-    fwrite(&nBytes,4,1,mat->fp);
-    fseek(mat->fp,end,SEEK_SET);
-    return 0;
-}
-
-#if defined(HAVE_ZLIB)
-/** @brief Writes the header and data for a field of a compressed cell array
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param matvar pointer to the mat variable
- * @return number of bytes written to the MAT file
- */
-size_t
-WriteCompressedCellArrayField(mat_t *mat,matvar_t *matvar,z_stream *z)
-{
-    mat_uint32_t array_flags = 0x0; 
-    mat_int16_t  array_name_type     = MAT_T_INT8;
-    mat_int16_t  fieldname_type      = MAT_T_INT32;
-    mat_int16_t  fieldname_data_size = 4;
-    int      array_flags_type = MAT_T_UINT32, dims_array_type = MAT_T_INT32;
-    int      array_flags_size = 8, pad4 = 0;
-    mat_int8_t   pad1 = 0;
-    int      nBytes, i, nmemb = 1, nzmax = 0;
-    long     start = 0;
-
-    mat_uint32_t comp_buf[512];
-    mat_uint32_t uncomp_buf[512] = {0,};
-    int buf_size = 512, err;
-    size_t byteswritten = 0;
-
-    if ( NULL == matvar || NULL == mat || NULL == z)
-        return 0;
-
-    start = ftell(mat->fp);
-
-    /* Array Flags */
-    array_flags = matvar->class_type & MAT_F_CLASS_T;
-    if ( matvar->isComplex )
-        array_flags |= MAT_F_COMPLEX;
-    if ( matvar->isGlobal )
-        array_flags |= MAT_F_GLOBAL;
-    if ( matvar->isLogical )
-        array_flags |= MAT_F_LOGICAL;
-    if ( matvar->class_type == MAT_C_SPARSE )
-        nzmax = ((sparse_t *)matvar->data)->nzmax;
-
-    uncomp_buf[0] = MAT_T_MATRIX;
-    uncomp_buf[1] = (int)GetMatrixMaxBufSize(matvar);
-    z->next_out  = comp_buf;
-    z->next_in   = uncomp_buf;
-    z->avail_out = buf_size*sizeof(*comp_buf);
-    z->avail_in  = 8;
-    err = deflate(z,Z_NO_FLUSH);
-    byteswritten += fwrite(comp_buf,1,buf_size*sizeof(*comp_buf)-z->avail_out,
-        mat->fp);
-    uncomp_buf[0] = array_flags_type;
-    uncomp_buf[1] = array_flags_size;
-    uncomp_buf[2] = array_flags;
-    uncomp_buf[3] = nzmax;
-    /* Rank and Dimension */
-    nBytes = matvar->rank * 4;
-    uncomp_buf[4] = dims_array_type;
-    uncomp_buf[5] = nBytes;
-    for ( i = 0; i < matvar->rank; i++ ) {
-        mat_int32_t dim;
-        dim = matvar->dims[i];
-        nmemb *= dim;
-        uncomp_buf[6+i] = dim;
-    }
-    if ( matvar->rank % 2 != 0 ) {
-        uncomp_buf[6+i] = pad4;
-        i++;
-    }
-
-    z->next_out  = comp_buf;
-    z->next_in   = uncomp_buf;
-    z->avail_out = buf_size*sizeof(*comp_buf);
-    z->avail_in  = (6+i)*sizeof(*uncomp_buf);
-    err = deflate(z,Z_NO_FLUSH);
-    byteswritten += fwrite(comp_buf,1,buf_size*sizeof(*comp_buf)-z->avail_out,
-        mat->fp);
-    /* Name of variable */
-    uncomp_buf[0] = array_name_type;
-    uncomp_buf[1] = 0;
-    z->next_out  = comp_buf;
-    z->next_in   = uncomp_buf;
-    z->avail_out = buf_size*sizeof(*comp_buf);
-    z->avail_in  = 8;
-    err = deflate(z,Z_NO_FLUSH);
-    byteswritten += fwrite(comp_buf,1,buf_size*sizeof(*comp_buf)-z->avail_out,
-        mat->fp);
-
-    matvar->datapos = ftell(mat->fp);
-    switch ( matvar->class_type ) {
-        case MAT_C_DOUBLE:
-        case MAT_C_SINGLE:
-        case MAT_C_INT64:
-        case MAT_C_UINT64:
-        case MAT_C_INT32:
-        case MAT_C_UINT32:
-        case MAT_C_INT16:
-        case MAT_C_UINT16:
-        case MAT_C_INT8:
-        case MAT_C_UINT8:
-        {
-            /* WriteCompressedData makes sure uncomressed data is aligned
-             * on an 8-byte boundary */
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data = matvar->data;
-
-                byteswritten += WriteCompressedData(mat,z,
-                    complex_data->Re,nmemb,matvar->data_type);
-                byteswritten += WriteCompressedData(mat,z,
-                    complex_data->Im,nmemb,matvar->data_type);
-            } else {
-                byteswritten += WriteCompressedData(mat,z,
-                    matvar->data,nmemb,matvar->data_type);
-            }
-            break;
-        }
-        case MAT_C_CHAR:
-        {
-            /* Check for a NULL character array */
-            if ( matvar->data != NULL && nmemb > 0 )
-                byteswritten += WriteCompressedCharData(mat,z,matvar->data,
-                    nmemb,matvar->data_type);
-            break;
-        }
-        case MAT_C_CELL:
-        {
-            int        ncells;
-            matvar_t **cells = (matvar_t **)matvar->data;
-
-            /* Check for an empty cell array */
-            if ( matvar->nbytes == 0 || matvar->data_size == 0 ||
-                 matvar->data   == NULL )
-                break;
-            ncells  = matvar->nbytes / matvar->data_size;
-            for ( i = 0; i < ncells; i++ )
-                WriteCompressedCellArrayField(mat,cells[i],z);
-            break;
-        }
-        case MAT_C_STRUCT:
-        {
-            char     **fieldnames;
-            unsigned char *padzero;
-            int        fieldname_size, nfields;
-            size_t     maxlen = 0;
-            mat_int32_t array_name_type = MAT_T_INT8;
-            matvar_t **fields = (matvar_t **)matvar->data;
-
-            /* Check for a structure with no fields */
-            if ( matvar->nbytes == 0 || matvar->data_size == 0 ||
-                 matvar->data   == NULL ) {
-                fieldname_size = 1;
-                uncomp_buf[0] = (fieldname_data_size << 16) | 
-                                 fieldname_type;
-                uncomp_buf[1] = 1;
-                uncomp_buf[2] = array_name_type;
-                uncomp_buf[3] = 0;
-                z->next_out  = comp_buf;
-                z->next_in   = uncomp_buf;
-                z->avail_out = buf_size*sizeof(*comp_buf);
-                z->avail_in  = 32;
-                err = deflate(z,Z_NO_FLUSH);
-                byteswritten += fwrite(comp_buf,1,buf_size*
-                    sizeof(*comp_buf)-z->avail_out,mat->fp);
-                break;
-            }
-            nfields = matvar->nbytes / (nmemb*matvar->data_size);
-            fieldnames = malloc(nfields*sizeof(char *));
-            for ( i = 0; i < nfields; i++ ) {
-                fieldnames[i] = fields[i]->name;
-                if ( strlen(fieldnames[i]) > maxlen )
-                    maxlen = strlen(fieldnames[i]);
-            }
-            maxlen++;
-            fieldname_size = maxlen;
-            while ( nfields*fieldname_size % 8 != 0 )
-                fieldname_size++;
-            uncomp_buf[0] = (fieldname_data_size << 16) | fieldname_type;
-            uncomp_buf[1] = fieldname_size;
-            uncomp_buf[2] = array_name_type;
-            uncomp_buf[3] = nfields*fieldname_size;
-
-            padzero = calloc(fieldname_size,1);
-            z->next_out  = comp_buf;
-            z->next_in   = uncomp_buf;
-            z->avail_out = buf_size*sizeof(*comp_buf);
-            z->avail_in  = 16;
-            err = deflate(z,Z_NO_FLUSH);
-            byteswritten += fwrite(comp_buf,1,
-                    buf_size*sizeof(*comp_buf)-z->avail_out,mat->fp);
-            for ( i = 0; i < nfields; i++ ) {
-                memset(padzero,'\0',fieldname_size);
-                memcpy(padzero,fieldnames[i],strlen(fieldnames[i]));
-                z->next_out  = comp_buf;
-                z->next_in   = padzero;
-                z->avail_out = buf_size*sizeof(*comp_buf);
-                z->avail_in  = fieldname_size;
-                err = deflate(z,Z_NO_FLUSH);
-                byteswritten += fwrite(comp_buf,1,
-                        buf_size*sizeof(*comp_buf)-z->avail_out,mat->fp);
-            }
-            free(fieldnames);
-            free(padzero);
-            for ( i = 0; i < nmemb*nfields; i++ )
-                byteswritten +=
-                    WriteCompressedStructField(mat,fields[i],z);
-            break;
-        }
-        case MAT_C_SPARSE:
-        {
-            sparse_t *sparse = matvar->data;
-
-            byteswritten += WriteCompressedData(mat,z,sparse->ir,
-                sparse->nir,MAT_T_INT32);
-            byteswritten += WriteCompressedData(mat,z,sparse->jc,
-                sparse->njc,MAT_T_INT32);
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data = sparse->data;
-                byteswritten += WriteCompressedData(mat,z,
-                    complex_data->Re,sparse->ndata,matvar->data_type);
-                byteswritten += WriteCompressedData(mat,z,
-                    complex_data->Im,sparse->ndata,matvar->data_type);
-            } else {
-                byteswritten += WriteCompressedData(mat,z,
-                    sparse->data,sparse->ndata,matvar->data_type);
-            }
-            break;
-        }
-    }
-    return byteswritten;
-}
-#endif
-
-/** @brief Writes the header and data for a field of a struct array
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param matvar pointer to the mat variable
- * @retval 0 on success
- */
-int
-WriteStructField(mat_t *mat,matvar_t *matvar)
-{
-    mat_uint32_t array_flags = 0x0; 
-    mat_int16_t  fieldname_type = MAT_T_INT32,fieldname_data_size=4;
-    mat_int32_t  array_name_type = MAT_T_INT8;
-    int      array_flags_type = MAT_T_UINT32, dims_array_type = MAT_T_INT32;
-    int      array_flags_size = 8, pad4 = 0, matrix_type = MAT_T_MATRIX;
-    mat_int8_t   pad1 = 0;
-    int      nBytes, i, nmemb = 1, nzmax = 0;
-    long     start = 0, end = 0;
-
-    if ( (matvar == NULL) || ( mat == NULL ))
-        return 1;
-
-    fwrite(&matrix_type,4,1,mat->fp);
-    fwrite(&pad4,4,1,mat->fp);
-    start = ftell(mat->fp);
-
-    /* Array Flags */
-    array_flags = matvar->class_type & MAT_F_CLASS_T;
-    if ( matvar->isComplex )
-        array_flags |= MAT_F_COMPLEX;
-    if ( matvar->isGlobal )
-        array_flags |= MAT_F_GLOBAL;
-    if ( matvar->isLogical )
-        array_flags |= MAT_F_LOGICAL;
-    if ( matvar->class_type == MAT_C_SPARSE )
-        nzmax = ((sparse_t *)matvar->data)->nzmax;
-
-    if ( mat->byteswap )
-        array_flags = Mat_int32Swap((mat_int32_t*)&array_flags);
-    fwrite(&array_flags_type,4,1,mat->fp);
-    fwrite(&array_flags_size,4,1,mat->fp);
-    fwrite(&array_flags,4,1,mat->fp);
-    fwrite(&nzmax,4,1,mat->fp);
-    /* Rank and Dimension */
-    nBytes = matvar->rank * 4;
-    fwrite(&dims_array_type,4,1,mat->fp);
-    fwrite(&nBytes,4,1,mat->fp);
-    for ( i = 0; i < matvar->rank; i++ ) {
-        mat_int32_t dim;
-        dim = matvar->dims[i];
-        nmemb *= dim;
-        fwrite(&dim,4,1,mat->fp);
-    }
-    if ( matvar->rank % 2 != 0 )
-        fwrite(&pad4,4,1,mat->fp);
-
-    /* Name of variable */
-    fwrite(&array_name_type,4,1,mat->fp);
-    fwrite(&pad4,4,1,mat->fp);
-
-    switch ( matvar->class_type ) {
-        case MAT_C_DOUBLE:
-        case MAT_C_SINGLE:
-        case MAT_C_INT64:
-        case MAT_C_UINT64:
-        case MAT_C_INT32:
-        case MAT_C_UINT32:
-        case MAT_C_INT16:
-        case MAT_C_UINT16:
-        case MAT_C_INT8:
-        case MAT_C_UINT8:
-        {
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data = matvar->data;
-
-
-                nBytes=WriteData(mat,complex_data->Re,nmemb,matvar->data_type);
-                if ( nBytes % 8 )
-                    for ( i = nBytes % 8; i < 8; i++ )
-                        fwrite(&pad1,1,1,mat->fp);
-                nBytes=WriteData(mat,complex_data->Im,nmemb,matvar->data_type);
-                if ( nBytes % 8 )
-                    for ( i = nBytes % 8; i < 8; i++ )
-                        fwrite(&pad1,1,1,mat->fp);
-            } else {
-                nBytes=WriteData(mat,matvar->data,nmemb,matvar->data_type);
-                if ( nBytes % 8 )
-                    for ( i = nBytes % 8; i < 8; i++ )
-                        fwrite(&pad1,1,1,mat->fp);
-            }
-            break;
-        }
-        case MAT_C_CHAR:
-            nBytes=WriteCharData(mat,matvar->data,nmemb,matvar->data_type);
-            break;
-        case MAT_C_CELL:
-        {
-            int nfields = matvar->nbytes / matvar->data_size;
-            matvar_t **fields = (matvar_t **)matvar->data;
-
-            for ( i = 0; i < nfields; i++ )
-                WriteCellArrayField(mat,fields[i]);
-            break;
-        }
-        case MAT_C_STRUCT:
-        {
-            char **fieldnames, *padzero;
-            int    fieldname_size, nfields;
-            size_t maxlen = 0;
-            matvar_t **fields = (matvar_t **)matvar->data;
-            unsigned fieldname;
-
-            nfields = matvar->nbytes / (nmemb*matvar->data_size);
-            fieldnames = malloc(nfields*sizeof(char *));
-            for ( i = 0; i < nfields; i++ ) {
-                fieldnames[i] = fields[i]->name;
-                if ( strlen(fieldnames[i]) > maxlen )
-                    maxlen = strlen(fieldnames[i]);
-            }
-            maxlen++;
-            fieldname_size = maxlen;
-            while ( nfields*fieldname_size % 8 != 0 )
-                fieldname_size++;
-#if 0
-            fwrite(&fieldname_type,2,1,mat->fp);
-            fwrite(&fieldname_data_size,2,1,mat->fp);
-#else
-            fieldname = (fieldname_data_size<<16) | fieldname_type;
-            fwrite(&fieldname,4,1,mat->fp);
-#endif
-            fwrite(&fieldname_size,4,1,mat->fp);
-            fwrite(&array_name_type,4,1,mat->fp);
-            nBytes = nfields*fieldname_size;
-            fwrite(&nBytes,4,1,mat->fp);
-            padzero = calloc(fieldname_size,1);
-            for ( i = 0; i < nfields; i++ ) {
-                fwrite(fieldnames[i],1,strlen(fieldnames[i]),mat->fp);
-                fwrite(padzero,1,fieldname_size-strlen(fieldnames[i]),
-                       mat->fp);
-            }
-            free(fieldnames);
-            free(padzero);
-            for ( i = 0; i < nmemb*nfields; i++ )
-                WriteStructField(mat,fields[i]);
-            break;
-        }
-        case MAT_C_SPARSE:
-        {
-            sparse_t *sparse = matvar->data;
-
-            nBytes = WriteData(mat,sparse->ir,sparse->nir,MAT_T_INT32);
-            if ( nBytes % 8 )
-                for ( i = nBytes % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-            nBytes = WriteData(mat,sparse->jc,sparse->njc,MAT_T_INT32);
-            if ( nBytes % 8 )
-                for ( i = nBytes % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-            nBytes = WriteData(mat,sparse->data,sparse->ndata,
-                       matvar->data_type);
-            if ( nBytes % 8 )
-                for ( i = nBytes % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-        }
-    }
-    end = ftell(mat->fp);
-    nBytes = (int)(end-start);
-    fseek(mat->fp,(long)-(nBytes+4),SEEK_CUR);
-    fwrite(&nBytes,4,1,mat->fp);
-    fseek(mat->fp,end,SEEK_SET);
-    return 0;
-}
-
-#if defined(HAVE_ZLIB)
-/** @brief Writes the header and data for a field of a compressed struct array
- *
- * @ingroup mat_internal
- * @fixme Currently does not work for cell arrays or sparse data
- * @param mat MAT file pointer
- * @param matvar pointer to the mat variable
- * @return number of bytes written to the MAT file
- */
-size_t
-WriteCompressedStructField(mat_t *mat,matvar_t *matvar,z_stream *z)
-{
-    mat_uint32_t array_flags = 0x0; 
-    mat_int16_t  array_name_type     = MAT_T_INT8;
-    mat_int16_t  fieldname_type      = MAT_T_INT32;
-    mat_int16_t  fieldname_data_size = 4;
-    int      array_flags_type = MAT_T_UINT32, dims_array_type = MAT_T_INT32;
-    int      array_flags_size = 8, pad4 = 0;
-    mat_int8_t   pad1 = 0;
-    int      nBytes, i, nmemb = 1, nzmax = 0;
-    long     start = 0;
-
-    mat_uint32_t comp_buf[512];
-    mat_uint32_t uncomp_buf[512] = {0,};
-    int buf_size = 512, err;
-    size_t byteswritten = 0;
-
-    if ( NULL == matvar || NULL == mat || NULL == z)
-        return 1;
-
-    start = ftell(mat->fp);
-
-    /* Array Flags */
-    array_flags = matvar->class_type & MAT_F_CLASS_T;
-    if ( matvar->isComplex )
-        array_flags |= MAT_F_COMPLEX;
-    if ( matvar->isGlobal )
-        array_flags |= MAT_F_GLOBAL;
-    if ( matvar->isLogical )
-        array_flags |= MAT_F_LOGICAL;
-    if ( matvar->class_type == MAT_C_SPARSE )
-        nzmax = ((sparse_t *)matvar->data)->nzmax;
-
-    uncomp_buf[0] = MAT_T_MATRIX;
-    uncomp_buf[1] = (int)GetMatrixMaxBufSize(matvar);
-    z->next_out  = comp_buf;
-    z->next_in   = uncomp_buf;
-    z->avail_out = buf_size*sizeof(*comp_buf);
-    z->avail_in  = 8;
-    err = deflate(z,Z_NO_FLUSH);
-    byteswritten += fwrite(comp_buf,1,buf_size*sizeof(*comp_buf)-z->avail_out,
-        mat->fp);
-    uncomp_buf[0] = array_flags_type;
-    uncomp_buf[1] = array_flags_size;
-    uncomp_buf[2] = array_flags;
-    uncomp_buf[3] = nzmax;
-    /* Rank and Dimension */
-    nBytes = matvar->rank * 4;
-    uncomp_buf[4] = dims_array_type;
-    uncomp_buf[5] = nBytes;
-    for ( i = 0; i < matvar->rank; i++ ) {
-        mat_int32_t dim;
-        dim = matvar->dims[i];
-        nmemb *= dim;
-        uncomp_buf[6+i] = dim;
-    }
-    if ( matvar->rank % 2 != 0 ) {
-        uncomp_buf[6+i] = pad4;
-        i++;
-    }
-
-    z->next_out  = comp_buf;
-    z->next_in   = uncomp_buf;
-    z->avail_out = buf_size*sizeof(*comp_buf);
-    z->avail_in  = (6+i)*sizeof(*uncomp_buf);
-    err = deflate(z,Z_NO_FLUSH);
-    byteswritten += fwrite(comp_buf,1,buf_size*sizeof(*comp_buf)-z->avail_out,
-        mat->fp);
-    /* Name of variable */
-    uncomp_buf[0] = array_name_type;
-    uncomp_buf[1] = 0;
-    z->next_out  = comp_buf;
-    z->next_in   = uncomp_buf;
-    z->avail_out = buf_size*sizeof(*comp_buf);
-    z->avail_in  = 8;
-    err = deflate(z,Z_NO_FLUSH);
-    byteswritten += fwrite(comp_buf,1,buf_size*sizeof(*comp_buf)-z->avail_out,
-        mat->fp);
-
-    matvar->datapos = ftell(mat->fp);
-    switch ( matvar->class_type ) {
-        case MAT_C_DOUBLE:
-        case MAT_C_SINGLE:
-        case MAT_C_INT64:
-        case MAT_C_UINT64:
-        case MAT_C_INT32:
-        case MAT_C_UINT32:
-        case MAT_C_INT16:
-        case MAT_C_UINT16:
-        case MAT_C_INT8:
-        case MAT_C_UINT8:
-        {
-            /* WriteCompressedData makes sure uncomressed data is aligned
-             * on an 8-byte boundary */
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data = matvar->data;
-
-                byteswritten += WriteCompressedData(mat,z,
-                    complex_data->Re,nmemb,matvar->data_type);
-                byteswritten += WriteCompressedData(mat,z,
-                    complex_data->Im,nmemb,matvar->data_type);
-            } else {
-                byteswritten += WriteCompressedData(mat,z,
-                    matvar->data,nmemb,matvar->data_type);
-            }
-            break;
-        }
-        case MAT_C_CHAR:
-        {
-            /* Check for a NULL character array */
-            if ( matvar->data != NULL && nmemb > 0 )
-                byteswritten += WriteCompressedCharData(mat,z,matvar->data,
-                    nmemb,matvar->data_type);
-            break;
-        }
-        case MAT_C_CELL:
-        {
-            int        ncells;
-            matvar_t **cells = (matvar_t **)matvar->data;
-
-            /* Check for an empty cell array */
-            if ( matvar->nbytes == 0 || matvar->data_size == 0 ||
-                 matvar->data   == NULL )
-                break;
-            ncells  = matvar->nbytes / matvar->data_size;
-            for ( i = 0; i < ncells; i++ )
-                WriteCompressedCellArrayField(mat,cells[i],z);
-            break;
-        }
-        case MAT_C_STRUCT:
-        {
-            char     **fieldnames;
-            unsigned char *padzero;
-            int        fieldname_size, nfields;
-            size_t     maxlen = 0;
-            mat_int32_t array_name_type = MAT_T_INT8;
-            matvar_t **fields = (matvar_t **)matvar->data;
-
-            /* Check for a structure with no fields */
-            if ( matvar->nbytes == 0 || matvar->data_size == 0 ||
-                 matvar->data   == NULL ) {
-                fieldname_size = 1;
-                uncomp_buf[0] = (fieldname_data_size << 16) | 
-                                 fieldname_type;
-                uncomp_buf[1] = 1;
-                uncomp_buf[2] = array_name_type;
-                uncomp_buf[3] = 0;
-                z->next_out  = comp_buf;
-                z->next_in   = uncomp_buf;
-                z->avail_out = buf_size*sizeof(*comp_buf);
-                z->avail_in  = 32;
-                err = deflate(z,Z_NO_FLUSH);
-                byteswritten += fwrite(comp_buf,1,buf_size*
-                    sizeof(*comp_buf)-z->avail_out,mat->fp);
-                break;
-            }
-            nfields = matvar->nbytes / (nmemb*matvar->data_size);
-            fieldnames = malloc(nfields*sizeof(char *));
-            for ( i = 0; i < nfields; i++ ) {
-                fieldnames[i] = fields[i]->name;
-                if ( strlen(fieldnames[i]) > maxlen )
-                    maxlen = strlen(fieldnames[i]);
-            }
-            maxlen++;
-            fieldname_size = maxlen;
-            while ( nfields*fieldname_size % 8 != 0 )
-                fieldname_size++;
-            uncomp_buf[0] = (fieldname_data_size << 16) | fieldname_type;
-            uncomp_buf[1] = fieldname_size;
-            uncomp_buf[2] = array_name_type;
-            uncomp_buf[3] = nfields*fieldname_size;
-
-            padzero = calloc(fieldname_size,1);
-            z->next_out  = comp_buf;
-            z->next_in   = uncomp_buf;
-            z->avail_out = buf_size*sizeof(*comp_buf);
-            z->avail_in  = 16;
-            err = deflate(z,Z_NO_FLUSH);
-            byteswritten += fwrite(comp_buf,1,
-                    buf_size*sizeof(*comp_buf)-z->avail_out,mat->fp);
-            for ( i = 0; i < nfields; i++ ) {
-                memset(padzero,'\0',fieldname_size);
-                memcpy(padzero,fieldnames[i],strlen(fieldnames[i]));
-                z->next_out  = comp_buf;
-                z->next_in   = padzero;
-                z->avail_out = buf_size*sizeof(*comp_buf);
-                z->avail_in  = fieldname_size;
-                err = deflate(z,Z_NO_FLUSH);
-                byteswritten += fwrite(comp_buf,1,
-                        buf_size*sizeof(*comp_buf)-z->avail_out,mat->fp);
-            }
-            free(fieldnames);
-            free(padzero);
-            for ( i = 0; i < nmemb*nfields; i++ )
-                byteswritten +=
-                    WriteCompressedStructField(mat,fields[i],z);
-            break;
-        }
-        case MAT_C_SPARSE:
-        {
-            sparse_t *sparse = matvar->data;
-
-            byteswritten += WriteCompressedData(mat,z,sparse->ir,
-                sparse->nir,MAT_T_INT32);
-            byteswritten += WriteCompressedData(mat,z,sparse->jc,
-                sparse->njc,MAT_T_INT32);
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data = sparse->data;
-                byteswritten += WriteCompressedData(mat,z,
-                    complex_data->Re,sparse->ndata,matvar->data_type);
-                byteswritten += WriteCompressedData(mat,z,
-                    complex_data->Im,sparse->ndata,matvar->data_type);
-            } else {
-                byteswritten += WriteCompressedData(mat,z,
-                    sparse->data,sparse->ndata,matvar->data_type);
-            }
-            break;
-        }
-    }
-    return byteswritten;
-}
-#endif
-
-/** @brief Reads the data of a version 5 MAT variable
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param matvar MAT variable pointer to read the data
- */
-void
-Read5(mat_t *mat, matvar_t *matvar)
-{
-    int nBytes, len = 0, i, byteswap, packed_type, data_in_tag = 0;
-    long fpos;
-    mat_uint32_t tag[2];
-
-    if ( matvar == NULL )
-        return;
-    else if ( matvar->rank == 0 )        /* An empty data set */
-        return;
-
-    fpos = ftell(mat->fp);
-    len = 1;
-    byteswap = mat->byteswap;
-    switch ( matvar->class_type ) {
-        case MAT_C_DOUBLE:
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    InflateDataType(mat,matvar->z,tag+1);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-#endif
-            } else {
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-                fread(tag,4,1,mat->fp);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(tag+1,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-            }
-            if ( nBytes == 0 ) {
-                matvar->nbytes = 0;
-                break;
-            }
-            for ( i = 0; i < matvar->rank; i++ )
-                len *= matvar->dims[i];
-            matvar->data_size = sizeof(double);
-            matvar->data_type = MAT_T_DOUBLE;
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes = len*matvar->data_size;
-                complex_data = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                if ( NULL == complex_data || NULL == complex_data->Re ||
-                     NULL == complex_data->Im ) {
-                    Mat_Critical("Failed to allocate %d bytes",2*matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadDoubleData(mat,complex_data->Re,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-
-                    /* Complex Data Tag */
-                    fread(tag,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        fread(tag+1,4,1,mat->fp);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadDoubleData(mat,complex_data->Im,packed_type,
-                                            len);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-                    nBytes = ReadCompressedDoubleData(mat,matvar->z,
-                                 complex_data->Re,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-
-                    /* Complex Data Tag */
-                    InflateDataType(mat,matvar->z,tag);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        InflateDataType(mat,matvar->z,tag+1);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadCompressedDoubleData(mat,matvar->z,
-                                 complex_data->Im,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-                matvar->data = complex_data;
-            } else { /* if ( isComplex ) */
-                matvar->nbytes = len*matvar->data_size;
-                matvar->data   = malloc(matvar->nbytes);
-                if ( !matvar->data ) {
-                    Mat_Critical("Failed to allocate %d bytes",matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadDoubleData(mat,(double*)matvar->data,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                    nBytes = ReadCompressedDoubleData(mat,matvar->z,
-                                 (double*)matvar->data,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-            }
-            break;
-        case MAT_C_SINGLE:
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    InflateDataType(mat,matvar->z,tag+1);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-#endif
-            } else {
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-                fread(tag,4,1,mat->fp);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(tag+1,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-            }
-            if ( nBytes == 0 ) {
-                matvar->nbytes = 0;
-                break;
-            }
-            for ( i = 0; i < matvar->rank; i++ )
-                len *= matvar->dims[i];
-            matvar->data_size = sizeof(float);
-            matvar->data_type = MAT_T_SINGLE;
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes = len*matvar->data_size;
-                complex_data = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                if ( NULL == complex_data || NULL == complex_data->Re ||
-                     NULL == complex_data->Im ) {
-                    Mat_Critical("Failed to allocate %d bytes",2*matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadSingleData(mat,complex_data->Re,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-
-                    /* Complex Data Tag */
-                    fread(tag,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        fread(tag+1,4,1,mat->fp);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadSingleData(mat,complex_data->Im,
-                               packed_type,len);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-                    nBytes = ReadCompressedSingleData(mat,matvar->z,
-                                 complex_data->Re,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-
-                    /* Complex Data Tag */
-                    InflateDataType(mat,matvar->z,tag);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        InflateDataType(mat,matvar->z,tag+1);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadCompressedSingleData(mat,matvar->z,
-                                 complex_data->Im,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-                matvar->data = complex_data;
-            } else {
-                matvar->nbytes = len*matvar->data_size;
-                matvar->data = malloc(matvar->nbytes);
-                if ( !matvar->data ) {
-                    Mat_Critical("Failed to allocate %d bytes",matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadSingleData(mat,(float*)matvar->data,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                    nBytes = ReadCompressedSingleData(mat,matvar->z,
-                                 (float*)matvar->data,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-            }
-            break;
-#ifdef HAVE_MAT_INT64_T
-        case MAT_C_INT64:
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    InflateDataType(mat,matvar->z,tag+1);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-#endif
-            } else {
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-                fread(tag,4,1,mat->fp);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(tag+1,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-            }
-            if ( nBytes == 0 ) {
-                matvar->nbytes = 0;
-                break;
-            }
-            for ( i = 0; i < matvar->rank; i++ )
-                len *= matvar->dims[i];
-            matvar->data_size = sizeof(mat_int64_t);
-            matvar->data_type = MAT_T_INT64;
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes = len*matvar->data_size;
-                complex_data = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                if ( NULL == complex_data || NULL == complex_data->Re ||
-                     NULL == complex_data->Im ) {
-                    Mat_Critical("Failed to allocate %d bytes",2*matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt64Data(mat,complex_data->Re,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-
-                    /* Complex Data Tag */
-                    fread(tag,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        fread(tag+1,4,1,mat->fp);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadInt64Data(mat,complex_data->Im,
-                               packed_type,len);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-                    nBytes = ReadCompressedInt64Data(mat,matvar->z,
-                                 complex_data->Re,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-
-                    /* Complex Data Tag */
-                    InflateDataType(mat,matvar->z,tag);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        InflateDataType(mat,matvar->z,tag+1);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadCompressedInt64Data(mat,matvar->z,
-                                 complex_data->Im,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-                matvar->data = complex_data;
-            } else {
-                matvar->nbytes = len*matvar->data_size;
-                matvar->data   = malloc(matvar->nbytes);
-                if ( !matvar->data ) {
-                    Mat_Critical("Failed to allocate %d bytes",matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt64Data(mat,(mat_int64_t*)matvar->data,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                    nBytes = ReadCompressedInt64Data(mat,matvar->z,
-                                 (mat_int64_t*)matvar->data,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-            }
-            break;
-#endif /* HAVE_MAT_INT64_T */
-#ifdef HAVE_MAT_UINT64_T
-        case MAT_C_UINT64:
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    InflateDataType(mat,matvar->z,tag+1);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-#endif
-            } else {
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-                fread(tag,4,1,mat->fp);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(tag+1,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-            }
-            if ( nBytes == 0 ) {
-                matvar->nbytes = 0;
-                break;
-            }
-            for ( i = 0; i < matvar->rank; i++ )
-                len *= matvar->dims[i];
-            matvar->data_size = sizeof(mat_uint64_t);
-            matvar->data_type = MAT_T_UINT64;
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes = len*matvar->data_size;
-                complex_data = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                if ( NULL == complex_data || NULL == complex_data->Re ||
-                     NULL == complex_data->Im ) {
-                    Mat_Critical("Failed to allocate %d bytes",2*matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt64Data(mat,complex_data->Re,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-
-                    /* Complex Data Tag */
-                    fread(tag,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        fread(tag+1,4,1,mat->fp);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadInt64Data(mat,complex_data->Im,
-                               packed_type,len);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-                    nBytes = ReadCompressedInt64Data(mat,matvar->z,
-                                 complex_data->Re,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-
-                    /* Complex Data Tag */
-                    InflateDataType(mat,matvar->z,tag);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        InflateDataType(mat,matvar->z,tag+1);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadCompressedInt64Data(mat,matvar->z,
-                                 complex_data->Im,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-                matvar->data = complex_data;
-            } else {
-                matvar->nbytes = len*matvar->data_size;
-                matvar->data   = malloc(matvar->nbytes);
-                if ( !matvar->data ) {
-                    Mat_Critical("Failed to allocate %d bytes",matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt64Data(mat,(mat_int64_t*)matvar->data,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                    nBytes = ReadCompressedInt64Data(mat,matvar->z,
-                                 (mat_int64_t*)matvar->data,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-            }
-            break;
-#endif /* HAVE_MAT_UINT64_T */
-        case MAT_C_INT32:
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    InflateDataType(mat,matvar->z,tag+1);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-#endif
-            } else {
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-                fread(tag,4,1,mat->fp);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(tag+1,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-            }
-            if ( nBytes == 0 ) {
-                matvar->nbytes = 0;
-                break;
-            }
-            for ( i = 0; i < matvar->rank; i++ )
-                len *= matvar->dims[i];
-            matvar->data_size = sizeof(mat_int32_t);
-            matvar->data_type = MAT_T_INT32;
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes = len*matvar->data_size;
-                complex_data = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                if ( NULL == complex_data || NULL == complex_data->Re ||
-                     NULL == complex_data->Im ) {
-                    Mat_Critical("Failed to allocate %d bytes",2*matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt32Data(mat,complex_data->Re,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-
-                    /* Complex Data Tag */
-                    fread(tag,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        fread(tag+1,4,1,mat->fp);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadInt32Data(mat,complex_data->Im,
-                               packed_type,len);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-                    nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                 complex_data->Re,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-
-                    /* Complex Data Tag */
-                    InflateDataType(mat,matvar->z,tag);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        InflateDataType(mat,matvar->z,tag+1);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                 complex_data->Im,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-                matvar->data = complex_data;
-            } else {
-                matvar->nbytes = len*matvar->data_size;
-                matvar->data   = malloc(matvar->nbytes);
-                if ( !matvar->data ) {
-                    Mat_Critical("Failed to allocate %d bytes",matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt32Data(mat,(mat_int32_t*)matvar->data,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                    nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                 (mat_int32_t*)matvar->data,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-            }
-            break;
-        case MAT_C_UINT32:
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    InflateDataType(mat,matvar->z,tag+1);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-#endif
-            } else {
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-                fread(tag,4,1,mat->fp);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(tag+1,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-            }
-            if ( nBytes == 0 ) {
-                matvar->nbytes = 0;
-                break;
-            }
-            for ( i = 0; i < matvar->rank; i++ )
-                len *= matvar->dims[i];
-            matvar->data_size = sizeof(mat_uint32_t);
-            matvar->data_type = MAT_T_UINT32;
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes = len*matvar->data_size;
-                complex_data = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                if ( NULL == complex_data || NULL == complex_data->Re ||
-                     NULL == complex_data->Im ) {
-                    Mat_Critical("Failed to allocate %d bytes",2*matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt32Data(mat,complex_data->Re,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-
-                    /* Complex Data Tag */
-                    fread(tag,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        fread(tag+1,4,1,mat->fp);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadInt32Data(mat,complex_data->Im,
-                               packed_type,len);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-                    nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                 complex_data->Re,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-
-                    /* Complex Data Tag */
-                    InflateDataType(mat,matvar->z,tag);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        InflateDataType(mat,matvar->z,tag+1);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                 complex_data->Im,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-                matvar->data = complex_data;
-            } else {
-                matvar->nbytes = len*matvar->data_size;
-                matvar->data   = malloc(matvar->nbytes);
-                if ( !matvar->data ) {
-                    Mat_Critical("Failed to allocate %d bytes",matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt32Data(mat,(mat_int32_t*)matvar->data,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                    nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                 (mat_int32_t*)matvar->data,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-            }
-            break;
-        case MAT_C_INT16:
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    InflateDataType(mat,matvar->z,tag+1);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-#endif
-            } else {
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-                fread(tag,4,1,mat->fp);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(tag+1,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-            }
-            if ( nBytes == 0 ) {
-                matvar->nbytes = 0;
-                break;
-            }
-            for ( i = 0; i < matvar->rank; i++ )
-                len *= matvar->dims[i];
-            matvar->data_size = sizeof(mat_int16_t);
-            matvar->data_type = MAT_T_INT16;
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes = len*matvar->data_size;
-                complex_data = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                if ( NULL == complex_data || NULL == complex_data->Re ||
-                     NULL == complex_data->Im ) {
-                    Mat_Critical("Failed to allocate %d bytes",2*matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt16Data(mat,complex_data->Re,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-
-                    /* Complex Data Tag */
-                    fread(tag,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        fread(tag+1,4,1,mat->fp);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadInt16Data(mat,complex_data->Im,
-                               packed_type,len);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-                    nBytes = ReadCompressedInt16Data(mat,matvar->z,
-                                 complex_data->Re,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-
-                    /* Complex Data Tag */
-                    InflateDataType(mat,matvar->z,tag);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        InflateDataType(mat,matvar->z,tag+1);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadCompressedInt16Data(mat,matvar->z,
-                                 complex_data->Im,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-                matvar->data = complex_data;
-            } else {
-                matvar->nbytes = len*matvar->data_size;
-                matvar->data   = malloc(matvar->nbytes);
-                if ( !matvar->data ) {
-                    Mat_Critical("Failed to allocate %d bytes",matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt16Data(mat,(mat_int16_t*)matvar->data,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                    nBytes = ReadCompressedInt16Data(mat,matvar->z,
-                                 (mat_int16_t*)matvar->data,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-            }
-            break;
-        case MAT_C_UINT16:
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    InflateDataType(mat,matvar->z,tag+1);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-#endif
-            } else {
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-                fread(tag,4,1,mat->fp);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(tag+1,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-            }
-            if ( nBytes == 0 ) {
-                matvar->nbytes = 0;
-                break;
-            }
-            for ( i = 0; i < matvar->rank; i++ )
-                len *= matvar->dims[i];
-            matvar->data_size = sizeof(mat_uint16_t);
-            matvar->data_type = MAT_T_UINT16;
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes = len*matvar->data_size;
-                complex_data = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                if ( NULL == complex_data || NULL == complex_data->Re ||
-                     NULL == complex_data->Im ) {
-                    Mat_Critical("Failed to allocate %d bytes",2*matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt16Data(mat,complex_data->Re,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-
-                    /* Complex Data Tag */
-                    fread(tag,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        fread(tag+1,4,1,mat->fp);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadInt16Data(mat,complex_data->Im,
-                               packed_type,len);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-                    nBytes = ReadCompressedInt16Data(mat,matvar->z,
-                                 complex_data->Re,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-
-                    /* Complex Data Tag */
-                    InflateDataType(mat,matvar->z,tag);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        InflateDataType(mat,matvar->z,tag+1);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadCompressedInt16Data(mat,matvar->z,
-                                 complex_data->Im,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-                matvar->data = complex_data;
-            } else {
-                matvar->nbytes = len*matvar->data_size;
-                matvar->data   = malloc(matvar->nbytes);
-                if ( !matvar->data ) {
-                    Mat_Critical("Failed to allocate %d bytes",matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt16Data(mat,(mat_int16_t*)matvar->data,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                    nBytes = ReadCompressedInt16Data(mat,matvar->z,
-                                 (mat_int16_t*)matvar->data,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-            }
-            break;
-        case MAT_C_INT8:
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    InflateDataType(mat,matvar->z,tag+1);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-#endif
-            } else {
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-                fread(tag,4,1,mat->fp);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(tag+1,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-            }
-            if ( nBytes == 0 ) {
-                matvar->nbytes = 0;
-                break;
-            }
-            for ( i = 0; i < matvar->rank; i++ )
-                len *= matvar->dims[i];
-            matvar->data_size = sizeof(mat_int8_t);
-            matvar->data_type = MAT_T_INT8;
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes = len*matvar->data_size;
-                complex_data = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                if ( NULL == complex_data || NULL == complex_data->Re ||
-                     NULL == complex_data->Im ) {
-                    Mat_Critical("Failed to allocate %d bytes",2*matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt8Data(mat,complex_data->Re,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-
-                    /* Complex Data Tag */
-                    fread(tag,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        fread(tag+1,4,1,mat->fp);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadInt8Data(mat,complex_data->Im,
-                               packed_type,len);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-                    nBytes = ReadCompressedInt8Data(mat,matvar->z,
-                                 complex_data->Re,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-
-                    /* Complex Data Tag */
-                    InflateDataType(mat,matvar->z,tag);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        InflateDataType(mat,matvar->z,tag+1);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadCompressedInt8Data(mat,matvar->z,
-                                 complex_data->Im,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-                matvar->data = complex_data;
-            } else {
-                matvar->nbytes = len*matvar->data_size;
-                matvar->data   = malloc(matvar->nbytes);
-                if ( !matvar->data ) {
-                    Mat_Critical("Failed to allocate %d bytes",matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt8Data(mat,(mat_int8_t*)matvar->data,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                    nBytes = ReadCompressedInt8Data(mat,matvar->z,
-                                 (mat_int8_t*)matvar->data,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-            }
-            break;
-        case MAT_C_UINT8:
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    InflateDataType(mat,matvar->z,tag+1);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-#endif
-            } else {
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-                fread(tag,4,1,mat->fp);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(tag+1,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-            }
-            if ( nBytes == 0 ) {
-                matvar->nbytes = 0;
-                break;
-            }
-            for ( i = 0; i < matvar->rank; i++ )
-                len *= matvar->dims[i];
-            matvar->data_size = sizeof(mat_uint8_t);
-            matvar->data_type = MAT_T_UINT8;
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes = len*matvar->data_size;
-                complex_data = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                if ( NULL == complex_data || NULL == complex_data->Re ||
-                     NULL == complex_data->Im ) {
-                    Mat_Critical("Failed to allocate %d bytes",2*matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt8Data(mat,complex_data->Re,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-
-                    /* Complex Data Tag */
-                    fread(tag,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        fread(tag+1,4,1,mat->fp);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadInt8Data(mat,complex_data->Im,
-                               packed_type,len);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-                    nBytes = ReadCompressedInt8Data(mat,matvar->z,
-                                 complex_data->Re,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-
-                    /* Complex Data Tag */
-                    InflateDataType(mat,matvar->z,tag);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        InflateDataType(mat,matvar->z,tag+1);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadCompressedInt8Data(mat,matvar->z,
-                                 complex_data->Im,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-                matvar->data = complex_data;
-            } else {
-                matvar->nbytes = len*matvar->data_size;
-                matvar->data   = malloc(matvar->nbytes);
-                if ( !matvar->data ) {
-                    Mat_Critical("Failed to allocate %d bytes",matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt8Data(mat,(mat_int8_t*)matvar->data,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                    nBytes = ReadCompressedInt8Data(mat,matvar->z,
-                                 (mat_int8_t*)matvar->data,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-            }
-            break;
-            break;
-        case MAT_C_CHAR:
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    InflateDataType(mat,matvar->z,tag+1);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-#endif
-            } else {
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-                fread(tag,4,1,mat->fp);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(tag+1,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-            }
-            if ( nBytes == 0 ) {
-                matvar->nbytes = 0;
-                break;
-            }
-            for ( i = 0; i < matvar->rank; i++ )
-                len *= matvar->dims[i];
-            matvar->data_size = sizeof(char);
-            /* FIXME: */
-            matvar->data_type = MAT_T_UINT8;
-            matvar->nbytes = len*matvar->data_size;
-            matvar->data   = calloc(matvar->nbytes+1,1);
-            if ( !matvar->data ) {
-                Mat_Critical("Failed to allocate %d bytes",matvar->nbytes);
-                break;
-            }
-            if ( matvar->compression == COMPRESSION_NONE) {
-                nBytes = ReadCharData(mat,(char*)matvar->data,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                if ( (nBytes % 8) != 0 )
-                    fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-            } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                nBytes = ReadCompressedCharData(mat,matvar->z,
-                             (char*)matvar->data,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                if ( (nBytes % 8) != 0 )
-                    InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-            }
-            break;
-        case MAT_C_STRUCT:
-        {
-            matvar_t **fields;
-            int nfields = 0;
-
-            if ( !matvar->nbytes || !matvar->data_size || NULL == matvar->data )
-                break;
-            nfields = matvar->nbytes / matvar->data_size;
-            fields = (matvar_t **)matvar->data;
-            for ( i = 0; i < nfields; i++ ) {
-                fields[i]->fp = mat;
-                Read5(mat,fields[i]);
-            }
-            /* FIXME: */
-            matvar->data_type = MAT_T_STRUCT;
-            break;
-        }
-        case MAT_C_CELL:
-        {
-            matvar_t **cells;
-
-            if ( !matvar->data ) {
-                Mat_Critical("Data is NULL for Cell Array %s",matvar->name);
-                break;
-            }
-            for ( i = 0; i < matvar->rank; i++ )
-                len *= matvar->dims[i];
-            cells = (matvar_t **)matvar->data;
-            for ( i = 0; i < len; i++ ) {
-                cells[i]->fp = mat;
-                Read5(mat,cells[i]);
-            }
-            /* FIXME: */
-            matvar->data_type = MAT_T_CELL;
-            break;
-        }
-        case MAT_C_SPARSE:
-        {
-            int N;
-            sparse_t *data;
-
-            matvar->data_size = sizeof(sparse_t);
-            matvar->data      = malloc(matvar->data_size);
-            if ( matvar->data == NULL ) {
-                Mat_Critical("ReadData: Allocation of data pointer failed");
-                break;
-            }
-            data = matvar->data;
-            data->nzmax  = matvar->nbytes;
-            fseek(mat->fp,matvar->datapos,SEEK_SET);
-            /*  Read ir    */
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( mat->byteswap )
-                    (void)Mat_uint32Swap(tag);
-
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    N = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    (void)ReadCompressedInt32Data(mat,matvar->z,
-                             (mat_int32_t*)&N,MAT_T_INT32,1);
-                }
-#endif
-            } else {
-                fread(tag,4,1,mat->fp);
-                if ( mat->byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    N = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(&N,4,1,mat->fp);
-                    if ( mat->byteswap )
-                        Mat_int32Swap(&N);
-                }
-            }
-            data->nir = N / 4;
-            data->ir = malloc(data->nir*sizeof(mat_int32_t));
-            if ( data->ir != NULL ) {
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt32Data(mat,data->ir,packed_type,data->nir);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                    nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                 data->ir,packed_type,data->nir);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-            } else {
-                Mat_Critical("ReadData: Allocation of ir pointer failed");
-                break;
-            }
-            /*  Read jc    */
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( mat->byteswap )
-                    Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    N = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    (void)ReadCompressedInt32Data(mat,matvar->z,
-                             (mat_int32_t*)&N,MAT_T_INT32,1);
-                }
-#endif
-            } else {
-                fread(tag,4,1,mat->fp);
-                if ( mat->byteswap )
-                    Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    N = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(&N,4,1,mat->fp);
-                    if ( mat->byteswap )
-                        Mat_int32Swap(&N);
-                }
-            }
-            data->njc = N / 4;
-            data->jc = malloc(data->njc*sizeof(mat_int32_t));
-            if ( data->jc != NULL ) {
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt32Data(mat,data->jc,packed_type,data->njc);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                    nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                 data->jc,packed_type,data->njc);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-            } else {
-                Mat_Critical("ReadData: Allocation of jc pointer failed");
-                break;
-            }
-            /*  Read data    */
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( mat->byteswap )
-                    Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    N = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    (void)ReadCompressedInt32Data(mat,matvar->z,
-                             (mat_int32_t*)&N,MAT_T_INT32,1);
-                }
-#endif
-            } else {
-                fread(tag,4,1,mat->fp);
-                if ( mat->byteswap )
-                    Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    N = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(&N,4,1,mat->fp);
-                    if ( mat->byteswap )
-                        Mat_int32Swap(&N);
-                }
-            }
-#if defined(EXTENDED_SPARSE)
-            matvar->data_type = packed_type;
-#else
-            matvar->data_type = MAT_T_DOUBLE;
-#endif
-            data->ndata = N / Mat_SizeOf(packed_type);
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                complex_data = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(data->ndata*
-                                          Mat_SizeOf(matvar->data_type));
-                complex_data->Im = malloc(data->ndata*
-                                          Mat_SizeOf(matvar->data_type));
-                if ( NULL != complex_data && NULL != complex_data->Re &&
-                     NULL != complex_data->Im ) {
-                    if ( matvar->compression == COMPRESSION_NONE) {
-#if defined(EXTENDED_SPARSE)
-                        switch ( matvar->data_type ) {
-                            case MAT_T_DOUBLE:
-                                nBytes = ReadDoubleData(mat,complex_data->Re,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_SINGLE:
-                                nBytes = ReadSingleData(mat,complex_data->Re,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT32:
-                                nBytes = ReadInt32Data(mat,complex_data->Re,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT32:
-                                nBytes = ReadInt32Data(mat,complex_data->Re,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT16:
-                                nBytes = ReadInt16Data(mat,complex_data->Re,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT16:
-                                nBytes = ReadInt16Data(mat,complex_data->Re,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT8:
-                                nBytes = ReadInt8Data(mat,complex_data->Re,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT8:
-                                nBytes = ReadInt8Data(mat,complex_data->Re,
-                                    packed_type,data->ndata);
-                                break;
-                        }
-#else
-                        nBytes = ReadDoubleData(mat,complex_data->Re,
-                                     packed_type,data->ndata);
-#endif
-                        if ( data_in_tag )
-                            nBytes+=4;
-                        if ( (nBytes % 8) != 0 )
-                            fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-
-                        /* Complex Data Tag */
-                        fread(tag,4,1,mat->fp);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag);
-                        packed_type = tag[0] & 0x000000ff;
-                        if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                            data_in_tag = 1;
-                            nBytes = (tag[0] & 0xffff0000) >> 16;
-                        } else {
-                            data_in_tag = 0;
-                            fread(tag+1,4,1,mat->fp);
-                            if ( byteswap )
-                                (void)Mat_uint32Swap(tag+1);
-                            nBytes = tag[1];
-                        }
-#if defined(EXTENDED_SPARSE)
-                        switch ( matvar->data_type ) {
-                            case MAT_T_DOUBLE:
-                                nBytes = ReadDoubleData(mat,complex_data->Im,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_SINGLE:
-                                nBytes = ReadSingleData(mat,complex_data->Im,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT32:
-                                nBytes = ReadInt32Data(mat,complex_data->Im,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT32:
-                                nBytes = ReadUInt32Data(mat,complex_data->Im,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT16:
-                                nBytes = ReadInt16Data(mat,complex_data->Im,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT16:
-                                nBytes = ReadUInt16Data(mat,complex_data->Im,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT8:
-                                nBytes = ReadInt8Data(mat,complex_data->Im,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT8:
-                                nBytes = ReadUInt8Data(mat,complex_data->Im,
-                                    packed_type,data->ndata);
-                                break;
-                        }
-#else /* EXTENDED_SPARSE */
-                        nBytes = ReadDoubleData(mat,complex_data->Im,
-                                     packed_type,data->ndata);
-#endif /* EXTENDED_SPARSE */
-                        if ( data_in_tag )
-                            nBytes+=4;
-                        if ( (nBytes % 8) != 0 )
-                            fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                    } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-#if defined(EXTENDED_SPARSE)
-                        switch ( matvar->data_type ) {
-                            case MAT_T_DOUBLE:
-                                nBytes = ReadCompressedDoubleData(mat,matvar->z,
-                                     complex_data->Re,packed_type,data->ndata);
-                                break;
-                            case MAT_T_SINGLE:
-                                nBytes = ReadCompressedSingleData(mat,matvar->z,
-                                     complex_data->Re,packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT32:
-                                nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                     complex_data->Re,packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT32:
-                                nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                     complex_data->Re,packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT16:
-                                nBytes = ReadCompressedInt16Data(mat,matvar->z,
-                                     complex_data->Re,packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT16:
-                                nBytes = ReadCompressedInt16Data(mat,matvar->z,
-                                     complex_data->Re,packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT8:
-                                nBytes = ReadCompressedInt8Data(mat,matvar->z,
-                                     complex_data->Re,packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT8:
-                                nBytes = ReadCompressedInt8Data(mat,matvar->z,
-                                     complex_data->Re,packed_type,data->ndata);
-                                break;
-                        }
-#else    /* EXTENDED_SPARSE */
-                        nBytes = ReadCompressedDoubleData(mat,matvar->z,
-                                     complex_data->Re,packed_type,data->ndata);
-#endif    /* EXTENDED_SPARSE */
-                        if ( data_in_tag )
-                            nBytes+=4;
-                        if ( (nBytes % 8) != 0 )
-                            InflateSkip(mat,matvar->z,8-(nBytes % 8));
-
-                        /* Complex Data Tag */
-                        InflateDataType(mat,matvar->z,tag);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag);
-
-                        packed_type = tag[0] & 0x000000ff;
-                        if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                            data_in_tag = 1;
-                            nBytes = (tag[0] & 0xffff0000) >> 16;
-                        } else {
-                            data_in_tag = 0;
-                            InflateDataType(mat,matvar->z,tag+1);
-                            if ( byteswap )
-                                (void)Mat_uint32Swap(tag+1);
-                            nBytes = tag[1];
-                        }
-#if defined(EXTENDED_SPARSE)
-                        switch ( matvar->data_type ) {
-                            case MAT_T_DOUBLE:
-                                nBytes = ReadCompressedDoubleData(mat,matvar->z,
-                                     complex_data->Im,packed_type,data->ndata);
-                                break;
-                            case MAT_T_SINGLE:
-                                nBytes = ReadCompressedSingleData(mat,matvar->z,
-                                     complex_data->Im,packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT32:
-                                nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                     complex_data->Im,packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT32:
-                                nBytes = ReadCompressedUInt32Data(mat,matvar->z,
-                                     complex_data->Im,packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT16:
-                                nBytes = ReadCompressedInt16Data(mat,matvar->z,
-                                     complex_data->Im,packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT16:
-                                nBytes = ReadCompressedUInt16Data(mat,matvar->z,
-                                     complex_data->Im,packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT8:
-                                nBytes = ReadCompressedInt8Data(mat,matvar->z,
-                                     complex_data->Im,packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT8:
-                                nBytes = ReadCompressedUInt8Data(mat,matvar->z,
-                                     complex_data->Im,packed_type,data->ndata);
-                                break;
-                        }
-#else    /* EXTENDED_SPARSE */
-                        nBytes = ReadCompressedDoubleData(mat,matvar->z,
-                                     complex_data->Im,packed_type,data->ndata);
-#endif    /* EXTENDED_SPARSE */
-                        if ( data_in_tag )
-                            nBytes+=4;
-                        if ( (nBytes % 8) != 0 )
-                            InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif    /* HAVE_ZLIB */
-                    }
-                } else {
-                    Mat_Critical("ReadData: Allocation of data pointer failed");
-                    break;
-                }
-                data->data = complex_data;
-            } else { /* isComplex */
-                data->data = malloc(data->ndata*Mat_SizeOf(MAT_T_DOUBLE));
-                if ( data->data != NULL ) {
-                    if ( matvar->compression == COMPRESSION_NONE) {
-#if defined(EXTENDED_SPARSE)
-                        switch ( matvar->data_type ) {
-                            case MAT_T_DOUBLE:
-                                nBytes = ReadDoubleData(mat,data->data,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_SINGLE:
-                                nBytes = ReadSingleData(mat,data->data,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT32:
-                                nBytes = ReadInt32Data(mat,data->data,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT32:
-                                nBytes = ReadInt32Data(mat,data->data,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT16:
-                                nBytes = ReadInt16Data(mat,data->data,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT16:
-                                nBytes = ReadInt16Data(mat,data->data,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT8:
-                                nBytes = ReadInt8Data(mat,data->data,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT8:
-                                nBytes = ReadInt8Data(mat,data->data,
-                                    packed_type,data->ndata);
-                                break;
-                        }
-#else
-                        nBytes = ReadDoubleData(mat,data->data,packed_type,
-                                     data->ndata);
-#endif
-                        if ( data_in_tag )
-                            nBytes+=4;
-                        if ( (nBytes % 8) != 0 )
-                            fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                    } else if ( matvar->compression == COMPRESSION_ZLIB) {
-#if defined(EXTENDED_SPARSE)
-                        switch ( matvar->data_type ) {
-                            case MAT_T_DOUBLE:
-                                nBytes = ReadCompressedDoubleData(mat,matvar->z,
-                                     data->data,packed_type,data->ndata);
-                                break;
-                            case MAT_T_SINGLE:
-                                nBytes = ReadCompressedSingleData(mat,matvar->z,
-                                     data->data,packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT32:
-                                nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                     data->data,packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT32:
-                                nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                     data->data,packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT16:
-                                nBytes = ReadCompressedInt16Data(mat,matvar->z,
-                                     data->data,packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT16:
-                                nBytes = ReadCompressedInt16Data(mat,matvar->z,
-                                     data->data,packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT8:
-                                nBytes = ReadCompressedInt8Data(mat,matvar->z,
-                                     data->data,packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT8:
-                                nBytes = ReadCompressedInt8Data(mat,matvar->z,
-                                     data->data,packed_type,data->ndata);
-                                break;
-                        }
-#else   /* EXTENDED_SPARSE */
-                        nBytes = ReadCompressedDoubleData(mat,matvar->z,
-                                     data->data,packed_type,data->ndata);
-#endif   /* EXTENDED_SPARSE */
-                        if ( data_in_tag )
-                            nBytes+=4;
-                        if ( (nBytes % 8) != 0 )
-                            InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif   /* HAVE_ZLIB */
-                    }
-                } else {
-                    Mat_Critical("ReadData: Allocation of data pointer failed");
-                    break;
-                }
-            }
-            break;
-        }
-        case MAT_C_FUNCTION:
-        {
-            matvar_t **functions;
-            int nfunctions = 0;
-
-            if ( !matvar->nbytes || !matvar->data_size )
-                break;
-            nfunctions = matvar->nbytes / matvar->data_size;
-            functions = (matvar_t **)matvar->data;
-            for ( i = 0; i < nfunctions; i++ ) {
-                functions[i]->fp = mat;
-                Read5(mat,functions[i]);
-            }
-            /* FIXME: */
-            matvar->data_type = MAT_T_FUNCTION;
-            break;
-        }
-        default:
-            Mat_Critical("Read5: %d is not a supported Class", matvar->class_type);
-    }
-    fseek(mat->fp,fpos,SEEK_SET);
-
-    return;
-}
-
-/** @brief Reads a slab of data from the mat variable @c matvar
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param matvar pointer to the mat variable
- * @param data pointer to store the read data in (must be of size
- *             edge[0]*...edge[rank-1]*Mat_SizeOfClass(matvar->class_type))
- * @param start index to start reading data in each dimension
- * @param stride write data every @c stride elements in each dimension
- * @param edge number of elements to read in each dimension
- * @retval 0 on success
- */
-int 
-ReadData5(mat_t *mat,matvar_t *matvar,void *data, 
-    int *start,int *stride,int *edge)
-{               
-    int err = 0,real_bytes;
-    mat_int32_t tag[2];
-#if defined(HAVE_ZLIB)
-    z_stream z;
-
-    err = inflateCopy(&z,matvar->z);
-#endif
-
-    fseek(mat->fp,matvar->datapos,SEEK_SET);
-    if ( matvar->compression == COMPRESSION_NONE ) {
-        fread(tag,4,2,mat->fp);
-        if ( mat->byteswap ) {
-            Mat_int32Swap(tag);
-            Mat_int32Swap(tag+1);
-        }
-        matvar->data_type = tag[0] & 0x000000ff;
-        if ( tag[0] & 0xffff0000 ) { /* Data is packed in the tag */
-            fseek(mat->fp,-4,SEEK_CUR);
-            real_bytes = 4+(tag[0] >> 16);
-        } else {
-            real_bytes = 8+tag[1];
-        }
-#if defined(HAVE_ZLIB)
-    } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-        z.avail_in = 0;
-        InflateDataType(mat,&z,tag);
-        if ( mat->byteswap ) {
-            Mat_int32Swap(tag);
-        }
-        matvar->data_type = tag[0] & 0x000000ff;
-        if ( !(tag[0] & 0xffff0000) ) {/* Data is NOT packed in the tag */
-            /* We're cheating, but InflateDataType just inflates 4 bytes */
-            InflateDataType(mat,&z,tag+1);
-            if ( mat->byteswap ) {
-                Mat_int32Swap(tag+1);
-            }
-            real_bytes = 8+tag[1];
-        } else {
-            real_bytes = 4+(tag[0] >> 16);
-        }
-#endif
-    }
-    if ( real_bytes % 8 )
-        real_bytes += (8-(real_bytes % 8));
-
-    if ( matvar->rank == 2 ) {
-        if ( stride[0]*(edge[0]-1)+start[0]+1 > matvar->dims[0] )
-            err = 1;
-        else if ( stride[1]*(edge[1]-1)+start[1]+1 > matvar->dims[1] )
-            err = 1;
-        else if ( matvar->compression == COMPRESSION_NONE ) {
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data = data;
-
-                ReadDataSlab2(mat,complex_data->Re,matvar->class_type,
-                    matvar->data_type,matvar->dims,start,stride,edge);
-                fseek(mat->fp,matvar->datapos+real_bytes,SEEK_SET);
-                fread(tag,4,2,mat->fp);
-                if ( mat->byteswap ) {
-                    Mat_int32Swap(tag);
-                    Mat_int32Swap(tag+1);
-                }
-                matvar->data_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is packed in the tag */
-                    fseek(mat->fp,-4,SEEK_CUR);
-                }
-                ReadDataSlab2(mat,complex_data->Im,matvar->class_type,
-                              matvar->data_type,matvar->dims,start,stride,edge);
-            } else {
-                ReadDataSlab2(mat,data,matvar->class_type,
-                    matvar->data_type,matvar->dims,start,stride,edge);
-            }
-        }
-#if defined(HAVE_ZLIB)
-        else if ( matvar->compression == COMPRESSION_ZLIB ) {
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data = data;
-
-                ReadCompressedDataSlab2(mat,&z,complex_data->Re,
-                    matvar->class_type,matvar->data_type,matvar->dims,
-                    start,stride,edge);
-
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-
-                /* Reset zlib knowledge to before reading real tag */
-                inflateEnd(&z);
-                err = inflateCopy(&z,matvar->z);
-                InflateSkip(mat,&z,real_bytes);
-                z.avail_in = 0;
-                InflateDataType(mat,&z,tag);
-                if ( mat->byteswap ) {
-                    Mat_int32Swap(tag);
-                }
-                matvar->data_type = tag[0] & 0x000000ff;
-                if ( !(tag[0] & 0xffff0000) ) {/*Data is NOT packed in the tag*/
-                    InflateSkip(mat,&z,4);
-                }
-                ReadCompressedDataSlab2(mat,&z,complex_data->Im,
-                    matvar->class_type,matvar->data_type,matvar->dims,
-                    start,stride,edge);
-                inflateEnd(&z);
-            } else {
-                ReadCompressedDataSlab2(mat,&z,data,matvar->class_type,
-                    matvar->data_type,matvar->dims,start,stride,edge);
-            }
-        }
-#endif
-    } else {
-        if ( matvar->compression == COMPRESSION_NONE ) {
-            if ( matvar->isComplex ) {
-                int i;
-                struct ComplexSplit *complex_data = data;
-
-                ReadDataSlabN(mat,complex_data->Re,matvar->class_type,
-                    matvar->data_type,matvar->rank,matvar->dims,
-                    start,stride,edge);
-
-                fseek(mat->fp,matvar->datapos+real_bytes,SEEK_SET);
-                fread(tag,4,2,mat->fp);
-                if ( mat->byteswap ) {
-                    Mat_int32Swap(tag);
-                    Mat_int32Swap(tag+1);
-                }
-                matvar->data_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is packed in the tag */
-                    fseek(mat->fp,-4,SEEK_CUR);
-                }
-                ReadDataSlabN(mat,complex_data->Im,matvar->class_type,
-                    matvar->data_type,matvar->rank,matvar->dims,
-                    start,stride,edge);
-            } else {
-                ReadDataSlabN(mat,data,matvar->class_type,matvar->data_type,
-                    matvar->rank,matvar->dims,start,stride,edge);
-            }
-        }
-#if defined(HAVE_ZLIB)
-        else if ( matvar->compression == COMPRESSION_ZLIB ) {
-            if ( matvar->isComplex ) {
-                int i;
-                struct ComplexSplit *complex_data = data;
-
-                ReadCompressedDataSlabN(mat,&z,complex_data->Re,
-                    matvar->class_type,matvar->data_type,matvar->rank,
-                    matvar->dims,start,stride,edge);
-
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-                /* Reset zlib knowledge to before reading real tag */
-                inflateEnd(&z);
-                err = inflateCopy(&z,matvar->z);
-                InflateSkip(mat,&z,real_bytes);
-                z.avail_in = 0;
-                InflateDataType(mat,&z,tag);
-                if ( mat->byteswap ) {
-                    Mat_int32Swap(tag);
-                }
-                matvar->data_type = tag[0] & 0x000000ff;
-                if ( !(tag[0] & 0xffff0000) ) {/*Data is NOT packed in the tag*/
-                    InflateSkip(mat,&z,4);
-                }
-                ReadCompressedDataSlabN(mat,&z,complex_data->Im,
-                    matvar->class_type,matvar->data_type,matvar->rank,
-                    matvar->dims,start,stride,edge);
-                inflateEnd(&z);
-            } else {
-                ReadCompressedDataSlabN(mat,&z,data,matvar->class_type,
-                    matvar->data_type,matvar->rank,matvar->dims,
-                    start,stride,edge);
-            }
-        }
-#endif
-    }
-    if ( err )
-        return err;
-
-    switch(matvar->class_type) {
-        case MAT_C_DOUBLE:
-            matvar->data_type = MAT_T_DOUBLE;
-            matvar->data_size = sizeof(double);
-            break;
-        case MAT_C_SINGLE:
-            matvar->data_type = MAT_T_SINGLE;
-            matvar->data_size = sizeof(float);
-            break;
-#ifdef HAVE_MAT_INT64_T
-        case MAT_C_INT64:
-            matvar->data_type = MAT_T_INT64;
-            matvar->data_size = sizeof(mat_int64_t);
-            break;
-#endif /* HAVE_MAT_INT64_T */
-#ifdef HAVE_MAT_UINT64_T
-        case MAT_C_UINT64:
-            matvar->data_type = MAT_T_UINT64;
-            matvar->data_size = sizeof(mat_uint64_t);
-            break;
-#endif /* HAVE_MAT_UINT64_T */
-        case MAT_C_INT32:
-            matvar->data_type = MAT_T_INT32;
-            matvar->data_size = sizeof(mat_int32_t);
-            break;
-        case MAT_C_UINT32:
-            matvar->data_type = MAT_T_UINT32;
-            matvar->data_size = sizeof(mat_uint32_t);
-            break;
-        case MAT_C_INT16:
-            matvar->data_type = MAT_T_INT16;
-            matvar->data_size = sizeof(mat_int16_t);
-            break;
-        case MAT_C_UINT16:
-            matvar->data_type = MAT_T_UINT16;
-            matvar->data_size = sizeof(mat_uint16_t);
-            break;
-        case MAT_C_INT8:
-            matvar->data_type = MAT_T_INT8;
-            matvar->data_size = sizeof(mat_int8_t);
-            break;
-        case MAT_C_UINT8:
-            matvar->data_type = MAT_T_UINT8;
-            matvar->data_size = sizeof(mat_uint8_t);
-            break;
-    }
-
-    return err;
-}
-
-/** @brief Writes a matlab variable to a version 5 matlab file
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param matvar pointer to the mat variable
- * @param compress option to compress the variable
- *                 (only works for numeric types)
- * @retval 0 on success
- */
-int
-Write5(mat_t *mat,matvar_t *matvar,int compress)
-{
-    mat_uint32_t array_flags = 0x0;
-    mat_int16_t  fieldname_type = MAT_T_INT32,fieldname_data_size=4;
-    mat_int8_t  pad1 = 0;
-    int      array_flags_type = MAT_T_UINT32, dims_array_type = MAT_T_INT32;
-    int      array_flags_size = 8, pad4 = 0, matrix_type = MAT_T_MATRIX;
-    int      nBytes, i, nmemb = 1,nzmax = 0;
-    long     start = 0, end = 0;
-
-    /* FIXME: SEEK_END is not Guaranteed by the C standard */
-    fseek(mat->fp,0,SEEK_END);         /* Always write at end of file */
-
-
-    if ( compress == COMPRESSION_NONE ) {
-        fwrite(&matrix_type,4,1,mat->fp);
-        fwrite(&pad4,4,1,mat->fp);
-        start = ftell(mat->fp);
-
-        /* Array Flags */
-
-        array_flags = matvar->class_type & MAT_F_CLASS_T;
-        if ( matvar->isComplex )
-            array_flags |= MAT_F_COMPLEX;
-        if ( matvar->isGlobal )
-            array_flags |= MAT_F_GLOBAL;
-        if ( matvar->isLogical )
-            array_flags |= MAT_F_LOGICAL;
-        if ( matvar->class_type == MAT_C_SPARSE )
-            nzmax = ((sparse_t *)matvar->data)->nzmax;
-
-        fwrite(&array_flags_type,4,1,mat->fp);
-        fwrite(&array_flags_size,4,1,mat->fp);
-        fwrite(&array_flags,4,1,mat->fp);
-        fwrite(&nzmax,4,1,mat->fp);
-        /* Rank and Dimension */
-        nBytes = matvar->rank * 4;
-        fwrite(&dims_array_type,4,1,mat->fp);
-        fwrite(&nBytes,4,1,mat->fp);
-        for ( i = 0; i < matvar->rank; i++ ) {
-            mat_int32_t dim;
-            dim = matvar->dims[i];
-            nmemb *= dim;
-            fwrite(&dim,4,1,mat->fp);
-        }
-        if ( matvar->rank % 2 != 0 )
-            fwrite(&pad4,4,1,mat->fp);
-        /* Name of variable */
-        if ( strlen(matvar->name) <= 4 ) {
-            mat_int32_t  array_name_type = MAT_T_INT8;
-            mat_int32_t array_name_len   = strlen(matvar->name);
-            mat_int8_t  pad1 = 0;
-#if 0
-            fwrite(&array_name_type,2,1,mat->fp);
-            fwrite(&array_name_len,2,1,mat->fp);
-#else
-            array_name_type = (array_name_len << 16) | array_name_type;
-            fwrite(&array_name_type,4,1,mat->fp);
-#endif
-            fwrite(matvar->name,1,array_name_len,mat->fp);
-            for ( i = array_name_len; i < 4; i++ )
-                fwrite(&pad1,1,1,mat->fp);
-        } else {
-            mat_int32_t array_name_type = MAT_T_INT8;
-            mat_int32_t array_name_len  = (mat_int32_t)strlen(matvar->name);
-            mat_int8_t  pad1 = 0;
-
-            fwrite(&array_name_type,4,1,mat->fp);
-            fwrite(&array_name_len,4,1,mat->fp);
-            fwrite(matvar->name,1,array_name_len,mat->fp);
-            if ( array_name_len % 8 )
-                for ( i = array_name_len % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-        }
-
-        matvar->datapos = ftell(mat->fp);
-        switch ( matvar->class_type ) {
-            case MAT_C_DOUBLE:
-            case MAT_C_SINGLE:
-            case MAT_C_INT64:
-            case MAT_C_UINT64:
-            case MAT_C_INT32:
-            case MAT_C_UINT32:
-            case MAT_C_INT16:
-            case MAT_C_UINT16:
-            case MAT_C_INT8:
-            case MAT_C_UINT8:
-            {
-                if ( matvar->isComplex ) {
-                    struct ComplexSplit *complex_data = matvar->data;
-                    nBytes = WriteData(mat,complex_data->Re,nmemb,
-                        matvar->data_type);
-                    if ( nBytes % 8 )
-                        for ( i = nBytes % 8; i < 8; i++ )
-                            fwrite(&pad1,1,1,mat->fp);
-                    nBytes = WriteData(mat,complex_data->Im,nmemb,
-                        matvar->data_type);
-                    if ( nBytes % 8 )
-                        for ( i = nBytes % 8; i < 8; i++ )
-                            fwrite(&pad1,1,1,mat->fp);
-                } else {
-                    nBytes=WriteData(mat,matvar->data,nmemb,matvar->data_type);
-                    if ( nBytes % 8 )
-                        for ( i = nBytes % 8; i < 8; i++ )
-                            fwrite(&pad1,1,1,mat->fp);
-                }
-                break;
-            }
-            case MAT_C_CHAR:
-            {
-                /* Check for a NULL character array */
-                if ( matvar->data != NULL && nmemb > 0 )
-                    WriteCharData(mat,matvar->data,nmemb,matvar->data_type);
-                break;
-            }
-            case MAT_C_CELL:
-            {
-                int        ncells;
-                matvar_t **cells = (matvar_t **)matvar->data;
-
-                /* Check for an empty cell array */
-                if ( matvar->nbytes == 0 || matvar->data_size == 0 ||
-                     matvar->data   == NULL )
-                    break;
-                ncells  = matvar->nbytes / matvar->data_size;
-                for ( i = 0; i < ncells; i++ )
-                    WriteCellArrayField(mat,cells[i]);
-                break;
-            }
-            case MAT_C_STRUCT:
-            {
-                char     **fieldnames, *padzero;
-                int        fieldname_size, nfields;
-                size_t     maxlen = 0;
-                matvar_t **fields = (matvar_t **)matvar->data;
-                mat_int32_t array_name_type = MAT_T_INT8;
-                unsigned   fieldname;
-
-                /* Check for a structure with no fields */
-                if ( matvar->nbytes == 0 || matvar->data_size == 0 ||
-                     matvar->data   == NULL ) {
-#if 0
-                    fwrite(&fieldname_type,2,1,mat->fp);
-                    fwrite(&fieldname_data_size,2,1,mat->fp);
-#else
-                    fieldname = (fieldname_data_size<<16) | fieldname_type;
-                    fwrite(&fieldname,4,1,mat->fp);
-#endif
-                    fieldname_size = 1;
-                    fwrite(&fieldname_size,4,1,mat->fp);
-                    fwrite(&array_name_type,4,1,mat->fp);
-                    nBytes = 0;
-                    fwrite(&nBytes,4,1,mat->fp);
-                    break;
-                }
-                nfields = matvar->nbytes / (nmemb*matvar->data_size);
-                fieldnames = malloc(nfields*sizeof(char *));
-                for ( i = 0; i < nfields; i++ ) {
-                    fieldnames[i] = fields[i]->name;
-                    if ( strlen(fieldnames[i]) > maxlen )
-                        maxlen = strlen(fieldnames[i]);
-                }
-                maxlen++;
-                fieldname_size = maxlen;
-                while ( nfields*fieldname_size % 8 != 0 )
-                    fieldname_size++;
-#if 0
-                fwrite(&fieldname_type,2,1,mat->fp);
-                fwrite(&fieldname_data_size,2,1,mat->fp);
-#else
-                fieldname = (fieldname_data_size<<16) | fieldname_type;
-                fwrite(&fieldname,4,1,mat->fp);
-#endif
-                fwrite(&fieldname_size,4,1,mat->fp);
-                fwrite(&array_name_type,4,1,mat->fp);
-                nBytes = nfields*fieldname_size;
-                fwrite(&nBytes,4,1,mat->fp);
-                padzero = calloc(fieldname_size,1);
-                for ( i = 0; i < nfields; i++ ) {
-                    fwrite(fieldnames[i],1,strlen(fieldnames[i]),mat->fp);
-                    fwrite(padzero,1,fieldname_size-strlen(fieldnames[i]),mat->fp);
-                }
-                free(fieldnames);
-                free(padzero);
-                for ( i = 0; i < nmemb*nfields; i++ )
-                    WriteStructField(mat,fields[i]);
-                break;
-            }
-            case MAT_C_SPARSE:
-            {
-                sparse_t *sparse = matvar->data;
-
-                nBytes = WriteData(mat,sparse->ir,sparse->nir,MAT_T_INT32);
-                if ( nBytes % 8 )
-                    for ( i = nBytes % 8; i < 8; i++ )
-                        fwrite(&pad1,1,1,mat->fp);
-                nBytes = WriteData(mat,sparse->jc,sparse->njc,MAT_T_INT32);
-                if ( nBytes % 8 )
-                    for ( i = nBytes % 8; i < 8; i++ )
-                        fwrite(&pad1,1,1,mat->fp);
-                if ( matvar->isComplex ) {
-                    struct ComplexSplit *complex_data = sparse->data;
-                    nBytes = WriteData(mat,complex_data->Re,sparse->ndata,
-                        matvar->data_type);
-                    if ( nBytes % 8 )
-                        for ( i = nBytes % 8; i < 8; i++ )
-                            fwrite(&pad1,1,1,mat->fp);
-                    nBytes = WriteData(mat,complex_data->Im,sparse->ndata,
-                        matvar->data_type);
-                    if ( nBytes % 8 )
-                        for ( i = nBytes % 8; i < 8; i++ )
-                            fwrite(&pad1,1,1,mat->fp);
-                } else {
-                    nBytes = WriteData(mat,sparse->data,sparse->ndata,matvar->data_type);
-                    if ( nBytes % 8 )
-                        for ( i = nBytes % 8; i < 8; i++ )
-                            fwrite(&pad1,1,1,mat->fp);
-                }
-            }
-        }
-#if defined(HAVE_ZLIB)
-    } else if ( compress == COMPRESSION_ZLIB ) {
-        mat_uint32_t comp_buf[512];
-        mat_uint32_t uncomp_buf[512] = {0,};
-        int buf_size = 512, err;
-        size_t byteswritten = 0;
-
-        matvar->z         = calloc(1,sizeof(*matvar->z));
-        matvar->z->zalloc = Z_NULL;
-        matvar->z->zfree  = Z_NULL;
-        err = deflateInit(matvar->z,Z_DEFAULT_COMPRESSION);
-
-        matrix_type = MAT_T_COMPRESSED;
-        fwrite(&matrix_type,4,1,mat->fp);
-        fwrite(&pad4,4,1,mat->fp);
-        start = ftell(mat->fp);
-
-        /* Array Flags */
-        array_flags = matvar->class_type & MAT_F_CLASS_T;
-        if ( matvar->isComplex )
-            array_flags |= MAT_F_COMPLEX;
-        if ( matvar->isGlobal )
-            array_flags |= MAT_F_GLOBAL;
-        if ( matvar->isLogical )
-            array_flags |= MAT_F_LOGICAL;
-        if ( matvar->class_type == MAT_C_SPARSE )
-            nzmax = ((sparse_t *)matvar->data)->nzmax;
-
-        uncomp_buf[0] = MAT_T_MATRIX;
-        uncomp_buf[1] = (int)GetMatrixMaxBufSize(matvar);
-        matvar->z->next_out  = comp_buf;
-        matvar->z->next_in   = uncomp_buf;
-        matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-        matvar->z->avail_in  = 8;
-        err = deflate(matvar->z,Z_NO_FLUSH);
-        byteswritten += fwrite(comp_buf,1,
-            buf_size*sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-        uncomp_buf[0] = array_flags_type;
-        uncomp_buf[1] = array_flags_size;
-        uncomp_buf[2] = array_flags;
-        uncomp_buf[3] = nzmax;
-        /* Rank and Dimension */
-        nBytes = matvar->rank * 4;
-        uncomp_buf[4] = dims_array_type;
-        uncomp_buf[5] = nBytes;
-        for ( i = 0; i < matvar->rank; i++ ) {
-            mat_int32_t dim;
-            dim = matvar->dims[i];
-            nmemb *= dim;
-            uncomp_buf[6+i] = dim;
-        }
-        if ( matvar->rank % 2 != 0 ) {
-            uncomp_buf[6+i] = pad4;
-            i++;
-        }
-
-        matvar->z->next_out  = comp_buf;
-        matvar->z->next_in   = uncomp_buf;
-        matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-        matvar->z->avail_in  = (6+i)*sizeof(*uncomp_buf);
-        err = deflate(matvar->z,Z_NO_FLUSH);
-        byteswritten += fwrite(comp_buf,1,
-                buf_size*sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-        /* Name of variable */
-        if ( strlen(matvar->name) <= 4 ) {
-            mat_int16_t array_name_len = (mat_int16_t)strlen(matvar->name);
-            mat_int16_t array_name_type = MAT_T_INT8;
-
-            memset(uncomp_buf,0,8);
-            uncomp_buf[0] = (array_name_len << 16) | array_name_type;
-            memcpy(uncomp_buf+1,matvar->name,array_name_len);
-            if ( array_name_len % 4 )
-                array_name_len += 4-(array_name_len % 4);
-
-            matvar->z->next_out  = comp_buf;
-            matvar->z->next_in   = uncomp_buf;
-            matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-            matvar->z->avail_in  = 8;
-            err = deflate(matvar->z,Z_NO_FLUSH);
-            byteswritten += fwrite(comp_buf,1,
-                    buf_size*sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-        } else {
-            mat_int32_t array_name_len = (mat_int32_t)strlen(matvar->name);
-            mat_int32_t array_name_type = MAT_T_INT8;
-
-            memset(uncomp_buf,0,buf_size*sizeof(*uncomp_buf));
-            uncomp_buf[0] = array_name_type;
-            uncomp_buf[1] = array_name_len;
-            memcpy(uncomp_buf+2,matvar->name,array_name_len);
-            if ( array_name_len % 8 )
-                array_name_len += 8-(array_name_len % 8);
-            matvar->z->next_out  = comp_buf;
-            matvar->z->next_in   = uncomp_buf;
-            matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-            matvar->z->avail_in  = 8+array_name_len;
-            err = deflate(matvar->z,Z_NO_FLUSH);
-            byteswritten += fwrite(comp_buf,1,
-                    buf_size*sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-        }
-        matvar->datapos = ftell(mat->fp);
-        switch ( matvar->class_type ) {
-            case MAT_C_DOUBLE:
-            case MAT_C_SINGLE:
-            case MAT_C_INT64:
-            case MAT_C_UINT64:
-            case MAT_C_INT32:
-            case MAT_C_UINT32:
-            case MAT_C_INT16:
-            case MAT_C_UINT16:
-            case MAT_C_INT8:
-            case MAT_C_UINT8:
-            {
-                /* WriteCompressedData makes sure uncomressed data is aligned
-                 * on an 8-byte boundary */
-                if ( matvar->isComplex ) {
-                    struct ComplexSplit *complex_data = matvar->data;
-
-                    byteswritten += WriteCompressedData(mat,matvar->z,
-                        complex_data->Re,nmemb,matvar->data_type);
-                    byteswritten += WriteCompressedData(mat,matvar->z,
-                        complex_data->Im,nmemb,matvar->data_type);
-                } else {
-                    byteswritten += WriteCompressedData(mat,matvar->z,
-                        matvar->data,nmemb,matvar->data_type);
-                }
-                break;
-            }
-            case MAT_C_CHAR:
-            {
-                /* Check for a NULL character array */
-                if ( matvar->data != NULL && nmemb > 0 )
-                    byteswritten += WriteCompressedCharData(mat,matvar->z,
-                        matvar->data,nmemb,matvar->data_type);
-                break;
-            }
-            case MAT_C_CELL:
-            {
-                int        ncells;
-                matvar_t **cells = (matvar_t **)matvar->data;
-
-                /* Check for an empty cell array */
-                if ( matvar->nbytes == 0 || matvar->data_size == 0 ||
-                     matvar->data   == NULL )
-                    break;
-                ncells  = matvar->nbytes / matvar->data_size;
-                for ( i = 0; i < ncells; i++ )
-                    WriteCompressedCellArrayField(mat,cells[i],matvar->z);
-                break;
-            }
-            case MAT_C_STRUCT:
-            {
-                char     **fieldnames;
-                unsigned char *padzero;
-                int        fieldname_size, nfields;
-                size_t     maxlen = 0;
-                mat_int32_t array_name_type = MAT_T_INT8;
-                matvar_t **fields = (matvar_t **)matvar->data;
-
-                /* Check for a structure with no fields */
-                if ( matvar->nbytes == 0 || matvar->data_size == 0 ||
-                     matvar->data   == NULL ) {
-                    fieldname_size = 1;
-                    uncomp_buf[0] = (fieldname_data_size << 16) | 
-                                     fieldname_type;
-                    uncomp_buf[1] = 1;
-                    uncomp_buf[2] = array_name_type;
-                    uncomp_buf[3] = 0;
-                    matvar->z->next_out  = comp_buf;
-                    matvar->z->next_in   = uncomp_buf;
-                    matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-                    matvar->z->avail_in  = 32;
-                    err = deflate(matvar->z,Z_NO_FLUSH);
-                    byteswritten += fwrite(comp_buf,1,buf_size*
-                        sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-                    break;
-                }
-                nfields = matvar->nbytes / (nmemb*matvar->data_size);
-                fieldnames = malloc(nfields*sizeof(char *));
-                for ( i = 0; i < nfields; i++ ) {
-                    fieldnames[i] = fields[i]->name;
-                    if ( strlen(fieldnames[i]) > maxlen )
-                        maxlen = strlen(fieldnames[i]);
-                }
-                maxlen++;
-                fieldname_size = maxlen;
-                while ( nfields*fieldname_size % 8 != 0 )
-                    fieldname_size++;
-                uncomp_buf[0] = (fieldname_data_size << 16) | fieldname_type;
-                uncomp_buf[1] = fieldname_size;
-                uncomp_buf[2] = array_name_type;
-                uncomp_buf[3] = nfields*fieldname_size;
-
-                padzero = calloc(fieldname_size,1);
-                matvar->z->next_out  = comp_buf;
-                matvar->z->next_in   = uncomp_buf;
-                matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-                matvar->z->avail_in  = 16;
-                err = deflate(matvar->z,Z_NO_FLUSH);
-                byteswritten += fwrite(comp_buf,1,
-                        buf_size*sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-                for ( i = 0; i < nfields; i++ ) {
-                    memset(padzero,'\0',fieldname_size);
-                    memcpy(padzero,fieldnames[i],strlen(fieldnames[i]));
-                    matvar->z->next_out  = comp_buf;
-                    matvar->z->next_in   = padzero;
-                    matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-                    matvar->z->avail_in  = fieldname_size;
-                    err = deflate(matvar->z,Z_NO_FLUSH);
-                    byteswritten += fwrite(comp_buf,1,
-                            buf_size*sizeof(*comp_buf)-matvar->z->avail_out,
-                            mat->fp);
-                }
-                free(fieldnames);
-                free(padzero);
-                for ( i = 0; i < nmemb*nfields; i++ )
-                    byteswritten +=
-                        WriteCompressedStructField(mat,fields[i],matvar->z);
-                break;
-            }
-            case MAT_C_SPARSE:
-            {
-                sparse_t *sparse = matvar->data;
-
-                byteswritten += WriteCompressedData(mat,matvar->z,sparse->ir,
-                    sparse->nir,MAT_T_INT32);
-                byteswritten += WriteCompressedData(mat,matvar->z,sparse->jc,
-                    sparse->njc,MAT_T_INT32);
-                if ( matvar->isComplex ) {
-                    struct ComplexSplit *complex_data = sparse->data;
-                    byteswritten += WriteCompressedData(mat,matvar->z,
-                        complex_data->Re,sparse->ndata,matvar->data_type);
-                    byteswritten += WriteCompressedData(mat,matvar->z,
-                        complex_data->Im,sparse->ndata,matvar->data_type);
-                } else {
-                    byteswritten += WriteCompressedData(mat,matvar->z,
-                        sparse->data,sparse->ndata,matvar->data_type);
-                }
-                break;
-            }
-        }
-        matvar->z->avail_in  = 0;
-        matvar->z->next_in   = NULL;
-        matvar->z->next_out  = comp_buf;
-        matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-
-        err = deflate(matvar->z,Z_FINISH);
-        byteswritten += fwrite(comp_buf,1,
-            buf_size*sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-        while ( err != Z_STREAM_END && !matvar->z->avail_out ) {
-            matvar->z->next_out  = comp_buf;
-            matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-
-            err = deflate(matvar->z,Z_FINISH);
-            byteswritten += fwrite(comp_buf,1,
-                buf_size*sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-        }
-        /* End the compression and set to NULL so Mat_VarFree doesn't try
-         * to free matvar->z with inflateEnd
-         */
-#if 0
-        if ( byteswritten % 8 )
-            for ( i = 0; i < 8-(byteswritten % 8); i++ )
-                fwrite(&pad1,1,1,mat->fp);
-#endif
-        err = deflateEnd(matvar->z);
-        free(matvar->z);
-        matvar->z = NULL;
-#endif
-    }
-    end = ftell(mat->fp);
-    nBytes = (int)(end-start);
-    fseek(mat->fp,(long)-(nBytes+4),SEEK_CUR);
-    fwrite(&nBytes,4,1,mat->fp);
-    fseek(mat->fp,end,SEEK_SET);
-
-    return 0;
-}
-
-/** @brief Writes the variable information and empty data
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param matvar pointer to the mat variable
- */
-void
-WriteInfo5(mat_t *mat, matvar_t *matvar)
-{
-    mat_uint32_t array_flags = 0x0;
-    mat_int16_t  fieldname_type = MAT_T_INT32,fieldname_data_size=4;
-    mat_int8_t  pad1 = 0;
-    int      array_flags_type = MAT_T_UINT32, dims_array_type = MAT_T_INT32;
-    int      array_flags_size = 8, pad4 = 0, matrix_type = MAT_T_MATRIX;
-    int      nBytes, i, nmemb = 1,nzmax;
-    long     start = 0, end = 0;
-
-    /* FIXME: SEEK_END is not Guaranteed by the C standard */
-    fseek(mat->fp,0,SEEK_END);         /* Always write at end of file */
-
-
-    if ( matvar->compression == COMPRESSION_NONE ) {
-        fwrite(&matrix_type,4,1,mat->fp);
-        fwrite(&pad4,4,1,mat->fp);
-        start = ftell(mat->fp);
-
-        /* Array Flags */
-
-        array_flags = matvar->class_type & MAT_F_CLASS_T;
-        if ( matvar->isComplex )
-            array_flags |= MAT_F_COMPLEX;
-        if ( matvar->isGlobal )
-            array_flags |= MAT_F_GLOBAL;
-        if ( matvar->isLogical )
-            array_flags |= MAT_F_LOGICAL;
-        if ( matvar->class_type == MAT_C_SPARSE )
-            nzmax = ((sparse_t *)matvar->data)->nzmax;
-
-        fwrite(&array_flags_type,4,1,mat->fp);
-        fwrite(&array_flags_size,4,1,mat->fp);
-        fwrite(&array_flags,4,1,mat->fp);
-        fwrite(&nzmax,4,1,mat->fp);
-        /* Rank and Dimension */
-        nBytes = matvar->rank * 4;
-        fwrite(&dims_array_type,4,1,mat->fp);
-        fwrite(&nBytes,4,1,mat->fp);
-        for ( i = 0; i < matvar->rank; i++ ) {
-            mat_int32_t dim;
-            dim = matvar->dims[i];
-            nmemb *= dim;
-            fwrite(&dim,4,1,mat->fp);
-        }
-        if ( matvar->rank % 2 != 0 )
-            fwrite(&pad4,4,1,mat->fp);
-        /* Name of variable */
-        if ( strlen(matvar->name) <= 4 ) {
-            mat_int16_t array_name_len = (mat_int16_t)strlen(matvar->name);
-            mat_int8_t  pad1 = 0;
-            mat_int16_t array_name_type = MAT_T_INT8;
-            fwrite(&array_name_type,2,1,mat->fp);
-            fwrite(&array_name_len,2,1,mat->fp);
-            fwrite(matvar->name,1,array_name_len,mat->fp);
-            for ( i = array_name_len; i < 4; i++ )
-                fwrite(&pad1,1,1,mat->fp);
-        } else {
-            mat_int32_t array_name_len = (mat_int32_t)strlen(matvar->name);
-            mat_int8_t  pad1 = 0;
-            mat_int32_t  array_name_type = MAT_T_INT8;
-
-            fwrite(&array_name_type,4,1,mat->fp);
-            fwrite(&array_name_len,4,1,mat->fp);
-            fwrite(matvar->name,1,array_name_len,mat->fp);
-            if ( array_name_len % 8 )
-                for ( i = array_name_len % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-        }
-
-        matvar->datapos = ftell(mat->fp);
-        switch ( matvar->class_type ) {
-            case MAT_C_DOUBLE:
-            case MAT_C_SINGLE:
-            case MAT_C_INT64:
-            case MAT_C_UINT64:
-            case MAT_C_INT32:
-            case MAT_C_UINT32:
-            case MAT_C_INT16:
-            case MAT_C_UINT16:
-            case MAT_C_INT8:
-            case MAT_C_UINT8:
-                nBytes = WriteEmptyData(mat,nmemb,matvar->data_type);
-                if ( nBytes % 8 )
-                    for ( i = nBytes % 8; i < 8; i++ )
-                        fwrite(&pad1,1,1,mat->fp);
-                if ( matvar->isComplex ) {
-                    nBytes = WriteEmptyData(mat,nmemb,matvar->data_type);
-                    if ( nBytes % 8 )
-                        for ( i = nBytes % 8; i < 8; i++ )
-                            fwrite(&pad1,1,1,mat->fp);
-                }
-                break;
-            case MAT_C_CHAR:
-            {
-                WriteEmptyCharData(mat,nmemb,matvar->data_type);
-                break;
-            }
-            case MAT_C_CELL:
-            {
-                int nfields = matvar->nbytes / matvar->data_size;
-                matvar_t **fields = (matvar_t **)matvar->data;
-
-                for ( i = 0; i < nfields; i++ )
-                    WriteCellArrayFieldInfo(mat,fields[i]);
-                break;
-            }
-            case MAT_C_STRUCT:
-            {
-                char **fieldnames, *padzero;
-                int maxlen = 0, fieldname_size;
-                int nfields = matvar->nbytes / matvar->data_size;
-                matvar_t **fields = (matvar_t **)matvar->data;
-                mat_int32_t  array_name_type = MAT_T_INT8;
-                unsigned fieldname;
-
-                fieldnames = malloc(nfields*sizeof(char *));
-                for ( i = 0; i < nfields; i++ ) {
-                    fieldnames[i] = fields[i]->name;
-                    if ( strlen(fieldnames[i]) > maxlen )
-                        maxlen = strlen(fieldnames[i]);
-                }
-                maxlen++;
-                fieldname_size = maxlen;
-                while ( nfields*fieldname_size % 8 != 0 )
-                    fieldname_size++;
-#if 0
-                fwrite(&fieldname_type,2,1,mat->fp);
-                fwrite(&fieldname_data_size,2,1,mat->fp);
-#else
-                fieldname = (fieldname_data_size<<16) | fieldname_type;
-                fwrite(&fieldname,4,1,mat->fp);
-#endif
-                fwrite(&fieldname_size,4,1,mat->fp);
-                fwrite(&array_name_type,4,1,mat->fp);
-                nBytes = nfields*fieldname_size;
-                fwrite(&nBytes,4,1,mat->fp);
-                padzero = calloc(fieldname_size,1);
-                for ( i = 0; i < nfields; i++ ) {
-                    fwrite(fieldnames[i],1,strlen(fieldnames[i]),mat->fp);
-                    fwrite(padzero,1,fieldname_size-strlen(fieldnames[i]),mat->fp);
-                }
-                free(fieldnames);
-                free(padzero);
-                for ( i = 0; i < nfields; i++ )
-                    WriteInfo5(mat,fields[i]);
-                break;
-            }
-        }
-    /* Does not work.
-     * Can write empty data, but how to go back and add the real data?
-     */
-#if 0
-    } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-#if defined(HAVE_ZLIB)
-        mat_uint32_t comp_buf[512];
-        mat_uint32_t uncomp_buf[512] = {0,};
-        int buf_size = 512, err;
-        size_t byteswritten = 0;
-
-        matvar->z         = malloc(sizeof(*matvar->z));
-        matvar->z->zalloc = Z_NULL;
-        matvar->z->zfree  = Z_NULL;
-        err = deflateInit(matvar->z,Z_DEFAULT_COMPRESSION);
-
-        matrix_type = MAT_T_COMPRESSED;
-        fwrite(&matrix_type,4,1,mat->fp);
-        fwrite(&pad4,4,1,mat->fp);
-        start = ftell(mat->fp);
-
-        /* Array Flags */
-
-        array_flags = matvar->class_type & MAT_F_CLASS_T;
-        if ( matvar->isComplex )
-            array_flags |= MAT_F_COMPLEX;
-        if ( matvar->isGlobal )
-            array_flags |= MAT_F_GLOBAL;
-        if ( matvar->isLogical )
-            array_flags |= MAT_F_LOGICAL;
-
-        uncomp_buf[0] = MAT_T_MATRIX;
-        uncomp_buf[1] = 448;
-        matvar->z->next_out  = comp_buf;
-        matvar->z->next_in   = uncomp_buf;
-        matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-        matvar->z->avail_in  = 8;
-        err = deflate(matvar->z,Z_SYNC_FLUSH);
-        byteswritten += fwrite(comp_buf,1,buf_size*sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-        uncomp_buf[0] = array_flags_type;
-        uncomp_buf[1] = array_flags_size;
-        uncomp_buf[2] = array_flags;
-        uncomp_buf[3] = 0;
-        /* Rank and Dimension */
-        nBytes = matvar->rank * 4;
-        uncomp_buf[4] = dims_array_type;
-        uncomp_buf[5] = nBytes;
-        for ( i = 0; i < matvar->rank; i++ ) {
-            mat_int32_t dim;
-            dim = matvar->dims[i];
-            nmemb *= dim;
-            uncomp_buf[6+i] = dim;
-        }
-        if ( matvar->rank % 2 != 0 )
-            uncomp_buf[6+i] = pad4;
-
-        matvar->z->next_out  = comp_buf;
-        matvar->z->next_in   = uncomp_buf;
-        matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-        matvar->z->avail_in  = (6+i)*sizeof(*uncomp_buf);
-        err = deflate(matvar->z,Z_NO_FLUSH);
-        byteswritten += fwrite(comp_buf,1,buf_size*sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-        /* Name of variable */
-        if ( strlen(matvar->name) <= 4 ) {
-#if 0
-            mat_int16_t array_name_len = (mat_int16_t)strlen(matvar->name);
-            mat_int8_t  pad1 = 0;
-
-            uncomp_buf[0] = (array_name_type << 16) | array_name_len;
-            memcpy(uncomp_buf+1,matvar->name,array_name_len);
-
-            matvar->z->next_out  = comp_buf;
-            matvar->z->next_in   = uncomp_buf;
-            matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-            matvar->z->avail_in  = 8;
-            err = deflate(matvar->z,Z_NO_FLUSH);
-            byteswritten += fwrite(comp_buf,1,buf_size*sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-        } else {
-#endif
-            mat_int32_t array_name_len = (mat_int32_t)strlen(matvar->name);
-
-            memset(uncomp_buf,0,buf_size*sizeof(*uncomp_buf));
-            uncomp_buf[0] = array_name_type;
-            uncomp_buf[1] = array_name_len;
-            memcpy(uncomp_buf+2,matvar->name,array_name_len);
-            if ( array_name_len % 8 )
-                array_name_len += array_name_len % 8;
-            matvar->z->next_out  = comp_buf;
-            matvar->z->next_in   = uncomp_buf;
-            matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-            matvar->z->avail_in  = 8+array_name_len;
-            err = deflate(matvar->z,Z_FULL_FLUSH);
-            byteswritten += fwrite(comp_buf,1,buf_size*sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-        }
-        matvar->datapos = ftell(mat->fp);
-        deflateCopy(&z_save,matvar->z);
-        switch ( matvar->class_type ) {
-            case MAT_C_DOUBLE:
-            case MAT_C_SINGLE:
-            case MAT_C_INT32:
-            case MAT_C_UINT32:
-            case MAT_C_INT16:
-            case MAT_C_UINT16:
-            case MAT_C_INT8:
-            case MAT_C_UINT8:
-                byteswritten += WriteCompressedEmptyData(mat,matvar->z,nmemb,matvar->data_type);
-#if 0
-                if ( nBytes % 8 )
-                    for ( i = nBytes % 8; i < 8; i++ )
-                        fwrite(&pad1,1,1,mat->fp);
-                if ( matvar->isComplex ) {
-                    nBytes = WriteEmptyData(mat,nmemb,matvar->data_type);
-                    if ( nBytes % 8 )
-                        for ( i = nBytes % 8; i < 8; i++ )
-                            fwrite(&pad1,1,1,mat->fp);
-                }
-#endif
-                break;
-        }
-        matvar->z->next_out  = comp_buf;
-        matvar->z->next_in   = NULL;
-        matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-        matvar->z->avail_in  = 0;
-
-        err = deflate(matvar->z,Z_FINISH);
-        byteswritten += fwrite(comp_buf,1,buf_size*sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-                if ( byteswritten % 8 )
-                    for ( i = byteswritten % 8; i < 8; i++ )
-                        fwrite(&pad1,1,1,mat->fp);
-        fprintf(stderr,"deflate Z_FINISH: err = %d,byteswritten = %u\n",err,byteswritten);
-
-        err = deflateEnd(matvar->z);
-        fprintf(stderr,"deflateEnd: err = %d\n",err);
-#if 1
-        err = deflateEnd(matvar->z);
-        free(matvar->z);
-        matvar->z = NULL;
-#else
-        memcpy(matvar->z,&z_save,sizeof(*matvar->z));
-#endif
-#endif
-#endif
-    }
-    end = ftell(mat->fp);
-    nBytes = (int)(end-start);
-    fseek(mat->fp,(long)-(nBytes+4),SEEK_CUR);
-    fwrite(&nBytes,4,1,mat->fp);
-    fseek(mat->fp,end,SEEK_SET);
-}
-
-/** @brief Prints the mat variable
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param matvar pointer to the mat variable
- */
-void
-Mat_VarPrint5( matvar_t *matvar, int printdata )
-{
-    int i, j;
-
-    if ( matvar == NULL )
-        return;
-    if ( matvar->name )
-        Mat_Message("      Name: %s", matvar->name);
-    Mat_Message("      Rank: %d", matvar->rank);
-    if ( matvar->rank == 0 )
-        return;
-    if ( matvar->isComplex )
-        Mat_Message("Class Type: %s (complex)",class_type_desc[matvar->class_type]);
-    else
-        Mat_Message("Class Type: %s",class_type_desc[matvar->class_type]);
-    if ( matvar->data_type )
-        Mat_Message(" Data Type: %s", data_type_desc[matvar->data_type]);
-    if ( matvar->data != NULL && matvar->data_size > 0 ) {
-        switch( matvar->class_type ) {
-            case MAT_C_DOUBLE:
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if ( matvar->rank == 2 &&
-                         (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%f ", ((double*)matvar->data)[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 ) {
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%f ", ((double*)matvar->data)[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else {
-                    for ( i = 0; i < matvar->nbytes/matvar->data_size; i++ )
-                        printf("%f\n", ((double*)matvar->data)[i]);
-                }
-                break;
-            case MAT_C_SINGLE:
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if ( matvar->rank == 2 &&
-                         (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%f ", ((float*)matvar->data)[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 ) {
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%f ", ((float*)matvar->data)[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else {
-                    for ( i = 0; i < matvar->nbytes/matvar->data_size; i++ )
-                        printf("%f\n", ((float*)matvar->data)[i]);
-                }
-                break;
-#ifdef HAVE_MAT_INT64_T
-            case MAT_C_INT64:
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if ( matvar->rank == 2 &&
-                         (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%d ", ((mat_int64_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 ) {
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%d ", ((mat_uint64_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else {
-                    for ( i = 0; i < matvar->nbytes/matvar->data_size; i++ )
-                        printf("%d\n", ((mat_int64_t*)matvar->data)[i]);
-                }
-                break;
-#endif
-#ifdef HAVE_MAT_UINT64_T
-            case MAT_C_UINT64:
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if ( matvar->rank == 2 &&
-                         (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%u ", ((mat_uint64_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 ) {
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%u ", ((mat_uint64_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else {
-                    for ( i = 0; i < matvar->nbytes/matvar->data_size; i++ )
-                        printf("%u\n", ((mat_int64_t*)matvar->data)[i]);
-                }
-                break;
-#endif /* HAVE_MAT_UINT64_T */
-            case MAT_C_INT32:
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if ( matvar->rank == 2 &&
-                         (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%d ", ((mat_int32_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 ) {
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%d ", ((mat_uint32_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else {
-                    for ( i = 0; i < matvar->nbytes/matvar->data_size; i++ )
-                        printf("%d\n", ((mat_int32_t*)matvar->data)[i]);
-                }
-                break;
-            case MAT_C_UINT32:
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if ( matvar->rank == 2 &&
-                         (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%u ", ((mat_uint32_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 ) {
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%u ", ((mat_uint32_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else {
-                    for ( i = 0; i < matvar->nbytes/matvar->data_size; i++ )
-                        printf("%u\n", ((mat_int32_t*)matvar->data)[i]);
-                }
-                break;
-            case MAT_C_INT16:
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if ( matvar->rank == 2 &&
-                         (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%hd ", ((mat_int16_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 ) {
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%hd ", ((mat_uint16_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else {
-                    for ( i = 0; i < matvar->nbytes/matvar->data_size; i++ )
-                        printf("%hd\n", ((mat_int16_t*)matvar->data)[i]);
-                }
-                break;
-            case MAT_C_UINT16:
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if ( matvar->rank == 2 &&
-                         (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%hu ", ((mat_uint16_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 ) {
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%hu ", ((mat_uint16_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else {
-                    for ( i = 0; i < matvar->nbytes/matvar->data_size; i++ )
-                        printf("%hu\n", ((mat_int32_t*)matvar->data)[i]);
-                }
-                break;
-            case MAT_C_INT8:
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if ( matvar->rank == 2 &&
-                         (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%hd ", ((mat_int8_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 ) {
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%hd ", ((mat_int8_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else {
-                    for ( i = 0; i < matvar->nbytes/matvar->data_size; i++ )
-                        printf("%hd\n", ((mat_int8_t*)matvar->data)[i]);
-                }
-                break;
-            case MAT_C_UINT8:
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if ( matvar->rank == 2 &&
-                         (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%hu ", ((mat_uint8_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 ) {
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%hu ", ((mat_uint8_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else {
-                    for ( i = 0; i < matvar->nbytes/matvar->data_size; i++ )
-                        printf("%hu\n", ((mat_uint8_t*)matvar->data)[i]);
-                }
-                break;
-            case MAT_C_CHAR:
-                if ( !printdata )
-                    break;
-                if ( matvar->dims[0] == 1 ) {
-                    printf("%s\n",(char *)matvar->data);
-                } else {
-                    int ndx = 0;
-                    for ( i = 0; i < matvar->dims[1]; i++ ) {
-                        ndx = i;
-                        j = 0;
-                        while ( j++ < matvar->dims[0] &&
-                                *((char *)matvar->data+ndx) != '\0' ) {
-                            printf("%c", *((char *)matvar->data+ndx));
-                            ndx += matvar->dims[0];
-                        }
-                        printf("\n");
-                    }
-                }
-                break;
-            case MAT_C_STRUCT:
-            {
-                matvar_t **fields = (matvar_t **)matvar->data;
-                int nfields = matvar->nbytes / matvar->data_size;
-                Mat_Message("Fields[%d] {", nfields);
-                for ( i = 0; i < nfields; i++ )
-                    Mat_VarPrint(fields[i],printdata);
-                Mat_Message("}");
-                break;
-            }
-            case MAT_C_CELL:
-            {
-                matvar_t **fields = (matvar_t **)matvar->data;
-                int nfields = matvar->nbytes / matvar->data_size;
-                for ( i = 0; i < nfields; i++ )
-                    Mat_VarPrint(fields[i],printdata);
-                break;
-            }
-            case MAT_C_SPARSE:
-            {
-                sparse_t *sparse;
-/* FIXME: ComplexSplit */
-#if defined(EXTENDED_SPARSE)
-                sparse = matvar->data;
-                switch ( matvar->data_type ) {
-                    case MAT_T_DOUBLE:
-                    {
-                        if ( matvar->isComplex ) {
-                            struct ComplexSplit *complex_data = sparse->data;
-                            double *re,*im;
-                            re = complex_data->Re;
-                            im = complex_data->Im;
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %f + %fi",
-                                        sparse->ir[j]+1,i+1,re[j],im[j]);
-                            }
-                        } else {
-                            double *data;
-                            data = sparse->data;
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %f",
-                                        sparse->ir[j]+1,i+1,data[j]);
-                            }
-                        }
-                        break;
-                    }
-                    case MAT_T_SINGLE:
-                    {
-                        float *data;
-                        data = sparse->data;
-                        if ( matvar->isComplex ) {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %f + %fi",
-                                        sparse->ir[j]+1,i+1,data[j],
-                                        data[sparse->ndata+j]);
-                            }
-                        } else {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %f",
-                                        sparse->ir[j]+1,i+1,data[j]);
-                            }
-                        }
-                        break;
-                    }
-#ifdef HAVE_MAT_INT64_T
-                    case MAT_T_INT64:
-                    {
-                        mat_int64_t *data;
-                        data = sparse->data;
-                        if ( matvar->isComplex ) {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %d + %di",
-                                        sparse->ir[j]+1,i+1,data[j],
-                                        data[sparse->ndata+j]);
-                            }
-                        } else {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %d",
-                                        sparse->ir[j]+1,i+1,data[j]);
-                            }
-                        }
-                        break;
-                    }
-#endif
-#ifdef HAVE_MAT_UINT64_T
-                    case MAT_T_UINT64:
-                    {
-                        mat_uint64_t *data;
-                        data = sparse->data;
-                        if ( matvar->isComplex ) {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %u + %ui",
-                                        sparse->ir[j]+1,i+1,data[j],
-                                        data[sparse->ndata+j]);
-                            }
-                        } else {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %u",
-                                        sparse->ir[j]+1,i+1,data[j]);
-                            }
-                        }
-                        break;
-                    }
-#endif
-                    case MAT_T_INT32:
-                    {
-                        mat_int32_t *data;
-                        data = sparse->data;
-                        if ( matvar->isComplex ) {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %d + %di",
-                                        sparse->ir[j]+1,i+1,data[j],
-                                        data[sparse->ndata+j]);
-                            }
-                        } else {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %d",
-                                        sparse->ir[j]+1,i+1,data[j]);
-                            }
-                        }
-                        break;
-                    }
-                    case MAT_T_UINT32:
-                    {
-                        mat_uint32_t *data;
-                        data = sparse->data;
-                        if ( matvar->isComplex ) {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %u + %ui",
-                                        sparse->ir[j]+1,i+1,data[j],
-                                        data[sparse->ndata+j]);
-                            }
-                        } else {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %u",
-                                        sparse->ir[j]+1,i+1,data[j]);
-                            }
-                        }
-                        break;
-                    }
-                    case MAT_T_INT16:
-                    {
-                        mat_int16_t *data;
-                        data = sparse->data;
-                        if ( matvar->isComplex ) {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %hd + %hdi",
-                                        sparse->ir[j]+1,i+1,data[j],
-                                        data[sparse->ndata+j]);
-                            }
-                        } else {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %hd",
-                                        sparse->ir[j]+1,i+1,data[j]);
-                            }
-                        }
-                        break;
-                    }
-                    case MAT_T_UINT16:
-                    {
-                        mat_uint16_t *data;
-                        data = sparse->data;
-                        if ( matvar->isComplex ) {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %hu + %hui",
-                                        sparse->ir[j]+1,i+1,data[j],
-                                        data[sparse->ndata+j]);
-                            }
-                        } else {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %hu",
-                                        sparse->ir[j]+1,i+1,data[j]);
-                            }
-                        }
-                        break;
-                    }
-                    case MAT_T_INT8:
-                    {
-                        mat_int8_t *data;
-                        data = sparse->data;
-                        if ( matvar->isComplex ) {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %hd + %hdi",
-                                        sparse->ir[j]+1,i+1,data[j],
-                                        data[sparse->ndata+j]);
-                            }
-                        } else {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %hd",
-                                        sparse->ir[j]+1,i+1,data[j]);
-                            }
-                        }
-                        break;
-                    }
-                    case MAT_T_UINT8:
-                    {
-                        mat_uint8_t *data;
-                        data = sparse->data;
-                        if ( matvar->isComplex ) {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %hu + %hui",
-                                        sparse->ir[j]+1,i+1,data[j],
-                                        (mat_uint16_t)data[sparse->ndata+j]);
-                            }
-                        } else {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %hu",
-                                        sparse->ir[j]+1,i+1,
-                                        (mat_uint16_t)data[j]);
-                            }
-                        }
-                        break;
-                    }
-                }
-#else
-                double *data;
-
-                sparse = matvar->data;
-                data = sparse->data;
-                if ( matvar->isComplex ) {
-                    for ( i = 0; i < sparse->njc-1; i++ ) {
-                        for ( j = sparse->jc[i];
-                              j < sparse->jc[i+1] && j < sparse->ndata; j++ )
-                            Mat_Message("    (%d,%d)  %f + %fi",
-                                sparse->ir[j]+1,i+1,data[j],
-                                data[sparse->ndata+j]);
-                    }
-                } else {
-                    for ( i = 0; i < sparse->njc-1; i++ ) {
-                        for ( j = sparse->jc[i];
-                              j < sparse->jc[i+1] && j < sparse->ndata; j++ )
-                            Mat_Message("    (%d,%d)  %f", sparse->ir[j]+1,i+1,
-                                data[j]);
-                    }
-                }
-#endif
-                break;
-            }
-            default:
-                printf("I can't print this class\n");
-        }
-    } else {
-        if ( printdata && !matvar->data  )
-            Mat_Warning("Data is NULL");
-        if ( printdata && matvar->data_size < 1 )
-            Mat_Warning("data-size is %d",matvar->data_size);
-    }
-    Mat_Message("\n");
-    return;
-}
-
-/** @brief Reads the header information for the next MAT variable
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @retuen pointer to the MAT variable or NULL
- */
-matvar_t *
-Mat_VarReadNextInfo5( mat_t *mat )
-{
-    int err, data_type, nBytes, i;
-    long  fpos;
-    matvar_t *matvar = NULL; 
-    mat_uint32_t array_flags;
-    long     bytesread = 0;
-
-    if( mat == NULL )
-        return NULL; 
-
-    fpos = ftell(mat->fp);
-    err = fread(&data_type,4,1,mat->fp);
-    if ( !err )
-        return NULL;
-    err = fread(&nBytes,4,1,mat->fp);
-    if ( mat->byteswap ) {
-        Mat_int32Swap(&data_type);
-        Mat_int32Swap(&nBytes);
-    }
-    switch ( data_type ) {
-#if defined(HAVE_ZLIB)
-        case MAT_T_COMPRESSED:
-        {
-            mat_uint32_t uncomp_buf[16] = {0,};
-            int      nbytes;
-
-            matvar               = malloc(sizeof(*matvar));
-            matvar->name         = NULL;
-            matvar->data         = NULL;
-            matvar->dims         = NULL;
-            matvar->nbytes       = 0;
-            matvar->data_type    = 0;
-            matvar->class_type   = 0;
-            matvar->data_size    = 0;
-            matvar->mem_conserve = 0;
-            matvar->compression  = 1;
-            matvar->fpos         = fpos;
-            matvar->fp           = mat;
-
-            matvar->z = calloc(1,sizeof(z_stream));
-            matvar->z->zalloc    = NULL;
-            matvar->z->zfree     = NULL;
-            matvar->z->opaque    = NULL;
-            matvar->z->next_in   = NULL;
-            matvar->z->next_out  = NULL;
-            matvar->z->avail_in  = 0;
-            matvar->z->avail_out = 0;
-            err = inflateInit(matvar->z);
-            if ( err != Z_OK ) {
-                Mat_Critical("inflateInit2 returned %d",err);
-                Mat_VarFree(matvar);
-                break;
-            }
-
-            /* Read Variable tag */
-            bytesread += InflateVarTag(mat,matvar,uncomp_buf);
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(uncomp_buf);
-                (void)Mat_uint32Swap(uncomp_buf+1);
-            }
-            nbytes = uncomp_buf[1];
-            if ( uncomp_buf[0] != MAT_T_MATRIX ) {
-                Mat_Critical("Uncompressed type not MAT_T_MATRIX");
-                fseek(mat->fp,nBytes-bytesread,SEEK_CUR);
-                Mat_VarFree(matvar);
-                matvar = NULL;
-                break;
-            }
-            /* Inflate Array Flags */
-            bytesread += InflateArrayFlags(mat,matvar,uncomp_buf);
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(uncomp_buf);
-                (void)Mat_uint32Swap(uncomp_buf+2);
-                (void)Mat_uint32Swap(uncomp_buf+3);
-            }
-            /* Array Flags */
-            if ( uncomp_buf[0] == MAT_T_UINT32 ) {
-               array_flags = uncomp_buf[2];
-               matvar->class_type  = (array_flags & MAT_F_CLASS_T);
-               matvar->isComplex   = (array_flags & MAT_F_COMPLEX);
-               matvar->isGlobal    = (array_flags & MAT_F_GLOBAL);
-               matvar->isLogical   = (array_flags & MAT_F_LOGICAL);
-               if ( matvar->class_type == MAT_C_SPARSE ) {
-                   /* Need to find a more appropriate place to store nzmax */
-                   matvar->nbytes      = uncomp_buf[3];
-               }
-            }
-            /* Inflate Dimensions */
-            bytesread += InflateDimensions(mat,matvar,uncomp_buf);
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(uncomp_buf);
-                (void)Mat_uint32Swap(uncomp_buf+1);
-            }
-            /* Rank and Dimension */
-            if ( uncomp_buf[0] == MAT_T_INT32 ) {
-                nbytes = uncomp_buf[1];
-                matvar->rank = nbytes / 4;
-                matvar->dims = malloc(matvar->rank*sizeof(int));
-                if ( mat->byteswap ) {
-                    for ( i = 0; i < matvar->rank; i++ )
-                        matvar->dims[i] = Mat_uint32Swap(&(uncomp_buf[2+i]));
-                } else {
-                    for ( i = 0; i < matvar->rank; i++ )
-                        matvar->dims[i] = uncomp_buf[2+i];
-                }
-            }
-            /* Inflate variable name tag */
-            bytesread += InflateVarNameTag(mat,matvar,uncomp_buf);
-            if ( mat->byteswap )
-                (void)Mat_uint32Swap(uncomp_buf);
-            /* Name of variable */
-            if ( uncomp_buf[0] == MAT_T_INT8 ) {    /* Name not in tag */
-                int len;
-                if ( mat->byteswap )
-                    len = Mat_uint32Swap(uncomp_buf+1);
-                else
-                    len = uncomp_buf[1];
-
-                if ( len % 8 == 0 )
-                    i = len;
-                else
-                    i = len+(8-(len % 8));
-                matvar->name = malloc(i+1);
-                /* Inflate variable name */
-                bytesread += InflateVarName(mat,matvar,matvar->name,i);
-                matvar->name[len] = '\0';
-            } else if ( ((uncomp_buf[0] & 0x0000ffff) == MAT_T_INT8) &&
-                        ((uncomp_buf[0] & 0xffff0000) != 0x00) ) {
-                /* Name packed in tag */
-                int len;
-                len = (uncomp_buf[0] & 0xffff0000) >> 16;
-                matvar->name = malloc(len+1);
-                memcpy(matvar->name,uncomp_buf+1,len);
-                matvar->name[len] = '\0';
-            }
-            if ( matvar->class_type == MAT_C_STRUCT )
-                ReadNextStructField(mat,matvar);
-            else if ( matvar->class_type == MAT_C_CELL ) {
-              if (ReadNextCell(mat,matvar) == -1) {
-                Mat_VarFree(matvar);
-                matvar = NULL;
-                return NULL;
-              }
-            }
-            fseek(mat->fp,-(int)matvar->z->avail_in,SEEK_CUR);
-            matvar->datapos = ftell(mat->fp);
-            fseek(mat->fp,nBytes+8+fpos,SEEK_SET);
-            break;
-        }
-#endif
-        case MAT_T_MATRIX:
-        {
-            int      nbytes;
-            mat_uint32_t buf[32];
-            size_t   bytesread = 0;
-
-            matvar = Mat_VarCalloc();
-            matvar->fpos         = fpos;
-            matvar->fp           = mat;
-
-            /* Read Array Flags and The Dimensions Tag */
-            bytesread  += fread(buf,4,6,mat->fp);
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(buf);
-                (void)Mat_uint32Swap(buf+1);
-                (void)Mat_uint32Swap(buf+2);
-                (void)Mat_uint32Swap(buf+3);
-                (void)Mat_uint32Swap(buf+4);
-                (void)Mat_uint32Swap(buf+5);
-            }
-            /* Array Flags */
-            if ( buf[0] == MAT_T_UINT32 ) {
-               array_flags = buf[2];
-               matvar->class_type  = (array_flags & MAT_F_CLASS_T);
-               matvar->isComplex   = (array_flags & MAT_F_COMPLEX);
-               matvar->isGlobal    = (array_flags & MAT_F_GLOBAL);
-               matvar->isLogical   = (array_flags & MAT_F_LOGICAL);
-               if ( matvar->class_type == MAT_C_SPARSE ) {
-                   /* Need to find a more appropriate place to store nzmax */
-                   matvar->nbytes      = buf[3];
-               }
-            }
-            /* Rank and Dimension */
-            if ( buf[4] == MAT_T_INT32 ) {
-                nbytes = buf[5];
-
-                matvar->rank = nbytes / 4;
-                matvar->dims = malloc(matvar->rank*sizeof(int));
-
-                /* Assumes rank <= 16 */
-                if ( matvar->rank % 2 != 0 )
-                    bytesread+=fread(buf,4,matvar->rank+1,mat->fp);
-                else
-                    bytesread+=fread(buf,4,matvar->rank,mat->fp);
-
-                if ( mat->byteswap ) {
-                    for ( i = 0; i < matvar->rank; i++ )
-                        matvar->dims[i] = Mat_uint32Swap(buf+i);
-                } else {
-                    for ( i = 0; i < matvar->rank; i++ )
-                        matvar->dims[i] = buf[i];
-                }
-            }
-            /* Variable Name Tag */
-            bytesread+=fread(buf,4,2,mat->fp);
-            if ( mat->byteswap )
-                (void)Mat_uint32Swap(buf);
-            /* Name of variable */
-            if ( buf[0] == MAT_T_INT8 ) {    /* Name not in tag */
-                int len;
-
-                if ( mat->byteswap )
-                    len = Mat_uint32Swap(buf+1);
-                else
-                    len = buf[1];
-                if ( len % 8 == 0 )
-                    i = len;
-                else
-                    i = len+(8-(len % 8));
-                bytesread+=fread(buf,1,i,mat->fp);
-
-                matvar->name = malloc(len+1);
-                memcpy(matvar->name,buf,len);
-                matvar->name[len] = '\0';
-            } else if ( ((buf[0] & 0x0000ffff) == MAT_T_INT8) &&
-                        ((buf[0] & 0xffff0000) != 0x00) ) {
-                /* Name packed in the tag */
-                int len;
-
-                len = (buf[0] & 0xffff0000) >> 16;
-                matvar->name = malloc(len+1);
-                memcpy(matvar->name,buf+1,len);
-                matvar->name[len] = '\0';
-            }
-            if ( matvar->class_type == MAT_C_STRUCT )
-                (void)ReadNextStructField(mat,matvar);
-            else if ( matvar->class_type == MAT_C_CELL )
-                (void)ReadNextCell(mat,matvar);
-            else if ( matvar->class_type == MAT_C_FUNCTION )
-                (void)ReadNextFunctionHandle(mat,matvar);
-            matvar->datapos = ftell(mat->fp);
-            fseek(mat->fp,nBytes+8+fpos,SEEK_SET);
-            break;
-        }
-        default:
-            Mat_Message("%d is not valid (MAT_T_MATRIX or MAT_T_COMPRESSED", data_type);
-            return NULL;
-    }
-
-    return matvar;
-}

+ 0 - 7103
matlabAccess/matio/src/mat5.c.orig

@@ -1,7103 +0,0 @@
-/** @file mat5.c
- * Matlab MAT version 5 file functions
- * @ingroup MAT
- */
-/*
- * Copyright (C) 2005-2006   Christopher C. Hulbert
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public
- *  License as published by the Free Software Foundation; either
- *  version 2.1 of the License, or (at your option) any later version.
- *
- *  This library is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this library; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-/* FIXME: Implement Unicode support */
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <math.h>
-#include <time.h>
-#include "matio.h"
-#include "mat5.h"
-#include "matio_private.h"
-
-static const char *class_type_desc[16] = {"Undefined","Cell Array","Structure",
-       "Object","Character Array","Sparse Array","Double Precision Array",
-       "Single Precision Array", "8-bit, signed Integer Array",
-       "8-bit, Unsigned Integer Array","16-bit, signed Integer Array",
-       "16-bit, unsigned Integer Array","32-bit, signed Integer Array",
-       "32-bit, unsigned Integer Array","Matlab Array","Compressed Data"};
-static const char *data_type_desc[23] = {"Unknown","8-bit, signed integer",
-       "8-bit, unsigned integer","16-bit, signed integer",
-       "16-bit, unsigned integer","32-bit, signed integer",
-       "32-bit, unsigned integer","IEEE 754 single-precision","RESERVED",
-       "IEEE 754 double-precision","RESERVED","RESERVED",
-       "64-bit, signed integer","64-bit, unsigned integer", "Matlab Array",
-       "Compressed Data","Unicode UTF-8 Encoded Character Data",
-       "Unicode UTF-16 Encoded Character Data",
-       "Unicode UTF-32 Encoded Character Data","","String","Cell Array",
-       "Structure"};
-
-/*
- * -------------------------------------------------------------
- *   Private Functions
- * -------------------------------------------------------------
- */
-
-static size_t GetMatrixMaxBufSize(matvar_t *matvar);
-static size_t GetStructFieldBufSize(matvar_t *matvar);
-static size_t GetCellArrayFieldBufSize(matvar_t *matvar);
-
-/** @brief determines the number of bytes needed to store the given struct field
- *
- * @ingroup mat_internal
- * @param matvar field of a structure
- * @return the number of bytes needed to store the struct field
- */
-static size_t
-GetStructFieldBufSize(matvar_t *matvar)
-{
-    size_t nBytes = 0,len;
-    size_t tag_size = 8, array_flags_size = 8;
-    int    nmemb = 1, i;
-
-    if ( matvar == NULL )
-        return nBytes;
-
-    /* Have to account for the matrix tag in a struct field */
-    nBytes += tag_size;
-
-    /* Add the Array Flags tag and space to the number of bytes */
-    nBytes += tag_size + array_flags_size;
-
-    /* In a struct field, the name is just a tag with 0 bytes */
-    nBytes += tag_size;
-
-    /* Add rank and dimensions, padded to an 8 byte block */
-    for ( i = 0, len = 0; i < matvar->rank; i++ )
-        nmemb *= matvar->dims[i];
-    if ( matvar->rank % 2 )
-        nBytes += tag_size + matvar->rank*4 + 4;
-    else
-        nBytes += tag_size + matvar->rank*4;
-
-    if ( matvar->class_type == MAT_C_STRUCT ) {
-        matvar_t **fields = matvar->data;
-        int i, nfields;
-        size_t maxlen = 0;
-
-        nfields = matvar->nbytes / (nmemb*matvar->data_size);
-        for ( i = 0; i < nfields; i++ ) {
-            if ( NULL != fields[i]->name && strlen(fields[i]->name) > maxlen )
-                maxlen = strlen(fields[i]->name);
-        }
-        maxlen++;
-        while ( nfields*maxlen % 8 != 0 )
-            maxlen++;
-
-        nBytes += tag_size + tag_size + maxlen*nfields;
-
-        /* FIXME: Add bytes for the fieldnames */
-        if ( NULL != fields && nfields > 0 ) {
-            for ( i = 0; i < nfields*nmemb; i++ )
-                nBytes += GetStructFieldBufSize(fields[i]);
-        }
-    } else if ( matvar->class_type == MAT_C_CELL ) {
-        matvar_t **cells = matvar->data;
-        int i, ncells = matvar->nbytes / matvar->data_size;
-
-        if ( NULL != cells && ncells > 0 ) {
-            for ( i = 0; i < ncells; i++ )
-                nBytes += GetCellArrayFieldBufSize(cells[i]);
-        }
-    } else if ( matvar->class_type == MAT_C_SPARSE ) {
-        sparse_t *sparse = matvar->data;
-
-        nBytes += tag_size + sparse->njc*sizeof(mat_int32_t) +
-                  tag_size + sparse->nir*sizeof(mat_int32_t) +
-                  tag_size + sparse->ndata*Mat_SizeOf(matvar->data_type);
-        if ( matvar->isComplex )
-            nBytes += tag_size + sparse->ndata*Mat_SizeOf(matvar->data_type);
-    } else {
-        nBytes += tag_size + nmemb*Mat_SizeOf(matvar->data_type);
-        if (nmemb*Mat_SizeOf(matvar->data_type) % 8) {
-            nBytes += (8 - (nmemb*Mat_SizeOf(matvar->data_type) % 8));
-          }
-        if ( matvar->isComplex ) {
-            nBytes += tag_size + nmemb*Mat_SizeOf(matvar->data_type);
-            if (nmemb*Mat_SizeOf(matvar->data_type) % 8) {
-                nBytes += (8 - (nmemb*Mat_SizeOf(matvar->data_type) % 8));
-              }
-          }
-    }
-    
-    return nBytes;
-}
-
-/** @brief determines the number of bytes needed to store the cell array element
- *
- * @ingroup mat_internal
- * @param matvar MAT variable
- * @return the number of bytes needed to store the variable
- */
-static size_t
-GetCellArrayFieldBufSize(matvar_t *matvar)
-{
-    size_t nBytes = 0,len;
-    size_t tag_size = 8, array_flags_size = 8;
-    int    nmemb = 1, i;
-
-    if ( matvar == NULL )
-        return nBytes;
-
-    /* Have to account for the matrix tag in a struct field */
-    nBytes += tag_size;
-
-    /* Add the Array Flags tag and space to the number of bytes */
-    nBytes += tag_size + array_flags_size;
-
-    /* Get size of variable name, pad it to an 8 byte block, and add it to nBytes */
-    if ( NULL != matvar->name )
-        len = strlen(matvar->name);
-    else
-        len=4;
-
-    if ( len <= 4 ) {
-        nBytes += tag_size;
-    } else {
-        if ( len % 8 )
-            len = len + (8 - len % 8);
-        nBytes += tag_size + len;
-    }
-
-    /* Add rank and dimensions, padded to an 8 byte block */
-    for ( i = 0, len = 0; i < matvar->rank; i++ )
-        nmemb *= matvar->dims[i];
-    if ( matvar->rank % 2 )
-        nBytes += tag_size + matvar->rank*4 + 4;
-    else
-        nBytes += tag_size + matvar->rank*4;
-
-    if ( matvar->class_type == MAT_C_STRUCT ) {
-        matvar_t **fields = matvar->data;
-        int i, nfields;
-        size_t maxlen = 0;
-
-        nfields = matvar->nbytes / (nmemb*matvar->data_size);
-        for ( i = 0; i < nfields; i++ ) {
-            if ( NULL != fields[i]->name && strlen(fields[i]->name) > maxlen )
-                maxlen = strlen(fields[i]->name);
-        }
-        maxlen++;
-        while ( nfields*maxlen % 8 != 0 )
-            maxlen++;
-
-        nBytes += tag_size + tag_size + maxlen*nfields;
-
-        if ( NULL != fields && nfields > 0 ) {
-            for ( i = 0; i < nfields*nmemb; i++ )
-                nBytes += GetStructFieldBufSize(fields[i]);
-        }
-    } else if ( matvar->class_type == MAT_C_CELL ) {
-        matvar_t **cells = matvar->data;
-        int i, ncells = matvar->nbytes / matvar->data_size;
-
-        if ( NULL != cells && ncells > 0 ) {
-            for ( i = 0; i < ncells; i++ )
-                nBytes += GetCellArrayFieldBufSize(cells[i]);
-        }
-    } else if ( matvar->class_type == MAT_C_SPARSE ) {
-        sparse_t *sparse = matvar->data;
-
-        nBytes += tag_size + sparse->njc*sizeof(mat_int32_t) +
-                  tag_size + sparse->nir*sizeof(mat_int32_t) +
-                  tag_size + sparse->ndata*Mat_SizeOf(matvar->data_type);
-        if ( matvar->isComplex )
-            nBytes += tag_size + sparse->ndata*Mat_SizeOf(matvar->data_type);
-    } else {
-        nBytes += tag_size + nmemb*Mat_SizeOf(matvar->data_type);
-        if ( nmemb*Mat_SizeOf(matvar->data_type) % 8 ) {
-            nBytes += (8 - (nmemb*Mat_SizeOf(matvar->data_type) % 8));
-          }
-        if ( matvar->isComplex ) {
-            nBytes += tag_size + nmemb*Mat_SizeOf(matvar->data_type);
-            if ( nmemb*Mat_SizeOf(matvar->data_type) % 8 ) {
-                nBytes += (8 - (nmemb*Mat_SizeOf(matvar->data_type) % 8));
-              }
-          }
-    }
-    
-    return nBytes;
-}
-
-/** @brief determines the number of bytes needed to store the given variable
- *
- * @ingroup mat_internal
- * @param matvar MAT variable
- * @return the number of bytes needed to store the variable
- */
-static size_t
-GetMatrixMaxBufSize(matvar_t *matvar)
-{
-    size_t nBytes = 0,len;
-    size_t tag_size = 8, array_flags_size = 8;
-    int    nmemb = 1, i;
-
-    if ( matvar == NULL )
-        return nBytes;
-
-    /* Add the Array Flags tag and space to the number of bytes */
-    nBytes += tag_size + array_flags_size;
-
-    /* Get size of variable name, pad it to an 8 byte block, and add it to nBytes */
-    if ( NULL != matvar->name )
-        len = strlen(matvar->name);
-    else
-        len=8;
-
-    if ( len <= 4 ) {
-        nBytes += tag_size;
-    } else {
-        if ( len % 8 )
-            len = len + (8 - len % 8);
-        nBytes += tag_size + len;
-    }
-
-    /* Add rank and dimensions, padded to an 8 byte block */
-    for ( i = 0, len = 0; i < matvar->rank; i++ )
-        nmemb *= matvar->dims[i];
-    if ( matvar->rank % 2 )
-        nBytes += tag_size + matvar->rank*4 + 4;
-    else
-        nBytes += tag_size + matvar->rank*4;
-
-    if ( matvar->class_type == MAT_C_STRUCT ) {
-        matvar_t **fields = matvar->data;
-        int i, nfields;
-        size_t maxlen = 0;
-
-        nfields = matvar->nbytes / (nmemb*matvar->data_size);
-        for ( i = 0; i < nfields; i++ ) {
-            if ( NULL != fields[i]->name && strlen(fields[i]->name) > maxlen )
-                maxlen = strlen(fields[i]->name);
-        }
-        maxlen++;
-        while ( nfields*maxlen % 8 != 0 )
-            maxlen++;
-
-        nBytes += tag_size + tag_size + maxlen*nfields;
-
-        /* FIXME: Add bytes for the fieldnames */
-        if ( NULL != fields && nfields > 0 ) {
-            for ( i = 0; i < nfields*nmemb; i++ )
-                nBytes += GetStructFieldBufSize(fields[i]);
-        }
-    } else if ( matvar->class_type == MAT_C_CELL ) {
-        matvar_t **cells = matvar->data;
-        int i, ncells = matvar->nbytes / matvar->data_size;
-
-        if ( NULL != cells && ncells > 0 ) {
-            for ( i = 0; i < ncells; i++ )
-                nBytes += GetCellArrayFieldBufSize(cells[i]);
-        }
-    } else if ( matvar->class_type == MAT_C_SPARSE ) {
-        sparse_t *sparse = matvar->data;
-
-        nBytes += tag_size + sparse->njc*sizeof(mat_int32_t) +
-                  tag_size + sparse->nir*sizeof(mat_int32_t) +
-                  tag_size + sparse->ndata*Mat_SizeOf(matvar->data_type);
-        if ( matvar->isComplex )
-            nBytes += tag_size + sparse->ndata*Mat_SizeOf(matvar->data_type);
-    } else {
-        nBytes += tag_size + nmemb*Mat_SizeOf(matvar->data_type);
-        if ( nmemb*Mat_SizeOf(matvar->data_type) % 8 ) {
-            nBytes += (8 - (nmemb*Mat_SizeOf(matvar->data_type) % 8));
-          }
-        if ( matvar->isComplex ) {
-            nBytes += tag_size + nmemb*Mat_SizeOf(matvar->data_type);
-            if ( nmemb*Mat_SizeOf(matvar->data_type) % 8 ) {
-                nBytes += (8 - (nmemb*Mat_SizeOf(matvar->data_type) % 8));
-              }
-          }
-    }
-    
-    return nBytes;
-}
-
-/** @brief Writes @c data as character data
- *
- * This function uses the knowledge that the data is part of a character class
- * to avoid some pitfalls with Matlab listed below.
- *   @li Matlab character data cannot be unsigned 8-bit integers, it needs at
- *       least unsigned 16-bit integers
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param data character data to write
- * @param N Number of elements to write
- * @param data_type character data type (enum matio_types)
- * @return number of bytes written
- */ 
-int
-WriteCharData(mat_t *mat, void *data, int N,int data_type)
-{
-    int nBytes = 0, bytesread = 0, i;
-    mat_int8_t pad1 = 0;
-
-    switch ( data_type ) {
-        case MAT_T_UINT16:
-        {
-            nBytes = N*2;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            fwrite(data,2,N,mat->fp);
-            if ( nBytes % 8 )
-                for ( i = nBytes % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-            break;
-        }
-        case MAT_T_INT8:
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t *ptr;
-            mat_uint16_t c;
-
-            /* Matlab can't read MAT_C_CHAR as uint8, needs uint16 */
-            nBytes = N*2;
-            data_type = MAT_T_UINT16;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            ptr = data;
-            for ( i = 0; i < N; i++ ) {
-                c = (mat_uint16_t)*(char *)ptr;
-                fwrite(&c,2,1,mat->fp);
-                ptr++;
-            }
-            if ( nBytes % 8 )
-                for ( i = nBytes % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-            break;
-        }
-        case MAT_T_UTF8:
-        {
-            mat_uint8_t *ptr;
-
-            nBytes = N;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            ptr = data;
-            fwrite(ptr,1,nBytes,mat->fp);
-            if ( nBytes % 8 )
-                for ( i = nBytes % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-            break;
-        }
-    }
-    bytesread+=nBytes;
-    return bytesread;
-}
-
-#if defined(HAVE_ZLIB)
-/** @brief Writes @c data as compressed character data
- *
- * This function uses the knowledge that the data is part of a character class
- * to avoid some pitfalls with Matlab listed below.
- *   @li Matlab character data cannot be unsigned 8-bit integers, it needs at
- *       least unsigned 16-bit integers
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param z pointer to the zlib compression stream
- * @param data character data to write
- * @param N Number of elements to write
- * @param data_type character data type (enum matio_types)
- * @return number of bytes written
- */ 
-size_t
-WriteCompressedCharData(mat_t *mat,z_stream *z,void *data,int N,int data_type)
-{
-    int nBytes = 0, data_size, data_tag[2], err, byteswritten = 0;
-    int buf_size = 1024, i;
-    mat_uint8_t   buf[1024], pad[8] = {0,};
-
-    if ((mat == NULL) || (data == NULL) || (mat->fp == NULL))
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_UINT16:
-        {
-            data_size = 2;
-            data_tag[0]  = MAT_T_UINT16;
-            data_tag[1]  = N*data_size;
-            z->next_in   = data_tag;
-            z->avail_in  = 8;
-            z->next_out  = buf;
-            z->avail_out = buf_size;
-            err = deflate(z,Z_NO_FLUSH);
-            byteswritten += fwrite(buf,1,buf_size-z->avail_out,mat->fp);
-            z->next_in   = data;
-            z->avail_in  = data_size*N;
-            do {
-                z->next_out  = buf;
-                z->avail_out = buf_size;
-                err = deflate(z,Z_NO_FLUSH);
-                byteswritten += fwrite(buf,1,buf_size-z->avail_out,mat->fp);
-            } while ( z->avail_out == 0 );
-            /* Add/Compress padding to pad to 8-byte boundary */
-            if ( N*data_size % 8 ) {
-                z->next_in   = pad;
-                z->avail_in  = 8 - (N*data_size % 8);
-                z->next_out  = buf;
-                z->avail_out = buf_size;
-                err = deflate(z,Z_NO_FLUSH);
-                byteswritten += fwrite(buf,1,buf_size-z->avail_out,mat->fp);
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t *ptr;
-            mat_uint16_t c;
-
-            /* Matlab can't read MAT_C_CHAR as uint8, needs uint16 */
-            data_size    = 2;
-            data_tag[0]  = MAT_T_UINT16;
-            data_tag[1]  = N*data_size;
-            z->next_in   = data_tag;
-            z->avail_in  = 8;
-            z->next_out  = buf;
-            z->avail_out = buf_size;
-            err = deflate(z,Z_NO_FLUSH);
-            byteswritten += fwrite(buf,1,buf_size-z->avail_out,mat->fp);
-            z->next_in   = data;
-            z->avail_in  = data_size*N;
-            ptr = data;
-            for ( i = 0; i < N; i++ ) {
-                c = (mat_uint16_t)*(char *)ptr;
-                z->next_in   = &c;
-                z->avail_in  = 2;
-                z->next_out  = buf;
-                z->avail_out = buf_size;
-                err = deflate(z,Z_NO_FLUSH);
-                byteswritten += fwrite(buf,1,buf_size-z->avail_out,mat->fp);
-                ptr++;
-            }
-            /* Add/Compress padding to pad to 8-byte boundary */
-            if ( N*data_size % 8 ) {
-                z->next_in   = pad;
-                z->avail_in  = 8 - (N*data_size % 8);
-                z->next_out  = buf;
-                z->avail_out = buf_size;
-                err = deflate(z,Z_NO_FLUSH);
-                byteswritten += fwrite(buf,1,buf_size-z->avail_out,mat->fp);
-            }
-            break;
-        }
-        case MAT_T_UTF8:
-        {
-            data_size = 1;
-            data_tag[0]  = MAT_T_UTF8;
-            data_tag[1]  = N*data_size;
-            z->next_in   = data_tag;
-            z->avail_in  = 8;
-            z->next_out  = buf;
-            z->avail_out = buf_size;
-            err = deflate(z,Z_NO_FLUSH);
-            byteswritten += fwrite(buf,1,buf_size-z->avail_out,mat->fp);
-            z->next_in   = data;
-            z->avail_in  = data_size*N;
-            do {
-                z->next_out  = buf;
-                z->avail_out = buf_size;
-                err = deflate(z,Z_NO_FLUSH);
-                byteswritten += fwrite(buf,1,buf_size-z->avail_out,mat->fp);
-            } while ( z->avail_out == 0 );
-            /* Add/Compress padding to pad to 8-byte boundary */
-            if ( N*data_size % 8 ) {
-                z->next_in   = pad;
-                z->avail_in  = 8 - (N*data_size % 8);
-                z->next_out  = buf;
-                z->avail_out = buf_size;
-                err = deflate(z,Z_NO_FLUSH);
-                byteswritten += fwrite(buf,1,buf_size-z->avail_out,mat->fp);
-            }
-            break;
-        }
-    }
-    return byteswritten;
-}
-#endif
-
-/** @brief Writes empty characters to the MAT file
- *
- * This function uses the knowledge that the data is part of a character class
- * to avoid some pitfalls with Matlab listed below.
- *   @li Matlab character data cannot be unsigned 8-bit integers, it needs at
- *       least unsigned 16-bit integers
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param data character data to write
- * @param N Number of elements to write
- * @param data_type character data type (enum matio_types)
- * @return number of bytes written
- */ 
-int
-WriteEmptyCharData(mat_t *mat, int N, int data_type)
-{
-    int nBytes = 0, bytesread = 0, i;
-    mat_int8_t pad1 = 0;
-
-    switch ( data_type ) {
-        case MAT_T_UINT8: /* Matlab MAT_C_CHAR needs uint16 */
-        case MAT_T_INT8:  /* Matlab MAT_C_CHAR needs uint16 */
-            data_type = MAT_T_UINT16;
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t u16 = 0;
-            nBytes = N*sizeof(mat_uint16_t);
-            fwrite(&data_type,sizeof(mat_int32_t),1,mat->fp);
-            fwrite(&nBytes,sizeof(mat_int32_t),1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&u16,sizeof(mat_uint16_t),1,mat->fp);
-            if ( nBytes % 8 )
-                for ( i = nBytes % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-            break;
-        }
-        case MAT_T_UTF8:
-        {
-            mat_uint8_t u8 = 0;
-            nBytes = N;
-            fwrite(&data_type,sizeof(mat_int32_t),1,mat->fp);
-            fwrite(&nBytes,sizeof(mat_int32_t),1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&u8,sizeof(mat_uint8_t),1,mat->fp);
-            if ( nBytes % 8 )
-                for ( i = nBytes % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-            break;
-        }
-    }
-    bytesread+=nBytes;
-    return bytesread;
-}
-
-/* @brief Writes the data tags and empty data to the file
- *
- * Writes the data tags and empty data to the file to save space for the
- * variable when the actual data is written
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param N number of elements to write
- * @param data_type data type to write
- * @return Number of bytes written
- */
-int
-WriteEmptyData(mat_t *mat,int N,int data_type)
-{
-    int nBytes = 0, data_size, i;
-
-    if ( (mat == NULL) || (mat->fp == NULL) )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            double d = 0.0;
-
-            data_size = sizeof(double);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&d,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_SINGLE:
-        {
-            float f = 0.0;
-
-            data_size = sizeof(float);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&f,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            mat_int8_t i8 = 0;
-
-            data_size = sizeof(mat_int8_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&i8,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t ui8 = 0;
-
-            data_size = sizeof(mat_uint8_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&ui8,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            mat_int16_t i16 = 0;
-
-            data_size = sizeof(mat_int16_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&i16,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t ui16 = 0;
-
-            data_size = sizeof(mat_uint16_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&ui16,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_INT32:
-        {
-            mat_int32_t i32 = 0;
-
-            data_size = sizeof(mat_int32_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&i32,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            mat_uint32_t ui32 = 0;
-
-            data_size = sizeof(mat_uint32_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&ui32,data_size,1,mat->fp);
-            break;
-        }
-#ifdef HAVE_MAT_INT64_T
-        case MAT_T_INT64:
-        {
-            mat_int64_t i64 = 0;
-
-            data_size = sizeof(mat_int64_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&i64,data_size,1,mat->fp);
-            break;
-        }
-#endif
-#ifdef HAVE_MAT_UINT64_T
-        case MAT_T_UINT64:
-        {
-            mat_uint64_t ui64 = 0;
-
-            data_size = sizeof(mat_uint64_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&ui64,data_size,1,mat->fp);
-            break;
-        }
-#endif
-        default:
-            nBytes = 0;
-    }
-    return nBytes;
-}
-
-#if defined(HAVE_ZLIB)
-int
-WriteCompressedEmptyData(mat_t *mat,z_stream *z,int N,int data_type)
-{
-    int nBytes = 0, data_size, i, err, byteswritten = 0;
-
-    if ( (mat == NULL) || (mat->fp == NULL) )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            mat_uint32_t uncomp_buf[32] = {0,};
-            mat_uint32_t comp_buf[32] = {0,};
-            double data_uncomp_buf[4] = {0.0,};
-
-            data_size = sizeof(double);
-            nBytes = N*data_size;
-            uncomp_buf[0] = data_type;
-            uncomp_buf[1] = 0;
-            z->next_out  = comp_buf;
-            z->next_in   = uncomp_buf;
-            z->avail_out = 32*sizeof(*comp_buf);
-            z->avail_in  = 8;
-            err = deflate(z,Z_NO_FLUSH);
-            byteswritten += fwrite(comp_buf,1,32*sizeof(*comp_buf)-z->avail_out,mat->fp);
-            for ( i = 0; i < N; i++ ) {
-                z->next_out  = comp_buf;
-                z->next_in   = data_uncomp_buf;
-                z->avail_out = 32*sizeof(*comp_buf);
-                z->avail_in  = 8;
-                err = deflate(z,Z_NO_FLUSH);
-                byteswritten += fwrite(comp_buf,32*sizeof(*comp_buf)-z->avail_out,1,mat->fp);
-            }
-            break;
-        }
-        case MAT_T_SINGLE:
-        {
-            float f = 0.0;
-
-            data_size = sizeof(float);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&f,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            mat_int8_t i8 = 0;
-
-            data_size = sizeof(mat_int8_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&i8,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t ui8 = 0;
-
-            data_size = sizeof(mat_uint8_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&ui8,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            mat_int16_t i16 = 0;
-
-            data_size = sizeof(mat_int16_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&i16,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t ui16 = 0;
-
-            data_size = sizeof(mat_uint16_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&ui16,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_INT32:
-        {
-            mat_int32_t i32 = 0;
-
-            data_size = sizeof(mat_int32_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&i32,data_size,1,mat->fp);
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            mat_uint32_t ui32 = 0;
-
-            data_size = sizeof(mat_uint32_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&ui32,data_size,1,mat->fp);
-            break;
-        }
-#ifdef HAVE_MAT_INT64_T
-        case MAT_T_INT64:
-        {
-            mat_int64_t i64 = 0;
-
-            data_size = sizeof(mat_int64_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&i64,data_size,1,mat->fp);
-            break;
-        }
-#endif
-#ifdef HAVE_MAT_UINT64_T
-        case MAT_T_UINT64:
-        {
-            mat_uint64_t ui64 = 0;
-
-            data_size = sizeof(mat_uint64_t);
-            nBytes = N*data_size;
-            fwrite(&data_type,4,1,mat->fp);
-            fwrite(&nBytes,4,1,mat->fp);
-            for ( i = 0; i < N; i++ )
-                fwrite(&ui64,data_size,1,mat->fp);
-            break;
-        }
-#endif
-        default:
-            nBytes = 0;
-    }
-    return byteswritten;
-}
-#endif
-
-/** @param Writes a 2-D slab of data to the MAT file
- *
- * @ingroup mat_internal
- * @fixme should return the number of bytes written, but currently returns 0
- * @param mat MAT file pointer
- * @param data pointer to the slab of data
- * @param data_type data type of the data (enum matio_types)
- * @param dims dimensions of the dataset
- * @param start index to start writing the data in each dimension
- * @param stride write data every @c stride elements
- * @param edge number of elements to write in each dimension
- * @return number of byteswritten
- */
-int
-WriteDataSlab2(mat_t *mat,void *data,int data_type,int *dims,int *start,
-              int *stride,int *edge)
-{
-    int nBytes = 0, data_size, i, j;
-    long pos, row_stride, col_stride;
-
-    if ( (mat   == NULL) || (data   == NULL) || (mat->fp == NULL) ||
-         (start == NULL) || (stride == NULL) || (edge    == NULL) ) {
-        return 0;
-    }
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            double *ptr;
-
-            data_size = sizeof(double);
-            ptr = (double *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    fwrite(ptr++,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        case MAT_T_SINGLE:
-        {
-            float *ptr;
-
-            data_size = sizeof(float);
-            ptr = (float *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    fwrite(ptr++,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-#ifdef HAVE_MAT_INT64_T
-        case MAT_T_INT64:
-        {
-            mat_int64_t *ptr;
-
-            data_size = sizeof(mat_int64_t);
-            ptr = (mat_int64_t *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    fwrite(ptr++,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-#endif
-#ifdef HAVE_MAT_UINT64_T
-        case MAT_T_UINT64:
-        {
-            mat_uint64_t *ptr;
-
-            data_size = sizeof(mat_uint64_t);
-            ptr = (mat_uint64_t *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    fwrite(ptr++,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-#endif
-        case MAT_T_INT32:
-        {
-            mat_int32_t *ptr;
-
-            data_size = sizeof(mat_int32_t);
-            ptr = (mat_int32_t *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    fwrite(ptr++,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            mat_uint32_t *ptr;
-
-            data_size = sizeof(mat_uint32_t);
-            ptr = (mat_uint32_t *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    fwrite(ptr++,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            mat_int16_t *ptr;
-
-            data_size = sizeof(mat_int16_t);
-            ptr = (mat_int16_t *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    fwrite(ptr++,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t *ptr;
-
-            data_size = sizeof(mat_uint16_t);
-            ptr = (mat_uint16_t *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    fwrite(ptr++,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            mat_int8_t *ptr;
-
-            data_size = sizeof(mat_int8_t);
-            ptr = (mat_int8_t *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    fwrite(ptr++,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t *ptr;
-
-            data_size = sizeof(mat_uint8_t);
-            ptr = (mat_uint8_t *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    fwrite(ptr++,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        default:
-            nBytes = 0;
-    }
-    return nBytes;
-}
-
-/** @param Writes a 2-D slab of character data to the MAT file
- *
- * This function uses the knowledge that the data is part of a character class
- * to avoid some pitfalls with Matlab listed below.
- *   @li Matlab character data cannot be unsigned 8-bit integers, it needs at
- *       least unsigned 16-bit integers
- * @ingroup mat_internal
- * @fixme should return the number of bytes written, but currently returns 0
- * @param mat MAT file pointer
- * @param data pointer to the slab of data
- * @param data_type data type of the data (enum matio_types)
- * @param dims dimensions of the dataset
- * @param start index to start writing the data in each dimension
- * @param stride write data every @c stride elements
- * @param edge number of elements to write in each dimension
- * @return number of byteswritten
- */
-int
-WriteCharDataSlab2(mat_t *mat,void *data,int data_type,int *dims,int *start,
-              int *stride,int *edge)
-{
-    int nBytes = 0, data_size, i, j;
-    long pos, row_stride, col_stride;
-
-    if ( (mat   == NULL) || (data   == NULL) || (mat->fp == NULL) ||
-         (start == NULL) || (stride == NULL) || (edge    == NULL) ) {
-        return 0;
-    }
-
-    switch ( data_type ) {
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t *ptr;
-
-            data_size = sizeof(mat_uint16_t);
-            ptr = data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    fwrite(ptr++,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        case MAT_T_UINT8:
-        {
-            /* Matlab can't read MAT_C_CHAR as uint8, needs uint16 */
-            mat_uint8_t *ptr;
-            mat_uint16_t c;
-
-            data_size = sizeof(mat_uint16_t);
-            ptr = data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++,ptr++ ) {
-                    c = *ptr;
-                    fwrite(&c,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        case MAT_T_UTF8:
-        {
-            mat_uint8_t *ptr;
-
-            data_size = sizeof(mat_uint8_t);
-            ptr = data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++,ptr++ ) {
-                    fwrite(ptr,data_size,1,mat->fp);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        default:
-            nBytes = 0;
-    }
-    return nBytes;
-}
-
-/** @brief Writes the data buffer to the file
- *
- * @param mat MAT file pointer
- * @param data pointer to the data to write
- * @param N number of elements to write
- * @param data_type data type of the data
- * @return number of bytes written
- */
-int
-WriteData(mat_t *mat,void *data,int N,int data_type)
-{
-    int nBytes = 0, data_size;
-
-    if ((mat == NULL) || (mat->fp == NULL) || (data == NULL && N > 0))
-        return 0;
-
-    data_size = Mat_SizeOf(data_type);
-    nBytes    = N*data_size;
-    fwrite(&data_type,4,1,mat->fp);
-    fwrite(&nBytes,4,1,mat->fp);
-    fwrite(data,data_size,N,mat->fp);
-
-    return nBytes;
-}
-
-#if defined(HAVE_ZLIB)
-/* Compresses the data buffer and writes it to the file */
-size_t
-WriteCompressedData(mat_t *mat,z_stream *z,void *data,int N,int data_type)
-{
-    int nBytes = 0, data_size, data_tag[2], err, byteswritten = 0;
-    int buf_size = 1024;
-    mat_uint8_t   buf[1024], pad[8] = {0,};
-
-    if ((mat == NULL) || (data == NULL) || (mat->fp == NULL))
-        return 0;
-
-    data_size = Mat_SizeOf(data_type);
-
-    data_tag[0]  = data_type;
-    data_tag[1]  = data_size*N;
-    z->next_in   = data_tag;
-    z->avail_in  = 8;
-    z->next_out  = buf;
-    z->avail_out = buf_size;
-    err = deflate(z,Z_NO_FLUSH);
-    byteswritten += fwrite(buf,1,buf_size-z->avail_out,mat->fp);
-    z->next_in   = data;
-    z->avail_in  = N*data_size;
-    do {
-        z->next_out  = buf;
-        z->avail_out = buf_size;
-        err = deflate(z,Z_NO_FLUSH);
-        byteswritten += fwrite(buf,1,buf_size-z->avail_out,mat->fp);
-    } while ( z->avail_out == 0 );
-    /* Add/Compress padding to pad to 8-byte boundary */
-    if ( N*data_size % 8 ) {
-        z->next_in   = pad;
-        z->avail_in  = 8 - (N*data_size % 8);
-        z->next_out  = buf;
-        z->avail_out = buf_size;
-        err = deflate(z,Z_NO_FLUSH);
-        byteswritten += fwrite(buf,1,buf_size-z->avail_out,mat->fp);
-    }
-    nBytes = byteswritten;
-    return nBytes;
-}
-#endif
-
-/** @brief Reads the next cell of the cell array in @c matvar
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param matvar MAT variable pointer
- * @return Number of bytes read
- */
-int
-ReadNextCell( mat_t *mat, matvar_t *matvar )
-{
-    int ncells, bytesread = 0, i, err;
-    matvar_t **cells = NULL;
-
-    if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-        mat_uint32_t uncomp_buf[16] = {0,};
-        int      nbytes;
-        mat_uint32_t array_flags; 
-
-        ncells = 1;
-        for ( i = 0; i < matvar->rank; i++ )
-            ncells *= matvar->dims[i];
-        matvar->data_size = sizeof(matvar_t *);
-        matvar->nbytes    = ncells*matvar->data_size;
-        matvar->data = malloc(matvar->nbytes);
-        if ( !matvar->data )
-            return bytesread;
-        cells = matvar->data;
-        for ( i = 0; i < ncells; i++ ) {
-            cells[i] = Mat_VarCalloc();
-            if ( NULL == cells[i] ) {
-                Mat_Critical("Couldn't allocate memory for cell %d", i);
-                continue;
-            }
-
-            cells[i]->fpos = ftell(mat->fp)-matvar->z->avail_in;
-
-            /* Read variable tag for cell */
-            bytesread += InflateVarTag(mat,matvar,uncomp_buf);
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(uncomp_buf);
-                (void)Mat_uint32Swap(uncomp_buf+1);
-            }
-            nbytes = uncomp_buf[1];
-            if ( uncomp_buf[0] != MAT_T_MATRIX ) {
-                Mat_Critical("cells[%d], Uncompressed type not MAT_T_MATRIX",i);
-                Mat_VarFree(cells[i]);
-                cells[i] = NULL;
-                return -1;
-            }
-            cells[i]->compression = 1;
-            bytesread += InflateArrayFlags(mat,matvar,uncomp_buf);
-            nbytes -= 16;
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(uncomp_buf);
-                (void)Mat_uint32Swap(uncomp_buf+1);
-                (void)Mat_uint32Swap(uncomp_buf+2);
-                (void)Mat_uint32Swap(uncomp_buf+3);
-            }
-            /* Array Flags */
-            if ( uncomp_buf[0] == MAT_T_UINT32 ) {
-               array_flags = uncomp_buf[2];
-               cells[i]->class_type  = (array_flags & MAT_F_CLASS_T);
-               cells[i]->isComplex   = (array_flags & MAT_F_COMPLEX);
-               cells[i]->isGlobal    = (array_flags & MAT_F_GLOBAL);
-               cells[i]->isLogical   = (array_flags & MAT_F_LOGICAL);
-               if ( cells[i]->class_type == MAT_C_SPARSE ) {
-                   /* Need to find a more appropriate place to store nzmax */
-                   cells[i]->nbytes      = uncomp_buf[3];
-               }
-            } else {
-                Mat_Critical("Expected MAT_T_UINT32 for Array Tags, got %d",
-                               uncomp_buf[0]);
-                bytesread+=InflateSkip(mat,matvar->z,nbytes);
-            }
-            bytesread += InflateDimensions(mat,matvar,uncomp_buf);
-            nbytes -= 8;
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(uncomp_buf);
-                (void)Mat_uint32Swap(uncomp_buf+1);
-            }
-            /* Rank and Dimension */
-            if ( uncomp_buf[0] == MAT_T_INT32 ) {
-                int j = 0;
-
-                cells[i]->rank = uncomp_buf[1];
-                nbytes -= cells[i]->rank;
-                cells[i]->rank /= 4;
-                cells[i]->dims = malloc(cells[i]->rank*sizeof(int));
-                if ( mat->byteswap ) {
-                    for ( j = 0; j < cells[i]->rank; j++ )
-                        cells[i]->dims[j] = Mat_uint32Swap(uncomp_buf+2+j);
-                } else {
-                    for ( j = 0; j < cells[i]->rank; j++ )
-                        cells[i]->dims[j] = uncomp_buf[2+j];
-                }
-                if ( cells[i]->rank % 2 != 0 )
-                    nbytes -= 4;
-            }
-            bytesread += InflateVarNameTag(mat,matvar,uncomp_buf);
-            nbytes -= 8;
-            cells[i]->z = calloc(1,sizeof(z_stream));
-            err = inflateCopy(cells[i]->z,matvar->z);
-            if ( err != Z_OK )
-                Mat_Critical("inflateCopy returned error %d",err);
-            cells[i]->datapos = ftell(mat->fp)-matvar->z->avail_in;
-            if ( cells[i]->class_type == MAT_C_STRUCT )
-                bytesread+=ReadNextStructField(mat,cells[i]);
-            else if ( cells[i]->class_type == MAT_C_CELL )
-                bytesread+=ReadNextCell(mat,cells[i]);
-            fseek(mat->fp,cells[i]->datapos,SEEK_SET);
-            bytesread+=InflateSkip(mat,matvar->z,nbytes);
-        }
-#else
-        Mat_Critical("Not compiled with zlib support");
-#endif
-
-    } else {
-        int ncells;
-        mat_uint32_t buf[16];
-        int      nbytes,nBytes;
-        mat_uint32_t array_flags; 
-
-        ncells = 1;
-        for ( i = 0; i < matvar->rank; i++ )
-            ncells *= matvar->dims[i];
-        matvar->data_size = sizeof(matvar_t *);
-        matvar->nbytes    = ncells*matvar->data_size;
-        matvar->data = malloc(matvar->nbytes);
-        if ( !matvar->data ) {
-            Mat_Critical("Couldn't allocate memory for %s->data",matvar->name);
-            return bytesread;
-        }
-        cells = (matvar_t **)matvar->data;
-        for ( i = 0; i < ncells; i++ ) {
-            cells[i] = Mat_VarCalloc();
-            if ( !cells[i] ) {
-                Mat_Critical("Couldn't allocate memory for cell %d", i);
-                continue;
-            }
-
-            cells[i]->fpos = ftell(mat->fp);
-
-            /* Read variable tag for cell */
-            bytesread += fread(buf,4,2,mat->fp);
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(buf);
-                (void)Mat_uint32Swap(buf+1);
-            }
-            nBytes = buf[1];
-            if ( buf[0] != MAT_T_MATRIX ) {
-                Mat_Critical("cells[%d] not MAT_T_MATRIX, fpos = %ld",i,ftell(mat->fp));
-                Mat_VarFree(cells[i]);
-                cells[i] = NULL;
-                continue;
-            }
-            cells[i]->compression = 0;
-#if defined(HAVE_ZLIB)
-            cells[i]->z = NULL;
-#endif
-
-            /* Read Array Flags and The Dimensions Tag */
-            bytesread  += fread(buf,4,6,mat->fp);
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(buf);
-                (void)Mat_uint32Swap(buf+1);
-                (void)Mat_uint32Swap(buf+2);
-                (void)Mat_uint32Swap(buf+3);
-                (void)Mat_uint32Swap(buf+4);
-                (void)Mat_uint32Swap(buf+5);
-            }
-            nBytes-=24;
-            /* Array Flags */
-            if ( buf[0] == MAT_T_UINT32 ) {
-               array_flags = buf[2];
-               cells[i]->class_type  = (array_flags & MAT_F_CLASS_T);
-               cells[i]->isComplex   = (array_flags & MAT_F_COMPLEX);
-               cells[i]->isGlobal    = (array_flags & MAT_F_GLOBAL);
-               cells[i]->isLogical   = (array_flags & MAT_F_LOGICAL);
-               if ( cells[i]->class_type == MAT_C_SPARSE ) {
-                   /* Need to find a more appropriate place to store nzmax */
-                   cells[i]->nbytes      = buf[3];
-               }
-            }
-            /* Rank and Dimension */
-            if ( buf[4] == MAT_T_INT32 ) {
-                int j;
-                nbytes = buf[5];
-                nBytes-=nbytes;
-
-                cells[i]->rank = nbytes / 4;
-                cells[i]->dims = malloc(cells[i]->rank*sizeof(int));
-
-                /* Assumes rank <= 16 */
-                if ( cells[i]->rank % 2 != 0 ) {
-                    bytesread+=fread(buf,4,cells[i]->rank+1,mat->fp);
-                    nBytes-=4;
-                } else
-                    bytesread+=fread(buf,4,cells[i]->rank,mat->fp);
-
-                if ( mat->byteswap ) {
-                    for ( j = 0; j < cells[i]->rank; j++ )
-                        cells[i]->dims[j] = Mat_uint32Swap(buf+j);
-                } else {
-                    for ( j = 0; j < cells[i]->rank; j++ )
-                        cells[i]->dims[j] = buf[j];
-                }
-            }
-            /* Variable Name Tag */
-            bytesread+=fread(buf,1,8,mat->fp);
-            nBytes-=8;
-            cells[i]->datapos = ftell(mat->fp);
-            if ( cells[i]->class_type == MAT_C_STRUCT )
-                bytesread+=ReadNextStructField(mat,cells[i]);
-            if ( cells[i]->class_type == MAT_C_CELL )
-                bytesread+=ReadNextCell(mat,cells[i]);
-            fseek(mat->fp,cells[i]->datapos+nBytes,SEEK_SET);
-        }
-    }
-
-    return bytesread;
-}
-
-/** @brief Reads the next struct field of the structure in @c matvar
- *
- * Reads the next struct fields (fieldname length,names,data headers for all
- * the fields
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param matvar MAT variable pointer
- * @return Number of bytes read
- */
-int
-ReadNextStructField( mat_t *mat, matvar_t *matvar )
-{
-    int fieldname_size,nfields, bytesread = 0, i, err;
-    matvar_t **fields = NULL;
-
-    if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-        char    *ptr;
-        mat_uint32_t uncomp_buf[16] = {0,};
-        int      nbytes, j, nmemb = 1;
-        mat_uint32_t array_flags; 
-
-        for ( i = 0; i < matvar->rank; i++ )
-            nmemb *= matvar->dims[i];
-
-        /* Inflate Field name length */
-        bytesread += InflateFieldNameLength(mat,matvar,uncomp_buf);
-        if ( mat->byteswap ) {
-            (void)Mat_uint32Swap(uncomp_buf);
-            (void)Mat_uint32Swap(uncomp_buf+1);
-        }
-        if ( (uncomp_buf[0] & 0x0000ffff) == MAT_T_INT32 ) {
-            fieldname_size = uncomp_buf[1];
-        } else {
-            Mat_Warning("Error getting fieldname size");
-            return bytesread;
-        }
-
-        bytesread += InflateFieldNamesTag(mat,matvar,uncomp_buf);
-        if ( mat->byteswap ) {
-            (void)Mat_uint32Swap(uncomp_buf);
-            (void)Mat_uint32Swap(uncomp_buf+1);
-        }
-        nfields = uncomp_buf[1];
-        nfields = nfields / fieldname_size;
-        matvar->data_size = sizeof(matvar_t *);
-        matvar->nbytes    = nmemb*nfields*matvar->data_size;
-        matvar->data      = malloc(matvar->nbytes);
-        if ( !matvar->data )
-            return 1;
-        fields = matvar->data;
-        if ( nfields*fieldname_size % 8 != 0 )
-            i = 8-(nfields*fieldname_size % 8);
-        else
-            i = 0;
-        ptr = malloc(nfields*fieldname_size+i);
-        bytesread += InflateFieldNames(mat,matvar,ptr,nfields,fieldname_size,i);
-        for ( i = 0; i < nfields; i++ ) {
-            fields[i]       = calloc(1,sizeof(matvar_t));
-            fields[i]->name = malloc(fieldname_size);
-            memcpy(fields[i]->name,ptr+i*fieldname_size,fieldname_size);
-            fields[i]->name[fieldname_size-1] = '\0';
-        }
-        for ( i = 1; i < nmemb; i++ ) {
-            for ( j = 0; j < nfields; j++ ) {
-                fields[i*nfields+j] = calloc(1,sizeof(matvar_t));
-                fields[i*nfields+j]->name = strdup_printf("%s",fields[j]->name);
-            }
-        }
-
-        for ( i = 0; i < nmemb*nfields; i++ ) {
-            fields[i]->fpos = ftell(mat->fp)-matvar->z->avail_in;
-            /* Read variable tag for struct field */
-            bytesread += InflateVarTag(mat,matvar,uncomp_buf);
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(uncomp_buf);
-                (void)Mat_uint32Swap(uncomp_buf+1);
-            }
-            nbytes = uncomp_buf[1];
-            if ( uncomp_buf[0] != MAT_T_MATRIX ) {
-                Mat_Critical("fields[%d], Uncompressed type not MAT_T_MATRIX",i);
-                Mat_VarFree(fields[i]);
-                fields[i] = NULL;
-                continue;
-            } else if ( nbytes == 0 ) {
-                fields[i]->rank = 0;
-                continue;
-            }
-            fields[i]->compression = COMPRESSION_ZLIB;
-            bytesread += InflateArrayFlags(mat,matvar,uncomp_buf);
-            nbytes -= 16;
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(uncomp_buf);
-                (void)Mat_uint32Swap(uncomp_buf+1);
-                (void)Mat_uint32Swap(uncomp_buf+2);
-                (void)Mat_uint32Swap(uncomp_buf+3);
-            }
-            /* Array Flags */
-            if ( uncomp_buf[0] == MAT_T_UINT32 ) {
-               array_flags = uncomp_buf[2];
-               fields[i]->class_type  = (array_flags & MAT_F_CLASS_T);
-               fields[i]->isComplex   = (array_flags & MAT_F_COMPLEX);
-               fields[i]->isGlobal    = (array_flags & MAT_F_GLOBAL);
-               fields[i]->isLogical   = (array_flags & MAT_F_LOGICAL);
-               if ( fields[i]->class_type == MAT_C_SPARSE ) {
-                   /* Need to find a more appropriate place to store nzmax */
-                   fields[i]->nbytes      = uncomp_buf[3];
-               }
-            } else {
-                Mat_Critical("Expected MAT_T_UINT32 for Array Tags, got %d",
-                    uncomp_buf[0]);
-                bytesread+=InflateSkip(mat,matvar->z,nbytes);
-            }
-            bytesread += InflateDimensions(mat,matvar,uncomp_buf);
-            nbytes -= 8;
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(uncomp_buf);
-                (void)Mat_uint32Swap(uncomp_buf+1);
-            }
-            /* Rank and Dimension */
-            if ( uncomp_buf[0] == MAT_T_INT32 ) {
-                int j = 0;
-
-                fields[i]->rank = uncomp_buf[1];
-                nbytes -= fields[i]->rank;
-                fields[i]->rank /= 4;
-                fields[i]->dims = malloc(fields[i]->rank*sizeof(int));
-                if ( mat->byteswap ) {
-                    for ( j = 0; j < fields[i]->rank; j++ )
-                        fields[i]->dims[j] = Mat_uint32Swap(uncomp_buf+2+j);
-                } else {
-                    for ( j = 0; j < fields[i]->rank; j++ )
-                        fields[i]->dims[j] = uncomp_buf[2+j];
-                }
-                if ( fields[i]->rank % 2 != 0 )
-                    nbytes -= 4;
-            }
-            bytesread += InflateVarNameTag(mat,matvar,uncomp_buf);
-            nbytes -= 8;
-            fields[i]->z = calloc(1,sizeof(z_stream));
-            err = inflateCopy(fields[i]->z,matvar->z);
-            if ( err != Z_OK ) {
-                Mat_Critical("inflateCopy returned error %d",err);
-            }
-            fields[i]->datapos = ftell(mat->fp)-matvar->z->avail_in;
-            if ( fields[i]->class_type == MAT_C_STRUCT )
-                bytesread+=ReadNextStructField(mat,fields[i]);
-            else if ( fields[i]->class_type == MAT_C_CELL )
-                bytesread+=ReadNextCell(mat,fields[i]);
-            fseek(mat->fp,fields[i]->datapos,SEEK_SET);
-            bytesread+=InflateSkip(mat,matvar->z,nbytes);
-        }
-        free(ptr);
-#else
-        Mat_Critical("Not compiled with zlib support");
-#endif
-    } else {
-        int fieldname_size,nfields;
-        mat_uint32_t buf[16] = {0,};
-        int      nbytes,nBytes,nmemb=1,j;
-        mat_uint32_t array_flags; 
-
-        for ( i = 0; i < matvar->rank; i++ )
-            nmemb *= matvar->dims[i];
-
-        bytesread+=fread(buf,4,2,mat->fp);
-        if ( mat->byteswap ) {
-            (void)Mat_uint32Swap(buf);
-            (void)Mat_uint32Swap(buf+1);
-        }
-        if ( (buf[0] & 0x0000ffff) == MAT_T_INT32 ) {
-            fieldname_size = buf[1];
-        } else {
-            Mat_Warning("Error getting fieldname size");
-            return bytesread;
-        }
-        bytesread+=fread(buf,4,2,mat->fp);
-        if ( mat->byteswap ) {
-            (void)Mat_uint32Swap(buf);
-            (void)Mat_uint32Swap(buf+1);
-        }
-        nfields = buf[1];
-        nfields = nfields / fieldname_size;
-        matvar->data_size = sizeof(matvar_t *);
-        matvar->nbytes    = nmemb*nfields*matvar->data_size;
-        matvar->data = malloc(matvar->nbytes);
-        if ( !matvar->data )
-            return bytesread;
-        fields = (matvar_t **)matvar->data;
-        for ( i = 0; i < nfields; i++ ) {
-            fields[i] = calloc(1,sizeof(matvar_t));
-            fields[i]->name = malloc(fieldname_size);
-            bytesread+=fread(fields[i]->name,1,fieldname_size,mat->fp);
-            fields[i]->name[fieldname_size-1] = '\0';
-        }
-        for ( i = 1; i < nmemb; i++ ) {
-            for ( j = 0; j < nfields; j++ ) {
-                fields[i*nfields+j] = calloc(1,sizeof(matvar_t));
-                fields[i*nfields+j]->name = strdup_printf("%s",fields[j]->name);
-            }
-        }
-        if ( (nfields*fieldname_size) % 8 ) {
-            fseek(mat->fp,8-((nfields*fieldname_size) % 8),SEEK_CUR);
-            bytesread+=8-((nfields*fieldname_size) % 8);
-        }
-        for ( i = 0; i < nmemb*nfields; i++ ) {
-
-            fields[i]->fpos = ftell(mat->fp);
-
-            /* Read variable tag for struct field */
-            bytesread += fread(buf,4,2,mat->fp);
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(buf);
-                (void)Mat_uint32Swap(buf+1);
-            }
-            nBytes = buf[1];
-            if ( buf[0] != MAT_T_MATRIX ) {
-                Mat_Critical("fields[%d] not MAT_T_MATRIX, fpos = %ld",i,ftell(mat->fp));
-                Mat_VarFree(fields[i]);
-                fields[i] = NULL;
-                return bytesread;
-            } else if ( nBytes == 0 ) {
-                fields[i]->rank = 0;
-                continue;
-            }
-            fields[i]->compression = 0;
-#if defined(HAVE_ZLIB)
-            fields[i]->z = NULL;
-#endif
-
-            /* Read Array Flags and The Dimensions Tag */
-            bytesread  += fread(buf,4,6,mat->fp);
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(buf);
-                (void)Mat_uint32Swap(buf+1);
-                (void)Mat_uint32Swap(buf+2);
-                (void)Mat_uint32Swap(buf+3);
-                (void)Mat_uint32Swap(buf+4);
-                (void)Mat_uint32Swap(buf+5);
-            }
-            nBytes-=24;
-            /* Array Flags */
-            if ( buf[0] == MAT_T_UINT32 ) {
-               array_flags = buf[2];
-               fields[i]->class_type  = (array_flags & MAT_F_CLASS_T);
-               fields[i]->isComplex   = (array_flags & MAT_F_COMPLEX);
-               fields[i]->isGlobal    = (array_flags & MAT_F_GLOBAL);
-               fields[i]->isLogical   = (array_flags & MAT_F_LOGICAL);
-               if ( fields[i]->class_type == MAT_C_SPARSE ) {
-                   /* Need to find a more appropriate place to store nzmax */
-                   fields[i]->nbytes      = buf[3];
-               }
-            }
-            /* Rank and Dimension */
-            if ( buf[4] == MAT_T_INT32 ) {
-                int j;
-
-                nbytes = buf[5];
-                nBytes-=nbytes;
-
-                fields[i]->rank = nbytes / 4;
-                fields[i]->dims = malloc(fields[i]->rank*sizeof(int));
-
-                /* Assumes rank <= 16 */
-                if ( fields[i]->rank % 2 != 0 ) {
-                    bytesread+=fread(buf,4,fields[i]->rank+1,mat->fp);
-                    nBytes-=4;
-                } else
-                    bytesread+=fread(buf,4,fields[i]->rank,mat->fp);
-
-                if ( mat->byteswap ) {
-                    for ( j = 0; j < fields[i]->rank; j++ )
-                        fields[i]->dims[j] = Mat_uint32Swap(buf+j);
-                } else {
-                    for ( j = 0; j < fields[i]->rank; j++ )
-                        fields[i]->dims[j] = buf[j];
-                }
-            }
-            /* Variable Name Tag */
-            bytesread+=fread(buf,1,8,mat->fp);
-            nBytes-=8;
-            fields[i]->datapos = ftell(mat->fp);
-            if ( fields[i]->class_type == MAT_C_STRUCT )
-                bytesread+=ReadNextStructField(mat,fields[i]);
-            else if ( fields[i]->class_type == MAT_C_CELL )
-                bytesread+=ReadNextCell(mat,fields[i]);
-            fseek(mat->fp,fields[i]->datapos+nBytes,SEEK_SET);
-        }
-    }
-
-    return bytesread;
-}
-
-/** @brief Reads the function handle data of the function handle in @c matvar
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param matvar MAT variable pointer
- * @return Number of bytes read
- */
-int
-ReadNextFunctionHandle(mat_t *mat, matvar_t *matvar)
-{
-    int nfunctions = 1, bytesread = 0, i;
-    matvar_t **functions = NULL;
-
-    for ( i = 0; i < matvar->rank; i++ )
-        nfunctions *= matvar->dims[i];
-
-    matvar->data = malloc(nfunctions*sizeof(matvar_t *));
-    if ( matvar->data != NULL ) {
-        matvar->data_size = sizeof(matvar_t *);
-        matvar->nbytes    = nfunctions*matvar->data_size;
-        functions = matvar->data;
-        for ( i = 0 ; i < nfunctions; i++ )
-            functions[i] = Mat_VarReadNextInfo(mat);
-    } else {
-        bytesread = 0;
-        matvar->data_size = 0;
-        matvar->nbytes    = 0;
-    }
-
-    return bytesread;
-}
-
-/** @brief Writes the header and blank data for a cell array
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param matvar pointer to the mat variable
- * @return number of bytes written
- */
-int
-WriteCellArrayFieldInfo(mat_t *mat,matvar_t *matvar)
-{
-    mat_uint32_t array_flags = 0x0; 
-    mat_int16_t  array_name_type = MAT_T_INT8;
-    int      array_flags_type = MAT_T_UINT32, dims_array_type = MAT_T_INT32;
-    int      array_flags_size = 8, pad4 = 0, matrix_type = MAT_T_MATRIX;
-    mat_int8_t   pad1 = 0;
-    int      nBytes, i, nmemb = 1;
-    long     start = 0, end = 0;
-
-    if ((matvar == NULL) || (mat == NULL))
-        return 0;
-
-#if 0
-    nBytes = GetMatrixMaxBufSize(matvar);
-#endif
-
-    fwrite(&matrix_type,4,1,mat->fp);
-    fwrite(&pad4,4,1,mat->fp);
-    start = ftell(mat->fp);
-
-    /* Array Flags */
-    if ( matvar->rank > 1 && ( matvar->dims[0] > 1 || matvar->dims[1] > 1 ) &&
-         matvar->class_type == MAT_C_INT32 ) {
-        array_flags = MAT_C_DOUBLE & MAT_F_CLASS_T;
-    } else {
-        array_flags = matvar->class_type & MAT_F_CLASS_T;
-    }
-    if ( matvar->isComplex )
-        array_flags |= MAT_F_COMPLEX;
-    if ( matvar->isGlobal )
-        array_flags |= MAT_F_GLOBAL;
-    if ( matvar->isLogical )
-        array_flags |= MAT_F_LOGICAL;
-
-    if ( mat->byteswap )
-        array_flags = Mat_int32Swap((mat_int32_t*)&array_flags);
-    fwrite(&array_flags_type,4,1,mat->fp);
-    fwrite(&array_flags_size,4,1,mat->fp);
-    fwrite(&array_flags,4,1,mat->fp);
-    fwrite(&pad4,4,1,mat->fp);
-    /* Rank and Dimension */
-    nBytes = matvar->rank * 4;
-    fwrite(&dims_array_type,4,1,mat->fp);
-    fwrite(&nBytes,4,1,mat->fp);
-    for ( i = 0; i < matvar->rank; i++ ) {
-        mat_int32_t dim;
-        dim = matvar->dims[i];
-        nmemb *= dim;
-        fwrite(&dim,4,1,mat->fp);
-    }
-    if ( matvar->rank % 2 != 0 )
-        fwrite(&pad4,4,1,mat->fp);
-    /* Name of variable */
-    if ( !matvar->name ) {
-        fwrite(&array_name_type,2,1,mat->fp);
-        fwrite(&pad1,1,1,mat->fp);
-        fwrite(&pad1,1,1,mat->fp);
-        fwrite(&pad4,4,1,mat->fp);
-    } else if ( strlen(matvar->name) <= 4 ) {
-        mat_int16_t array_name_len = (mat_int16_t)strlen(matvar->name);
-        mat_int8_t  pad1 = 0;
-        fwrite(&array_name_type,2,1,mat->fp);
-        fwrite(&array_name_len,2,1,mat->fp);
-        fwrite(matvar->name,1,array_name_len,mat->fp);
-        for ( i = array_name_len; i < 4; i++ )
-            fwrite(&pad1,1,1,mat->fp);
-    } else {
-        mat_int32_t array_name_len = (mat_int32_t)strlen(matvar->name);
-        mat_int8_t  pad1 = 0;
-
-        fwrite(&array_name_type,2,1,mat->fp);
-        fwrite(&pad1,1,1,mat->fp);
-        fwrite(&pad1,1,1,mat->fp);
-        fwrite(&array_name_len,4,1,mat->fp);
-        fwrite(matvar->name,1,array_name_len,mat->fp);
-        if ( array_name_len % 8 )
-            for ( i = array_name_len % 8; i < 8; i++ )
-                fwrite(&pad1,1,1,mat->fp);
-    }
-
-    matvar->datapos = ftell(mat->fp);
-    switch ( matvar->class_type ) {
-        case MAT_C_DOUBLE:
-        case MAT_C_SINGLE:
-        case MAT_C_INT64:
-        case MAT_C_UINT64:
-        case MAT_C_INT32:
-        case MAT_C_UINT32:
-        case MAT_C_INT16:
-        case MAT_C_UINT16:
-        case MAT_C_INT8:
-        case MAT_C_UINT8:
-            nBytes = WriteEmptyData(mat,nmemb,matvar->data_type);
-            if ( nBytes % 8 )
-                for ( i = nBytes % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-            if ( matvar->isComplex ) {
-                nBytes = WriteEmptyData(mat,nmemb,matvar->data_type);
-                if ( nBytes % 8 )
-                    for ( i = nBytes % 8; i < 8; i++ )
-                        fwrite(&pad1,1,1,mat->fp);
-            }
-            break;
-        case MAT_C_CHAR:
-        {
-            WriteEmptyCharData(mat,nmemb,matvar->data_type);
-            break;
-        }
-        case MAT_C_CELL:
-        {
-            int nfields = matvar->nbytes / matvar->data_size;
-            matvar_t **fields = (matvar_t **)matvar->data;
-
-            for ( i = 0; i < nfields; i++ )
-                WriteCellArrayFieldInfo(mat,fields[i]);
-            break;
-        }
-        /* FIXME: Structures */
-    }
-    end = ftell(mat->fp);
-    nBytes = (int)(end-start);
-    fseek(mat->fp,(long)-(nBytes+4),SEEK_CUR);
-    fwrite(&nBytes,4,1,mat->fp);
-    fseek(mat->fp,end,SEEK_SET);
-    return 0;
-}
-
-/** @brief Writes the header and data for an element of a cell array
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param matvar pointer to the mat variable
- * @retval 0 on success
- */
-int
-WriteCellArrayField(mat_t *mat,matvar_t *matvar )
-{
-    mat_uint32_t array_flags = 0x0; 
-    mat_int16_t  array_name_type = MAT_T_INT8,fieldname_type = MAT_T_INT32,fieldname_data_size=4;
-    int      array_flags_type = MAT_T_UINT32, dims_array_type = MAT_T_INT32;
-    int      array_flags_size = 8, pad4 = 0, matrix_type = MAT_T_MATRIX;
-    mat_int8_t   pad1 = 0;
-    int      nBytes, i, nmemb = 1, nzmax = 0;
-    long     start = 0, end = 0;
-
-    if ((matvar == NULL) || (mat == NULL))
-        return 1;
-
-#if 0
-    nBytes = GetMatrixMaxBufSize(matvar);
-#endif
-
-    fwrite(&matrix_type,4,1,mat->fp);
-    fwrite(&pad4,4,1,mat->fp);
-    start = ftell(mat->fp);
-
-    /* Array Flags */
-    if ( matvar->rank > 1 && ( matvar->dims[0] > 1 || matvar->dims[1] > 1 ) &&
-         matvar->class_type == MAT_C_INT32 ) {
-        array_flags = MAT_C_DOUBLE & MAT_F_CLASS_T;
-    } else {
-        array_flags = matvar->class_type & MAT_F_CLASS_T;
-    }
-    if ( matvar->isComplex )
-        array_flags |= MAT_F_COMPLEX;
-    if ( matvar->isGlobal )
-        array_flags |= MAT_F_GLOBAL;
-    if ( matvar->isLogical )
-        array_flags |= MAT_F_LOGICAL;
-    if ( matvar->class_type == MAT_C_SPARSE )
-        nzmax = ((sparse_t *)matvar->data)->nzmax;
-
-    if ( mat->byteswap )
-        array_flags = Mat_int32Swap((mat_int32_t*)&array_flags);
-    fwrite(&array_flags_type,4,1,mat->fp);
-    fwrite(&array_flags_size,4,1,mat->fp);
-    fwrite(&array_flags,4,1,mat->fp);
-    fwrite(&nzmax,4,1,mat->fp);
-    /* Rank and Dimension */
-    nBytes = matvar->rank * 4;
-    fwrite(&dims_array_type,4,1,mat->fp);
-    fwrite(&nBytes,4,1,mat->fp);
-    for ( i = 0; i < matvar->rank; i++ ) {
-        mat_int32_t dim;
-        dim = matvar->dims[i];
-        nmemb *= dim;
-        fwrite(&dim,4,1,mat->fp);
-    }
-    if ( matvar->rank % 2 != 0 )
-        fwrite(&pad4,4,1,mat->fp);
-    /* Name of variable */
-    if ( !matvar->name ) {
-        fwrite(&array_name_type,2,1,mat->fp);
-        fwrite(&pad1,1,1,mat->fp);
-        fwrite(&pad1,1,1,mat->fp);
-        fwrite(&pad4,4,1,mat->fp);
-    } else if ( strlen(matvar->name) <= 4 ) {
-        mat_int16_t array_name_len = (mat_int16_t)strlen(matvar->name);
-        mat_int8_t  pad1 = 0;
-        fwrite(&array_name_type,2,1,mat->fp);
-        fwrite(&array_name_len,2,1,mat->fp);
-        fwrite(matvar->name,1,array_name_len,mat->fp);
-        for ( i = array_name_len; i < 4; i++ )
-            fwrite(&pad1,1,1,mat->fp);
-    } else {
-        mat_int32_t array_name_len = (mat_int32_t)strlen(matvar->name);
-        mat_int8_t  pad1 = 0;
-
-        fwrite(&array_name_type,2,1,mat->fp);
-        fwrite(&pad1,1,1,mat->fp);
-        fwrite(&pad1,1,1,mat->fp);
-        fwrite(&array_name_len,4,1,mat->fp);
-        fwrite(matvar->name,1,array_name_len,mat->fp);
-        if ( array_name_len % 8 )
-            for ( i = array_name_len % 8; i < 8; i++ )
-                fwrite(&pad1,1,1,mat->fp);
-    }
-
-    switch ( matvar->class_type ) {
-        case MAT_C_DOUBLE:
-        case MAT_C_SINGLE:
-        case MAT_C_INT64:
-        case MAT_C_UINT64:
-        case MAT_C_INT32:
-        case MAT_C_UINT32:
-        case MAT_C_INT16:
-        case MAT_C_UINT16:
-        case MAT_C_INT8:
-        case MAT_C_UINT8:
-        {
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data = matvar->data;
-
-
-                nBytes=WriteData(mat,complex_data->Re,nmemb,matvar->data_type);
-                if ( nBytes % 8 )
-                    for ( i = nBytes % 8; i < 8; i++ )
-                        fwrite(&pad1,1,1,mat->fp);
-                nBytes=WriteData(mat,complex_data->Im,nmemb,matvar->data_type);
-                if ( nBytes % 8 )
-                    for ( i = nBytes % 8; i < 8; i++ )
-                        fwrite(&pad1,1,1,mat->fp);
-            } else {
-                nBytes = WriteData(mat,matvar->data,nmemb,matvar->data_type);
-                if ( nBytes % 8 )
-                    for ( i = nBytes % 8; i < 8; i++ )
-                        fwrite(&pad1,1,1,mat->fp);
-            }
-            break;
-        }
-        case MAT_C_CHAR:
-            WriteCharData(mat,matvar->data,nmemb,matvar->data_type);
-            break;
-        case MAT_C_CELL:
-        {
-            int nfields = matvar->nbytes / matvar->data_size;
-            matvar_t **fields = (matvar_t **)matvar->data;
-
-            for ( i = 0; i < nfields; i++ )
-                WriteCellArrayField(mat,fields[i]);
-            break;
-        }
-        case MAT_C_STRUCT:
-        {
-            char **fieldnames, *padzero;
-            int    fieldname_size, nfields;
-            size_t maxlen = 0;
-            matvar_t **fields = (matvar_t **)matvar->data;
-            unsigned fieldname;
-
-            nfields = matvar->nbytes / (nmemb*matvar->data_size);
-            fieldnames = malloc(nfields*sizeof(char *));
-            for ( i = 0; i < nfields; i++ ) {
-                fieldnames[i] = fields[i]->name;
-                if ( strlen(fieldnames[i]) > maxlen )
-                    maxlen = strlen(fieldnames[i]);
-            }
-            maxlen++;
-            fieldname_size = maxlen;
-            while ( nfields*fieldname_size % 8 != 0 )
-                fieldname_size++;
-#if 0
-            fwrite(&fieldname_type,2,1,mat->fp);
-            fwrite(&fieldname_data_size,2,1,mat->fp);
-#else
-            fieldname = (fieldname_data_size<<16) | fieldname_type;
-            fwrite(&fieldname,4,1,mat->fp);
-#endif
-            fwrite(&fieldname_size,4,1,mat->fp);
-            fwrite(&array_name_type,2,1,mat->fp);
-            fwrite(&pad1,1,1,mat->fp);
-            fwrite(&pad1,1,1,mat->fp);
-            nBytes = nfields*fieldname_size;
-            fwrite(&nBytes,4,1,mat->fp);
-            padzero = calloc(fieldname_size,1);
-            for ( i = 0; i < nfields; i++ ) {
-                fwrite(fieldnames[i],1,strlen(fieldnames[i]),mat->fp);
-                fwrite(padzero,1,fieldname_size-strlen(fieldnames[i]),mat->fp);
-            }
-            free(fieldnames);
-            free(padzero);
-            for ( i = 0; i < nmemb*nfields; i++ )
-                WriteStructField(mat,fields[i]);
-            break;
-        }
-        case MAT_C_SPARSE:
-        {
-            sparse_t *sparse = matvar->data;
-
-            nBytes = WriteData(mat,sparse->ir,sparse->nir,MAT_T_INT32);
-            if ( nBytes % 8 )
-                for ( i = nBytes % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-            nBytes = WriteData(mat,sparse->jc,sparse->njc,MAT_T_INT32);
-            if ( nBytes % 8 )
-                for ( i = nBytes % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-            nBytes = WriteData(mat,sparse->data,sparse->ndata,matvar->data_type);
-            if ( nBytes % 8 )
-                for ( i = nBytes % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-        }
-    }
-    end = ftell(mat->fp);
-    nBytes = (int)(end-start);
-    fseek(mat->fp,(long)-(nBytes+4),SEEK_CUR);
-    fwrite(&nBytes,4,1,mat->fp);
-    fseek(mat->fp,end,SEEK_SET);
-    return 0;
-}
-
-#if defined(HAVE_ZLIB)
-/** @brief Writes the header and data for a field of a compressed cell array
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param matvar pointer to the mat variable
- * @return number of bytes written to the MAT file
- */
-size_t
-WriteCompressedCellArrayField(mat_t *mat,matvar_t *matvar,z_stream *z)
-{
-    mat_uint32_t array_flags = 0x0; 
-    mat_int16_t  array_name_type     = MAT_T_INT8;
-    mat_int16_t  fieldname_type      = MAT_T_INT32;
-    mat_int16_t  fieldname_data_size = 4;
-    int      array_flags_type = MAT_T_UINT32, dims_array_type = MAT_T_INT32;
-    int      array_flags_size = 8, pad4 = 0;
-    mat_int8_t   pad1 = 0;
-    int      nBytes, i, nmemb = 1, nzmax = 0;
-    long     start = 0;
-
-    mat_uint32_t comp_buf[512];
-    mat_uint32_t uncomp_buf[512] = {0,};
-    int buf_size = 512, err;
-    size_t byteswritten = 0;
-
-    if ( NULL == matvar || NULL == mat || NULL == z)
-        return 0;
-
-    start = ftell(mat->fp);
-
-    /* Array Flags */
-    array_flags = matvar->class_type & MAT_F_CLASS_T;
-    if ( matvar->isComplex )
-        array_flags |= MAT_F_COMPLEX;
-    if ( matvar->isGlobal )
-        array_flags |= MAT_F_GLOBAL;
-    if ( matvar->isLogical )
-        array_flags |= MAT_F_LOGICAL;
-    if ( matvar->class_type == MAT_C_SPARSE )
-        nzmax = ((sparse_t *)matvar->data)->nzmax;
-
-    uncomp_buf[0] = MAT_T_MATRIX;
-    uncomp_buf[1] = (int)GetMatrixMaxBufSize(matvar);
-    z->next_out  = comp_buf;
-    z->next_in   = uncomp_buf;
-    z->avail_out = buf_size*sizeof(*comp_buf);
-    z->avail_in  = 8;
-    err = deflate(z,Z_NO_FLUSH);
-    byteswritten += fwrite(comp_buf,1,buf_size*sizeof(*comp_buf)-z->avail_out,
-        mat->fp);
-    uncomp_buf[0] = array_flags_type;
-    uncomp_buf[1] = array_flags_size;
-    uncomp_buf[2] = array_flags;
-    uncomp_buf[3] = nzmax;
-    /* Rank and Dimension */
-    nBytes = matvar->rank * 4;
-    uncomp_buf[4] = dims_array_type;
-    uncomp_buf[5] = nBytes;
-    for ( i = 0; i < matvar->rank; i++ ) {
-        mat_int32_t dim;
-        dim = matvar->dims[i];
-        nmemb *= dim;
-        uncomp_buf[6+i] = dim;
-    }
-    if ( matvar->rank % 2 != 0 ) {
-        uncomp_buf[6+i] = pad4;
-        i++;
-    }
-
-    z->next_out  = comp_buf;
-    z->next_in   = uncomp_buf;
-    z->avail_out = buf_size*sizeof(*comp_buf);
-    z->avail_in  = (6+i)*sizeof(*uncomp_buf);
-    err = deflate(z,Z_NO_FLUSH);
-    byteswritten += fwrite(comp_buf,1,buf_size*sizeof(*comp_buf)-z->avail_out,
-        mat->fp);
-    /* Name of variable */
-    uncomp_buf[0] = array_name_type;
-    uncomp_buf[1] = 0;
-    z->next_out  = comp_buf;
-    z->next_in   = uncomp_buf;
-    z->avail_out = buf_size*sizeof(*comp_buf);
-    z->avail_in  = 8;
-    err = deflate(z,Z_NO_FLUSH);
-    byteswritten += fwrite(comp_buf,1,buf_size*sizeof(*comp_buf)-z->avail_out,
-        mat->fp);
-
-    matvar->datapos = ftell(mat->fp);
-    switch ( matvar->class_type ) {
-        case MAT_C_DOUBLE:
-        case MAT_C_SINGLE:
-        case MAT_C_INT64:
-        case MAT_C_UINT64:
-        case MAT_C_INT32:
-        case MAT_C_UINT32:
-        case MAT_C_INT16:
-        case MAT_C_UINT16:
-        case MAT_C_INT8:
-        case MAT_C_UINT8:
-        {
-            /* WriteCompressedData makes sure uncomressed data is aligned
-             * on an 8-byte boundary */
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data = matvar->data;
-
-                byteswritten += WriteCompressedData(mat,z,
-                    complex_data->Re,nmemb,matvar->data_type);
-                byteswritten += WriteCompressedData(mat,z,
-                    complex_data->Im,nmemb,matvar->data_type);
-            } else {
-                byteswritten += WriteCompressedData(mat,z,
-                    matvar->data,nmemb,matvar->data_type);
-            }
-            break;
-        }
-        case MAT_C_CHAR:
-        {
-            /* Check for a NULL character array */
-            if ( matvar->data != NULL && nmemb > 0 )
-                byteswritten += WriteCompressedCharData(mat,z,matvar->data,
-                    nmemb,matvar->data_type);
-            break;
-        }
-        case MAT_C_CELL:
-        {
-            int        ncells;
-            matvar_t **cells = (matvar_t **)matvar->data;
-
-            /* Check for an empty cell array */
-            if ( matvar->nbytes == 0 || matvar->data_size == 0 ||
-                 matvar->data   == NULL )
-                break;
-            ncells  = matvar->nbytes / matvar->data_size;
-            for ( i = 0; i < ncells; i++ )
-                WriteCompressedCellArrayField(mat,cells[i],z);
-            break;
-        }
-        case MAT_C_STRUCT:
-        {
-            char     **fieldnames;
-            unsigned char *padzero;
-            int        fieldname_size, nfields;
-            size_t     maxlen = 0;
-            mat_int32_t array_name_type = MAT_T_INT8;
-            matvar_t **fields = (matvar_t **)matvar->data;
-
-            /* Check for a structure with no fields */
-            if ( matvar->nbytes == 0 || matvar->data_size == 0 ||
-                 matvar->data   == NULL ) {
-                fieldname_size = 1;
-                uncomp_buf[0] = (fieldname_data_size << 16) | 
-                                 fieldname_type;
-                uncomp_buf[1] = 1;
-                uncomp_buf[2] = array_name_type;
-                uncomp_buf[3] = 0;
-                z->next_out  = comp_buf;
-                z->next_in   = uncomp_buf;
-                z->avail_out = buf_size*sizeof(*comp_buf);
-                z->avail_in  = 32;
-                err = deflate(z,Z_NO_FLUSH);
-                byteswritten += fwrite(comp_buf,1,buf_size*
-                    sizeof(*comp_buf)-z->avail_out,mat->fp);
-                break;
-            }
-            nfields = matvar->nbytes / (nmemb*matvar->data_size);
-            fieldnames = malloc(nfields*sizeof(char *));
-            for ( i = 0; i < nfields; i++ ) {
-                fieldnames[i] = fields[i]->name;
-                if ( strlen(fieldnames[i]) > maxlen )
-                    maxlen = strlen(fieldnames[i]);
-            }
-            maxlen++;
-            fieldname_size = maxlen;
-            while ( nfields*fieldname_size % 8 != 0 )
-                fieldname_size++;
-            uncomp_buf[0] = (fieldname_data_size << 16) | fieldname_type;
-            uncomp_buf[1] = fieldname_size;
-            uncomp_buf[2] = array_name_type;
-            uncomp_buf[3] = nfields*fieldname_size;
-
-            padzero = calloc(fieldname_size,1);
-            z->next_out  = comp_buf;
-            z->next_in   = uncomp_buf;
-            z->avail_out = buf_size*sizeof(*comp_buf);
-            z->avail_in  = 16;
-            err = deflate(z,Z_NO_FLUSH);
-            byteswritten += fwrite(comp_buf,1,
-                    buf_size*sizeof(*comp_buf)-z->avail_out,mat->fp);
-            for ( i = 0; i < nfields; i++ ) {
-                memset(padzero,'\0',fieldname_size);
-                memcpy(padzero,fieldnames[i],strlen(fieldnames[i]));
-                z->next_out  = comp_buf;
-                z->next_in   = padzero;
-                z->avail_out = buf_size*sizeof(*comp_buf);
-                z->avail_in  = fieldname_size;
-                err = deflate(z,Z_NO_FLUSH);
-                byteswritten += fwrite(comp_buf,1,
-                        buf_size*sizeof(*comp_buf)-z->avail_out,mat->fp);
-            }
-            free(fieldnames);
-            free(padzero);
-            for ( i = 0; i < nmemb*nfields; i++ )
-                byteswritten +=
-                    WriteCompressedStructField(mat,fields[i],z);
-            break;
-        }
-        case MAT_C_SPARSE:
-        {
-            sparse_t *sparse = matvar->data;
-
-            byteswritten += WriteCompressedData(mat,z,sparse->ir,
-                sparse->nir,MAT_T_INT32);
-            byteswritten += WriteCompressedData(mat,z,sparse->jc,
-                sparse->njc,MAT_T_INT32);
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data = sparse->data;
-                byteswritten += WriteCompressedData(mat,z,
-                    complex_data->Re,sparse->ndata,matvar->data_type);
-                byteswritten += WriteCompressedData(mat,z,
-                    complex_data->Im,sparse->ndata,matvar->data_type);
-            } else {
-                byteswritten += WriteCompressedData(mat,z,
-                    sparse->data,sparse->ndata,matvar->data_type);
-            }
-            break;
-        }
-    }
-    return byteswritten;
-}
-#endif
-
-/** @brief Writes the header and data for a field of a struct array
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param matvar pointer to the mat variable
- * @retval 0 on success
- */
-int
-WriteStructField(mat_t *mat,matvar_t *matvar)
-{
-    mat_uint32_t array_flags = 0x0; 
-    mat_int16_t  fieldname_type = MAT_T_INT32,fieldname_data_size=4;
-    mat_int32_t  array_name_type = MAT_T_INT8;
-    int      array_flags_type = MAT_T_UINT32, dims_array_type = MAT_T_INT32;
-    int      array_flags_size = 8, pad4 = 0, matrix_type = MAT_T_MATRIX;
-    mat_int8_t   pad1 = 0;
-    int      nBytes, i, nmemb = 1, nzmax = 0;
-    long     start = 0, end = 0;
-
-    if ( (matvar == NULL) || ( mat == NULL ))
-        return 1;
-
-    fwrite(&matrix_type,4,1,mat->fp);
-    fwrite(&pad4,4,1,mat->fp);
-    start = ftell(mat->fp);
-
-    /* Array Flags */
-    array_flags = matvar->class_type & MAT_F_CLASS_T;
-    if ( matvar->isComplex )
-        array_flags |= MAT_F_COMPLEX;
-    if ( matvar->isGlobal )
-        array_flags |= MAT_F_GLOBAL;
-    if ( matvar->isLogical )
-        array_flags |= MAT_F_LOGICAL;
-    if ( matvar->class_type == MAT_C_SPARSE )
-        nzmax = ((sparse_t *)matvar->data)->nzmax;
-
-    if ( mat->byteswap )
-        array_flags = Mat_int32Swap((mat_int32_t*)&array_flags);
-    fwrite(&array_flags_type,4,1,mat->fp);
-    fwrite(&array_flags_size,4,1,mat->fp);
-    fwrite(&array_flags,4,1,mat->fp);
-    fwrite(&nzmax,4,1,mat->fp);
-    /* Rank and Dimension */
-    nBytes = matvar->rank * 4;
-    fwrite(&dims_array_type,4,1,mat->fp);
-    fwrite(&nBytes,4,1,mat->fp);
-    for ( i = 0; i < matvar->rank; i++ ) {
-        mat_int32_t dim;
-        dim = matvar->dims[i];
-        nmemb *= dim;
-        fwrite(&dim,4,1,mat->fp);
-    }
-    if ( matvar->rank % 2 != 0 )
-        fwrite(&pad4,4,1,mat->fp);
-
-    /* Name of variable */
-    fwrite(&array_name_type,4,1,mat->fp);
-    fwrite(&pad4,4,1,mat->fp);
-
-    switch ( matvar->class_type ) {
-        case MAT_C_DOUBLE:
-        case MAT_C_SINGLE:
-        case MAT_C_INT64:
-        case MAT_C_UINT64:
-        case MAT_C_INT32:
-        case MAT_C_UINT32:
-        case MAT_C_INT16:
-        case MAT_C_UINT16:
-        case MAT_C_INT8:
-        case MAT_C_UINT8:
-        {
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data = matvar->data;
-
-
-                nBytes=WriteData(mat,complex_data->Re,nmemb,matvar->data_type);
-                if ( nBytes % 8 )
-                    for ( i = nBytes % 8; i < 8; i++ )
-                        fwrite(&pad1,1,1,mat->fp);
-                nBytes=WriteData(mat,complex_data->Im,nmemb,matvar->data_type);
-                if ( nBytes % 8 )
-                    for ( i = nBytes % 8; i < 8; i++ )
-                        fwrite(&pad1,1,1,mat->fp);
-            } else {
-                nBytes=WriteData(mat,matvar->data,nmemb,matvar->data_type);
-                if ( nBytes % 8 )
-                    for ( i = nBytes % 8; i < 8; i++ )
-                        fwrite(&pad1,1,1,mat->fp);
-            }
-            break;
-        }
-        case MAT_C_CHAR:
-            nBytes=WriteCharData(mat,matvar->data,nmemb,matvar->data_type);
-            break;
-        case MAT_C_CELL:
-        {
-            int nfields = matvar->nbytes / matvar->data_size;
-            matvar_t **fields = (matvar_t **)matvar->data;
-
-            for ( i = 0; i < nfields; i++ )
-                WriteCellArrayField(mat,fields[i]);
-            break;
-        }
-        case MAT_C_STRUCT:
-        {
-            char **fieldnames, *padzero;
-            int    fieldname_size, nfields;
-            size_t maxlen = 0;
-            matvar_t **fields = (matvar_t **)matvar->data;
-            unsigned fieldname;
-
-            nfields = matvar->nbytes / (nmemb*matvar->data_size);
-            fieldnames = malloc(nfields*sizeof(char *));
-            for ( i = 0; i < nfields; i++ ) {
-                fieldnames[i] = fields[i]->name;
-                if ( strlen(fieldnames[i]) > maxlen )
-                    maxlen = strlen(fieldnames[i]);
-            }
-            maxlen++;
-            fieldname_size = maxlen;
-            while ( nfields*fieldname_size % 8 != 0 )
-                fieldname_size++;
-#if 0
-            fwrite(&fieldname_type,2,1,mat->fp);
-            fwrite(&fieldname_data_size,2,1,mat->fp);
-#else
-            fieldname = (fieldname_data_size<<16) | fieldname_type;
-            fwrite(&fieldname,4,1,mat->fp);
-#endif
-            fwrite(&fieldname_size,4,1,mat->fp);
-            fwrite(&array_name_type,4,1,mat->fp);
-            nBytes = nfields*fieldname_size;
-            fwrite(&nBytes,4,1,mat->fp);
-            padzero = calloc(fieldname_size,1);
-            for ( i = 0; i < nfields; i++ ) {
-                fwrite(fieldnames[i],1,strlen(fieldnames[i]),mat->fp);
-                fwrite(padzero,1,fieldname_size-strlen(fieldnames[i]),
-                       mat->fp);
-            }
-            free(fieldnames);
-            free(padzero);
-            for ( i = 0; i < nmemb*nfields; i++ )
-                WriteStructField(mat,fields[i]);
-            break;
-        }
-        case MAT_C_SPARSE:
-        {
-            sparse_t *sparse = matvar->data;
-
-            nBytes = WriteData(mat,sparse->ir,sparse->nir,MAT_T_INT32);
-            if ( nBytes % 8 )
-                for ( i = nBytes % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-            nBytes = WriteData(mat,sparse->jc,sparse->njc,MAT_T_INT32);
-            if ( nBytes % 8 )
-                for ( i = nBytes % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-            nBytes = WriteData(mat,sparse->data,sparse->ndata,
-                       matvar->data_type);
-            if ( nBytes % 8 )
-                for ( i = nBytes % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-        }
-    }
-    end = ftell(mat->fp);
-    nBytes = (int)(end-start);
-    fseek(mat->fp,(long)-(nBytes+4),SEEK_CUR);
-    fwrite(&nBytes,4,1,mat->fp);
-    fseek(mat->fp,end,SEEK_SET);
-    return 0;
-}
-
-#if defined(HAVE_ZLIB)
-/** @brief Writes the header and data for a field of a compressed struct array
- *
- * @ingroup mat_internal
- * @fixme Currently does not work for cell arrays or sparse data
- * @param mat MAT file pointer
- * @param matvar pointer to the mat variable
- * @return number of bytes written to the MAT file
- */
-size_t
-WriteCompressedStructField(mat_t *mat,matvar_t *matvar,z_stream *z)
-{
-    mat_uint32_t array_flags = 0x0; 
-    mat_int16_t  array_name_type     = MAT_T_INT8;
-    mat_int16_t  fieldname_type      = MAT_T_INT32;
-    mat_int16_t  fieldname_data_size = 4;
-    int      array_flags_type = MAT_T_UINT32, dims_array_type = MAT_T_INT32;
-    int      array_flags_size = 8, pad4 = 0;
-    mat_int8_t   pad1 = 0;
-    int      nBytes, i, nmemb = 1, nzmax = 0;
-    long     start = 0;
-
-    mat_uint32_t comp_buf[512];
-    mat_uint32_t uncomp_buf[512] = {0,};
-    int buf_size = 512, err;
-    size_t byteswritten = 0;
-
-    if ( NULL == matvar || NULL == mat || NULL == z)
-        return 1;
-
-    start = ftell(mat->fp);
-
-    /* Array Flags */
-    array_flags = matvar->class_type & MAT_F_CLASS_T;
-    if ( matvar->isComplex )
-        array_flags |= MAT_F_COMPLEX;
-    if ( matvar->isGlobal )
-        array_flags |= MAT_F_GLOBAL;
-    if ( matvar->isLogical )
-        array_flags |= MAT_F_LOGICAL;
-    if ( matvar->class_type == MAT_C_SPARSE )
-        nzmax = ((sparse_t *)matvar->data)->nzmax;
-
-    uncomp_buf[0] = MAT_T_MATRIX;
-    uncomp_buf[1] = (int)GetMatrixMaxBufSize(matvar);
-    z->next_out  = comp_buf;
-    z->next_in   = uncomp_buf;
-    z->avail_out = buf_size*sizeof(*comp_buf);
-    z->avail_in  = 8;
-    err = deflate(z,Z_NO_FLUSH);
-    byteswritten += fwrite(comp_buf,1,buf_size*sizeof(*comp_buf)-z->avail_out,
-        mat->fp);
-    uncomp_buf[0] = array_flags_type;
-    uncomp_buf[1] = array_flags_size;
-    uncomp_buf[2] = array_flags;
-    uncomp_buf[3] = nzmax;
-    /* Rank and Dimension */
-    nBytes = matvar->rank * 4;
-    uncomp_buf[4] = dims_array_type;
-    uncomp_buf[5] = nBytes;
-    for ( i = 0; i < matvar->rank; i++ ) {
-        mat_int32_t dim;
-        dim = matvar->dims[i];
-        nmemb *= dim;
-        uncomp_buf[6+i] = dim;
-    }
-    if ( matvar->rank % 2 != 0 ) {
-        uncomp_buf[6+i] = pad4;
-        i++;
-    }
-
-    z->next_out  = comp_buf;
-    z->next_in   = uncomp_buf;
-    z->avail_out = buf_size*sizeof(*comp_buf);
-    z->avail_in  = (6+i)*sizeof(*uncomp_buf);
-    err = deflate(z,Z_NO_FLUSH);
-    byteswritten += fwrite(comp_buf,1,buf_size*sizeof(*comp_buf)-z->avail_out,
-        mat->fp);
-    /* Name of variable */
-    uncomp_buf[0] = array_name_type;
-    uncomp_buf[1] = 0;
-    z->next_out  = comp_buf;
-    z->next_in   = uncomp_buf;
-    z->avail_out = buf_size*sizeof(*comp_buf);
-    z->avail_in  = 8;
-    err = deflate(z,Z_NO_FLUSH);
-    byteswritten += fwrite(comp_buf,1,buf_size*sizeof(*comp_buf)-z->avail_out,
-        mat->fp);
-
-    matvar->datapos = ftell(mat->fp);
-    switch ( matvar->class_type ) {
-        case MAT_C_DOUBLE:
-        case MAT_C_SINGLE:
-        case MAT_C_INT64:
-        case MAT_C_UINT64:
-        case MAT_C_INT32:
-        case MAT_C_UINT32:
-        case MAT_C_INT16:
-        case MAT_C_UINT16:
-        case MAT_C_INT8:
-        case MAT_C_UINT8:
-        {
-            /* WriteCompressedData makes sure uncomressed data is aligned
-             * on an 8-byte boundary */
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data = matvar->data;
-
-                byteswritten += WriteCompressedData(mat,z,
-                    complex_data->Re,nmemb,matvar->data_type);
-                byteswritten += WriteCompressedData(mat,z,
-                    complex_data->Im,nmemb,matvar->data_type);
-            } else {
-                byteswritten += WriteCompressedData(mat,z,
-                    matvar->data,nmemb,matvar->data_type);
-            }
-            break;
-        }
-        case MAT_C_CHAR:
-        {
-            /* Check for a NULL character array */
-            if ( matvar->data != NULL && nmemb > 0 )
-                byteswritten += WriteCompressedCharData(mat,z,matvar->data,
-                    nmemb,matvar->data_type);
-            break;
-        }
-        case MAT_C_CELL:
-        {
-            int        ncells;
-            matvar_t **cells = (matvar_t **)matvar->data;
-
-            /* Check for an empty cell array */
-            if ( matvar->nbytes == 0 || matvar->data_size == 0 ||
-                 matvar->data   == NULL )
-                break;
-            ncells  = matvar->nbytes / matvar->data_size;
-            for ( i = 0; i < ncells; i++ )
-                WriteCompressedCellArrayField(mat,cells[i],z);
-            break;
-        }
-        case MAT_C_STRUCT:
-        {
-            char     **fieldnames;
-            unsigned char *padzero;
-            int        fieldname_size, nfields;
-            size_t     maxlen = 0;
-            mat_int32_t array_name_type = MAT_T_INT8;
-            matvar_t **fields = (matvar_t **)matvar->data;
-
-            /* Check for a structure with no fields */
-            if ( matvar->nbytes == 0 || matvar->data_size == 0 ||
-                 matvar->data   == NULL ) {
-                fieldname_size = 1;
-                uncomp_buf[0] = (fieldname_data_size << 16) | 
-                                 fieldname_type;
-                uncomp_buf[1] = 1;
-                uncomp_buf[2] = array_name_type;
-                uncomp_buf[3] = 0;
-                z->next_out  = comp_buf;
-                z->next_in   = uncomp_buf;
-                z->avail_out = buf_size*sizeof(*comp_buf);
-                z->avail_in  = 32;
-                err = deflate(z,Z_NO_FLUSH);
-                byteswritten += fwrite(comp_buf,1,buf_size*
-                    sizeof(*comp_buf)-z->avail_out,mat->fp);
-                break;
-            }
-            nfields = matvar->nbytes / (nmemb*matvar->data_size);
-            fieldnames = malloc(nfields*sizeof(char *));
-            for ( i = 0; i < nfields; i++ ) {
-                fieldnames[i] = fields[i]->name;
-                if ( strlen(fieldnames[i]) > maxlen )
-                    maxlen = strlen(fieldnames[i]);
-            }
-            maxlen++;
-            fieldname_size = maxlen;
-            while ( nfields*fieldname_size % 8 != 0 )
-                fieldname_size++;
-            uncomp_buf[0] = (fieldname_data_size << 16) | fieldname_type;
-            uncomp_buf[1] = fieldname_size;
-            uncomp_buf[2] = array_name_type;
-            uncomp_buf[3] = nfields*fieldname_size;
-
-            padzero = calloc(fieldname_size,1);
-            z->next_out  = comp_buf;
-            z->next_in   = uncomp_buf;
-            z->avail_out = buf_size*sizeof(*comp_buf);
-            z->avail_in  = 16;
-            err = deflate(z,Z_NO_FLUSH);
-            byteswritten += fwrite(comp_buf,1,
-                    buf_size*sizeof(*comp_buf)-z->avail_out,mat->fp);
-            for ( i = 0; i < nfields; i++ ) {
-                memset(padzero,'\0',fieldname_size);
-                memcpy(padzero,fieldnames[i],strlen(fieldnames[i]));
-                z->next_out  = comp_buf;
-                z->next_in   = padzero;
-                z->avail_out = buf_size*sizeof(*comp_buf);
-                z->avail_in  = fieldname_size;
-                err = deflate(z,Z_NO_FLUSH);
-                byteswritten += fwrite(comp_buf,1,
-                        buf_size*sizeof(*comp_buf)-z->avail_out,mat->fp);
-            }
-            free(fieldnames);
-            free(padzero);
-            for ( i = 0; i < nmemb*nfields; i++ )
-                byteswritten +=
-                    WriteCompressedStructField(mat,fields[i],z);
-            break;
-        }
-        case MAT_C_SPARSE:
-        {
-            sparse_t *sparse = matvar->data;
-
-            byteswritten += WriteCompressedData(mat,z,sparse->ir,
-                sparse->nir,MAT_T_INT32);
-            byteswritten += WriteCompressedData(mat,z,sparse->jc,
-                sparse->njc,MAT_T_INT32);
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data = sparse->data;
-                byteswritten += WriteCompressedData(mat,z,
-                    complex_data->Re,sparse->ndata,matvar->data_type);
-                byteswritten += WriteCompressedData(mat,z,
-                    complex_data->Im,sparse->ndata,matvar->data_type);
-            } else {
-                byteswritten += WriteCompressedData(mat,z,
-                    sparse->data,sparse->ndata,matvar->data_type);
-            }
-            break;
-        }
-    }
-    return byteswritten;
-}
-#endif
-
-/** @brief Reads the data of a version 5 MAT variable
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param matvar MAT variable pointer to read the data
- */
-void
-Read5(mat_t *mat, matvar_t *matvar)
-{
-    int nBytes, len = 0, i, byteswap, packed_type, data_in_tag = 0;
-    long fpos;
-    mat_uint32_t tag[2];
-
-    if ( matvar == NULL )
-        return;
-    else if ( matvar->rank == 0 )        /* An empty data set */
-        return;
-
-    fpos = ftell(mat->fp);
-    len = 1;
-    byteswap = mat->byteswap;
-    switch ( matvar->class_type ) {
-        case MAT_C_DOUBLE:
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    InflateDataType(mat,matvar->z,tag+1);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-#endif
-            } else {
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-                fread(tag,4,1,mat->fp);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(tag+1,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-            }
-            if ( nBytes == 0 ) {
-                matvar->nbytes = 0;
-                break;
-            }
-            for ( i = 0; i < matvar->rank; i++ )
-                len *= matvar->dims[i];
-            matvar->data_size = sizeof(double);
-            matvar->data_type = MAT_T_DOUBLE;
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes = len*matvar->data_size;
-                complex_data = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                if ( NULL == complex_data || NULL == complex_data->Re ||
-                     NULL == complex_data->Im ) {
-                    Mat_Critical("Failed to allocate %d bytes",2*matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadDoubleData(mat,complex_data->Re,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-
-                    /* Complex Data Tag */
-                    fread(tag,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        fread(tag+1,4,1,mat->fp);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadDoubleData(mat,complex_data->Im,packed_type,
-                                            len);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-                    nBytes = ReadCompressedDoubleData(mat,matvar->z,
-                                 complex_data->Re,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-
-                    /* Complex Data Tag */
-                    InflateDataType(mat,matvar->z,tag);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        InflateDataType(mat,matvar->z,tag+1);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadCompressedDoubleData(mat,matvar->z,
-                                 complex_data->Im,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-                matvar->data = complex_data;
-            } else { /* if ( isComplex ) */
-                matvar->nbytes = len*matvar->data_size;
-                matvar->data   = malloc(matvar->nbytes);
-                if ( !matvar->data ) {
-                    Mat_Critical("Failed to allocate %d bytes",matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadDoubleData(mat,(double*)matvar->data,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                    nBytes = ReadCompressedDoubleData(mat,matvar->z,
-                                 (double*)matvar->data,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-            }
-            break;
-        case MAT_C_SINGLE:
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    InflateDataType(mat,matvar->z,tag+1);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-#endif
-            } else {
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-                fread(tag,4,1,mat->fp);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(tag+1,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-            }
-            if ( nBytes == 0 ) {
-                matvar->nbytes = 0;
-                break;
-            }
-            for ( i = 0; i < matvar->rank; i++ )
-                len *= matvar->dims[i];
-            matvar->data_size = sizeof(float);
-            matvar->data_type = MAT_T_SINGLE;
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes = len*matvar->data_size;
-                complex_data = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                if ( NULL == complex_data || NULL == complex_data->Re ||
-                     NULL == complex_data->Im ) {
-                    Mat_Critical("Failed to allocate %d bytes",2*matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadSingleData(mat,complex_data->Re,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-
-                    /* Complex Data Tag */
-                    fread(tag,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        fread(tag+1,4,1,mat->fp);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadSingleData(mat,complex_data->Im,
-                               packed_type,len);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-                    nBytes = ReadCompressedSingleData(mat,matvar->z,
-                                 complex_data->Re,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-
-                    /* Complex Data Tag */
-                    InflateDataType(mat,matvar->z,tag);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        InflateDataType(mat,matvar->z,tag+1);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadCompressedSingleData(mat,matvar->z,
-                                 complex_data->Im,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-                matvar->data = complex_data;
-            } else {
-                matvar->nbytes = len*matvar->data_size;
-                matvar->data = malloc(matvar->nbytes);
-                if ( !matvar->data ) {
-                    Mat_Critical("Failed to allocate %d bytes",matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadSingleData(mat,(float*)matvar->data,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                    nBytes = ReadCompressedSingleData(mat,matvar->z,
-                                 (float*)matvar->data,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-            }
-            break;
-#ifdef HAVE_MAT_INT64_T
-        case MAT_C_INT64:
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    InflateDataType(mat,matvar->z,tag+1);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-#endif
-            } else {
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-                fread(tag,4,1,mat->fp);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(tag+1,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-            }
-            if ( nBytes == 0 ) {
-                matvar->nbytes = 0;
-                break;
-            }
-            for ( i = 0; i < matvar->rank; i++ )
-                len *= matvar->dims[i];
-            matvar->data_size = sizeof(mat_int64_t);
-            matvar->data_type = MAT_T_INT64;
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes = len*matvar->data_size;
-                complex_data = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                if ( NULL == complex_data || NULL == complex_data->Re ||
-                     NULL == complex_data->Im ) {
-                    Mat_Critical("Failed to allocate %d bytes",2*matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt64Data(mat,complex_data->Re,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-
-                    /* Complex Data Tag */
-                    fread(tag,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        fread(tag+1,4,1,mat->fp);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadInt64Data(mat,complex_data->Im,
-                               packed_type,len);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-                    nBytes = ReadCompressedInt64Data(mat,matvar->z,
-                                 complex_data->Re,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-
-                    /* Complex Data Tag */
-                    InflateDataType(mat,matvar->z,tag);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        InflateDataType(mat,matvar->z,tag+1);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadCompressedInt64Data(mat,matvar->z,
-                                 complex_data->Im,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-                matvar->data = complex_data;
-            } else {
-                matvar->nbytes = len*matvar->data_size;
-                matvar->data   = malloc(matvar->nbytes);
-                if ( !matvar->data ) {
-                    Mat_Critical("Failed to allocate %d bytes",matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt64Data(mat,(mat_int64_t*)matvar->data,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                    nBytes = ReadCompressedInt64Data(mat,matvar->z,
-                                 (mat_int64_t*)matvar->data,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-            }
-            break;
-#endif /* HAVE_MAT_INT64_T */
-#ifdef HAVE_MAT_UINT64_T
-        case MAT_C_UINT64:
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    InflateDataType(mat,matvar->z,tag+1);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-#endif
-            } else {
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-                fread(tag,4,1,mat->fp);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(tag+1,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-            }
-            if ( nBytes == 0 ) {
-                matvar->nbytes = 0;
-                break;
-            }
-            for ( i = 0; i < matvar->rank; i++ )
-                len *= matvar->dims[i];
-            matvar->data_size = sizeof(mat_uint64_t);
-            matvar->data_type = MAT_T_UINT64;
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes = len*matvar->data_size;
-                complex_data = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                if ( NULL == complex_data || NULL == complex_data->Re ||
-                     NULL == complex_data->Im ) {
-                    Mat_Critical("Failed to allocate %d bytes",2*matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt64Data(mat,complex_data->Re,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-
-                    /* Complex Data Tag */
-                    fread(tag,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        fread(tag+1,4,1,mat->fp);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadInt64Data(mat,complex_data->Im,
-                               packed_type,len);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-                    nBytes = ReadCompressedInt64Data(mat,matvar->z,
-                                 complex_data->Re,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-
-                    /* Complex Data Tag */
-                    InflateDataType(mat,matvar->z,tag);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        InflateDataType(mat,matvar->z,tag+1);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadCompressedInt64Data(mat,matvar->z,
-                                 complex_data->Im,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-                matvar->data = complex_data;
-            } else {
-                matvar->nbytes = len*matvar->data_size;
-                matvar->data   = malloc(matvar->nbytes);
-                if ( !matvar->data ) {
-                    Mat_Critical("Failed to allocate %d bytes",matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt64Data(mat,(mat_int64_t*)matvar->data,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                    nBytes = ReadCompressedInt64Data(mat,matvar->z,
-                                 (mat_int64_t*)matvar->data,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-            }
-            break;
-#endif /* HAVE_MAT_UINT64_T */
-        case MAT_C_INT32:
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    InflateDataType(mat,matvar->z,tag+1);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-#endif
-            } else {
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-                fread(tag,4,1,mat->fp);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(tag+1,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-            }
-            if ( nBytes == 0 ) {
-                matvar->nbytes = 0;
-                break;
-            }
-            for ( i = 0; i < matvar->rank; i++ )
-                len *= matvar->dims[i];
-            matvar->data_size = sizeof(mat_int32_t);
-            matvar->data_type = MAT_T_INT32;
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes = len*matvar->data_size;
-                complex_data = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                if ( NULL == complex_data || NULL == complex_data->Re ||
-                     NULL == complex_data->Im ) {
-                    Mat_Critical("Failed to allocate %d bytes",2*matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt32Data(mat,complex_data->Re,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-
-                    /* Complex Data Tag */
-                    fread(tag,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        fread(tag+1,4,1,mat->fp);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadInt32Data(mat,complex_data->Im,
-                               packed_type,len);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-                    nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                 complex_data->Re,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-
-                    /* Complex Data Tag */
-                    InflateDataType(mat,matvar->z,tag);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        InflateDataType(mat,matvar->z,tag+1);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                 complex_data->Im,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-                matvar->data = complex_data;
-            } else {
-                matvar->nbytes = len*matvar->data_size;
-                matvar->data   = malloc(matvar->nbytes);
-                if ( !matvar->data ) {
-                    Mat_Critical("Failed to allocate %d bytes",matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt32Data(mat,(mat_int32_t*)matvar->data,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                    nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                 (mat_int32_t*)matvar->data,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-            }
-            break;
-        case MAT_C_UINT32:
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    InflateDataType(mat,matvar->z,tag+1);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-#endif
-            } else {
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-                fread(tag,4,1,mat->fp);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(tag+1,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-            }
-            if ( nBytes == 0 ) {
-                matvar->nbytes = 0;
-                break;
-            }
-            for ( i = 0; i < matvar->rank; i++ )
-                len *= matvar->dims[i];
-            matvar->data_size = sizeof(mat_uint32_t);
-            matvar->data_type = MAT_T_UINT32;
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes = len*matvar->data_size;
-                complex_data = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                if ( NULL == complex_data || NULL == complex_data->Re ||
-                     NULL == complex_data->Im ) {
-                    Mat_Critical("Failed to allocate %d bytes",2*matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt32Data(mat,complex_data->Re,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-
-                    /* Complex Data Tag */
-                    fread(tag,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        fread(tag+1,4,1,mat->fp);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadInt32Data(mat,complex_data->Im,
-                               packed_type,len);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-                    nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                 complex_data->Re,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-
-                    /* Complex Data Tag */
-                    InflateDataType(mat,matvar->z,tag);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        InflateDataType(mat,matvar->z,tag+1);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                 complex_data->Im,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-                matvar->data = complex_data;
-            } else {
-                matvar->nbytes = len*matvar->data_size;
-                matvar->data   = malloc(matvar->nbytes);
-                if ( !matvar->data ) {
-                    Mat_Critical("Failed to allocate %d bytes",matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt32Data(mat,(mat_int32_t*)matvar->data,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                    nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                 (mat_int32_t*)matvar->data,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-            }
-            break;
-        case MAT_C_INT16:
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    InflateDataType(mat,matvar->z,tag+1);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-#endif
-            } else {
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-                fread(tag,4,1,mat->fp);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(tag+1,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-            }
-            if ( nBytes == 0 ) {
-                matvar->nbytes = 0;
-                break;
-            }
-            for ( i = 0; i < matvar->rank; i++ )
-                len *= matvar->dims[i];
-            matvar->data_size = sizeof(mat_int16_t);
-            matvar->data_type = MAT_T_INT16;
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes = len*matvar->data_size;
-                complex_data = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                if ( NULL == complex_data || NULL == complex_data->Re ||
-                     NULL == complex_data->Im ) {
-                    Mat_Critical("Failed to allocate %d bytes",2*matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt16Data(mat,complex_data->Re,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-
-                    /* Complex Data Tag */
-                    fread(tag,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        fread(tag+1,4,1,mat->fp);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadInt16Data(mat,complex_data->Im,
-                               packed_type,len);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-                    nBytes = ReadCompressedInt16Data(mat,matvar->z,
-                                 complex_data->Re,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-
-                    /* Complex Data Tag */
-                    InflateDataType(mat,matvar->z,tag);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        InflateDataType(mat,matvar->z,tag+1);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadCompressedInt16Data(mat,matvar->z,
-                                 complex_data->Im,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-                matvar->data = complex_data;
-            } else {
-                matvar->nbytes = len*matvar->data_size;
-                matvar->data   = malloc(matvar->nbytes);
-                if ( !matvar->data ) {
-                    Mat_Critical("Failed to allocate %d bytes",matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt16Data(mat,(mat_int16_t*)matvar->data,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                    nBytes = ReadCompressedInt16Data(mat,matvar->z,
-                                 (mat_int16_t*)matvar->data,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-            }
-            break;
-        case MAT_C_UINT16:
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    InflateDataType(mat,matvar->z,tag+1);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-#endif
-            } else {
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-                fread(tag,4,1,mat->fp);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(tag+1,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-            }
-            if ( nBytes == 0 ) {
-                matvar->nbytes = 0;
-                break;
-            }
-            for ( i = 0; i < matvar->rank; i++ )
-                len *= matvar->dims[i];
-            matvar->data_size = sizeof(mat_uint16_t);
-            matvar->data_type = MAT_T_UINT16;
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes = len*matvar->data_size;
-                complex_data = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                if ( NULL == complex_data || NULL == complex_data->Re ||
-                     NULL == complex_data->Im ) {
-                    Mat_Critical("Failed to allocate %d bytes",2*matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt16Data(mat,complex_data->Re,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-
-                    /* Complex Data Tag */
-                    fread(tag,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        fread(tag+1,4,1,mat->fp);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadInt16Data(mat,complex_data->Im,
-                               packed_type,len);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-                    nBytes = ReadCompressedInt16Data(mat,matvar->z,
-                                 complex_data->Re,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-
-                    /* Complex Data Tag */
-                    InflateDataType(mat,matvar->z,tag);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        InflateDataType(mat,matvar->z,tag+1);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadCompressedInt16Data(mat,matvar->z,
-                                 complex_data->Im,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-                matvar->data = complex_data;
-            } else {
-                matvar->nbytes = len*matvar->data_size;
-                matvar->data   = malloc(matvar->nbytes);
-                if ( !matvar->data ) {
-                    Mat_Critical("Failed to allocate %d bytes",matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt16Data(mat,(mat_int16_t*)matvar->data,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                    nBytes = ReadCompressedInt16Data(mat,matvar->z,
-                                 (mat_int16_t*)matvar->data,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-            }
-            break;
-        case MAT_C_INT8:
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    InflateDataType(mat,matvar->z,tag+1);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-#endif
-            } else {
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-                fread(tag,4,1,mat->fp);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(tag+1,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-            }
-            if ( nBytes == 0 ) {
-                matvar->nbytes = 0;
-                break;
-            }
-            for ( i = 0; i < matvar->rank; i++ )
-                len *= matvar->dims[i];
-            matvar->data_size = sizeof(mat_int8_t);
-            matvar->data_type = MAT_T_INT8;
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes = len*matvar->data_size;
-                complex_data = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                if ( NULL == complex_data || NULL == complex_data->Re ||
-                     NULL == complex_data->Im ) {
-                    Mat_Critical("Failed to allocate %d bytes",2*matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt8Data(mat,complex_data->Re,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-
-                    /* Complex Data Tag */
-                    fread(tag,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        fread(tag+1,4,1,mat->fp);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadInt8Data(mat,complex_data->Im,
-                               packed_type,len);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-                    nBytes = ReadCompressedInt8Data(mat,matvar->z,
-                                 complex_data->Re,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-
-                    /* Complex Data Tag */
-                    InflateDataType(mat,matvar->z,tag);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        InflateDataType(mat,matvar->z,tag+1);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadCompressedInt8Data(mat,matvar->z,
-                                 complex_data->Im,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-                matvar->data = complex_data;
-            } else {
-                matvar->nbytes = len*matvar->data_size;
-                matvar->data   = malloc(matvar->nbytes);
-                if ( !matvar->data ) {
-                    Mat_Critical("Failed to allocate %d bytes",matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt8Data(mat,(mat_int8_t*)matvar->data,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                    nBytes = ReadCompressedInt8Data(mat,matvar->z,
-                                 (mat_int8_t*)matvar->data,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-            }
-            break;
-        case MAT_C_UINT8:
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    InflateDataType(mat,matvar->z,tag+1);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-#endif
-            } else {
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-                fread(tag,4,1,mat->fp);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(tag+1,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-            }
-            if ( nBytes == 0 ) {
-                matvar->nbytes = 0;
-                break;
-            }
-            for ( i = 0; i < matvar->rank; i++ )
-                len *= matvar->dims[i];
-            matvar->data_size = sizeof(mat_uint8_t);
-            matvar->data_type = MAT_T_UINT8;
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                matvar->nbytes = len*matvar->data_size;
-                complex_data = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(matvar->nbytes);
-                complex_data->Im = malloc(matvar->nbytes);
-                if ( NULL == complex_data || NULL == complex_data->Re ||
-                     NULL == complex_data->Im ) {
-                    Mat_Critical("Failed to allocate %d bytes",2*matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt8Data(mat,complex_data->Re,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-
-                    /* Complex Data Tag */
-                    fread(tag,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        fread(tag+1,4,1,mat->fp);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadInt8Data(mat,complex_data->Im,
-                               packed_type,len);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-                    nBytes = ReadCompressedInt8Data(mat,matvar->z,
-                                 complex_data->Re,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-
-                    /* Complex Data Tag */
-                    InflateDataType(mat,matvar->z,tag);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag);
-
-                    packed_type = tag[0] & 0x000000ff;
-                    if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                        data_in_tag = 1;
-                        nBytes = (tag[0] & 0xffff0000) >> 16;
-                    } else {
-                        data_in_tag = 0;
-                        InflateDataType(mat,matvar->z,tag+1);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag+1);
-                        nBytes = tag[1];
-                    }
-                    nBytes = ReadCompressedInt8Data(mat,matvar->z,
-                                 complex_data->Im,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-                matvar->data = complex_data;
-            } else {
-                matvar->nbytes = len*matvar->data_size;
-                matvar->data   = malloc(matvar->nbytes);
-                if ( !matvar->data ) {
-                    Mat_Critical("Failed to allocate %d bytes",matvar->nbytes);
-                    break;
-                }
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt8Data(mat,(mat_int8_t*)matvar->data,
-                                 packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                    nBytes = ReadCompressedInt8Data(mat,matvar->z,
-                                 (mat_int8_t*)matvar->data,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-            }
-            break;
-            break;
-        case MAT_C_CHAR:
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    InflateDataType(mat,matvar->z,tag+1);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-#endif
-            } else {
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-                fread(tag,4,1,mat->fp);
-                if ( byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    nBytes = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(tag+1,4,1,mat->fp);
-                    if ( byteswap )
-                        (void)Mat_uint32Swap(tag+1);
-                    nBytes = tag[1];
-                }
-            }
-            if ( nBytes == 0 ) {
-                matvar->nbytes = 0;
-                break;
-            }
-            for ( i = 0; i < matvar->rank; i++ )
-                len *= matvar->dims[i];
-            matvar->data_size = sizeof(char);
-            /* FIXME: */
-            matvar->data_type = MAT_T_UINT8;
-            matvar->nbytes = len*matvar->data_size;
-            matvar->data   = calloc(matvar->nbytes+1,1);
-            if ( !matvar->data ) {
-                Mat_Critical("Failed to allocate %d bytes",matvar->nbytes);
-                break;
-            }
-            if ( matvar->compression == COMPRESSION_NONE) {
-                nBytes = ReadCharData(mat,(char*)matvar->data,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                if ( (nBytes % 8) != 0 )
-                    fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-            } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                nBytes = ReadCompressedCharData(mat,matvar->z,
-                             (char*)matvar->data,packed_type,len);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                if ( (nBytes % 8) != 0 )
-                    InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-            }
-            break;
-        case MAT_C_STRUCT:
-        {
-            matvar_t **fields;
-            int nfields = 0;
-
-            if ( !matvar->nbytes || !matvar->data_size || NULL == matvar->data )
-                break;
-            nfields = matvar->nbytes / matvar->data_size;
-            fields = (matvar_t **)matvar->data;
-            for ( i = 0; i < nfields; i++ ) {
-                fields[i]->fp = mat;
-                Read5(mat,fields[i]);
-            }
-            /* FIXME: */
-            matvar->data_type = MAT_T_STRUCT;
-            break;
-        }
-        case MAT_C_CELL:
-        {
-            matvar_t **cells;
-
-            if ( !matvar->data ) {
-                Mat_Critical("Data is NULL for Cell Array %s",matvar->name);
-                break;
-            }
-            for ( i = 0; i < matvar->rank; i++ )
-                len *= matvar->dims[i];
-            cells = (matvar_t **)matvar->data;
-            for ( i = 0; i < len; i++ ) {
-                cells[i]->fp = mat;
-                Read5(mat,cells[i]);
-            }
-            /* FIXME: */
-            matvar->data_type = MAT_T_CELL;
-            break;
-        }
-        case MAT_C_SPARSE:
-        {
-            int N;
-            sparse_t *data;
-
-            matvar->data_size = sizeof(sparse_t);
-            matvar->data      = malloc(matvar->data_size);
-            if ( matvar->data == NULL ) {
-                Mat_Critical("ReadData: Allocation of data pointer failed");
-                break;
-            }
-            data = matvar->data;
-            data->nzmax  = matvar->nbytes;
-            fseek(mat->fp,matvar->datapos,SEEK_SET);
-            /*  Read ir    */
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( mat->byteswap )
-                    (void)Mat_uint32Swap(tag);
-
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    N = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    (void)ReadCompressedInt32Data(mat,matvar->z,
-                             (mat_int32_t*)&N,MAT_T_INT32,1);
-                }
-#endif
-            } else {
-                fread(tag,4,1,mat->fp);
-                if ( mat->byteswap )
-                    (void)Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    N = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(&N,4,1,mat->fp);
-                    if ( mat->byteswap )
-                        Mat_int32Swap(&N);
-                }
-            }
-            data->nir = N / 4;
-            data->ir = malloc(data->nir*sizeof(mat_int32_t));
-            if ( data->ir != NULL ) {
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt32Data(mat,data->ir,packed_type,data->nir);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                    nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                 data->ir,packed_type,data->nir);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-            } else {
-                Mat_Critical("ReadData: Allocation of ir pointer failed");
-                break;
-            }
-            /*  Read jc    */
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( mat->byteswap )
-                    Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    N = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    (void)ReadCompressedInt32Data(mat,matvar->z,
-                             (mat_int32_t*)&N,MAT_T_INT32,1);
-                }
-#endif
-            } else {
-                fread(tag,4,1,mat->fp);
-                if ( mat->byteswap )
-                    Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    N = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(&N,4,1,mat->fp);
-                    if ( mat->byteswap )
-                        Mat_int32Swap(&N);
-                }
-            }
-            data->njc = N / 4;
-            data->jc = malloc(data->njc*sizeof(mat_int32_t));
-            if ( data->jc != NULL ) {
-                if ( matvar->compression == COMPRESSION_NONE) {
-                    nBytes = ReadInt32Data(mat,data->jc,packed_type,data->njc);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                } else if ( matvar->compression == COMPRESSION_ZLIB) {
-                    nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                 data->jc,packed_type,data->njc);
-                    /*
-                     * If the data was in the tag we started on a 4-byte
-                     * boundary so add 4 to make it an 8-byte
-                     */
-                    if ( data_in_tag )
-                        nBytes+=4;
-                    if ( (nBytes % 8) != 0 )
-                        InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif
-                }
-            } else {
-                Mat_Critical("ReadData: Allocation of jc pointer failed");
-                break;
-            }
-            /*  Read data    */
-            if ( matvar->compression ) {
-#if defined(HAVE_ZLIB)
-                matvar->z->avail_in = 0;
-                InflateDataType(mat,matvar->z,tag);
-                if ( mat->byteswap )
-                    Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    N = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    (void)ReadCompressedInt32Data(mat,matvar->z,
-                             (mat_int32_t*)&N,MAT_T_INT32,1);
-                }
-#endif
-            } else {
-                fread(tag,4,1,mat->fp);
-                if ( mat->byteswap )
-                    Mat_uint32Swap(tag);
-                packed_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                    data_in_tag = 1;
-                    N = (tag[0] & 0xffff0000) >> 16;
-                } else {
-                    data_in_tag = 0;
-                    fread(&N,4,1,mat->fp);
-                    if ( mat->byteswap )
-                        Mat_int32Swap(&N);
-                }
-            }
-#if defined(EXTENDED_SPARSE)
-            matvar->data_type = packed_type;
-#else
-            matvar->data_type = MAT_T_DOUBLE;
-#endif
-            data->ndata = N / Mat_SizeOf(packed_type);
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data;
-
-                complex_data = malloc(sizeof(*complex_data));
-                complex_data->Re = malloc(data->ndata*
-                                          Mat_SizeOf(matvar->data_type));
-                complex_data->Im = malloc(data->ndata*
-                                          Mat_SizeOf(matvar->data_type));
-                if ( NULL == complex_data || NULL == complex_data->Re ||
-                     NULL == complex_data->Im ) {
-                    if ( matvar->compression == COMPRESSION_NONE) {
-#if defined(EXTENDED_SPARSE)
-                        switch ( matvar->data_type ) {
-                            case MAT_T_DOUBLE:
-                                nBytes = ReadDoubleData(mat,complex_data->Re,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_SINGLE:
-                                nBytes = ReadSingleData(mat,complex_data->Re,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT32:
-                                nBytes = ReadInt32Data(mat,complex_data->Re,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT32:
-                                nBytes = ReadInt32Data(mat,complex_data->Re,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT16:
-                                nBytes = ReadInt16Data(mat,complex_data->Re,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT16:
-                                nBytes = ReadInt16Data(mat,complex_data->Re,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT8:
-                                nBytes = ReadInt8Data(mat,complex_data->Re,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT8:
-                                nBytes = ReadInt8Data(mat,complex_data->Re,
-                                    packed_type,data->ndata);
-                                break;
-                        }
-#else
-                        nBytes = ReadDoubleData(mat,complex_data->Re,
-                                     packed_type,data->ndata);
-#endif
-                        if ( data_in_tag )
-                            nBytes+=4;
-                        if ( (nBytes % 8) != 0 )
-                            fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-
-                        /* Complex Data Tag */
-                        fread(tag,4,1,mat->fp);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag);
-                        packed_type = tag[0] & 0x000000ff;
-                        if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                            data_in_tag = 1;
-                            nBytes = (tag[0] & 0xffff0000) >> 16;
-                        } else {
-                            data_in_tag = 0;
-                            fread(tag+1,4,1,mat->fp);
-                            if ( byteswap )
-                                (void)Mat_uint32Swap(tag+1);
-                            nBytes = tag[1];
-                        }
-#if defined(EXTENDED_SPARSE)
-                        switch ( matvar->data_type ) {
-                            case MAT_T_DOUBLE:
-                                nBytes = ReadDoubleData(mat,complex_data->Im,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_SINGLE:
-                                nBytes = ReadSingleData(mat,complex_data->Im,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT32:
-                                nBytes = ReadInt32Data(mat,complex_data->Im,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT32:
-                                nBytes = ReadUInt32Data(mat,complex_data->Im,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT16:
-                                nBytes = ReadInt16Data(mat,complex_data->Im,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT16:
-                                nBytes = ReadUInt16Data(mat,complex_data->Im,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT8:
-                                nBytes = ReadInt8Data(mat,complex_data->Im,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT8:
-                                nBytes = ReadUInt8Data(mat,complex_data->Im,
-                                    packed_type,data->ndata);
-                                break;
-                        }
-#else /* EXTENDED_SPARSE */
-                        nBytes = ReadDoubleData(mat,complex_data->Im,
-                                     packed_type,data->ndata);
-#endif /* EXTENDED_SPARSE */
-                        if ( data_in_tag )
-                            nBytes+=4;
-                        if ( (nBytes % 8) != 0 )
-                            fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                    } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-#if defined(EXTENDED_SPARSE)
-                        switch ( matvar->data_type ) {
-                            case MAT_T_DOUBLE:
-                                nBytes = ReadCompressedDoubleData(mat,matvar->z,
-                                     complex_data->Re,packed_type,data->ndata);
-                                break;
-                            case MAT_T_SINGLE:
-                                nBytes = ReadCompressedSingleData(mat,matvar->z,
-                                     complex_data->Re,packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT32:
-                                nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                     complex_data->Re,packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT32:
-                                nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                     complex_data->Re,packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT16:
-                                nBytes = ReadCompressedInt16Data(mat,matvar->z,
-                                     complex_data->Re,packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT16:
-                                nBytes = ReadCompressedInt16Data(mat,matvar->z,
-                                     complex_data->Re,packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT8:
-                                nBytes = ReadCompressedInt8Data(mat,matvar->z,
-                                     complex_data->Re,packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT8:
-                                nBytes = ReadCompressedInt8Data(mat,matvar->z,
-                                     complex_data->Re,packed_type,data->ndata);
-                                break;
-                        }
-#else    /* EXTENDED_SPARSE */
-                        nBytes = ReadCompressedDoubleData(mat,matvar->z,
-                                     complex_data->Re,packed_type,data->ndata);
-#endif    /* EXTENDED_SPARSE */
-                        if ( data_in_tag )
-                            nBytes+=4;
-                        if ( (nBytes % 8) != 0 )
-                            InflateSkip(mat,matvar->z,8-(nBytes % 8));
-
-                        /* Complex Data Tag */
-                        InflateDataType(mat,matvar->z,tag);
-                        if ( byteswap )
-                            (void)Mat_uint32Swap(tag);
-
-                        packed_type = tag[0] & 0x000000ff;
-                        if ( tag[0] & 0xffff0000 ) { /* Data is in the tag */
-                            data_in_tag = 1;
-                            nBytes = (tag[0] & 0xffff0000) >> 16;
-                        } else {
-                            data_in_tag = 0;
-                            InflateDataType(mat,matvar->z,tag+1);
-                            if ( byteswap )
-                                (void)Mat_uint32Swap(tag+1);
-                            nBytes = tag[1];
-                        }
-#if defined(EXTENDED_SPARSE)
-                        switch ( matvar->data_type ) {
-                            case MAT_T_DOUBLE:
-                                nBytes = ReadCompressedDoubleData(mat,matvar->z,
-                                     complex_data->Im,packed_type,data->ndata);
-                                break;
-                            case MAT_T_SINGLE:
-                                nBytes = ReadCompressedSingleData(mat,matvar->z,
-                                     complex_data->Im,packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT32:
-                                nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                     complex_data->Im,packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT32:
-                                nBytes = ReadCompressedUInt32Data(mat,matvar->z,
-                                     complex_data->Im,packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT16:
-                                nBytes = ReadCompressedInt16Data(mat,matvar->z,
-                                     complex_data->Im,packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT16:
-                                nBytes = ReadCompressedUInt16Data(mat,matvar->z,
-                                     complex_data->Im,packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT8:
-                                nBytes = ReadCompressedInt8Data(mat,matvar->z,
-                                     complex_data->Im,packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT8:
-                                nBytes = ReadCompressedUInt8Data(mat,matvar->z,
-                                     complex_data->Im,packed_type,data->ndata);
-                                break;
-                        }
-#else    /* EXTENDED_SPARSE */
-                        nBytes = ReadCompressedDoubleData(mat,matvar->z,
-                                     complex_data->Im,packed_type,data->ndata);
-#endif    /* EXTENDED_SPARSE */
-                        if ( data_in_tag )
-                            nBytes+=4;
-                        if ( (nBytes % 8) != 0 )
-                            InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif    /* HAVE_ZLIB */
-                    }
-                } else {
-                    Mat_Critical("ReadData: Allocation of data pointer failed");
-                    break;
-                }
-                data->data = complex_data;
-            } else { /* isComplex */
-                data->data = malloc(data->ndata*Mat_SizeOf(MAT_T_DOUBLE));
-                if ( data->data != NULL ) {
-                    if ( matvar->compression == COMPRESSION_NONE) {
-#if defined(EXTENDED_SPARSE)
-                        switch ( matvar->data_type ) {
-                            case MAT_T_DOUBLE:
-                                nBytes = ReadDoubleData(mat,data->data,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_SINGLE:
-                                nBytes = ReadSingleData(mat,data->data,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT32:
-                                nBytes = ReadInt32Data(mat,data->data,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT32:
-                                nBytes = ReadInt32Data(mat,data->data,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT16:
-                                nBytes = ReadInt16Data(mat,data->data,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT16:
-                                nBytes = ReadInt16Data(mat,data->data,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT8:
-                                nBytes = ReadInt8Data(mat,data->data,
-                                    packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT8:
-                                nBytes = ReadInt8Data(mat,data->data,
-                                    packed_type,data->ndata);
-                                break;
-                        }
-#else
-                        nBytes = ReadDoubleData(mat,data->data,packed_type,
-                                     data->ndata);
-#endif
-                        if ( data_in_tag )
-                            nBytes+=4;
-                        if ( (nBytes % 8) != 0 )
-                            fseek(mat->fp,8-(nBytes % 8),SEEK_CUR);
-#if defined(HAVE_ZLIB)
-                    } else if ( matvar->compression == COMPRESSION_ZLIB) {
-#if defined(EXTENDED_SPARSE)
-                        switch ( matvar->data_type ) {
-                            case MAT_T_DOUBLE:
-                                nBytes = ReadCompressedDoubleData(mat,matvar->z,
-                                     data->data,packed_type,data->ndata);
-                                break;
-                            case MAT_T_SINGLE:
-                                nBytes = ReadCompressedSingleData(mat,matvar->z,
-                                     data->data,packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT32:
-                                nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                     data->data,packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT32:
-                                nBytes = ReadCompressedInt32Data(mat,matvar->z,
-                                     data->data,packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT16:
-                                nBytes = ReadCompressedInt16Data(mat,matvar->z,
-                                     data->data,packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT16:
-                                nBytes = ReadCompressedInt16Data(mat,matvar->z,
-                                     data->data,packed_type,data->ndata);
-                                break;
-                            case MAT_T_INT8:
-                                nBytes = ReadCompressedInt8Data(mat,matvar->z,
-                                     data->data,packed_type,data->ndata);
-                                break;
-                            case MAT_T_UINT8:
-                                nBytes = ReadCompressedInt8Data(mat,matvar->z,
-                                     data->data,packed_type,data->ndata);
-                                break;
-                        }
-#else   /* EXTENDED_SPARSE */
-                        nBytes = ReadCompressedDoubleData(mat,matvar->z,
-                                     data->data,packed_type,data->ndata);
-#endif   /* EXTENDED_SPARSE */
-                        if ( data_in_tag )
-                            nBytes+=4;
-                        if ( (nBytes % 8) != 0 )
-                            InflateSkip(mat,matvar->z,8-(nBytes % 8));
-#endif   /* HAVE_ZLIB */
-                    }
-                } else {
-                    Mat_Critical("ReadData: Allocation of data pointer failed");
-                    break;
-                }
-            }
-            break;
-        }
-        case MAT_C_FUNCTION:
-        {
-            matvar_t **functions;
-            int nfunctions = 0;
-
-            if ( !matvar->nbytes || !matvar->data_size )
-                break;
-            nfunctions = matvar->nbytes / matvar->data_size;
-            functions = (matvar_t **)matvar->data;
-            for ( i = 0; i < nfunctions; i++ ) {
-                functions[i]->fp = mat;
-                Read5(mat,functions[i]);
-            }
-            /* FIXME: */
-            matvar->data_type = MAT_T_FUNCTION;
-            break;
-        }
-        default:
-            Mat_Critical("Read5: %d is not a supported Class", matvar->class_type);
-    }
-    fseek(mat->fp,fpos,SEEK_SET);
-
-    return;
-}
-
-/** @brief Reads a slab of data from the mat variable @c matvar
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param matvar pointer to the mat variable
- * @param data pointer to store the read data in (must be of size
- *             edge[0]*...edge[rank-1]*Mat_SizeOfClass(matvar->class_type))
- * @param start index to start reading data in each dimension
- * @param stride write data every @c stride elements in each dimension
- * @param edge number of elements to read in each dimension
- * @retval 0 on success
- */
-int 
-ReadData5(mat_t *mat,matvar_t *matvar,void *data, 
-    int *start,int *stride,int *edge)
-{               
-    int err = 0,real_bytes;
-    mat_int32_t tag[2];
-#if defined(HAVE_ZLIB)
-    z_stream z;
-
-    err = inflateCopy(&z,matvar->z);
-#endif
-
-    fseek(mat->fp,matvar->datapos,SEEK_SET);
-    if ( matvar->compression == COMPRESSION_NONE ) {
-        fread(tag,4,2,mat->fp);
-        if ( mat->byteswap ) {
-            Mat_int32Swap(tag);
-            Mat_int32Swap(tag+1);
-        }
-        matvar->data_type = tag[0] & 0x000000ff;
-        if ( tag[0] & 0xffff0000 ) { /* Data is packed in the tag */
-            fseek(mat->fp,-4,SEEK_CUR);
-            real_bytes = 4+(tag[0] >> 16);
-        } else {
-            real_bytes = 8+tag[1];
-        }
-#if defined(HAVE_ZLIB)
-    } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-        z.avail_in = 0;
-        InflateDataType(mat,&z,tag);
-        if ( mat->byteswap ) {
-            Mat_int32Swap(tag);
-        }
-        matvar->data_type = tag[0] & 0x000000ff;
-        if ( !(tag[0] & 0xffff0000) ) {/* Data is NOT packed in the tag */
-            /* We're cheating, but InflateDataType just inflates 4 bytes */
-            InflateDataType(mat,&z,tag+1);
-            if ( mat->byteswap ) {
-                Mat_int32Swap(tag+1);
-            }
-            real_bytes = 8+tag[1];
-        } else {
-            real_bytes = 4+(tag[0] >> 16);
-        }
-#endif
-    }
-    if ( real_bytes % 8 )
-        real_bytes += (8-(real_bytes % 8));
-
-    if ( matvar->rank == 2 ) {
-        if ( stride[0]*(edge[0]-1)+start[0]+1 > matvar->dims[0] )
-            err = 1;
-        else if ( stride[1]*(edge[1]-1)+start[1]+1 > matvar->dims[1] )
-            err = 1;
-        else if ( matvar->compression == COMPRESSION_NONE ) {
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data = data;
-
-                ReadDataSlab2(mat,complex_data->Re,matvar->class_type,
-                    matvar->data_type,matvar->dims,start,stride,edge);
-                fseek(mat->fp,matvar->datapos+real_bytes,SEEK_SET);
-                fread(tag,4,2,mat->fp);
-                if ( mat->byteswap ) {
-                    Mat_int32Swap(tag);
-                    Mat_int32Swap(tag+1);
-                }
-                matvar->data_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is packed in the tag */
-                    fseek(mat->fp,-4,SEEK_CUR);
-                }
-                ReadDataSlab2(mat,complex_data->Im,matvar->class_type,
-                              matvar->data_type,matvar->dims,start,stride,edge);
-            } else {
-                ReadDataSlab2(mat,data,matvar->class_type,
-                    matvar->data_type,matvar->dims,start,stride,edge);
-            }
-        }
-#if defined(HAVE_ZLIB)
-        else if ( matvar->compression == COMPRESSION_ZLIB ) {
-            if ( matvar->isComplex ) {
-                struct ComplexSplit *complex_data = data;
-
-                ReadCompressedDataSlab2(mat,&z,complex_data->Re,
-                    matvar->class_type,matvar->data_type,matvar->dims,
-                    start,stride,edge);
-
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-
-                /* Reset zlib knowledge to before reading real tag */
-                inflateEnd(&z);
-                err = inflateCopy(&z,matvar->z);
-                InflateSkip(mat,&z,real_bytes);
-                z.avail_in = 0;
-                InflateDataType(mat,&z,tag);
-                if ( mat->byteswap ) {
-                    Mat_int32Swap(tag);
-                }
-                matvar->data_type = tag[0] & 0x000000ff;
-                if ( !(tag[0] & 0xffff0000) ) {/*Data is NOT packed in the tag*/
-                    InflateSkip(mat,&z,4);
-                }
-                ReadCompressedDataSlab2(mat,&z,complex_data->Im,
-                    matvar->class_type,matvar->data_type,matvar->dims,
-                    start,stride,edge);
-                inflateEnd(&z);
-            } else {
-                ReadCompressedDataSlab2(mat,&z,data,matvar->class_type,
-                    matvar->data_type,matvar->dims,start,stride,edge);
-            }
-        }
-#endif
-    } else {
-        if ( matvar->compression == COMPRESSION_NONE ) {
-            if ( matvar->isComplex ) {
-                int i;
-                struct ComplexSplit *complex_data = data;
-
-                ReadDataSlabN(mat,complex_data->Re,matvar->class_type,
-                    matvar->data_type,matvar->rank,matvar->dims,
-                    start,stride,edge);
-
-                fseek(mat->fp,matvar->datapos+real_bytes,SEEK_SET);
-                fread(tag,4,2,mat->fp);
-                if ( mat->byteswap ) {
-                    Mat_int32Swap(tag);
-                    Mat_int32Swap(tag+1);
-                }
-                matvar->data_type = tag[0] & 0x000000ff;
-                if ( tag[0] & 0xffff0000 ) { /* Data is packed in the tag */
-                    fseek(mat->fp,-4,SEEK_CUR);
-                }
-                ReadDataSlabN(mat,complex_data->Im,matvar->class_type,
-                    matvar->data_type,matvar->rank,matvar->dims,
-                    start,stride,edge);
-            } else {
-                ReadDataSlabN(mat,data,matvar->class_type,matvar->data_type,
-                    matvar->rank,matvar->dims,start,stride,edge);
-            }
-        }
-#if defined(HAVE_ZLIB)
-        else if ( matvar->compression == COMPRESSION_ZLIB ) {
-            if ( matvar->isComplex ) {
-                int i;
-                struct ComplexSplit *complex_data = data;
-
-                ReadCompressedDataSlabN(mat,&z,complex_data->Re,
-                    matvar->class_type,matvar->data_type,matvar->rank,
-                    matvar->dims,start,stride,edge);
-
-                fseek(mat->fp,matvar->datapos,SEEK_SET);
-                /* Reset zlib knowledge to before reading real tag */
-                inflateEnd(&z);
-                err = inflateCopy(&z,matvar->z);
-                InflateSkip(mat,&z,real_bytes);
-                z.avail_in = 0;
-                InflateDataType(mat,&z,tag);
-                if ( mat->byteswap ) {
-                    Mat_int32Swap(tag);
-                }
-                matvar->data_type = tag[0] & 0x000000ff;
-                if ( !(tag[0] & 0xffff0000) ) {/*Data is NOT packed in the tag*/
-                    InflateSkip(mat,&z,4);
-                }
-                ReadCompressedDataSlabN(mat,&z,complex_data->Im,
-                    matvar->class_type,matvar->data_type,matvar->rank,
-                    matvar->dims,start,stride,edge);
-                inflateEnd(&z);
-            } else {
-                ReadCompressedDataSlabN(mat,&z,data,matvar->class_type,
-                    matvar->data_type,matvar->rank,matvar->dims,
-                    start,stride,edge);
-            }
-        }
-#endif
-    }
-    if ( err )
-        return err;
-
-    switch(matvar->class_type) {
-        case MAT_C_DOUBLE:
-            matvar->data_type = MAT_T_DOUBLE;
-            matvar->data_size = sizeof(double);
-            break;
-        case MAT_C_SINGLE:
-            matvar->data_type = MAT_T_SINGLE;
-            matvar->data_size = sizeof(float);
-            break;
-#ifdef HAVE_MAT_INT64_T
-        case MAT_C_INT64:
-            matvar->data_type = MAT_T_INT64;
-            matvar->data_size = sizeof(mat_int64_t);
-            break;
-#endif /* HAVE_MAT_INT64_T */
-#ifdef HAVE_MAT_UINT64_T
-        case MAT_C_UINT64:
-            matvar->data_type = MAT_T_UINT64;
-            matvar->data_size = sizeof(mat_uint64_t);
-            break;
-#endif /* HAVE_MAT_UINT64_T */
-        case MAT_C_INT32:
-            matvar->data_type = MAT_T_INT32;
-            matvar->data_size = sizeof(mat_int32_t);
-            break;
-        case MAT_C_UINT32:
-            matvar->data_type = MAT_T_UINT32;
-            matvar->data_size = sizeof(mat_uint32_t);
-            break;
-        case MAT_C_INT16:
-            matvar->data_type = MAT_T_INT16;
-            matvar->data_size = sizeof(mat_int16_t);
-            break;
-        case MAT_C_UINT16:
-            matvar->data_type = MAT_T_UINT16;
-            matvar->data_size = sizeof(mat_uint16_t);
-            break;
-        case MAT_C_INT8:
-            matvar->data_type = MAT_T_INT8;
-            matvar->data_size = sizeof(mat_int8_t);
-            break;
-        case MAT_C_UINT8:
-            matvar->data_type = MAT_T_UINT8;
-            matvar->data_size = sizeof(mat_uint8_t);
-            break;
-    }
-
-    return err;
-}
-
-/** @brief Writes a matlab variable to a version 5 matlab file
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param matvar pointer to the mat variable
- * @param compress option to compress the variable
- *                 (only works for numeric types)
- * @retval 0 on success
- */
-int
-Write5(mat_t *mat,matvar_t *matvar,int compress)
-{
-    mat_uint32_t array_flags = 0x0;
-    mat_int16_t  fieldname_type = MAT_T_INT32,fieldname_data_size=4;
-    mat_int8_t  pad1 = 0;
-    int      array_flags_type = MAT_T_UINT32, dims_array_type = MAT_T_INT32;
-    int      array_flags_size = 8, pad4 = 0, matrix_type = MAT_T_MATRIX;
-    int      nBytes, i, nmemb = 1,nzmax = 0;
-    long     start = 0, end = 0;
-
-    /* FIXME: SEEK_END is not Guaranteed by the C standard */
-    fseek(mat->fp,0,SEEK_END);         /* Always write at end of file */
-
-
-    if ( compress == COMPRESSION_NONE ) {
-        fwrite(&matrix_type,4,1,mat->fp);
-        fwrite(&pad4,4,1,mat->fp);
-        start = ftell(mat->fp);
-
-        /* Array Flags */
-
-        array_flags = matvar->class_type & MAT_F_CLASS_T;
-        if ( matvar->isComplex )
-            array_flags |= MAT_F_COMPLEX;
-        if ( matvar->isGlobal )
-            array_flags |= MAT_F_GLOBAL;
-        if ( matvar->isLogical )
-            array_flags |= MAT_F_LOGICAL;
-        if ( matvar->class_type == MAT_C_SPARSE )
-            nzmax = ((sparse_t *)matvar->data)->nzmax;
-
-        fwrite(&array_flags_type,4,1,mat->fp);
-        fwrite(&array_flags_size,4,1,mat->fp);
-        fwrite(&array_flags,4,1,mat->fp);
-        fwrite(&nzmax,4,1,mat->fp);
-        /* Rank and Dimension */
-        nBytes = matvar->rank * 4;
-        fwrite(&dims_array_type,4,1,mat->fp);
-        fwrite(&nBytes,4,1,mat->fp);
-        for ( i = 0; i < matvar->rank; i++ ) {
-            mat_int32_t dim;
-            dim = matvar->dims[i];
-            nmemb *= dim;
-            fwrite(&dim,4,1,mat->fp);
-        }
-        if ( matvar->rank % 2 != 0 )
-            fwrite(&pad4,4,1,mat->fp);
-        /* Name of variable */
-        if ( strlen(matvar->name) <= 4 ) {
-            mat_int32_t  array_name_type = MAT_T_INT8;
-            mat_int32_t array_name_len   = strlen(matvar->name);
-            mat_int8_t  pad1 = 0;
-#if 0
-            fwrite(&array_name_type,2,1,mat->fp);
-            fwrite(&array_name_len,2,1,mat->fp);
-#else
-            array_name_type = (array_name_len << 16) | array_name_type;
-            fwrite(&array_name_type,4,1,mat->fp);
-#endif
-            fwrite(matvar->name,1,array_name_len,mat->fp);
-            for ( i = array_name_len; i < 4; i++ )
-                fwrite(&pad1,1,1,mat->fp);
-        } else {
-            mat_int32_t array_name_type = MAT_T_INT8;
-            mat_int32_t array_name_len  = (mat_int32_t)strlen(matvar->name);
-            mat_int8_t  pad1 = 0;
-
-            fwrite(&array_name_type,4,1,mat->fp);
-            fwrite(&array_name_len,4,1,mat->fp);
-            fwrite(matvar->name,1,array_name_len,mat->fp);
-            if ( array_name_len % 8 )
-                for ( i = array_name_len % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-        }
-
-        matvar->datapos = ftell(mat->fp);
-        switch ( matvar->class_type ) {
-            case MAT_C_DOUBLE:
-            case MAT_C_SINGLE:
-            case MAT_C_INT64:
-            case MAT_C_UINT64:
-            case MAT_C_INT32:
-            case MAT_C_UINT32:
-            case MAT_C_INT16:
-            case MAT_C_UINT16:
-            case MAT_C_INT8:
-            case MAT_C_UINT8:
-            {
-                if ( matvar->isComplex ) {
-                    struct ComplexSplit *complex_data = matvar->data;
-                    nBytes = WriteData(mat,complex_data->Re,nmemb,
-                        matvar->data_type);
-                    if ( nBytes % 8 )
-                        for ( i = nBytes % 8; i < 8; i++ )
-                            fwrite(&pad1,1,1,mat->fp);
-                    nBytes = WriteData(mat,complex_data->Im,nmemb,
-                        matvar->data_type);
-                    if ( nBytes % 8 )
-                        for ( i = nBytes % 8; i < 8; i++ )
-                            fwrite(&pad1,1,1,mat->fp);
-                } else {
-                    nBytes=WriteData(mat,matvar->data,nmemb,matvar->data_type);
-                    if ( nBytes % 8 )
-                        for ( i = nBytes % 8; i < 8; i++ )
-                            fwrite(&pad1,1,1,mat->fp);
-                }
-                break;
-            }
-            case MAT_C_CHAR:
-            {
-                /* Check for a NULL character array */
-                if ( matvar->data != NULL && nmemb > 0 )
-                    WriteCharData(mat,matvar->data,nmemb,matvar->data_type);
-                break;
-            }
-            case MAT_C_CELL:
-            {
-                int        ncells;
-                matvar_t **cells = (matvar_t **)matvar->data;
-
-                /* Check for an empty cell array */
-                if ( matvar->nbytes == 0 || matvar->data_size == 0 ||
-                     matvar->data   == NULL )
-                    break;
-                ncells  = matvar->nbytes / matvar->data_size;
-                for ( i = 0; i < ncells; i++ )
-                    WriteCellArrayField(mat,cells[i]);
-                break;
-            }
-            case MAT_C_STRUCT:
-            {
-                char     **fieldnames, *padzero;
-                int        fieldname_size, nfields;
-                size_t     maxlen = 0;
-                matvar_t **fields = (matvar_t **)matvar->data;
-                mat_int32_t array_name_type = MAT_T_INT8;
-                unsigned   fieldname;
-
-                /* Check for a structure with no fields */
-                if ( matvar->nbytes == 0 || matvar->data_size == 0 ||
-                     matvar->data   == NULL ) {
-#if 0
-                    fwrite(&fieldname_type,2,1,mat->fp);
-                    fwrite(&fieldname_data_size,2,1,mat->fp);
-#else
-                    fieldname = (fieldname_data_size<<16) | fieldname_type;
-                    fwrite(&fieldname,4,1,mat->fp);
-#endif
-                    fieldname_size = 1;
-                    fwrite(&fieldname_size,4,1,mat->fp);
-                    fwrite(&array_name_type,4,1,mat->fp);
-                    nBytes = 0;
-                    fwrite(&nBytes,4,1,mat->fp);
-                    break;
-                }
-                nfields = matvar->nbytes / (nmemb*matvar->data_size);
-                fieldnames = malloc(nfields*sizeof(char *));
-                for ( i = 0; i < nfields; i++ ) {
-                    fieldnames[i] = fields[i]->name;
-                    if ( strlen(fieldnames[i]) > maxlen )
-                        maxlen = strlen(fieldnames[i]);
-                }
-                maxlen++;
-                fieldname_size = maxlen;
-                while ( nfields*fieldname_size % 8 != 0 )
-                    fieldname_size++;
-#if 0
-                fwrite(&fieldname_type,2,1,mat->fp);
-                fwrite(&fieldname_data_size,2,1,mat->fp);
-#else
-                fieldname = (fieldname_data_size<<16) | fieldname_type;
-                fwrite(&fieldname,4,1,mat->fp);
-#endif
-                fwrite(&fieldname_size,4,1,mat->fp);
-                fwrite(&array_name_type,4,1,mat->fp);
-                nBytes = nfields*fieldname_size;
-                fwrite(&nBytes,4,1,mat->fp);
-                padzero = calloc(fieldname_size,1);
-                for ( i = 0; i < nfields; i++ ) {
-                    fwrite(fieldnames[i],1,strlen(fieldnames[i]),mat->fp);
-                    fwrite(padzero,1,fieldname_size-strlen(fieldnames[i]),mat->fp);
-                }
-                free(fieldnames);
-                free(padzero);
-                for ( i = 0; i < nmemb*nfields; i++ )
-                    WriteStructField(mat,fields[i]);
-                break;
-            }
-            case MAT_C_SPARSE:
-            {
-                sparse_t *sparse = matvar->data;
-
-                nBytes = WriteData(mat,sparse->ir,sparse->nir,MAT_T_INT32);
-                if ( nBytes % 8 )
-                    for ( i = nBytes % 8; i < 8; i++ )
-                        fwrite(&pad1,1,1,mat->fp);
-                nBytes = WriteData(mat,sparse->jc,sparse->njc,MAT_T_INT32);
-                if ( nBytes % 8 )
-                    for ( i = nBytes % 8; i < 8; i++ )
-                        fwrite(&pad1,1,1,mat->fp);
-                if ( matvar->isComplex ) {
-                    struct ComplexSplit *complex_data = sparse->data;
-                    nBytes = WriteData(mat,complex_data->Re,sparse->ndata,
-                        matvar->data_type);
-                    if ( nBytes % 8 )
-                        for ( i = nBytes % 8; i < 8; i++ )
-                            fwrite(&pad1,1,1,mat->fp);
-                    nBytes = WriteData(mat,complex_data->Im,sparse->ndata,
-                        matvar->data_type);
-                    if ( nBytes % 8 )
-                        for ( i = nBytes % 8; i < 8; i++ )
-                            fwrite(&pad1,1,1,mat->fp);
-                } else {
-                    nBytes = WriteData(mat,sparse->data,sparse->ndata,matvar->data_type);
-                    if ( nBytes % 8 )
-                        for ( i = nBytes % 8; i < 8; i++ )
-                            fwrite(&pad1,1,1,mat->fp);
-                }
-            }
-        }
-#if defined(HAVE_ZLIB)
-    } else if ( compress == COMPRESSION_ZLIB ) {
-        mat_uint32_t comp_buf[512];
-        mat_uint32_t uncomp_buf[512] = {0,};
-        int buf_size = 512, err;
-        size_t byteswritten = 0;
-
-        matvar->z         = calloc(1,sizeof(*matvar->z));
-        matvar->z->zalloc = Z_NULL;
-        matvar->z->zfree  = Z_NULL;
-        err = deflateInit(matvar->z,Z_DEFAULT_COMPRESSION);
-
-        matrix_type = MAT_T_COMPRESSED;
-        fwrite(&matrix_type,4,1,mat->fp);
-        fwrite(&pad4,4,1,mat->fp);
-        start = ftell(mat->fp);
-
-        /* Array Flags */
-        array_flags = matvar->class_type & MAT_F_CLASS_T;
-        if ( matvar->isComplex )
-            array_flags |= MAT_F_COMPLEX;
-        if ( matvar->isGlobal )
-            array_flags |= MAT_F_GLOBAL;
-        if ( matvar->isLogical )
-            array_flags |= MAT_F_LOGICAL;
-        if ( matvar->class_type == MAT_C_SPARSE )
-            nzmax = ((sparse_t *)matvar->data)->nzmax;
-
-        uncomp_buf[0] = MAT_T_MATRIX;
-        uncomp_buf[1] = (int)GetMatrixMaxBufSize(matvar);
-        matvar->z->next_out  = comp_buf;
-        matvar->z->next_in   = uncomp_buf;
-        matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-        matvar->z->avail_in  = 8;
-        err = deflate(matvar->z,Z_NO_FLUSH);
-        byteswritten += fwrite(comp_buf,1,
-            buf_size*sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-        uncomp_buf[0] = array_flags_type;
-        uncomp_buf[1] = array_flags_size;
-        uncomp_buf[2] = array_flags;
-        uncomp_buf[3] = nzmax;
-        /* Rank and Dimension */
-        nBytes = matvar->rank * 4;
-        uncomp_buf[4] = dims_array_type;
-        uncomp_buf[5] = nBytes;
-        for ( i = 0; i < matvar->rank; i++ ) {
-            mat_int32_t dim;
-            dim = matvar->dims[i];
-            nmemb *= dim;
-            uncomp_buf[6+i] = dim;
-        }
-        if ( matvar->rank % 2 != 0 ) {
-            uncomp_buf[6+i] = pad4;
-            i++;
-        }
-
-        matvar->z->next_out  = comp_buf;
-        matvar->z->next_in   = uncomp_buf;
-        matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-        matvar->z->avail_in  = (6+i)*sizeof(*uncomp_buf);
-        err = deflate(matvar->z,Z_NO_FLUSH);
-        byteswritten += fwrite(comp_buf,1,
-                buf_size*sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-        /* Name of variable */
-        if ( strlen(matvar->name) <= 4 ) {
-            mat_int16_t array_name_len = (mat_int16_t)strlen(matvar->name);
-            mat_int16_t array_name_type = MAT_T_INT8;
-
-            memset(uncomp_buf,0,8);
-            uncomp_buf[0] = (array_name_len << 16) | array_name_type;
-            memcpy(uncomp_buf+1,matvar->name,array_name_len);
-            if ( array_name_len % 4 )
-                array_name_len += 4-(array_name_len % 4);
-
-            matvar->z->next_out  = comp_buf;
-            matvar->z->next_in   = uncomp_buf;
-            matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-            matvar->z->avail_in  = 8;
-            err = deflate(matvar->z,Z_NO_FLUSH);
-            byteswritten += fwrite(comp_buf,1,
-                    buf_size*sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-        } else {
-            mat_int32_t array_name_len = (mat_int32_t)strlen(matvar->name);
-            mat_int32_t array_name_type = MAT_T_INT8;
-
-            memset(uncomp_buf,0,buf_size*sizeof(*uncomp_buf));
-            uncomp_buf[0] = array_name_type;
-            uncomp_buf[1] = array_name_len;
-            memcpy(uncomp_buf+2,matvar->name,array_name_len);
-            if ( array_name_len % 8 )
-                array_name_len += 8-(array_name_len % 8);
-            matvar->z->next_out  = comp_buf;
-            matvar->z->next_in   = uncomp_buf;
-            matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-            matvar->z->avail_in  = 8+array_name_len;
-            err = deflate(matvar->z,Z_NO_FLUSH);
-            byteswritten += fwrite(comp_buf,1,
-                    buf_size*sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-        }
-        matvar->datapos = ftell(mat->fp);
-        switch ( matvar->class_type ) {
-            case MAT_C_DOUBLE:
-            case MAT_C_SINGLE:
-            case MAT_C_INT64:
-            case MAT_C_UINT64:
-            case MAT_C_INT32:
-            case MAT_C_UINT32:
-            case MAT_C_INT16:
-            case MAT_C_UINT16:
-            case MAT_C_INT8:
-            case MAT_C_UINT8:
-            {
-                /* WriteCompressedData makes sure uncomressed data is aligned
-                 * on an 8-byte boundary */
-                if ( matvar->isComplex ) {
-                    struct ComplexSplit *complex_data = matvar->data;
-
-                    byteswritten += WriteCompressedData(mat,matvar->z,
-                        complex_data->Re,nmemb,matvar->data_type);
-                    byteswritten += WriteCompressedData(mat,matvar->z,
-                        complex_data->Im,nmemb,matvar->data_type);
-                } else {
-                    byteswritten += WriteCompressedData(mat,matvar->z,
-                        matvar->data,nmemb,matvar->data_type);
-                }
-                break;
-            }
-            case MAT_C_CHAR:
-            {
-                /* Check for a NULL character array */
-                if ( matvar->data != NULL && nmemb > 0 )
-                    byteswritten += WriteCompressedCharData(mat,matvar->z,
-                        matvar->data,nmemb,matvar->data_type);
-                break;
-            }
-            case MAT_C_CELL:
-            {
-                int        ncells;
-                matvar_t **cells = (matvar_t **)matvar->data;
-
-                /* Check for an empty cell array */
-                if ( matvar->nbytes == 0 || matvar->data_size == 0 ||
-                     matvar->data   == NULL )
-                    break;
-                ncells  = matvar->nbytes / matvar->data_size;
-                for ( i = 0; i < ncells; i++ )
-                    WriteCompressedCellArrayField(mat,cells[i],matvar->z);
-                break;
-            }
-            case MAT_C_STRUCT:
-            {
-                char     **fieldnames;
-                unsigned char *padzero;
-                int        fieldname_size, nfields;
-                size_t     maxlen = 0;
-                mat_int32_t array_name_type = MAT_T_INT8;
-                matvar_t **fields = (matvar_t **)matvar->data;
-
-                /* Check for a structure with no fields */
-                if ( matvar->nbytes == 0 || matvar->data_size == 0 ||
-                     matvar->data   == NULL ) {
-                    fieldname_size = 1;
-                    uncomp_buf[0] = (fieldname_data_size << 16) | 
-                                     fieldname_type;
-                    uncomp_buf[1] = 1;
-                    uncomp_buf[2] = array_name_type;
-                    uncomp_buf[3] = 0;
-                    matvar->z->next_out  = comp_buf;
-                    matvar->z->next_in   = uncomp_buf;
-                    matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-                    matvar->z->avail_in  = 32;
-                    err = deflate(matvar->z,Z_NO_FLUSH);
-                    byteswritten += fwrite(comp_buf,1,buf_size*
-                        sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-                    break;
-                }
-                nfields = matvar->nbytes / (nmemb*matvar->data_size);
-                fieldnames = malloc(nfields*sizeof(char *));
-                for ( i = 0; i < nfields; i++ ) {
-                    fieldnames[i] = fields[i]->name;
-                    if ( strlen(fieldnames[i]) > maxlen )
-                        maxlen = strlen(fieldnames[i]);
-                }
-                maxlen++;
-                fieldname_size = maxlen;
-                while ( nfields*fieldname_size % 8 != 0 )
-                    fieldname_size++;
-                uncomp_buf[0] = (fieldname_data_size << 16) | fieldname_type;
-                uncomp_buf[1] = fieldname_size;
-                uncomp_buf[2] = array_name_type;
-                uncomp_buf[3] = nfields*fieldname_size;
-
-                padzero = calloc(fieldname_size,1);
-                matvar->z->next_out  = comp_buf;
-                matvar->z->next_in   = uncomp_buf;
-                matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-                matvar->z->avail_in  = 16;
-                err = deflate(matvar->z,Z_NO_FLUSH);
-                byteswritten += fwrite(comp_buf,1,
-                        buf_size*sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-                for ( i = 0; i < nfields; i++ ) {
-                    memset(padzero,'\0',fieldname_size);
-                    memcpy(padzero,fieldnames[i],strlen(fieldnames[i]));
-                    matvar->z->next_out  = comp_buf;
-                    matvar->z->next_in   = padzero;
-                    matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-                    matvar->z->avail_in  = fieldname_size;
-                    err = deflate(matvar->z,Z_NO_FLUSH);
-                    byteswritten += fwrite(comp_buf,1,
-                            buf_size*sizeof(*comp_buf)-matvar->z->avail_out,
-                            mat->fp);
-                }
-                free(fieldnames);
-                free(padzero);
-                for ( i = 0; i < nmemb*nfields; i++ )
-                    byteswritten +=
-                        WriteCompressedStructField(mat,fields[i],matvar->z);
-                break;
-            }
-            case MAT_C_SPARSE:
-            {
-                sparse_t *sparse = matvar->data;
-
-                byteswritten += WriteCompressedData(mat,matvar->z,sparse->ir,
-                    sparse->nir,MAT_T_INT32);
-                byteswritten += WriteCompressedData(mat,matvar->z,sparse->jc,
-                    sparse->njc,MAT_T_INT32);
-                if ( matvar->isComplex ) {
-                    struct ComplexSplit *complex_data = sparse->data;
-                    byteswritten += WriteCompressedData(mat,matvar->z,
-                        complex_data->Re,sparse->ndata,matvar->data_type);
-                    byteswritten += WriteCompressedData(mat,matvar->z,
-                        complex_data->Im,sparse->ndata,matvar->data_type);
-                } else {
-                    byteswritten += WriteCompressedData(mat,matvar->z,
-                        sparse->data,sparse->ndata,matvar->data_type);
-                }
-                break;
-            }
-        }
-        matvar->z->avail_in  = 0;
-        matvar->z->next_in   = NULL;
-        matvar->z->next_out  = comp_buf;
-        matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-
-        err = deflate(matvar->z,Z_FINISH);
-        byteswritten += fwrite(comp_buf,1,
-            buf_size*sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-        while ( err != Z_STREAM_END && !matvar->z->avail_out ) {
-            matvar->z->next_out  = comp_buf;
-            matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-
-            err = deflate(matvar->z,Z_FINISH);
-            byteswritten += fwrite(comp_buf,1,
-                buf_size*sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-        }
-        /* End the compression and set to NULL so Mat_VarFree doesn't try
-         * to free matvar->z with inflateEnd
-         */
-#if 0
-        if ( byteswritten % 8 )
-            for ( i = 0; i < 8-(byteswritten % 8); i++ )
-                fwrite(&pad1,1,1,mat->fp);
-#endif
-        err = deflateEnd(matvar->z);
-        free(matvar->z);
-        matvar->z = NULL;
-#endif
-    }
-    end = ftell(mat->fp);
-    nBytes = (int)(end-start);
-    fseek(mat->fp,(long)-(nBytes+4),SEEK_CUR);
-    fwrite(&nBytes,4,1,mat->fp);
-    fseek(mat->fp,end,SEEK_SET);
-
-    return 0;
-}
-
-/** @brief Writes the variable information and empty data
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param matvar pointer to the mat variable
- */
-void
-WriteInfo5(mat_t *mat, matvar_t *matvar)
-{
-    mat_uint32_t array_flags = 0x0;
-    mat_int16_t  fieldname_type = MAT_T_INT32,fieldname_data_size=4;
-    mat_int8_t  pad1 = 0;
-    int      array_flags_type = MAT_T_UINT32, dims_array_type = MAT_T_INT32;
-    int      array_flags_size = 8, pad4 = 0, matrix_type = MAT_T_MATRIX;
-    int      nBytes, i, nmemb = 1,nzmax;
-    long     start = 0, end = 0;
-
-    /* FIXME: SEEK_END is not Guaranteed by the C standard */
-    fseek(mat->fp,0,SEEK_END);         /* Always write at end of file */
-
-
-    if ( matvar->compression == COMPRESSION_NONE ) {
-        fwrite(&matrix_type,4,1,mat->fp);
-        fwrite(&pad4,4,1,mat->fp);
-        start = ftell(mat->fp);
-
-        /* Array Flags */
-
-        array_flags = matvar->class_type & MAT_F_CLASS_T;
-        if ( matvar->isComplex )
-            array_flags |= MAT_F_COMPLEX;
-        if ( matvar->isGlobal )
-            array_flags |= MAT_F_GLOBAL;
-        if ( matvar->isLogical )
-            array_flags |= MAT_F_LOGICAL;
-        if ( matvar->class_type == MAT_C_SPARSE )
-            nzmax = ((sparse_t *)matvar->data)->nzmax;
-
-        fwrite(&array_flags_type,4,1,mat->fp);
-        fwrite(&array_flags_size,4,1,mat->fp);
-        fwrite(&array_flags,4,1,mat->fp);
-        fwrite(&nzmax,4,1,mat->fp);
-        /* Rank and Dimension */
-        nBytes = matvar->rank * 4;
-        fwrite(&dims_array_type,4,1,mat->fp);
-        fwrite(&nBytes,4,1,mat->fp);
-        for ( i = 0; i < matvar->rank; i++ ) {
-            mat_int32_t dim;
-            dim = matvar->dims[i];
-            nmemb *= dim;
-            fwrite(&dim,4,1,mat->fp);
-        }
-        if ( matvar->rank % 2 != 0 )
-            fwrite(&pad4,4,1,mat->fp);
-        /* Name of variable */
-        if ( strlen(matvar->name) <= 4 ) {
-            mat_int16_t array_name_len = (mat_int16_t)strlen(matvar->name);
-            mat_int8_t  pad1 = 0;
-            mat_int16_t array_name_type = MAT_T_INT8;
-            fwrite(&array_name_type,2,1,mat->fp);
-            fwrite(&array_name_len,2,1,mat->fp);
-            fwrite(matvar->name,1,array_name_len,mat->fp);
-            for ( i = array_name_len; i < 4; i++ )
-                fwrite(&pad1,1,1,mat->fp);
-        } else {
-            mat_int32_t array_name_len = (mat_int32_t)strlen(matvar->name);
-            mat_int8_t  pad1 = 0;
-            mat_int32_t  array_name_type = MAT_T_INT8;
-
-            fwrite(&array_name_type,4,1,mat->fp);
-            fwrite(&array_name_len,4,1,mat->fp);
-            fwrite(matvar->name,1,array_name_len,mat->fp);
-            if ( array_name_len % 8 )
-                for ( i = array_name_len % 8; i < 8; i++ )
-                    fwrite(&pad1,1,1,mat->fp);
-        }
-
-        matvar->datapos = ftell(mat->fp);
-        switch ( matvar->class_type ) {
-            case MAT_C_DOUBLE:
-            case MAT_C_SINGLE:
-            case MAT_C_INT64:
-            case MAT_C_UINT64:
-            case MAT_C_INT32:
-            case MAT_C_UINT32:
-            case MAT_C_INT16:
-            case MAT_C_UINT16:
-            case MAT_C_INT8:
-            case MAT_C_UINT8:
-                nBytes = WriteEmptyData(mat,nmemb,matvar->data_type);
-                if ( nBytes % 8 )
-                    for ( i = nBytes % 8; i < 8; i++ )
-                        fwrite(&pad1,1,1,mat->fp);
-                if ( matvar->isComplex ) {
-                    nBytes = WriteEmptyData(mat,nmemb,matvar->data_type);
-                    if ( nBytes % 8 )
-                        for ( i = nBytes % 8; i < 8; i++ )
-                            fwrite(&pad1,1,1,mat->fp);
-                }
-                break;
-            case MAT_C_CHAR:
-            {
-                WriteEmptyCharData(mat,nmemb,matvar->data_type);
-                break;
-            }
-            case MAT_C_CELL:
-            {
-                int nfields = matvar->nbytes / matvar->data_size;
-                matvar_t **fields = (matvar_t **)matvar->data;
-
-                for ( i = 0; i < nfields; i++ )
-                    WriteCellArrayFieldInfo(mat,fields[i]);
-                break;
-            }
-            case MAT_C_STRUCT:
-            {
-                char **fieldnames, *padzero;
-                int maxlen = 0, fieldname_size;
-                int nfields = matvar->nbytes / matvar->data_size;
-                matvar_t **fields = (matvar_t **)matvar->data;
-                mat_int32_t  array_name_type = MAT_T_INT8;
-                unsigned fieldname;
-
-                fieldnames = malloc(nfields*sizeof(char *));
-                for ( i = 0; i < nfields; i++ ) {
-                    fieldnames[i] = fields[i]->name;
-                    if ( strlen(fieldnames[i]) > maxlen )
-                        maxlen = strlen(fieldnames[i]);
-                }
-                maxlen++;
-                fieldname_size = maxlen;
-                while ( nfields*fieldname_size % 8 != 0 )
-                    fieldname_size++;
-#if 0
-                fwrite(&fieldname_type,2,1,mat->fp);
-                fwrite(&fieldname_data_size,2,1,mat->fp);
-#else
-                fieldname = (fieldname_data_size<<16) | fieldname_type;
-                fwrite(&fieldname,4,1,mat->fp);
-#endif
-                fwrite(&fieldname_size,4,1,mat->fp);
-                fwrite(&array_name_type,4,1,mat->fp);
-                nBytes = nfields*fieldname_size;
-                fwrite(&nBytes,4,1,mat->fp);
-                padzero = calloc(fieldname_size,1);
-                for ( i = 0; i < nfields; i++ ) {
-                    fwrite(fieldnames[i],1,strlen(fieldnames[i]),mat->fp);
-                    fwrite(padzero,1,fieldname_size-strlen(fieldnames[i]),mat->fp);
-                }
-                free(fieldnames);
-                free(padzero);
-                for ( i = 0; i < nfields; i++ )
-                    WriteInfo5(mat,fields[i]);
-                break;
-            }
-        }
-    /* Does not work.
-     * Can write empty data, but how to go back and add the real data?
-     */
-#if 0
-    } else if ( matvar->compression == COMPRESSION_ZLIB ) {
-#if defined(HAVE_ZLIB)
-        mat_uint32_t comp_buf[512];
-        mat_uint32_t uncomp_buf[512] = {0,};
-        int buf_size = 512, err;
-        size_t byteswritten = 0;
-
-        matvar->z         = malloc(sizeof(*matvar->z));
-        matvar->z->zalloc = Z_NULL;
-        matvar->z->zfree  = Z_NULL;
-        err = deflateInit(matvar->z,Z_DEFAULT_COMPRESSION);
-
-        matrix_type = MAT_T_COMPRESSED;
-        fwrite(&matrix_type,4,1,mat->fp);
-        fwrite(&pad4,4,1,mat->fp);
-        start = ftell(mat->fp);
-
-        /* Array Flags */
-
-        array_flags = matvar->class_type & MAT_F_CLASS_T;
-        if ( matvar->isComplex )
-            array_flags |= MAT_F_COMPLEX;
-        if ( matvar->isGlobal )
-            array_flags |= MAT_F_GLOBAL;
-        if ( matvar->isLogical )
-            array_flags |= MAT_F_LOGICAL;
-
-        uncomp_buf[0] = MAT_T_MATRIX;
-        uncomp_buf[1] = 448;
-        matvar->z->next_out  = comp_buf;
-        matvar->z->next_in   = uncomp_buf;
-        matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-        matvar->z->avail_in  = 8;
-        err = deflate(matvar->z,Z_SYNC_FLUSH);
-        byteswritten += fwrite(comp_buf,1,buf_size*sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-        uncomp_buf[0] = array_flags_type;
-        uncomp_buf[1] = array_flags_size;
-        uncomp_buf[2] = array_flags;
-        uncomp_buf[3] = 0;
-        /* Rank and Dimension */
-        nBytes = matvar->rank * 4;
-        uncomp_buf[4] = dims_array_type;
-        uncomp_buf[5] = nBytes;
-        for ( i = 0; i < matvar->rank; i++ ) {
-            mat_int32_t dim;
-            dim = matvar->dims[i];
-            nmemb *= dim;
-            uncomp_buf[6+i] = dim;
-        }
-        if ( matvar->rank % 2 != 0 )
-            uncomp_buf[6+i] = pad4;
-
-        matvar->z->next_out  = comp_buf;
-        matvar->z->next_in   = uncomp_buf;
-        matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-        matvar->z->avail_in  = (6+i)*sizeof(*uncomp_buf);
-        err = deflate(matvar->z,Z_NO_FLUSH);
-        byteswritten += fwrite(comp_buf,1,buf_size*sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-        /* Name of variable */
-        if ( strlen(matvar->name) <= 4 ) {
-#if 0
-            mat_int16_t array_name_len = (mat_int16_t)strlen(matvar->name);
-            mat_int8_t  pad1 = 0;
-
-            uncomp_buf[0] = (array_name_type << 16) | array_name_len;
-            memcpy(uncomp_buf+1,matvar->name,array_name_len);
-
-            matvar->z->next_out  = comp_buf;
-            matvar->z->next_in   = uncomp_buf;
-            matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-            matvar->z->avail_in  = 8;
-            err = deflate(matvar->z,Z_NO_FLUSH);
-            byteswritten += fwrite(comp_buf,1,buf_size*sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-        } else {
-#endif
-            mat_int32_t array_name_len = (mat_int32_t)strlen(matvar->name);
-
-            memset(uncomp_buf,0,buf_size*sizeof(*uncomp_buf));
-            uncomp_buf[0] = array_name_type;
-            uncomp_buf[1] = array_name_len;
-            memcpy(uncomp_buf+2,matvar->name,array_name_len);
-            if ( array_name_len % 8 )
-                array_name_len += array_name_len % 8;
-            matvar->z->next_out  = comp_buf;
-            matvar->z->next_in   = uncomp_buf;
-            matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-            matvar->z->avail_in  = 8+array_name_len;
-            err = deflate(matvar->z,Z_FULL_FLUSH);
-            byteswritten += fwrite(comp_buf,1,buf_size*sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-        }
-        matvar->datapos = ftell(mat->fp);
-        deflateCopy(&z_save,matvar->z);
-        switch ( matvar->class_type ) {
-            case MAT_C_DOUBLE:
-            case MAT_C_SINGLE:
-            case MAT_C_INT32:
-            case MAT_C_UINT32:
-            case MAT_C_INT16:
-            case MAT_C_UINT16:
-            case MAT_C_INT8:
-            case MAT_C_UINT8:
-                byteswritten += WriteCompressedEmptyData(mat,matvar->z,nmemb,matvar->data_type);
-#if 0
-                if ( nBytes % 8 )
-                    for ( i = nBytes % 8; i < 8; i++ )
-                        fwrite(&pad1,1,1,mat->fp);
-                if ( matvar->isComplex ) {
-                    nBytes = WriteEmptyData(mat,nmemb,matvar->data_type);
-                    if ( nBytes % 8 )
-                        for ( i = nBytes % 8; i < 8; i++ )
-                            fwrite(&pad1,1,1,mat->fp);
-                }
-#endif
-                break;
-        }
-        matvar->z->next_out  = comp_buf;
-        matvar->z->next_in   = NULL;
-        matvar->z->avail_out = buf_size*sizeof(*comp_buf);
-        matvar->z->avail_in  = 0;
-
-        err = deflate(matvar->z,Z_FINISH);
-        byteswritten += fwrite(comp_buf,1,buf_size*sizeof(*comp_buf)-matvar->z->avail_out,mat->fp);
-                if ( byteswritten % 8 )
-                    for ( i = byteswritten % 8; i < 8; i++ )
-                        fwrite(&pad1,1,1,mat->fp);
-        fprintf(stderr,"deflate Z_FINISH: err = %d,byteswritten = %u\n",err,byteswritten);
-
-        err = deflateEnd(matvar->z);
-        fprintf(stderr,"deflateEnd: err = %d\n",err);
-#if 1
-        err = deflateEnd(matvar->z);
-        free(matvar->z);
-        matvar->z = NULL;
-#else
-        memcpy(matvar->z,&z_save,sizeof(*matvar->z));
-#endif
-#endif
-#endif
-    }
-    end = ftell(mat->fp);
-    nBytes = (int)(end-start);
-    fseek(mat->fp,(long)-(nBytes+4),SEEK_CUR);
-    fwrite(&nBytes,4,1,mat->fp);
-    fseek(mat->fp,end,SEEK_SET);
-}
-
-/** @brief Prints the mat variable
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param matvar pointer to the mat variable
- */
-void
-Mat_VarPrint5( matvar_t *matvar, int printdata )
-{
-    int i, j;
-
-    if ( matvar == NULL )
-        return;
-    if ( matvar->name )
-        Mat_Message("      Name: %s", matvar->name);
-    Mat_Message("      Rank: %d", matvar->rank);
-    if ( matvar->rank == 0 )
-        return;
-    if ( matvar->isComplex )
-        Mat_Message("Class Type: %s (complex)",class_type_desc[matvar->class_type]);
-    else
-        Mat_Message("Class Type: %s",class_type_desc[matvar->class_type]);
-    if ( matvar->data_type )
-        Mat_Message(" Data Type: %s", data_type_desc[matvar->data_type]);
-    if ( matvar->data != NULL && matvar->data_size > 0 ) {
-        switch( matvar->class_type ) {
-            case MAT_C_DOUBLE:
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if ( matvar->rank == 2 &&
-                         (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%f ", ((double*)matvar->data)[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 ) {
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%f ", ((double*)matvar->data)[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else {
-                    for ( i = 0; i < matvar->nbytes/matvar->data_size; i++ )
-                        printf("%f\n", ((double*)matvar->data)[i]);
-                }
-                break;
-            case MAT_C_SINGLE:
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if ( matvar->rank == 2 &&
-                         (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%f ", ((float*)matvar->data)[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 ) {
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%f ", ((float*)matvar->data)[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else {
-                    for ( i = 0; i < matvar->nbytes/matvar->data_size; i++ )
-                        printf("%f\n", ((float*)matvar->data)[i]);
-                }
-                break;
-#ifdef HAVE_MAT_INT64_T
-            case MAT_C_INT64:
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if ( matvar->rank == 2 &&
-                         (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%d ", ((mat_int64_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 ) {
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%d ", ((mat_uint64_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else {
-                    for ( i = 0; i < matvar->nbytes/matvar->data_size; i++ )
-                        printf("%d\n", ((mat_int64_t*)matvar->data)[i]);
-                }
-                break;
-#endif
-#ifdef HAVE_MAT_UINT64_T
-            case MAT_C_UINT64:
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if ( matvar->rank == 2 &&
-                         (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%u ", ((mat_uint64_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 ) {
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%u ", ((mat_uint64_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else {
-                    for ( i = 0; i < matvar->nbytes/matvar->data_size; i++ )
-                        printf("%u\n", ((mat_int64_t*)matvar->data)[i]);
-                }
-                break;
-#endif /* HAVE_MAT_UINT64_T */
-            case MAT_C_INT32:
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if ( matvar->rank == 2 &&
-                         (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%d ", ((mat_int32_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 ) {
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%d ", ((mat_uint32_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else {
-                    for ( i = 0; i < matvar->nbytes/matvar->data_size; i++ )
-                        printf("%d\n", ((mat_int32_t*)matvar->data)[i]);
-                }
-                break;
-            case MAT_C_UINT32:
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if ( matvar->rank == 2 &&
-                         (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%u ", ((mat_uint32_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 ) {
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%u ", ((mat_uint32_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else {
-                    for ( i = 0; i < matvar->nbytes/matvar->data_size; i++ )
-                        printf("%u\n", ((mat_int32_t*)matvar->data)[i]);
-                }
-                break;
-            case MAT_C_INT16:
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if ( matvar->rank == 2 &&
-                         (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%hd ", ((mat_int16_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 ) {
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%hd ", ((mat_uint16_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else {
-                    for ( i = 0; i < matvar->nbytes/matvar->data_size; i++ )
-                        printf("%hd\n", ((mat_int16_t*)matvar->data)[i]);
-                }
-                break;
-            case MAT_C_UINT16:
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if ( matvar->rank == 2 &&
-                         (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%hu ", ((mat_uint16_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 ) {
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%hu ", ((mat_uint16_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else {
-                    for ( i = 0; i < matvar->nbytes/matvar->data_size; i++ )
-                        printf("%hu\n", ((mat_int32_t*)matvar->data)[i]);
-                }
-                break;
-            case MAT_C_INT8:
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if ( matvar->rank == 2 &&
-                         (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%hd ", ((mat_int8_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 ) {
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%hd ", ((mat_int8_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else {
-                    for ( i = 0; i < matvar->nbytes/matvar->data_size; i++ )
-                        printf("%hd\n", ((mat_int8_t*)matvar->data)[i]);
-                }
-                break;
-            case MAT_C_UINT8:
-                if ( !printdata )
-                    break;
-                if ( matvar->rank > 2 ) {
-                    printf("I can't print more than 2 dimensions\n");
-                } else if ( matvar->rank == 1 && matvar->dims[0] > 15 ) {
-                    printf("I won't print more than 15 elements in a vector\n");
-                } else if ( matvar->rank == 2 &&
-                         (matvar->dims[0] > 15 || matvar->dims[1] > 15) ) {
-                    for ( i = 0; i < matvar->dims[0] && i < 15; i++ ) {
-                        for ( j = 0; j < matvar->dims[1] && j < 15; j++ )
-                            printf("%hu ", ((mat_uint8_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        if ( j < matvar->dims[1] )
-                            printf("...");
-                        printf("\n");
-                    }
-                    if ( i < matvar->dims[0] )
-                        printf(".\n.\n.\n");
-                } else if ( matvar->rank == 2 ) {
-                    for ( i = 0; i < matvar->dims[0]; i++ ) {
-                        for ( j = 0; j < matvar->dims[1]; j++ )
-                            printf("%hu ", ((mat_uint8_t*)matvar->data)[matvar->dims[0]*j+i]);
-                        printf("\n");
-                    }
-                } else {
-                    for ( i = 0; i < matvar->nbytes/matvar->data_size; i++ )
-                        printf("%hu\n", ((mat_uint8_t*)matvar->data)[i]);
-                }
-                break;
-            case MAT_C_CHAR:
-                if ( !printdata )
-                    break;
-                if ( matvar->dims[0] == 1 ) {
-                    printf("%s\n",(char *)matvar->data);
-                } else {
-                    int ndx = 0;
-                    for ( i = 0; i < matvar->dims[1]; i++ ) {
-                        ndx = i;
-                        j = 0;
-                        while ( j++ < matvar->dims[0] &&
-                                *((char *)matvar->data+ndx) != '\0' ) {
-                            printf("%c", *((char *)matvar->data+ndx));
-                            ndx += matvar->dims[0];
-                        }
-                        printf("\n");
-                    }
-                }
-                break;
-            case MAT_C_STRUCT:
-            {
-                matvar_t **fields = (matvar_t **)matvar->data;
-                int nfields = matvar->nbytes / matvar->data_size;
-                Mat_Message("Fields[%d] {", nfields);
-                for ( i = 0; i < nfields; i++ )
-                    Mat_VarPrint(fields[i],printdata);
-                Mat_Message("}");
-                break;
-            }
-            case MAT_C_CELL:
-            {
-                matvar_t **fields = (matvar_t **)matvar->data;
-                int nfields = matvar->nbytes / matvar->data_size;
-                for ( i = 0; i < nfields; i++ )
-                    Mat_VarPrint(fields[i],printdata);
-                break;
-            }
-            case MAT_C_SPARSE:
-            {
-                sparse_t *sparse;
-/* FIXME: ComplexSplit */
-#if defined(EXTENDED_SPARSE)
-                sparse = matvar->data;
-                switch ( matvar->data_type ) {
-                    case MAT_T_DOUBLE:
-                    {
-                        if ( matvar->isComplex ) {
-                            struct ComplexSplit *complex_data = sparse->data;
-                            double *re,*im;
-                            re = complex_data->Re;
-                            im = complex_data->Im;
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %f + %fi",
-                                        sparse->ir[j]+1,i+1,re[j],im[j]);
-                            }
-                        } else {
-                            double *data;
-                            data = sparse->data;
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %f",
-                                        sparse->ir[j]+1,i+1,data[j]);
-                            }
-                        }
-                        break;
-                    }
-                    case MAT_T_SINGLE:
-                    {
-                        float *data;
-                        data = sparse->data;
-                        if ( matvar->isComplex ) {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %f + %fi",
-                                        sparse->ir[j]+1,i+1,data[j],
-                                        data[sparse->ndata+j]);
-                            }
-                        } else {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %f",
-                                        sparse->ir[j]+1,i+1,data[j]);
-                            }
-                        }
-                        break;
-                    }
-#ifdef HAVE_MAT_INT64_T
-                    case MAT_T_INT64:
-                    {
-                        mat_int64_t *data;
-                        data = sparse->data;
-                        if ( matvar->isComplex ) {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %d + %di",
-                                        sparse->ir[j]+1,i+1,data[j],
-                                        data[sparse->ndata+j]);
-                            }
-                        } else {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %d",
-                                        sparse->ir[j]+1,i+1,data[j]);
-                            }
-                        }
-                        break;
-                    }
-#endif
-#ifdef HAVE_MAT_UINT64_T
-                    case MAT_T_UINT64:
-                    {
-                        mat_uint64_t *data;
-                        data = sparse->data;
-                        if ( matvar->isComplex ) {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %u + %ui",
-                                        sparse->ir[j]+1,i+1,data[j],
-                                        data[sparse->ndata+j]);
-                            }
-                        } else {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %u",
-                                        sparse->ir[j]+1,i+1,data[j]);
-                            }
-                        }
-                        break;
-                    }
-#endif
-                    case MAT_T_INT32:
-                    {
-                        mat_int32_t *data;
-                        data = sparse->data;
-                        if ( matvar->isComplex ) {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %d + %di",
-                                        sparse->ir[j]+1,i+1,data[j],
-                                        data[sparse->ndata+j]);
-                            }
-                        } else {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %d",
-                                        sparse->ir[j]+1,i+1,data[j]);
-                            }
-                        }
-                        break;
-                    }
-                    case MAT_T_UINT32:
-                    {
-                        mat_uint32_t *data;
-                        data = sparse->data;
-                        if ( matvar->isComplex ) {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %u + %ui",
-                                        sparse->ir[j]+1,i+1,data[j],
-                                        data[sparse->ndata+j]);
-                            }
-                        } else {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %u",
-                                        sparse->ir[j]+1,i+1,data[j]);
-                            }
-                        }
-                        break;
-                    }
-                    case MAT_T_INT16:
-                    {
-                        mat_int16_t *data;
-                        data = sparse->data;
-                        if ( matvar->isComplex ) {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %hd + %hdi",
-                                        sparse->ir[j]+1,i+1,data[j],
-                                        data[sparse->ndata+j]);
-                            }
-                        } else {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %hd",
-                                        sparse->ir[j]+1,i+1,data[j]);
-                            }
-                        }
-                        break;
-                    }
-                    case MAT_T_UINT16:
-                    {
-                        mat_uint16_t *data;
-                        data = sparse->data;
-                        if ( matvar->isComplex ) {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %hu + %hui",
-                                        sparse->ir[j]+1,i+1,data[j],
-                                        data[sparse->ndata+j]);
-                            }
-                        } else {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %hu",
-                                        sparse->ir[j]+1,i+1,data[j]);
-                            }
-                        }
-                        break;
-                    }
-                    case MAT_T_INT8:
-                    {
-                        mat_int8_t *data;
-                        data = sparse->data;
-                        if ( matvar->isComplex ) {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %hd + %hdi",
-                                        sparse->ir[j]+1,i+1,data[j],
-                                        data[sparse->ndata+j]);
-                            }
-                        } else {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %hd",
-                                        sparse->ir[j]+1,i+1,data[j]);
-                            }
-                        }
-                        break;
-                    }
-                    case MAT_T_UINT8:
-                    {
-                        mat_uint8_t *data;
-                        data = sparse->data;
-                        if ( matvar->isComplex ) {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %hu + %hui",
-                                        sparse->ir[j]+1,i+1,data[j],
-                                        (mat_uint16_t)data[sparse->ndata+j]);
-                            }
-                        } else {
-                            for ( i = 0; i < sparse->njc-1; i++ ) {
-                                for (j = sparse->jc[i];
-                                     j<sparse->jc[i+1] && j<sparse->ndata;j++ )
-                                    Mat_Message("    (%d,%d)  %hu",
-                                        sparse->ir[j]+1,i+1,
-                                        (mat_uint16_t)data[j]);
-                            }
-                        }
-                        break;
-                    }
-                }
-#else
-                double *data;
-
-                sparse = matvar->data;
-                data = sparse->data;
-                if ( matvar->isComplex ) {
-                    for ( i = 0; i < sparse->njc-1; i++ ) {
-                        for ( j = sparse->jc[i];
-                              j < sparse->jc[i+1] && j < sparse->ndata; j++ )
-                            Mat_Message("    (%d,%d)  %f + %fi",
-                                sparse->ir[j]+1,i+1,data[j],
-                                data[sparse->ndata+j]);
-                    }
-                } else {
-                    for ( i = 0; i < sparse->njc-1; i++ ) {
-                        for ( j = sparse->jc[i];
-                              j < sparse->jc[i+1] && j < sparse->ndata; j++ )
-                            Mat_Message("    (%d,%d)  %f", sparse->ir[j]+1,i+1,
-                                data[j]);
-                    }
-                }
-#endif
-                break;
-            }
-            default:
-                printf("I can't print this class\n");
-        }
-    } else {
-        if ( printdata && !matvar->data  )
-            Mat_Warning("Data is NULL");
-        if ( printdata && matvar->data_size < 1 )
-            Mat_Warning("data-size is %d",matvar->data_size);
-    }
-    Mat_Message("\n");
-    return;
-}
-
-/** @brief Reads the header information for the next MAT variable
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @retuen pointer to the MAT variable or NULL
- */
-matvar_t *
-Mat_VarReadNextInfo5( mat_t *mat )
-{
-    int err, data_type, nBytes, i;
-    long  fpos;
-    matvar_t *matvar = NULL; 
-    mat_uint32_t array_flags;
-    long     bytesread = 0;
-
-    if( mat == NULL )
-        return NULL; 
-
-    fpos = ftell(mat->fp);
-    err = fread(&data_type,4,1,mat->fp);
-    if ( !err )
-        return NULL;
-    err = fread(&nBytes,4,1,mat->fp);
-    if ( mat->byteswap ) {
-        Mat_int32Swap(&data_type);
-        Mat_int32Swap(&nBytes);
-    }
-    switch ( data_type ) {
-#if defined(HAVE_ZLIB)
-        case MAT_T_COMPRESSED:
-        {
-            mat_uint32_t uncomp_buf[16] = {0,};
-            int      nbytes;
-
-            matvar               = malloc(sizeof(*matvar));
-            matvar->name         = NULL;
-            matvar->data         = NULL;
-            matvar->dims         = NULL;
-            matvar->nbytes       = 0;
-            matvar->data_type    = 0;
-            matvar->class_type   = 0;
-            matvar->data_size    = 0;
-            matvar->mem_conserve = 0;
-            matvar->compression  = 1;
-            matvar->fpos         = fpos;
-            matvar->fp           = mat;
-
-            matvar->z = calloc(1,sizeof(z_stream));
-            matvar->z->zalloc    = NULL;
-            matvar->z->zfree     = NULL;
-            matvar->z->opaque    = NULL;
-            matvar->z->next_in   = NULL;
-            matvar->z->next_out  = NULL;
-            matvar->z->avail_in  = 0;
-            matvar->z->avail_out = 0;
-            err = inflateInit(matvar->z);
-            if ( err != Z_OK ) {
-                Mat_Critical("inflateInit2 returned %d",err);
-                Mat_VarFree(matvar);
-                break;
-            }
-
-            /* Read Variable tag */
-            bytesread += InflateVarTag(mat,matvar,uncomp_buf);
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(uncomp_buf);
-                (void)Mat_uint32Swap(uncomp_buf+1);
-            }
-            nbytes = uncomp_buf[1];
-            if ( uncomp_buf[0] != MAT_T_MATRIX ) {
-                Mat_Critical("Uncompressed type not MAT_T_MATRIX");
-                fseek(mat->fp,nBytes-bytesread,SEEK_CUR);
-                Mat_VarFree(matvar);
-                matvar = NULL;
-                break;
-            }
-            /* Inflate Array Flags */
-            bytesread += InflateArrayFlags(mat,matvar,uncomp_buf);
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(uncomp_buf);
-                (void)Mat_uint32Swap(uncomp_buf+2);
-                (void)Mat_uint32Swap(uncomp_buf+3);
-            }
-            /* Array Flags */
-            if ( uncomp_buf[0] == MAT_T_UINT32 ) {
-               array_flags = uncomp_buf[2];
-               matvar->class_type  = (array_flags & MAT_F_CLASS_T);
-               matvar->isComplex   = (array_flags & MAT_F_COMPLEX);
-               matvar->isGlobal    = (array_flags & MAT_F_GLOBAL);
-               matvar->isLogical   = (array_flags & MAT_F_LOGICAL);
-               if ( matvar->class_type == MAT_C_SPARSE ) {
-                   /* Need to find a more appropriate place to store nzmax */
-                   matvar->nbytes      = uncomp_buf[3];
-               }
-            }
-            /* Inflate Dimensions */
-            bytesread += InflateDimensions(mat,matvar,uncomp_buf);
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(uncomp_buf);
-                (void)Mat_uint32Swap(uncomp_buf+1);
-            }
-            /* Rank and Dimension */
-            if ( uncomp_buf[0] == MAT_T_INT32 ) {
-                nbytes = uncomp_buf[1];
-                matvar->rank = nbytes / 4;
-                matvar->dims = malloc(matvar->rank*sizeof(int));
-                if ( mat->byteswap ) {
-                    for ( i = 0; i < matvar->rank; i++ )
-                        matvar->dims[i] = Mat_uint32Swap(&(uncomp_buf[2+i]));
-                } else {
-                    for ( i = 0; i < matvar->rank; i++ )
-                        matvar->dims[i] = uncomp_buf[2+i];
-                }
-            }
-            /* Inflate variable name tag */
-            bytesread += InflateVarNameTag(mat,matvar,uncomp_buf);
-            if ( mat->byteswap )
-                (void)Mat_uint32Swap(uncomp_buf);
-            /* Name of variable */
-            if ( uncomp_buf[0] == MAT_T_INT8 ) {    /* Name not in tag */
-                int len;
-                if ( mat->byteswap )
-                    len = Mat_uint32Swap(uncomp_buf+1);
-                else
-                    len = uncomp_buf[1];
-
-                if ( len % 8 == 0 )
-                    i = len;
-                else
-                    i = len+(8-(len % 8));
-                matvar->name = malloc(i+1);
-                /* Inflate variable name */
-                bytesread += InflateVarName(mat,matvar,matvar->name,i);
-                matvar->name[len] = '\0';
-            } else if ( ((uncomp_buf[0] & 0x0000ffff) == MAT_T_INT8) &&
-                        ((uncomp_buf[0] & 0xffff0000) != 0x00) ) {
-                /* Name packed in tag */
-                int len;
-                len = (uncomp_buf[0] & 0xffff0000) >> 16;
-                matvar->name = malloc(len+1);
-                memcpy(matvar->name,uncomp_buf+1,len);
-                matvar->name[len] = '\0';
-            }
-            if ( matvar->class_type == MAT_C_STRUCT )
-                ReadNextStructField(mat,matvar);
-            else if ( matvar->class_type == MAT_C_CELL ) {
-              if (ReadNextCell(mat,matvar) == -1) {
-                Mat_VarFree(matvar);
-                matvar = NULL;
-                return NULL;
-              }
-            }
-            fseek(mat->fp,-(int)matvar->z->avail_in,SEEK_CUR);
-            matvar->datapos = ftell(mat->fp);
-            fseek(mat->fp,nBytes+8+fpos,SEEK_SET);
-            break;
-        }
-#endif
-        case MAT_T_MATRIX:
-        {
-            int      nbytes;
-            mat_uint32_t buf[32];
-            size_t   bytesread = 0;
-
-            matvar = Mat_VarCalloc();
-            matvar->fpos         = fpos;
-            matvar->fp           = mat;
-
-            /* Read Array Flags and The Dimensions Tag */
-            bytesread  += fread(buf,4,6,mat->fp);
-            if ( mat->byteswap ) {
-                (void)Mat_uint32Swap(buf);
-                (void)Mat_uint32Swap(buf+1);
-                (void)Mat_uint32Swap(buf+2);
-                (void)Mat_uint32Swap(buf+3);
-                (void)Mat_uint32Swap(buf+4);
-                (void)Mat_uint32Swap(buf+5);
-            }
-            /* Array Flags */
-            if ( buf[0] == MAT_T_UINT32 ) {
-               array_flags = buf[2];
-               matvar->class_type  = (array_flags & MAT_F_CLASS_T);
-               matvar->isComplex   = (array_flags & MAT_F_COMPLEX);
-               matvar->isGlobal    = (array_flags & MAT_F_GLOBAL);
-               matvar->isLogical   = (array_flags & MAT_F_LOGICAL);
-               if ( matvar->class_type == MAT_C_SPARSE ) {
-                   /* Need to find a more appropriate place to store nzmax */
-                   matvar->nbytes      = buf[3];
-               }
-            }
-            /* Rank and Dimension */
-            if ( buf[4] == MAT_T_INT32 ) {
-                nbytes = buf[5];
-
-                matvar->rank = nbytes / 4;
-                matvar->dims = malloc(matvar->rank*sizeof(int));
-
-                /* Assumes rank <= 16 */
-                if ( matvar->rank % 2 != 0 )
-                    bytesread+=fread(buf,4,matvar->rank+1,mat->fp);
-                else
-                    bytesread+=fread(buf,4,matvar->rank,mat->fp);
-
-                if ( mat->byteswap ) {
-                    for ( i = 0; i < matvar->rank; i++ )
-                        matvar->dims[i] = Mat_uint32Swap(buf+i);
-                } else {
-                    for ( i = 0; i < matvar->rank; i++ )
-                        matvar->dims[i] = buf[i];
-                }
-            }
-            /* Variable Name Tag */
-            bytesread+=fread(buf,4,2,mat->fp);
-            if ( mat->byteswap )
-                (void)Mat_uint32Swap(buf);
-            /* Name of variable */
-            if ( buf[0] == MAT_T_INT8 ) {    /* Name not in tag */
-                int len;
-
-                if ( mat->byteswap )
-                    len = Mat_uint32Swap(buf+1);
-                else
-                    len = buf[1];
-                if ( len % 8 == 0 )
-                    i = len;
-                else
-                    i = len+(8-(len % 8));
-                bytesread+=fread(buf,1,i,mat->fp);
-
-                matvar->name = malloc(len+1);
-                memcpy(matvar->name,buf,len);
-                matvar->name[len] = '\0';
-            } else if ( ((buf[0] & 0x0000ffff) == MAT_T_INT8) &&
-                        ((buf[0] & 0xffff0000) != 0x00) ) {
-                /* Name packed in the tag */
-                int len;
-
-                len = (buf[0] & 0xffff0000) >> 16;
-                matvar->name = malloc(len+1);
-                memcpy(matvar->name,buf+1,len);
-                matvar->name[len] = '\0';
-            }
-            if ( matvar->class_type == MAT_C_STRUCT )
-                (void)ReadNextStructField(mat,matvar);
-            else if ( matvar->class_type == MAT_C_CELL )
-                (void)ReadNextCell(mat,matvar);
-            else if ( matvar->class_type == MAT_C_FUNCTION )
-                (void)ReadNextFunctionHandle(mat,matvar);
-            matvar->datapos = ftell(mat->fp);
-            fseek(mat->fp,nBytes+8+fpos,SEEK_SET);
-            break;
-        }
-        default:
-            Mat_Message("%d is not valid (MAT_T_MATRIX or MAT_T_COMPRESSED", data_type);
-            return NULL;
-    }
-
-    return matvar;
-}

+ 0 - 62
matlabAccess/matio/src/mat5.h

@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2008   Christopher C. Hulbert
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public
- *  License as published by the Free Software Foundation; either
- *  version 2.1 of the License, or (at your option) any later version.
- *
- *  This library is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this library; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-#ifndef MAT5_H
-#define MAT5_H
-
-#include "matio.h"
-
-#ifdef __cplusplus
-#   define EXTERN extern "C"
-#else
-#   define EXTERN extern
-#endif
-
-EXTERN int WriteCellArrayField(mat_t *mat,matvar_t *matvar );
-EXTERN int WriteCellArrayFieldInfo(mat_t *mat,matvar_t *matvar);
-EXTERN int WriteStructField(mat_t *mat,matvar_t *matvar);
-#if defined(HAVE_ZLIB)
-EXTERN size_t WriteCompressedCellArrayField(mat_t *mat,matvar_t *matvar,
-                                            z_stream *z);
-EXTERN size_t WriteCompressedStructField(mat_t *mat,matvar_t *matvar,
-                                         z_stream *z);
-#endif
-EXTERN int ReadNextStructField( mat_t *mat, matvar_t *matvar );
-EXTERN int ReadNextCell( mat_t *mat, matvar_t *matvar );
-EXTERN int WriteEmptyCharData(mat_t *mat, int N, int data_type);
-
-/*   mat5.c    */
-void      Mat_VarPrint5( matvar_t *matvar, int printdata );
-matvar_t *Mat_VarReadNextInfo5( mat_t *mat );
-void      Read5(mat_t *mat, matvar_t *matvar);
-int       ReadData5(mat_t *mat,matvar_t *matvar,void *data, 
-              int *start,int *stride,int *edge);
-int       Write5(mat_t *mat,matvar_t *matvar,int compress);
-int       WriteCharDataSlab2(mat_t *mat,void *data,int data_type,int *dims,
-              int *start,int *stride,int *edge);
-#if defined(HAVE_ZLIB)
-size_t    WriteCompressedData(mat_t *mat,z_stream *z,void *data,int N,
-              int data_type);
-size_t    WriteCompressedCharData(mat_t *mat,z_stream *z,void *data,int N,
-              int data_type);
-#endif
-int       WriteData(mat_t *mat,void *data,int N,int data_type);
-int       WriteDataSlab2(mat_t *mat,void *data,int data_type,int *dims,
-              int *start,int *stride,int *edge);
-void      WriteInfo5(mat_t *mat, matvar_t *matvar);
-
-#endif

+ 0 - 323
matlabAccess/matio/src/matio.h

@@ -1,323 +0,0 @@
-/** @file matio.h
- * LIBMATIO Header
- * @ingroup MAT
- */
-/*
- * Copyright (C) 2005-2006   Christopher C. Hulbert
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public
- *  License as published by the Free Software Foundation; either
- *  version 2.1 of the License, or (at your option) any later version.
- *
- *  This library is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this library; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#ifndef MATIO_H
-#define MATIO_H
-
-#include <stdlib.h>
-#include <stdio.h>
-#include "matioConfig.h"
-#if defined(HAVE_INTTYPES_H)
-#   include <inttypes.h>
-#endif
-#if defined(HAVE_STDINT_H)
-#   include <stdint.h>
-#endif
-
-#include <stdarg.h>
-#if defined(HAVE_ZLIB)
-#   include <zlib.h>
-#endif
-
-#undef EXTERN
-#ifdef __cplusplus
-#   define EXTERN extern "C"
-#else
-#   define EXTERN extern
-#endif
-
-#ifdef _mat_int64_t
-    typedef _mat_int64_t mat_int64_t;
-#endif
-#ifdef _mat_uint64_t
-    typedef _mat_uint64_t mat_uint64_t;
-#endif
-#ifdef _mat_int32_t
-    typedef _mat_int32_t mat_int32_t;
-#endif
-#ifdef _mat_uint32_t
-    typedef _mat_uint32_t mat_uint32_t;
-#endif
-#ifdef _mat_int16_t
-    typedef _mat_int16_t mat_int16_t;
-#endif
-#ifdef _mat_uint16_t
-    typedef _mat_uint16_t mat_uint16_t;
-#endif
-#ifdef _mat_int8_t
-    typedef _mat_int8_t mat_int8_t;
-#endif
-#ifdef _mat_uint8_t
-    typedef _mat_uint8_t mat_uint8_t;
-#endif
-
-/** @defgroup MAT Matlab MAT File I/O Library */
-/** @defgroup mat_internal Internal Functions */
-
-/** @brief MAT file access types
- *
- * @ingroup MAT
- * MAT file access types
- */
-enum mat_acc {
-    MAT_ACC_RDONLY = 1,  /**< @brief Read only file access                */
-    MAT_ACC_RDWR   = 2   /**< @brief Read/Write file access               */
-};
-
-/** @brief MAT file versions
- *
- * @ingroup MAT
- * MAT file versions
- */
-enum mat_ft {
-    MAT_FT_MAT5  = 1,        /**< @brief Matlab level-5 file                  */
-    MAT_FT_MAT4  = 1 << 16   /**< @brief Version 4 file                       */
-};
-
-
-/** @brief Matlab data types
- *
- * @ingroup MAT
- * Matlab data types
- */
-enum matio_types {
-    MAT_T_UNKNOWN    =  0,    /**< @brief UNKOWN data type                    */
-    MAT_T_INT8       =  1,    /**< @brief 8-bit signed integer data type      */
-    MAT_T_UINT8      =  2,    /**< @brief 8-bit unsigned integer data type    */
-    MAT_T_INT16      =  3,    /**< @brief 16-bit signed integer data type     */
-    MAT_T_UINT16     =  4,    /**< @brief 16-bit unsigned integer data type   */
-    MAT_T_INT32      =  5,    /**< @brief 32-bit signed integer data type     */
-    MAT_T_UINT32     =  6,    /**< @brief 32-bit unsigned integer data type   */
-    MAT_T_SINGLE     =  7,    /**< @brief IEEE 754 single precision data type */
-    MAT_T_DOUBLE     =  9,    /**< @brief IEEE 754 double precision data type */
-    MAT_T_INT64      = 12,    /**< @brief 64-bit signed integer data type     */
-    MAT_T_UINT64     = 13,    /**< @brief 64-bit unsigned integer data type   */
-    MAT_T_MATRIX     = 14,    /**< @brief matrix data type                    */
-    MAT_T_COMPRESSED = 15,    /**< @brief compressed data type                */
-    MAT_T_UTF8       = 16,    /**< @brief 8-bit unicode text data type        */
-    MAT_T_UTF16      = 17,    /**< @brief 16-bit unicode text data type       */
-    MAT_T_UTF32      = 18,    /**< @brief 32-bit unicode text data type       */
-
-    MAT_T_STRING     = 20,    /**< @brief String data type                    */
-    MAT_T_CELL       = 21,    /**< @brief Cell array data type                */
-    MAT_T_STRUCT     = 22,    /**< @brief Structure data type                 */
-    MAT_T_ARRAY      = 23,    /**< @brief Array data type                     */
-    MAT_T_FUNCTION   = 24     /**< @brief Function data type                  */
-};
-
-/** @brief Matlab variable classes
- *
- * @ingroup MAT
- * Matlab variable classes
- */
-enum matio_classes {
-    MAT_C_CELL     =  1, /**< @brief Matlab cell array class               */
-    MAT_C_STRUCT   =  2, /**< @brief Matlab structure class                */
-    MAT_C_OBJECT   =  3, /**< @brief Matlab object class                   */
-    MAT_C_CHAR     =  4, /**< @brief Matlab character array class          */
-    MAT_C_SPARSE   =  5, /**< @brief Matlab sparse array class             */
-    MAT_C_DOUBLE   =  6, /**< @brief Matlab double-precision class         */
-    MAT_C_SINGLE   =  7, /**< @brief Matlab single-precision class         */
-    MAT_C_INT8     =  8, /**< @brief Matlab signed 8-bit integer class     */
-    MAT_C_UINT8    =  9, /**< @brief Matlab unsigned 8-bit integer class   */
-    MAT_C_INT16    = 10, /**< @brief Matlab signed 16-bit integer class    */
-    MAT_C_UINT16   = 11, /**< @brief Matlab unsigned 16-bit integer class  */
-    MAT_C_INT32    = 12, /**< @brief Matlab signed 32-bit integer class    */
-    MAT_C_UINT32   = 13, /**< @brief Matlab unsigned 32-bit integer class  */
-    MAT_C_INT64    = 14, /**< @brief Matlab unsigned 32-bit integer class  */
-    MAT_C_UINT64   = 15, /**< @brief Matlab unsigned 32-bit integer class  */
-    MAT_C_FUNCTION = 16 /**< @brief Matlab unsigned 32-bit integer class  */
-};
-
-/** @brief Matlab array flags
- *
- * @ingroup MAT
- * Matlab array flags
- */
-enum matio_flags {
-    MAT_F_COMPLEX = 0x0800,    /**< @brief Complex bit flag */
-    MAT_F_GLOBAL  = 0x0400,    /**< @brief Global bit flag */
-    MAT_F_LOGICAL = 0x0200,    /**< @brief Logical bit flag */
-    MAT_F_CLASS_T = 0x00ff     /**< @brief Class-Type bits flag */
-};
-
-#define MEM_CONSERVE 1       /**< @brief Conserve memory */
-
-/** @brief Matlab compression options
- *
- * @ingroup MAT
- * Matlab compression options
- */
-enum matio_compression {
-    COMPRESSION_NONE = 0,   /**< @brief No compression */
-    COMPRESSION_ZLIB = 1    /**< @brief zlib compression */
-};
-
-/** @brief matio lookup type
- *
- * @ingroup MAT
- * matio lookup type
- */
-enum {
-    BY_NAME  = 1, /**< Lookup by name */
-    BY_INDEX = 2  /**< Lookup by index */
-};
-
-/** @brief Complex data type using split storage
- *
- * Complex data type using split real/imaginary pointers
- * @ingroup MAT
- */
-struct ComplexSplit {
-    void *Re; /**< Pointer to the real part */
-    void *Im; /**< Pointer to the imaginary part */
-};
-
-/** @brief Matlab MAT File information
- *
- * Contains information about a Matlab MAT file
- * @ingroup MAT
- */
-typedef struct mat_t {
-    FILE *fp;               /**< Pointer to the MAT file */
-    char *header;           /**< MAT File header string */
-    char *subsys_offset;    /**< offset */
-    char *filename;         /**< Name of the file that fp points to */
-    int   version;          /**< MAT File version */
-    int   byteswap;         /**< 1 if byte swapping is required, 0 else */
-    int   mode;             /**< Access mode */
-    long  bof;              /**< Beginning of file not including header */
-} mat_t;
-
-/** @brief Matlab variable information
- *
- * Contains information about a Matlab variable
- * @ingroup MAT
- */
-typedef struct matvar_t {
-    int   nbytes;       /**< Number of bytes for the MAT variable */
-    int   rank;         /**< Rank (Number of dimensions) of the data */
-    int   data_type;    /**< Data type(MAT_T_*) */
-    int   data_size;    /**< Bytes / element for the data */
-    int   class_type;   /**< Class type in Matlab(mxDOUBLE_CLASS, etc) */
-    int   isComplex;    /**< non-zero if the data is complex, 0 if real */
-    int   isGlobal;     /**< non-zero if the variable is global */
-    int   isLogical;    /**< non-zero if the variable is logical */
-    int  *dims;         /**< Array of lengths for each dimension */
-    char *name;         /**< Name of the variable */
-    void *data;         /**< Pointer to the data */
-    int   mem_conserve; /**< 1 if Memory was conserved with data */
-    int   compression;  /**< Compression (0=>None,1=>ZLIB) */
-    long  fpos;         /**< Offset from the beginning of the MAT file to the variable */
-    long  datapos;      /**< Offset from the beginning of the MAT file to the data */
-    mat_t    *fp;       /**< Pointer to the MAT file structure (mat_t) */
-#if defined(HAVE_ZLIB)
-    z_stream *z;        /**< zlib compression state */
-#endif
-} matvar_t;
-
-/** @brief sparse data information
- *
- * Contains information and data for a sparse matrix
- * @ingroup MAT
- */
-typedef struct sparse_t {
-    int nzmax;               /**< Maximum number of non-zero elements */
-    int *ir;                 /**< Array of size nzmax where ir[k] is the row of
-                               *  data[k].  0 <= k <= nzmax
-                               */
-    int nir;                 /**< number of elements in ir */
-    int *jc;                 /**< Array size N+1 (N is number of columsn) with
-                               *  jc[k] being the index into ir/data of the
-                               *  first non-zero element for row k.
-                               */
-    int   njc;               /**< Number of elements in jc */
-    int   ndata;             /**< Number of complex/real data values */
-    void *data;              /**< Array of data elements */
-} sparse_t;
-
-/*     io.c         */
-EXTERN char  *strdup_vprintf(const char *format, va_list ap);
-EXTERN char  *strdup_printf(const char *format, ...);
-EXTERN int    Mat_SetVerbose( int verb, int s );
-EXTERN int    Mat_SetDebug( int d );
-EXTERN void   Mat_Critical( const char *format, ... );
-EXTERN void   Mat_Error( const char *format, ... );
-EXTERN void   Mat_Help( const char *helpstr[] );
-EXTERN int    Mat_LogInit( char *progname );
-EXTERN int    Mat_LogClose(void);
-EXTERN int    Mat_LogInitFunc(char *prog_name,
-                    void (*log_func)(int log_level, char *message) );
-EXTERN int    Mat_Message( const char *format, ... );
-EXTERN int    Mat_DebugMessage( int level, const char *format, ... );
-EXTERN int    Mat_VerbMessage( int level, const char *format, ... );
-EXTERN void   Mat_Warning( const char *format, ... );
-EXTERN size_t Mat_SizeOf(int data_type);
-EXTERN size_t Mat_SizeOfClass(int class_type);
-
-/*   MAT File functions   */
-EXTERN mat_t  *Mat_Create(const char *matname,const char *hdr_str);
-EXTERN int     Mat_Close(mat_t *mat);
-EXTERN mat_t  *Mat_Open(const char *matname,int mode);
-EXTERN int     Mat_Rewind(mat_t *mat);
-
-/* MAT variable functions */
-EXTERN matvar_t  *Mat_VarCalloc(void);
-EXTERN matvar_t  *Mat_VarCreate(const char *name,int class_type,int data_type,
-                      int rank,int *dims,void *data, int opt);
-EXTERN int        Mat_VarDelete(mat_t *mat, char *name);
-EXTERN matvar_t  *Mat_VarDuplicate(const matvar_t *in, int opt);
-EXTERN void       Mat_VarFree(matvar_t *matvar);
-EXTERN matvar_t  *Mat_VarGetCell(matvar_t *matvar,int index);
-EXTERN matvar_t **Mat_VarGetCells(matvar_t *matvar,int *start,int *stride,
-                      int *edge);
-EXTERN matvar_t **Mat_VarGetCellsLinear(matvar_t *matvar,int start,int stride,
-                      int edge);
-EXTERN size_t     Mat_VarGetSize(matvar_t *matvar);
-EXTERN int        Mat_VarGetNumberOfFields(matvar_t *matvar);
-EXTERN int        Mat_VarAddStructField(matvar_t *matvar,matvar_t **fields);
-EXTERN matvar_t  *Mat_VarGetStructField(matvar_t *matvar,void *name_or_index,
-                      int opt,int index);
-EXTERN matvar_t  *Mat_VarGetStructs(matvar_t *matvar,int *start,int *stride,
-                      int *edge,int copy_fields);
-EXTERN matvar_t  *Mat_VarGetStructsLinear(matvar_t *matvar,int start,int stride,
-                      int edge,int copy_fields);
-EXTERN void       Mat_VarPrint( matvar_t *matvar, int printdata );
-EXTERN matvar_t  *Mat_VarRead(mat_t *mat, char *name );
-EXTERN int        Mat_VarReadData(mat_t *mat,matvar_t *matvar,void *data,
-                      int *start,int *stride,int *edge);
-EXTERN int        Mat_VarReadDataAll(mat_t *mat,matvar_t *matvar);
-EXTERN int        Mat_VarReadDataLinear(mat_t *mat,matvar_t *matvar,void *data,
-                      int start,int stride,int edge);
-EXTERN matvar_t  *Mat_VarReadInfo( mat_t *mat, char *name );
-EXTERN matvar_t  *Mat_VarReadNext( mat_t *mat );
-EXTERN matvar_t  *Mat_VarReadNextInfo( mat_t *mat );
-EXTERN int        Mat_VarWrite(mat_t *mat,matvar_t *matvar,int compress );
-EXTERN int        Mat_VarWriteInfo(mat_t *mat,matvar_t *matvar);
-EXTERN int        Mat_VarWriteData(mat_t *mat,matvar_t *matvar,void *data,
-                      int *start,int *stride,int *edge);
-
-/* Other functions */
-EXTERN int       Mat_CalcSingleSubscript(int rank,int *dims,int *subs);
-EXTERN int      *Mat_CalcSubscripts(int rank,int *dims,int index);
-
-#endif

+ 0 - 55
matlabAccess/matio/src/matioConfig.h

@@ -1,55 +0,0 @@
-/* src/matioConfig.h.  Generated from matioConfig.h.in by configure.  */
-#define HAVE_ZLIB 1
-#define HAVE_INTTYPES_H 1
-#define HAVE_STRINGS_H 1
-#define HAVE_STDINT_H 1
-#define STDC_HEADERS 1
-
-#define MATIO_PLATFORM "x86_64-unknown-linux-gnu"
-#define MATIO_MAJOR_VERSION 1
-#define MATIO_MINOR_VERSION 3
-#define MATIO_RELEASE_LEVEL 4
-
-/* #undef FC_FUNC */
-/* #undef FC_FUNC_ */
-
-#define LINUX 1
-/* #undef WINNT */
-/* #undef SUN */
-
-#define SIZEOF_DOUBLE 8
-#define SIZEOF_FLOAT 4
-/* #undef SIZEOF_LONG */
-#define SIZEOF_INT 4
-#define SIZEOF_SHORT 2
-#define SIZEOF_CHAR 1
-/* #undef SIZEOF_VOID_PTR */
-
-#define HAVE_MAT_INT64_T 1
-#define HAVE_MAT_INT32_T 1
-#define HAVE_MAT_INT16_T 1
-#define HAVE_MAT_INT8_T 1
-#define HAVE_MAT_UINT64_T 1
-#define HAVE_MAT_UINT32_T 1
-#define HAVE_MAT_UINT16_T 1
-#define HAVE_MAT_UINT8_T 1
-
-#define _mat_uint8_t uint8_t
-#define _mat_uint16_t uint16_t
-#define _mat_uint32_t uint32_t
-#define _mat_uint64_t uint64_t
-#define _mat_int8_t int8_t
-#define _mat_int16_t int16_t
-#define _mat_int32_t int32_t
-#define _mat_int64_t int64_t
-
-#define HAVE_VA_COPY 1
-/* #undef HAVE___VA_COPY */
-#define HAVE_VSNPRINTF 1
-#define HAVE_SNPRINTF 1
-#define HAVE_VASPRINTF 1
-#define HAVE_ASPRINTF 1
-
-#define EXTENDED_SPARSE 1
-
-/* #undef Z_PREFIX */

+ 0 - 92
matlabAccess/matio/src/matio_private.h

@@ -1,92 +0,0 @@
-#ifndef MATIO_PRIVATE_H
-#define MATIO_PRIVATE_H
-
-#include "matio.h"
-
-#ifndef EXTERN
-#   ifdef __cplusplus
-#       define EXTERN extern "C"
-#   else
-#       define EXTERN extern
-#   endif
-#endif
-
-/*    snprintf.c    */
-EXTERN int mat_snprintf(char *str,size_t count,const char *fmt,...);
-EXTERN int mat_asprintf(char **ptr,const char *format, ...);
-EXTERN int mat_vsnprintf(char *str,size_t count,const char *fmt,va_list args);
-EXTERN int mat_vasprintf(char **ptr,const char *format,va_list ap);
-
-/*   endian.c     */
-EXTERN double        Mat_doubleSwap(double  *a);
-EXTERN float         Mat_floatSwap(float   *a);
-#ifdef HAVE_MAT_INT64_T
-EXTERN mat_int64_t   Mat_int64Swap(mat_int64_t  *a);
-#endif /* HAVE_MAT_INT64_T */
-#ifdef HAVE_MAT_UINT64_T
-EXTERN mat_uint64_t  Mat_uint64Swap(mat_uint64_t *a);
-#endif /* HAVE_MAT_UINT64_T */
-EXTERN mat_int32_t   Mat_int32Swap(mat_int32_t  *a);
-EXTERN mat_uint32_t  Mat_uint32Swap(mat_uint32_t *a);
-EXTERN mat_int16_t   Mat_int16Swap(mat_int16_t  *a);
-EXTERN mat_uint16_t  Mat_uint16Swap(mat_uint16_t *a);
-
-/* read_data.c */
-EXTERN int ReadDoubleData(mat_t *mat,double  *data,int data_type,int len);
-EXTERN int ReadSingleData(mat_t *mat,float   *data,int data_type,int len);
-EXTERN int ReadInt32Data (mat_t *mat,mat_int32_t *data,int data_type,int len);
-EXTERN int ReadUInt32Data(mat_t *mat,mat_uint32_t *data,int data_type,int len);
-EXTERN int ReadInt16Data (mat_t *mat,mat_int16_t *data,int data_type,int len);
-EXTERN int ReadUInt16Data(mat_t *mat,mat_uint16_t *data,int data_type,int len);
-EXTERN int ReadInt8Data  (mat_t *mat,mat_int8_t  *data,int data_type,int len);
-EXTERN int ReadUInt8Data (mat_t *mat,mat_uint8_t  *data,int data_type,int len);
-EXTERN int ReadCharData  (mat_t *mat,char  *data,int data_type,int len);
-EXTERN int ReadDataSlab2(mat_t *mat,void *data,int class_type,int data_type,
-               int *dims,int *start,int *stride,int *edge);
-EXTERN int ReadDataSlabN(mat_t *mat,void *data,int class_type,int data_type,
-               int rank,int *dims,int *start,int *stride,int *edge);
-#if defined(HAVE_ZLIB)
-EXTERN int ReadCompressedDoubleData(mat_t *mat,z_stream *z,double  *data,
-               int data_type,int len);
-EXTERN int ReadCompressedSingleData(mat_t *mat,z_stream *z,float   *data,
-               int data_type,int len);
-EXTERN int ReadCompressedInt32Data(mat_t *mat,z_stream *z,mat_int32_t *data,
-               int data_type,int len);
-EXTERN int ReadCompressedUInt32Data(mat_t *mat,z_stream *z,mat_uint32_t *data,
-               int data_type,int len);
-EXTERN int ReadCompressedInt16Data(mat_t *mat,z_stream *z,mat_int16_t *data,
-               int data_type,int len);
-EXTERN int ReadCompressedUInt16Data(mat_t *mat,z_stream *z,mat_uint16_t *data,
-               int data_type,int len);
-EXTERN int ReadCompressedInt8Data(mat_t *mat,z_stream *z,mat_int8_t  *data,
-               int data_type,int len);
-EXTERN int ReadCompressedUInt8Data(mat_t *mat,z_stream *z,mat_uint8_t  *data,
-               int data_type,int len);
-EXTERN int ReadCompressedCharData(mat_t *mat,z_stream *z,char *data,
-               int data_type,int len);
-EXTERN int ReadCompressedDataSlab2(mat_t *mat,z_stream *z,void *data,
-               int class_type,int data_type,int *dims,int *start,int *stride,
-               int *edge);
-EXTERN int ReadCompressedDataSlabN(mat_t *mat,z_stream *z,void *data,
-               int class_type,int data_type,int rank,int *dims,int *start,
-               int *stride,int *edge);
-
-/*   inflate.c    */
-EXTERN int InflateSkip(mat_t *mat, z_stream *z, int nbytes);
-EXTERN int InflateSkip2(mat_t *mat, matvar_t *matvar, int nbytes);
-EXTERN int InflateSkipData(mat_t *mat,z_stream *z,int data_type,int len);
-EXTERN int InflateVarTag(mat_t *mat, matvar_t *matvar, void *buf);
-EXTERN int InflateArrayFlags(mat_t *mat, matvar_t *matvar, void *buf);
-EXTERN int InflateDimensions(mat_t *mat, matvar_t *matvar, void *buf);
-EXTERN int InflateVarNameTag(mat_t *mat, matvar_t *matvar, void *buf);
-EXTERN int InflateVarName(mat_t *mat,matvar_t *matvar,void *buf,int N);
-EXTERN int InflateDataTag(mat_t *mat, matvar_t *matvar, void *buf);
-EXTERN int InflateDataType(mat_t *mat, z_stream *matvar, void *buf);
-EXTERN int InflateData(mat_t *mat, z_stream *z, void *buf, int nBytes);
-EXTERN int InflateFieldNameLength(mat_t *mat,matvar_t *matvar,void *buf);
-EXTERN int InflateFieldNamesTag(mat_t *mat,matvar_t *matvar,void *buf);
-EXTERN int InflateFieldNames(mat_t *mat,matvar_t *matvar,void *buf,int nfields,
-               int fieldname_length,int padding);
-#endif
-
-#endif

+ 0 - 5285
matlabAccess/matio/src/read_data.c

@@ -1,5285 +0,0 @@
-/** @file read_data.c
- * Matlab MAT version 5 file functions
- * @ingroup MAT
- */
-/*
- * Copyright (C) 2005-2006   Christopher C. Hulbert
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public
- *  License as published by the Free Software Foundation; either
- *  version 2.1 of the License, or (at your option) any later version.
- *
- *  This library is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this library; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-/* FIXME: Implement Unicode support */
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <math.h>
-#include <time.h>
-#include "matio.h"
-#include "matio_private.h"
-#if defined(HAVE_ZLIB)
-#   include <zlib.h>
-#endif
-
-/*
- * --------------------------------------------------------------------------
- *    Routines to read data of any type into arrays of a specific type
- * --------------------------------------------------------------------------
- */
-
-/** @brief Reads data of type @c data_type into a double type
- *
- * Reads from the MAT file @c len elements of data type @c data_type storing
- * them as double's in @c data.
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param data Pointer to store the output double values (len*sizeof(double))
- * @param data_type one of the @c matio_types enumerations which is the source
- *                  data type in the file
- * @param len Number of elements of type @c data_type to read from the file
- * @retval Number of bytes read from the file
- */
-int
-ReadDoubleData(mat_t *mat,double *data,int data_type,int len)
-{
-    int bytesread = 0, data_size = 0, i;
-
-    if ( (mat   == NULL) || (data   == NULL) || (mat->fp == NULL) )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            data_size = sizeof(double);
-            if ( mat->byteswap ) {
-                bytesread += fread(data,data_size,len,mat->fp);
-                for ( i = 0; i < len; i++ ) {
-                    (void)Mat_doubleSwap(data+i);
-                }
-            } else {
-                bytesread += fread(data,data_size,len,mat->fp);
-            }
-            break;
-        }
-        case MAT_T_SINGLE:
-        {
-            float f;
-
-            data_size = sizeof(float);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&f,data_size,1,mat->fp);
-                    data[i] = Mat_floatSwap(&f);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&f,data_size,1,mat->fp);
-                    data[i] = f;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT32:
-        {
-            mat_int32_t i32;
-
-            data_size = sizeof(mat_int32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i32,data_size,1,mat->fp);
-                    data[i] = Mat_int32Swap(&i32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i32,data_size,1,mat->fp);
-                    data[i] = i32;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            mat_uint32_t ui32;
-
-            data_size = sizeof(mat_uint32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui32,data_size,1,mat->fp);
-                    data[i] = Mat_uint32Swap(&ui32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui32,data_size,1,mat->fp);
-                    data[i] = ui32;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            mat_int16_t i16;
-
-            data_size = sizeof(mat_int16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i16,data_size,1,mat->fp);
-                    data[i] = Mat_int16Swap(&i16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i16,data_size,1,mat->fp);
-                    data[i] = i16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t ui16;
-
-            data_size = sizeof(mat_uint16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui16,data_size,1,mat->fp);
-                    data[i] = Mat_uint16Swap(&ui16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui16,data_size,1,mat->fp);
-                    data[i] = ui16;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            mat_int8_t i8;
-
-            data_size = sizeof(mat_int8_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i8,data_size,1,mat->fp);
-                    data[i] = i8;
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i8,data_size,1,mat->fp);
-                    data[i] = i8;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t ui8;
-
-            data_size = sizeof(mat_uint8_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui8,data_size,1,mat->fp);
-                    data[i] = ui8;
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui8,data_size,1,mat->fp);
-                    data[i] = ui8;
-                }
-            }
-            break;
-        }
-    }
-    bytesread *= data_size;
-    return bytesread;
-}
-
-#if defined(HAVE_ZLIB)
-/** @brief Reads data of type @c data_type into a double type
- *
- * Reads from the MAT file @c len compressed elements of data type @c data_type
- * storing them as double's in @c data.
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param z Pointer to the zlib stream for inflation
- * @param data Pointer to store the output double values (len*sizeof(double))
- * @param data_type one of the @c matio_types enumerations which is the source
- *                  data type in the file
- * @param len Number of elements of type @c data_type to read from the file
- * @retval Number of bytes read from the file
- */
-int
-ReadCompressedDoubleData(mat_t *mat,z_stream *z,double *data,
-    int data_type,int len)
-{
-    int nBytes = 0, data_size = 0, i;
-    union _buf {
-#if SIZEOF_DOUBLE == 8
-        double          d[128];
-#elif SIZEOF_DOUBLE == 16
-        double          d[64];
-#endif
-        float           f[256];
-        mat_int32_t   i32[256];
-        mat_uint32_t ui32[256];
-        mat_int16_t   i16[512];
-        mat_uint16_t ui16[512];
-        mat_int8_t     i8[1024];
-        mat_uint8_t   ui8[1024];
-    } buf;
-
-    
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            data_size = sizeof(double);
-            if ( mat->byteswap ) {
-                InflateData(mat,z,data,len*data_size);
-                for ( i = 0; i < len; i++ )
-                    (void)Mat_doubleSwap(data+i);
-            } else {
-                InflateData(mat,z,data,len*data_size);
-            }
-            break;
-        }
-        case MAT_T_INT32:
-        {
-            data_size = sizeof(mat_int32_t);
-            if ( mat->byteswap ) {
-                if ( len <= 256 ){
-                    InflateData(mat,z,buf.i32,len*data_size);
-                    for ( i = 0; i < len; i++ )
-                        data[i] = Mat_int32Swap(buf.i32+i);
-                } else {
-                    int j;
-                    len -= 256;
-                    for ( i = 0; i < len; i+=256 ) {
-                        InflateData(mat,z,buf.i32,256*data_size);
-                        for ( j = 0; j < 256; j++ )
-                            data[i+j] = Mat_int32Swap(buf.i32+j);
-                    }
-                    len = len-(i-256);
-                    InflateData(mat,z,buf.i32,len*data_size);
-                    for ( j = 0; j < len; j++ )
-                        data[i+j] = Mat_int32Swap(buf.i32+j);
-                }
-            } else {
-                if ( len <= 256 ){
-                    InflateData(mat,z,buf.i32,len*data_size);
-                    for ( i = 0; i < len; i++ )
-                        data[i] = buf.i32[i];
-                } else {
-                    int j;
-                    len -= 256;
-                    for ( i = 0; i < len; i+=256 ) {
-                        InflateData(mat,z,buf.i32,256*data_size);
-                        for ( j = 0; j < 256; j++ )
-                            data[i+j] = buf.i32[j];
-                    }
-                    len = len-(i-256);
-                    InflateData(mat,z,buf.i32,len*data_size);
-                    for ( j = 0; j < len; j++ )
-                        data[i+j] = buf.i32[j];
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            data_size = sizeof(mat_uint32_t);
-            if ( mat->byteswap ) {
-                if ( len <= 256 ){
-                    InflateData(mat,z,buf.ui32,len*data_size);
-                    for ( i = 0; i < len; i++ )
-                        data[i] = Mat_uint32Swap(buf.ui32+i);
-                } else {
-                    int j;
-                    len -= 256;
-                    for ( i = 0; i < len; i+=256 ) {
-                        InflateData(mat,z,buf.ui32,256*data_size);
-                        for ( j = 0; j < 256; j++ )
-                            data[i+j] = Mat_uint32Swap(buf.ui32+j);
-                    }
-                    len = len-(i-256);
-                    InflateData(mat,z,buf.ui32,len*data_size);
-                    for ( j = 0; j < len; j++ )
-                        data[i+j] = Mat_uint32Swap(buf.ui32+j);
-                }
-            } else {
-                if ( len <= 256 ) {
-                    InflateData(mat,z,buf.ui32,len*data_size);
-                    for ( i = 0; i < len; i++ )
-                        data[i] = buf.ui32[i];
-                } else {
-                    int j;
-                    len -= 256;
-                    for ( i = 0; i < len; i+=256 ) {
-                        InflateData(mat,z,buf.ui32,256*data_size);
-                        for ( j = 0; j < 256; j++ )
-                            data[i+j] = buf.ui32[j];
-                    }
-                    len = len-(i-256);
-                    InflateData(mat,z,buf.ui32,len*data_size);
-                    for ( j = 0; j < len; j++ )
-                        data[i+j] = buf.ui32[j];
-                }
-            }
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            data_size = sizeof(mat_int16_t);
-            if ( mat->byteswap ) {
-                if ( len <= 512 ){
-                    InflateData(mat,z,buf.i16,len*data_size);
-                    for ( i = 0; i < len; i++ )
-                        data[i] = Mat_int16Swap(buf.i16+i);
-                } else {
-                    int j;
-                    len -= 512;
-                    for ( i = 0; i < len; i+=512 ) {
-                        InflateData(mat,z,buf.i16,512*data_size);
-                        for ( j = 0; j < 512; j++ )
-                            data[i+j] = Mat_int16Swap(buf.i16+j);
-                    }
-                    len = len-(i-512);
-                    InflateData(mat,z,buf.i16,len*data_size);
-                    for ( j = 0; j < len; j++ )
-                        data[i+j] = Mat_int16Swap(buf.i16+j);
-                }
-            } else {
-                if ( len <= 512 ) {
-                    InflateData(mat,z,buf.i16,len*data_size);
-                    for ( i = 0; i < len; i++ )
-                        data[i] = buf.i16[i];
-                } else {
-                    int j;
-                    len -= 512;
-                    for ( i = 0; i < len; i+=512 ) {
-                        InflateData(mat,z,buf.i16,512*data_size);
-                        for ( j = 0; j < 512; j++ )
-                            data[i+j] = buf.i16[j];
-                    }
-                    len = len-(i-512);
-                    InflateData(mat,z,buf.i16,len*data_size);
-                    for ( j = 0; j < len; j++ )
-                        data[i+j] = buf.i16[j];
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            data_size = sizeof(mat_uint16_t);
-            if ( mat->byteswap ) {
-                if ( len <= 512 ){
-                    InflateData(mat,z,buf.ui16,len*data_size);
-                    for ( i = 0; i < len; i++ )
-                        data[i] = Mat_uint16Swap(buf.ui16+i);
-                } else {
-                    int j;
-                    len -= 512;
-                    for ( i = 0; i < len; i+=512 ) {
-                        InflateData(mat,z,buf.ui16,512*data_size);
-                        for ( j = 0; j < 512; j++ )
-                            data[i+j] = Mat_uint16Swap(buf.ui16+j);
-                    }
-                    len = len-(i-512);
-                    InflateData(mat,z,buf.ui16,len*data_size);
-                    for ( j = 0; j < len; j++ )
-                        data[i+j] = Mat_uint16Swap(buf.ui16+j);
-                }
-            } else {
-                if ( len <= 512 ) {
-                    InflateData(mat,z,buf.ui16,len*data_size);
-                    for ( i = 0; i < len; i++ )
-                        data[i] = buf.ui16[i];
-                } else {
-                    int j;
-                    len -= 512;
-                    for ( i = 0; i < len; i+=512 ) {
-                        InflateData(mat,z,buf.ui16,512*data_size);
-                        for ( j = 0; j < 512; j++ )
-                            data[i+j] = buf.ui16[j];
-                    }
-                    len = len-(i-512);
-                    InflateData(mat,z,buf.ui16,len*data_size);
-                    for ( j = 0; j < len; j++ )
-                        data[i+j] = buf.ui16[j];
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            data_size = sizeof(mat_uint8_t);
-            if ( len <= 1024 ) {
-                InflateData(mat,z,buf.ui8,len*data_size);
-                for ( i = 0; i < len; i++ )
-                    data[i] = buf.ui8[i];
-            } else {
-                int j;
-                len -= 1024;
-                for ( i = 0; i < len; i+=1024 ) {
-                    InflateData(mat,z,buf.ui8,1024*data_size);
-                    for ( j = 0; j < 1024; j++ )
-                        data[i+j] = buf.ui8[j];
-                }
-                len = len-(i-1024);
-                InflateData(mat,z,buf.ui8,len*data_size);
-                for ( j = 0; j < len; j++ )
-                    data[i+j] = buf.ui8[j];
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            data_size = sizeof(mat_int8_t);
-            if ( len <= 1024 ) {
-                InflateData(mat,z,buf.i8,len*data_size);
-                for ( i = 0; i < len; i++ )
-                    data[i] = buf.i8[i];
-            } else {
-                int j;
-                len -= 1024;
-                for ( i = 0; i < len; i+=1024 ) {
-                    InflateData(mat,z,buf.i8,1024*data_size);
-                    for ( j = 0; j < 1024; j++ )
-                        data[i+j] = buf.i8[j];
-                }
-                len = len-(i-1024);
-                InflateData(mat,z,buf.i8,len*data_size);
-                for ( j = 0; j < len; j++ )
-                    data[i+j] = buf.i8[j];
-            }
-            break;
-        }
-    }
-    nBytes = len*data_size;
-    return nBytes;
-}
-#endif
-
-/** @brief Reads data of type @c data_type into a float type
- *
- * Reads from the MAT file @c len elements of data type @c data_type storing
- * them as float's in @c data.
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param data Pointer to store the output float values (len*sizeof(float))
- * @param data_type one of the @c matio_types enumerations which is the source
- *                  data type in the file
- * @param len Number of elements of type @c data_type to read from the file
- * @retval Number of bytes read from the file
- */
-int
-ReadSingleData(mat_t *mat,float *data,int data_type,int len)
-{
-    int bytesread = 0, data_size = 0, i;
-
-    if ( (mat   == NULL) || (data   == NULL) || (mat->fp == NULL) )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            double d;
-
-            data_size = sizeof(double);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&d,data_size,1,mat->fp);
-                    data[i] = Mat_doubleSwap(&d);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&d,data_size,1,mat->fp);
-                    data[i] = d;
-                }
-            }
-            break;
-        }
-        case MAT_T_SINGLE:
-        {
-            float f;
-
-            data_size = sizeof(float);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&f,data_size,1,mat->fp);
-                    data[i] = Mat_floatSwap(&f);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&f,data_size,1,mat->fp);
-                    data[i] = f;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT32:
-        {
-            mat_int32_t i32;
-
-            data_size = sizeof(mat_int32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i32,data_size,1,mat->fp);
-                    data[i] = Mat_int32Swap(&i32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i32,data_size,1,mat->fp);
-                    data[i] = i32;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            mat_uint32_t ui32;
-
-            data_size = sizeof(mat_uint32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui32,data_size,1,mat->fp);
-                    data[i] = Mat_uint32Swap(&ui32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui32,data_size,1,mat->fp);
-                    data[i] = ui32;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            mat_int16_t i16;
-
-            data_size = sizeof(mat_int16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i16,data_size,1,mat->fp);
-                    data[i] = Mat_int16Swap(&i16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i16,data_size,1,mat->fp);
-                    data[i] = i16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t ui16;
-
-            data_size = sizeof(mat_uint16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui16,data_size,1,mat->fp);
-                    data[i] = Mat_uint16Swap(&ui16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui16,data_size,1,mat->fp);
-                    data[i] = ui16;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            mat_int8_t i8;
-
-            data_size = sizeof(mat_int8_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i8,data_size,1,mat->fp);
-                    data[i] = i8;
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i8,data_size,1,mat->fp);
-                    data[i] = i8;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t ui8;
-
-            data_size = sizeof(mat_uint8_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui8,data_size,1,mat->fp);
-                    data[i] = ui8;
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui8,data_size,1,mat->fp);
-                    data[i] = ui8;
-                }
-            }
-            break;
-        }
-    }
-    bytesread *= data_size;
-    return bytesread;
-}
-
-#if defined(HAVE_ZLIB)
-/** @brief Reads data of type @c data_type into a float type
- *
- * Reads from the MAT file @c len compressed elements of data type @c data_type
- * storing them as float's in @c data.
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param z Pointer to the zlib stream for inflation
- * @param data Pointer to store the output float values (len*sizeof(float))
- * @param data_type one of the @c matio_types enumerations which is the source
- *                  data type in the file
- * @param len Number of elements of type @c data_type to read from the file
- * @retval Number of bytes read from the file
- */
-int
-ReadCompressedSingleData(mat_t *mat,z_stream *z,float *data,
-    int data_type,int len)
-{
-    int nBytes = 0, data_size = 0, i;
-
-    if ( (mat == NULL) || (data == NULL) || (z == NULL) )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            double d;
-
-            data_size = sizeof(double);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&d,data_size);
-                    data[i] = Mat_doubleSwap(&d);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&d,data_size);
-                    data[i] = d;
-                }
-            }
-            break;
-        }
-        case MAT_T_SINGLE:
-        {
-            float f;
-
-            data_size = sizeof(float);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&f,data_size);
-                    data[i] = Mat_floatSwap(&f);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,data+i,data_size);
-                }
-            }
-            break;
-        }
-        case MAT_T_INT32:
-        {
-            mat_int32_t i32;
-
-            data_size = sizeof(mat_int32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i32,data_size);
-                    data[i] = Mat_int32Swap(&i32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i32,data_size);
-                    data[i] = i32;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            mat_uint32_t ui32;
-
-            data_size = sizeof(mat_uint32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui32,data_size);
-                    data[i] = Mat_uint32Swap(&ui32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui32,data_size);
-                    data[i] = ui32;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            mat_int16_t i16;
-
-            data_size = sizeof(mat_int16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i16,data_size);
-                    data[i] = Mat_int16Swap(&i16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i16,data_size);
-                    data[i] = i16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t ui16;
-
-            data_size = sizeof(mat_uint16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui16,data_size);
-                    data[i] = Mat_uint16Swap(&ui16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui16,data_size);
-                    data[i] = ui16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t ui8;
-
-            data_size = sizeof(mat_uint8_t);
-            for ( i = 0; i < len; i++ ) {
-                InflateData(mat,z,&ui8,data_size);
-                data[i] = ui8;
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            mat_int8_t i8;
-
-            data_size = sizeof(mat_int8_t);
-            for ( i = 0; i < len; i++ ) {
-                InflateData(mat,z,&i8,data_size);
-                data[i] = i8;
-            }
-            break;
-        }
-    }
-    nBytes = len*data_size;
-    return nBytes;
-}
-#endif
-
-#ifdef HAVE_MAT_INT64_T
-/** @brief Reads data of type @c data_type into a signed 64-bit integer type
- *
- * Reads from the MAT file @c len elements of data type @c data_type storing
- * them as signed 64-bit integers in @c data.
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param data Pointer to store the output signed 64-bit integer values
- *             (len*sizeof(mat_int64_t))
- * @param data_type one of the @c matio_types enumerations which is the source
- *                  data type in the file
- * @param len Number of elements of type @c data_type to read from the file
- * @retval Number of bytes read from the file
- */
-int
-ReadInt64Data(mat_t *mat,mat_int64_t *data,int data_type,int len)
-{
-    int bytesread = 0, data_size = 0, i;
-
-    if ( (mat   == NULL) || (data   == NULL) || (mat->fp == NULL) )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            double d;
-
-            data_size = sizeof(double);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&d,data_size,1,mat->fp);
-                    data[i] = Mat_doubleSwap(&d);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&d,data_size,1,mat->fp);
-                    data[i] = d;
-                }
-            }
-            break;
-        }
-        case MAT_T_SINGLE:
-        {
-            float f;
-
-            data_size = sizeof(float);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&f,data_size,1,mat->fp);
-                    data[i] = Mat_floatSwap(&f);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&f,data_size,1,mat->fp);
-                    data[i] = f;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT64:
-        {
-            mat_int64_t i64;
-
-            data_size = sizeof(mat_int64_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i64,data_size,1,mat->fp);
-                    data[i] = Mat_int64Swap(&i64);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i64,data_size,1,mat->fp);
-                    data[i] = i64;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT64:
-        {
-            mat_uint64_t ui64;
-
-            data_size = sizeof(mat_uint64_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui64,data_size,1,mat->fp);
-                    data[i] = Mat_uint64Swap(&ui64);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui64,data_size,1,mat->fp);
-                    data[i] = ui64;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT32:
-        {
-            mat_int32_t i32;
-
-            data_size = sizeof(mat_int32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i32,data_size,1,mat->fp);
-                    data[i] = Mat_int32Swap(&i32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i32,data_size,1,mat->fp);
-                    data[i] = i32;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            mat_uint32_t ui32;
-
-            data_size = sizeof(mat_uint32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui32,data_size,1,mat->fp);
-                    data[i] = Mat_uint32Swap(&ui32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui32,data_size,1,mat->fp);
-                    data[i] = ui32;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            mat_int16_t i16;
-
-            data_size = sizeof(mat_int16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i16,data_size,1,mat->fp);
-                    data[i] = Mat_int16Swap(&i16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i16,data_size,1,mat->fp);
-                    data[i] = i16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t ui16;
-
-            data_size = sizeof(mat_uint16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui16,data_size,1,mat->fp);
-                    data[i] = Mat_uint16Swap(&ui16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui16,data_size,1,mat->fp);
-                    data[i] = ui16;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            mat_int8_t i8;
-
-            data_size = sizeof(mat_int8_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i8,data_size,1,mat->fp);
-                    data[i] = i8;
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i8,data_size,1,mat->fp);
-                    data[i] = i8;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t ui8;
-
-            data_size = sizeof(mat_uint8_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui8,data_size,1,mat->fp);
-                    data[i] = ui8;
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui8,data_size,1,mat->fp);
-                    data[i] = ui8;
-                }
-            }
-            break;
-        }
-    }
-    bytesread *= data_size;
-    return bytesread;
-}
-
-#if defined(HAVE_ZLIB)
-/** @brief Reads data of type @c data_type into a signed 64-bit integer type
- *
- * Reads from the MAT file @c len compressed elements of data type @c data_type
- * storing them as signed 64-bit integers in @c data.
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param z Pointer to the zlib stream for inflation
- * @param data Pointer to store the output signed 64-bit integer values
- *             (len*sizeof(mat_int64_t))
- * @param data_type one of the @c matio_types enumerations which is the source
- *                  data type in the file
- * @param len Number of elements of type @c data_type to read from the file
- * @retval Number of bytes read from the file
- */
-int
-ReadCompressedInt64Data(mat_t *mat,z_stream *z,mat_int64_t *data,
-    int data_type,int len)
-{
-    int nBytes = 0, data_size = 0, i;
-
-    if ( (mat == NULL) || (data == NULL) || (z == NULL) )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            double d;
-
-            data_size = sizeof(double);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&d,data_size);
-                    data[i] = Mat_doubleSwap(&d);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&d,data_size);
-                    data[i] = d;
-                }
-            }
-            break;
-        }
-        case MAT_T_SINGLE:
-        {
-            float f;
-
-            data_size = sizeof(float);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&f,data_size);
-                    data[i] = Mat_floatSwap(&f);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&f,data_size);
-                    data[i] = f;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT64:
-        {
-            mat_int64_t i64;
-
-            data_size = sizeof(mat_int64_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i64,data_size);
-                    data[i] = Mat_int64Swap(&i64);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i64,data_size);
-                    data[i] = i64;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT64:
-        {
-            mat_uint64_t ui64;
-
-            data_size = sizeof(mat_uint64_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui64,data_size);
-                    data[i] = Mat_uint64Swap(&ui64);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui64,data_size);
-                    data[i] = ui64;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT32:
-        {
-            mat_int32_t i32;
-
-            data_size = sizeof(mat_int32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i32,data_size);
-                    data[i] = Mat_int32Swap(&i32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i32,data_size);
-                    data[i] = i32;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            mat_uint32_t ui32;
-
-            data_size = sizeof(mat_uint32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui32,data_size);
-                    data[i] = Mat_uint32Swap(&ui32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui32,data_size);
-                    data[i] = ui32;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            mat_int16_t i16;
-
-            data_size = sizeof(mat_int16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i16,data_size);
-                    data[i] = Mat_int16Swap(&i16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i16,data_size);
-                    data[i] = i16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t ui16;
-
-            data_size = sizeof(mat_uint16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui16,data_size);
-                    data[i] = Mat_uint16Swap(&ui16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui16,data_size);
-                    data[i] = ui16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t ui8;
-
-            data_size = sizeof(mat_uint8_t);
-            for ( i = 0; i < len; i++ ) {
-                InflateData(mat,z,&ui8,data_size);
-                data[i] = ui8;
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            mat_int8_t i8;
-
-            data_size = sizeof(mat_int8_t);
-            for ( i = 0; i < len; i++ ) {
-                InflateData(mat,z,&i8,data_size);
-                data[i] = i8;
-            }
-            break;
-        }
-    }
-    nBytes = len*data_size;
-    return nBytes;
-}
-#endif
-#endif /* HAVE_MAT_INT64_T */
-
-#ifdef HAVE_MAT_UINT64_T
-/** @brief Reads data of type @c data_type into an unsigned 64-bit integer type
- *
- * Reads from the MAT file @c len elements of data type @c data_type storing
- * them as unsigned 64-bit integers in @c data.
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param data Pointer to store the output unsigned 64-bit integer values
- *             (len*sizeof(mat_uint64_t))
- * @param data_type one of the @c matio_types enumerations which is the source
- *                  data type in the file
- * @param len Number of elements of type @c data_type to read from the file
- * @retval Number of bytes read from the file
- */
-int
-ReadUInt64Data(mat_t *mat,mat_uint64_t *data,int data_type,int len)
-{
-    int bytesread = 0, data_size = 0, i;
-
-    if ( (mat   == NULL) || (data   == NULL) || (mat->fp == NULL) )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            double d;
-
-            data_size = sizeof(double);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&d,data_size,1,mat->fp);
-                    data[i] = Mat_doubleSwap(&d);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&d,data_size,1,mat->fp);
-                    data[i] = d;
-                }
-            }
-            break;
-        }
-        case MAT_T_SINGLE:
-        {
-            float f;
-
-            data_size = sizeof(float);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&f,data_size,1,mat->fp);
-                    data[i] = Mat_floatSwap(&f);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&f,data_size,1,mat->fp);
-                    data[i] = f;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT64:
-        {
-            mat_int64_t i64;
-
-            data_size = sizeof(mat_int64_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i64,data_size,1,mat->fp);
-                    data[i] = Mat_int64Swap(&i64);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i64,data_size,1,mat->fp);
-                    data[i] = i64;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT64:
-        {
-            mat_uint64_t ui64;
-
-            data_size = sizeof(mat_uint64_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui64,data_size,1,mat->fp);
-                    data[i] = Mat_uint64Swap(&ui64);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui64,data_size,1,mat->fp);
-                    data[i] = ui64;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT32:
-        {
-            mat_int32_t i32;
-
-            data_size = sizeof(mat_int32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i32,data_size,1,mat->fp);
-                    data[i] = Mat_int32Swap(&i32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i32,data_size,1,mat->fp);
-                    data[i] = i32;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            mat_uint32_t ui32;
-
-            data_size = sizeof(mat_uint32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui32,data_size,1,mat->fp);
-                    data[i] = Mat_uint32Swap(&ui32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui32,data_size,1,mat->fp);
-                    data[i] = ui32;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            mat_int16_t i16;
-
-            data_size = sizeof(mat_int16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i16,data_size,1,mat->fp);
-                    data[i] = Mat_int16Swap(&i16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i16,data_size,1,mat->fp);
-                    data[i] = i16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t ui16;
-
-            data_size = sizeof(mat_uint16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui16,data_size,1,mat->fp);
-                    data[i] = Mat_uint16Swap(&ui16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui16,data_size,1,mat->fp);
-                    data[i] = ui16;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            mat_int8_t i8;
-
-            data_size = sizeof(mat_int8_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i8,data_size,1,mat->fp);
-                    data[i] = i8;
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i8,data_size,1,mat->fp);
-                    data[i] = i8;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t ui8;
-
-            data_size = sizeof(mat_uint8_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui8,data_size,1,mat->fp);
-                    data[i] = ui8;
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui8,data_size,1,mat->fp);
-                    data[i] = ui8;
-                }
-            }
-            break;
-        }
-    }
-    bytesread *= data_size;
-    return bytesread;
-}
-
-#if defined(HAVE_ZLIB)
-/** @brief Reads data of type @c data_type into an unsigned 64-bit integer type
- *
- * Reads from the MAT file @c len compressed elements of data type @c data_type
- * storing them as unsigned 64-bit integers in @c data.
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param z Pointer to the zlib stream for inflation
- * @param data Pointer to store the output unsigned 64-bit integer values
- *             (len*sizeof(mat_uint64_t))
- * @param data_type one of the @c matio_types enumerations which is the source
- *                  data type in the file
- * @param len Number of elements of type @c data_type to read from the file
- * @retval Number of bytes read from the file
- */
-int
-ReadCompressedUInt64Data(mat_t *mat,z_stream *z,mat_uint64_t *data,
-    int data_type,int len)
-{
-    int nBytes = 0, data_size = 0, i;
-
-    if ( (mat == NULL) || (data == NULL) || (z == NULL) )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            double d;
-
-            data_size = sizeof(double);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&d,data_size);
-                    data[i] = Mat_doubleSwap(&d);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&d,data_size);
-                    data[i] = d;
-                }
-            }
-            break;
-        }
-        case MAT_T_SINGLE:
-        {
-            float f;
-
-            data_size = sizeof(float);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&f,data_size);
-                    data[i] = Mat_floatSwap(&f);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&f,data_size);
-                    data[i] = f;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT64:
-        {
-            mat_int64_t i64;
-
-            data_size = sizeof(mat_int64_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i64,data_size);
-                    data[i] = Mat_int64Swap(&i64);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i64,data_size);
-                    data[i] = i64;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT64:
-        {
-            mat_uint64_t ui64;
-
-            data_size = sizeof(mat_uint64_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui64,data_size);
-                    data[i] = Mat_uint64Swap(&ui64);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui64,data_size);
-                    data[i] = ui64;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT32:
-        {
-            mat_int32_t i32;
-
-            data_size = sizeof(mat_int32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i32,data_size);
-                    data[i] = Mat_int32Swap(&i32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i32,data_size);
-                    data[i] = i32;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            mat_uint32_t ui32;
-
-            data_size = sizeof(mat_uint32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui32,data_size);
-                    data[i] = Mat_uint32Swap(&ui32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui32,data_size);
-                    data[i] = ui32;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            mat_int16_t i16;
-
-            data_size = sizeof(mat_int16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i16,data_size);
-                    data[i] = Mat_int16Swap(&i16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i16,data_size);
-                    data[i] = i16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t ui16;
-
-            data_size = sizeof(mat_uint16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui16,data_size);
-                    data[i] = Mat_uint16Swap(&ui16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui16,data_size);
-                    data[i] = ui16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t ui8;
-
-            data_size = sizeof(mat_uint8_t);
-            for ( i = 0; i < len; i++ ) {
-                InflateData(mat,z,&ui8,data_size);
-                data[i] = ui8;
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            mat_int8_t i8;
-
-            data_size = sizeof(mat_int8_t);
-            for ( i = 0; i < len; i++ ) {
-                InflateData(mat,z,&i8,data_size);
-                data[i] = i8;
-            }
-            break;
-        }
-    }
-    nBytes = len*data_size;
-    return nBytes;
-}
-#endif /* HAVE_ZLIB */
-#endif /* HAVE_MAT_UINT64_T */
-
-/** @brief Reads data of type @c data_type into a signed 32-bit integer type
- *
- * Reads from the MAT file @c len elements of data type @c data_type storing
- * them as signed 32-bit integers in @c data.
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param data Pointer to store the output signed 32-bit integer values
- *             (len*sizeof(mat_int32_t))
- * @param data_type one of the @c matio_types enumerations which is the source
- *                  data type in the file
- * @param len Number of elements of type @c data_type to read from the file
- * @retval Number of bytes read from the file
- */
-int
-ReadInt32Data(mat_t *mat,mat_int32_t *data,int data_type,int len)
-{
-    int bytesread = 0, data_size = 0, i;
-
-    if ( (mat   == NULL) || (data   == NULL) || (mat->fp == NULL) )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            double d;
-
-            data_size = sizeof(double);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&d,data_size,1,mat->fp);
-                    data[i] = Mat_doubleSwap(&d);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&d,data_size,1,mat->fp);
-                    data[i] = d;
-                }
-            }
-            break;
-        }
-        case MAT_T_SINGLE:
-        {
-            float f;
-
-            data_size = sizeof(float);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&f,data_size,1,mat->fp);
-                    data[i] = Mat_floatSwap(&f);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&f,data_size,1,mat->fp);
-                    data[i] = f;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT32:
-        {
-            mat_int32_t i32;
-
-            data_size = sizeof(mat_int32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i32,data_size,1,mat->fp);
-                    data[i] = Mat_int32Swap(&i32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i32,data_size,1,mat->fp);
-                    data[i] = i32;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            mat_uint32_t ui32;
-
-            data_size = sizeof(mat_uint32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui32,data_size,1,mat->fp);
-                    data[i] = Mat_uint32Swap(&ui32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui32,data_size,1,mat->fp);
-                    data[i] = ui32;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            mat_int16_t i16;
-
-            data_size = sizeof(mat_int16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i16,data_size,1,mat->fp);
-                    data[i] = Mat_int16Swap(&i16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i16,data_size,1,mat->fp);
-                    data[i] = i16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t ui16;
-
-            data_size = sizeof(mat_uint16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui16,data_size,1,mat->fp);
-                    data[i] = Mat_uint16Swap(&ui16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui16,data_size,1,mat->fp);
-                    data[i] = ui16;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            mat_int8_t i8;
-
-            data_size = sizeof(mat_int8_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i8,data_size,1,mat->fp);
-                    data[i] = i8;
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i8,data_size,1,mat->fp);
-                    data[i] = i8;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t ui8;
-
-            data_size = sizeof(mat_uint8_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui8,data_size,1,mat->fp);
-                    data[i] = ui8;
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui8,data_size,1,mat->fp);
-                    data[i] = ui8;
-                }
-            }
-            break;
-        }
-    }
-    bytesread *= data_size;
-    return bytesread;
-}
-
-#if defined(HAVE_ZLIB)
-/** @brief Reads data of type @c data_type into a signed 32-bit integer type
- *
- * Reads from the MAT file @c len compressed elements of data type @c data_type
- * storing them as signed 32-bit integers in @c data.
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param z Pointer to the zlib stream for inflation
- * @param data Pointer to store the output signed 32-bit integer values
- *             (len*sizeof(mat_int32_t))
- * @param data_type one of the @c matio_types enumerations which is the source
- *                  data type in the file
- * @param len Number of elements of type @c data_type to read from the file
- * @retval Number of bytes read from the file
- */
-int
-ReadCompressedInt32Data(mat_t *mat,z_stream *z,mat_int32_t *data,
-    int data_type,int len)
-{
-    int nBytes = 0, data_size = 0, i;
-
-    if ( (mat == NULL) || (data == NULL) || (z == NULL) )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            double d;
-
-            data_size = sizeof(double);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&d,data_size);
-                    data[i] = Mat_doubleSwap(&d);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&d,data_size);
-                    data[i] = d;
-                }
-            }
-            break;
-        }
-        case MAT_T_SINGLE:
-        {
-            float f;
-
-            data_size = sizeof(float);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&f,data_size);
-                    data[i] = Mat_floatSwap(&f);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&f,data_size);
-                    data[i] = f;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT32:
-        {
-            mat_int32_t i32;
-
-            data_size = sizeof(mat_int32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i32,data_size);
-                    data[i] = Mat_int32Swap(&i32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i32,data_size);
-                    data[i] = i32;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            mat_uint32_t ui32;
-
-            data_size = sizeof(mat_uint32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui32,data_size);
-                    data[i] = Mat_uint32Swap(&ui32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui32,data_size);
-                    data[i] = ui32;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            mat_int16_t i16;
-
-            data_size = sizeof(mat_int16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i16,data_size);
-                    data[i] = Mat_int16Swap(&i16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i16,data_size);
-                    data[i] = i16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t ui16;
-
-            data_size = sizeof(mat_uint16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui16,data_size);
-                    data[i] = Mat_uint16Swap(&ui16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui16,data_size);
-                    data[i] = ui16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t ui8;
-
-            data_size = sizeof(mat_uint8_t);
-            for ( i = 0; i < len; i++ ) {
-                InflateData(mat,z,&ui8,data_size);
-                data[i] = ui8;
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            mat_int8_t i8;
-
-            data_size = sizeof(mat_int8_t);
-            for ( i = 0; i < len; i++ ) {
-                InflateData(mat,z,&i8,data_size);
-                data[i] = i8;
-            }
-            break;
-        }
-    }
-    nBytes = len*data_size;
-    return nBytes;
-}
-#endif
-
-/** @brief Reads data of type @c data_type into an unsigned 32-bit integer type
- *
- * Reads from the MAT file @c len elements of data type @c data_type storing
- * them as unsigned 32-bit integers in @c data.
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param data Pointer to store the output unsigned 32-bit integer values
- *             (len*sizeof(mat_uint32_t))
- * @param data_type one of the @c matio_types enumerations which is the source
- *                  data type in the file
- * @param len Number of elements of type @c data_type to read from the file
- * @retval Number of bytes read from the file
- */
-int
-ReadUInt32Data(mat_t *mat,mat_uint32_t *data,int data_type,int len)
-{
-    int bytesread = 0, data_size = 0, i;
-
-    if ( (mat   == NULL) || (data   == NULL) || (mat->fp == NULL) )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            double d;
-
-            data_size = sizeof(double);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&d,data_size,1,mat->fp);
-                    data[i] = Mat_doubleSwap(&d);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&d,data_size,1,mat->fp);
-                    data[i] = d;
-                }
-            }
-            break;
-        }
-        case MAT_T_SINGLE:
-        {
-            float f;
-
-            data_size = sizeof(float);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&f,data_size,1,mat->fp);
-                    data[i] = Mat_floatSwap(&f);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&f,data_size,1,mat->fp);
-                    data[i] = f;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT32:
-        {
-            mat_int32_t i32;
-
-            data_size = sizeof(mat_int32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i32,data_size,1,mat->fp);
-                    data[i] = Mat_int32Swap(&i32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i32,data_size,1,mat->fp);
-                    data[i] = i32;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            mat_uint32_t ui32;
-
-            data_size = sizeof(mat_uint32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui32,data_size,1,mat->fp);
-                    data[i] = Mat_uint32Swap(&ui32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui32,data_size,1,mat->fp);
-                    data[i] = ui32;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            mat_int16_t i16;
-
-            data_size = sizeof(mat_int16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i16,data_size,1,mat->fp);
-                    data[i] = Mat_int16Swap(&i16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i16,data_size,1,mat->fp);
-                    data[i] = i16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t ui16;
-
-            data_size = sizeof(mat_uint16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui16,data_size,1,mat->fp);
-                    data[i] = Mat_uint16Swap(&ui16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui16,data_size,1,mat->fp);
-                    data[i] = ui16;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            mat_int8_t i8;
-
-            data_size = sizeof(mat_int8_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i8,data_size,1,mat->fp);
-                    data[i] = i8;
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i8,data_size,1,mat->fp);
-                    data[i] = i8;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t ui8;
-
-            data_size = sizeof(mat_uint8_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui8,data_size,1,mat->fp);
-                    data[i] = ui8;
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui8,data_size,1,mat->fp);
-                    data[i] = ui8;
-                }
-            }
-            break;
-        }
-    }
-    bytesread *= data_size;
-    return bytesread;
-}
-
-#if defined(HAVE_ZLIB)
-/** @brief Reads data of type @c data_type into an unsigned 32-bit integer type
- *
- * Reads from the MAT file @c len compressed elements of data type @c data_type
- * storing them as unsigned 32-bit integers in @c data.
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param z Pointer to the zlib stream for inflation
- * @param data Pointer to store the output unsigned 32-bit integer values
- *             (len*sizeof(mat_uint32_t))
- * @param data_type one of the @c matio_types enumerations which is the source
- *                  data type in the file
- * @param len Number of elements of type @c data_type to read from the file
- * @retval Number of bytes read from the file
- */
-int
-ReadCompressedUInt32Data(mat_t *mat,z_stream *z,mat_uint32_t *data,
-    int data_type,int len)
-{
-    int nBytes = 0, data_size = 0, i;
-
-    if ( (mat == NULL) || (data == NULL) || (z == NULL) )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            double d;
-
-            data_size = sizeof(double);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&d,data_size);
-                    data[i] = Mat_doubleSwap(&d);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&d,data_size);
-                    data[i] = d;
-                }
-            }
-            break;
-        }
-        case MAT_T_SINGLE:
-        {
-            float f;
-
-            data_size = sizeof(float);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&f,data_size);
-                    data[i] = Mat_floatSwap(&f);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&f,data_size);
-                    data[i] = f;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT32:
-        {
-            mat_int32_t i32;
-
-            data_size = sizeof(mat_int32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i32,data_size);
-                    data[i] = Mat_int32Swap(&i32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i32,data_size);
-                    data[i] = i32;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            mat_uint32_t ui32;
-
-            data_size = sizeof(mat_uint32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui32,data_size);
-                    data[i] = Mat_uint32Swap(&ui32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui32,data_size);
-                    data[i] = ui32;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            mat_int16_t i16;
-
-            data_size = sizeof(mat_int16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i16,data_size);
-                    data[i] = Mat_int16Swap(&i16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i16,data_size);
-                    data[i] = i16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t ui16;
-
-            data_size = sizeof(mat_uint16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui16,data_size);
-                    data[i] = Mat_uint16Swap(&ui16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui16,data_size);
-                    data[i] = ui16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t ui8;
-
-            data_size = sizeof(mat_uint8_t);
-            for ( i = 0; i < len; i++ ) {
-                InflateData(mat,z,&ui8,data_size);
-                data[i] = ui8;
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            mat_int8_t i8;
-
-            data_size = sizeof(mat_int8_t);
-            for ( i = 0; i < len; i++ ) {
-                InflateData(mat,z,&i8,data_size);
-                data[i] = i8;
-            }
-            break;
-        }
-    }
-    nBytes = len*data_size;
-    return nBytes;
-}
-#endif
-
-/** @brief Reads data of type @c data_type into a signed 16-bit integer type
- *
- * Reads from the MAT file @c len elements of data type @c data_type storing
- * them as signed 16-bit integers in @c data.
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param data Pointer to store the output signed 16-bit integer values
- *             (len*sizeof(mat_int16_t))
- * @param data_type one of the @c matio_types enumerations which is the source
- *                  data type in the file
- * @param len Number of elements of type @c data_type to read from the file
- * @retval Number of bytes read from the file
- */
-int
-ReadInt16Data(mat_t *mat,mat_int16_t *data,int data_type,int len)
-{
-    int bytesread = 0, data_size = 0, i;
-
-    if ( (mat   == NULL) || (data   == NULL) || (mat->fp == NULL) )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            double d;
-
-            data_size = sizeof(double);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&d,data_size,1,mat->fp);
-                    data[i] = Mat_doubleSwap(&d);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&d,data_size,1,mat->fp);
-                    data[i] = d;
-                }
-            }
-            break;
-        }
-        case MAT_T_SINGLE:
-        {
-            float f;
-
-            data_size = sizeof(float);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&f,data_size,1,mat->fp);
-                    data[i] = Mat_floatSwap(&f);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&f,data_size,1,mat->fp);
-                    data[i] = f;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT32:
-        {
-            mat_int32_t i32;
-
-            data_size = sizeof(mat_int32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i32,data_size,1,mat->fp);
-                    data[i] = Mat_int32Swap(&i32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i32,data_size,1,mat->fp);
-                    data[i] = i32;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            mat_uint32_t ui32;
-
-            data_size = sizeof(mat_uint32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui32,data_size,1,mat->fp);
-                    data[i] = Mat_uint32Swap(&ui32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui32,data_size,1,mat->fp);
-                    data[i] = ui32;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            mat_int16_t i16;
-
-            data_size = sizeof(mat_int16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i16,data_size,1,mat->fp);
-                    data[i] = Mat_int16Swap(&i16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i16,data_size,1,mat->fp);
-                    data[i] = i16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t ui16;
-
-            data_size = sizeof(mat_uint16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui16,data_size,1,mat->fp);
-                    data[i] = Mat_uint16Swap(&ui16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui16,data_size,1,mat->fp);
-                    data[i] = ui16;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            mat_int8_t i8;
-
-            data_size = sizeof(mat_int8_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i8,data_size,1,mat->fp);
-                    data[i] = i8;
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i8,data_size,1,mat->fp);
-                    data[i] = i8;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t ui8;
-
-            data_size = sizeof(mat_uint8_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui8,data_size,1,mat->fp);
-                    data[i] = ui8;
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui8,data_size,1,mat->fp);
-                    data[i] = ui8;
-                }
-            }
-            break;
-        }
-    }
-    bytesread *= data_size;
-    return bytesread;
-}
-
-#if defined(HAVE_ZLIB)
-/** @brief Reads data of type @c data_type into a signed 16-bit integer type
- *
- * Reads from the MAT file @c len compressed elements of data type @c data_type
- * storing them as signed 16-bit integers in @c data.
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param z Pointer to the zlib stream for inflation
- * @param data Pointer to store the output signed 16-bit integer values
- *             (len*sizeof(mat_int16_t))
- * @param data_type one of the @c matio_types enumerations which is the source
- *                  data type in the file
- * @param len Number of elements of type @c data_type to read from the file
- * @retval Number of bytes read from the file
- */
-int
-ReadCompressedInt16Data(mat_t *mat,z_stream *z,mat_int16_t *data,
-    int data_type,int len)
-{
-    int nBytes = 0, data_size = 0, i;
-
-    if ( (mat == NULL) || (data == NULL) || (z == NULL) )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            double d;
-
-            data_size = sizeof(double);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&d,data_size);
-                    data[i] = Mat_doubleSwap(&d);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&d,data_size);
-                    data[i] = d;
-                }
-            }
-            break;
-        }
-        case MAT_T_SINGLE:
-        {
-            float f;
-
-            data_size = sizeof(float);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&f,data_size);
-                    data[i] = Mat_floatSwap(&f);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&f,data_size);
-                    data[i] = f;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT32:
-        {
-            mat_int32_t i32;
-
-            data_size = sizeof(mat_int32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i32,data_size);
-                    data[i] = Mat_int32Swap(&i32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i32,data_size);
-                    data[i] = i32;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            mat_uint32_t ui32;
-
-            data_size = sizeof(mat_uint32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui32,data_size);
-                    data[i] = Mat_uint32Swap(&ui32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui32,data_size);
-                    data[i] = ui32;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            mat_int16_t i16;
-
-            data_size = sizeof(mat_int16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i16,data_size);
-                    data[i] = Mat_int16Swap(&i16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i16,data_size);
-                    data[i] = i16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t ui16;
-
-            data_size = sizeof(mat_uint16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui16,data_size);
-                    data[i] = Mat_uint16Swap(&ui16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui16,data_size);
-                    data[i] = ui16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t ui8;
-
-            data_size = sizeof(mat_uint8_t);
-            for ( i = 0; i < len; i++ ) {
-                InflateData(mat,z,&ui8,data_size);
-                data[i] = ui8;
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            mat_int8_t i8;
-
-            data_size = sizeof(mat_int8_t);
-            for ( i = 0; i < len; i++ ) {
-                InflateData(mat,z,&i8,data_size);
-                data[i] = i8;
-            }
-            break;
-        }
-    }
-    nBytes = len*data_size;
-    return nBytes;
-}
-#endif
-
-/** @brief Reads data of type @c data_type into an unsigned 16-bit integer type
- *
- * Reads from the MAT file @c len elements of data type @c data_type storing
- * them as unsigned 16-bit integers in @c data.
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param data Pointer to store the output unsigned 16-bit integer values
- *             (len*sizeof(mat_uint16_t))
- * @param data_type one of the @c matio_types enumerations which is the source
- *                  data type in the file
- * @param len Number of elements of type @c data_type to read from the file
- * @retval Number of bytes read from the file
- */
-int
-ReadUInt16Data(mat_t *mat,mat_uint16_t *data,int data_type,int len)
-{
-    int bytesread = 0, data_size = 0, i;
-
-    if ( (mat   == NULL) || (data   == NULL) || (mat->fp == NULL) )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            double d;
-
-            data_size = sizeof(double);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&d,data_size,1,mat->fp);
-                    data[i] = Mat_doubleSwap(&d);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&d,data_size,1,mat->fp);
-                    data[i] = d;
-                }
-            }
-            break;
-        }
-        case MAT_T_SINGLE:
-        {
-            float f;
-
-            data_size = sizeof(float);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&f,data_size,1,mat->fp);
-                    data[i] = Mat_floatSwap(&f);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&f,data_size,1,mat->fp);
-                    data[i] = f;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT32:
-        {
-            mat_int32_t i32;
-
-            data_size = sizeof(mat_int32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i32,data_size,1,mat->fp);
-                    data[i] = Mat_int32Swap(&i32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i32,data_size,1,mat->fp);
-                    data[i] = i32;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            mat_uint32_t ui32;
-
-            data_size = sizeof(mat_uint32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui32,data_size,1,mat->fp);
-                    data[i] = Mat_uint32Swap(&ui32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui32,data_size,1,mat->fp);
-                    data[i] = ui32;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            mat_int16_t i16;
-
-            data_size = sizeof(mat_int16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i16,data_size,1,mat->fp);
-                    data[i] = Mat_int16Swap(&i16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i16,data_size,1,mat->fp);
-                    data[i] = i16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t ui16;
-
-            data_size = sizeof(mat_uint16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui16,data_size,1,mat->fp);
-                    data[i] = Mat_uint16Swap(&ui16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui16,data_size,1,mat->fp);
-                    data[i] = ui16;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            mat_int8_t i8;
-
-            data_size = sizeof(mat_int8_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i8,data_size,1,mat->fp);
-                    data[i] = i8;
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i8,data_size,1,mat->fp);
-                    data[i] = i8;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t ui8;
-
-            data_size = sizeof(mat_uint8_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui8,data_size,1,mat->fp);
-                    data[i] = ui8;
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui8,data_size,1,mat->fp);
-                    data[i] = ui8;
-                }
-            }
-            break;
-        }
-    }
-    bytesread *= data_size;
-    return bytesread;
-}
-
-#if defined(HAVE_ZLIB)
-/** @brief Reads data of type @c data_type into an unsigned 16-bit integer type
- *
- * Reads from the MAT file @c len compressed elements of data type @c data_type
- * storing them as unsigned 16-bit integers in @c data.
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param z Pointer to the zlib stream for inflation
- * @param data Pointer to store the output n unsigned 16-bit integer values
- *             (len*sizeof(mat_uint16_t))
- * @param data_type one of the @c matio_types enumerations which is the source
- *                  data type in the file
- * @param len Number of elements of type @c data_type to read from the file
- * @retval Number of bytes read from the file
- */
-int
-ReadCompressedUInt16Data(mat_t *mat,z_stream *z,mat_uint16_t *data,
-    int data_type,int len)
-{
-    int nBytes = 0, data_size = 0, i;
-
-    if ( (mat == NULL) || (data == NULL) || (z == NULL) )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            double d;
-
-            data_size = sizeof(double);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&d,data_size);
-                    data[i] = Mat_doubleSwap(&d);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&d,data_size);
-                    data[i] = d;
-                }
-            }
-            break;
-        }
-        case MAT_T_SINGLE:
-        {
-            float f;
-
-            data_size = sizeof(float);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&f,data_size);
-                    data[i] = Mat_floatSwap(&f);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&f,data_size);
-                    data[i] = f;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT32:
-        {
-            mat_int32_t i32;
-
-            data_size = sizeof(mat_int32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i32,data_size);
-                    data[i] = Mat_int32Swap(&i32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i32,data_size);
-                    data[i] = i32;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            mat_uint32_t ui32;
-
-            data_size = sizeof(mat_uint32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui32,data_size);
-                    data[i] = Mat_uint32Swap(&ui32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui32,data_size);
-                    data[i] = ui32;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            mat_int16_t i16;
-
-            data_size = sizeof(mat_int16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i16,data_size);
-                    data[i] = Mat_int16Swap(&i16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i16,data_size);
-                    data[i] = i16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t ui16;
-
-            data_size = sizeof(mat_uint16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui16,data_size);
-                    data[i] = Mat_uint16Swap(&ui16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui16,data_size);
-                    data[i] = ui16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t ui8;
-
-            data_size = sizeof(mat_uint8_t);
-            for ( i = 0; i < len; i++ ) {
-                InflateData(mat,z,&ui8,data_size);
-                data[i] = ui8;
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            mat_int8_t i8;
-
-            data_size = sizeof(mat_int8_t);
-            for ( i = 0; i < len; i++ ) {
-                InflateData(mat,z,&i8,data_size);
-                data[i] = i8;
-            }
-            break;
-        }
-    }
-    nBytes = len*data_size;
-    return nBytes;
-}
-#endif
-
-/** @brief Reads data of type @c data_type into a signed 8-bit integer type
- *
- * Reads from the MAT file @c len elements of data type @c data_type storing
- * them as signed 8-bit integers in @c data.
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param data Pointer to store the output signed 8-bit integer values
- *             (len*sizeof(mat_int8_t))
- * @param data_type one of the @c matio_types enumerations which is the source
- *                  data type in the file
- * @param len Number of elements of type @c data_type to read from the file
- * @retval Number of bytes read from the file
- */
-int
-ReadInt8Data(mat_t *mat,mat_int8_t *data,int data_type,int len)
-{
-    int bytesread = 0, data_size = 0, i;
-
-    if ( (mat   == NULL) || (data   == NULL) || (mat->fp == NULL) )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            double d;
-
-            data_size = sizeof(double);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&d,data_size,1,mat->fp);
-                    data[i] = Mat_doubleSwap(&d);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&d,data_size,1,mat->fp);
-                    data[i] = d;
-                }
-            }
-            break;
-        }
-        case MAT_T_SINGLE:
-        {
-            float f;
-
-            data_size = sizeof(float);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&f,data_size,1,mat->fp);
-                    data[i] = Mat_floatSwap(&f);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&f,data_size,1,mat->fp);
-                    data[i] = f;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT32:
-        {
-            mat_int32_t i32;
-
-            data_size = sizeof(mat_int32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i32,data_size,1,mat->fp);
-                    data[i] = Mat_int32Swap(&i32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i32,data_size,1,mat->fp);
-                    data[i] = i32;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            mat_uint32_t ui32;
-
-            data_size = sizeof(mat_uint32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui32,data_size,1,mat->fp);
-                    data[i] = Mat_uint32Swap(&ui32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui32,data_size,1,mat->fp);
-                    data[i] = ui32;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            mat_int16_t i16;
-
-            data_size = sizeof(mat_int16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i16,data_size,1,mat->fp);
-                    data[i] = Mat_int16Swap(&i16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i16,data_size,1,mat->fp);
-                    data[i] = i16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t ui16;
-
-            data_size = sizeof(mat_uint16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui16,data_size,1,mat->fp);
-                    data[i] = Mat_uint16Swap(&ui16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui16,data_size,1,mat->fp);
-                    data[i] = ui16;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            mat_int8_t i8;
-
-            data_size = sizeof(mat_int8_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i8,data_size,1,mat->fp);
-                    data[i] = i8;
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i8,data_size,1,mat->fp);
-                    data[i] = i8;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t ui8;
-
-            data_size = sizeof(mat_uint8_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui8,data_size,1,mat->fp);
-                    data[i] = ui8;
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui8,data_size,1,mat->fp);
-                    data[i] = ui8;
-                }
-            }
-            break;
-        }
-    }
-    bytesread *= data_size;
-    return bytesread;
-}
-
-#if defined(HAVE_ZLIB)
-/** @brief Reads data of type @c data_type into a signed 8-bit integer type
- *
- * Reads from the MAT file @c len compressed elements of data type @c data_type
- * storing them as signed 8-bit integers in @c data.
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param z Pointer to the zlib stream for inflation
- * @param data Pointer to store the output signed 8-bit integer values
- *             (len*sizeof(mat_int8_t))
- * @param data_type one of the @c matio_types enumerations which is the source
- *                  data type in the file
- * @param len Number of elements of type @c data_type to read from the file
- * @retval Number of bytes read from the file
- */
-int
-ReadCompressedInt8Data(mat_t *mat,z_stream *z,mat_int8_t *data,
-    int data_type,int len)
-{
-    int nBytes = 0, data_size = 0, i;
-
-    if ( (mat == NULL) || (data == NULL) || (z == NULL) )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            double d;
-
-            data_size = sizeof(double);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&d,data_size);
-                    data[i] = Mat_doubleSwap(&d);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&d,data_size);
-                    data[i] = d;
-                }
-            }
-            break;
-        }
-        case MAT_T_SINGLE:
-        {
-            float f;
-
-            data_size = sizeof(float);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&f,data_size);
-                    data[i] = Mat_floatSwap(&f);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&f,data_size);
-                    data[i] = f;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT32:
-        {
-            mat_int32_t i32;
-
-            data_size = sizeof(mat_int32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i32,data_size);
-                    data[i] = Mat_int32Swap(&i32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i32,data_size);
-                    data[i] = i32;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            mat_uint32_t ui32;
-
-            data_size = sizeof(mat_uint32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui32,data_size);
-                    data[i] = Mat_uint32Swap(&ui32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui32,data_size);
-                    data[i] = ui32;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            mat_int16_t i16;
-
-            data_size = sizeof(mat_int16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i16,data_size);
-                    data[i] = Mat_int16Swap(&i16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i16,data_size);
-                    data[i] = i16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t ui16;
-
-            data_size = sizeof(mat_uint16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui16,data_size);
-                    data[i] = Mat_uint16Swap(&ui16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui16,data_size);
-                    data[i] = ui16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t ui8;
-
-            data_size = sizeof(mat_uint8_t);
-            for ( i = 0; i < len; i++ ) {
-                InflateData(mat,z,&ui8,data_size);
-                data[i] = ui8;
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            mat_int8_t i8;
-
-            data_size = sizeof(mat_int8_t);
-            for ( i = 0; i < len; i++ ) {
-                InflateData(mat,z,&i8,data_size);
-                data[i] = i8;
-            }
-            break;
-        }
-    }
-    nBytes = len*data_size;
-    return nBytes;
-}
-#endif
-
-/** @brief Reads data of type @c data_type into an unsigned 8-bit integer type
- *
- * Reads from the MAT file @c len elements of data type @c data_type storing
- * them as unsigned 8-bit integers in @c data.
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param data Pointer to store the output unsigned 8-bit integer values
- *             (len*sizeof(mat_uint8_t))
- * @param data_type one of the @c matio_types enumerations which is the source
- *                  data type in the file
- * @param len Number of elements of type @c data_type to read from the file
- * @retval Number of bytes read from the file
- */
-int
-ReadUInt8Data(mat_t *mat,mat_uint8_t *data,int data_type,int len)
-{
-    int bytesread = 0, data_size = 0, i;
-
-    if ( (mat   == NULL) || (data   == NULL) || (mat->fp == NULL) )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            double d;
-
-            data_size = sizeof(double);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&d,data_size,1,mat->fp);
-                    data[i] = Mat_doubleSwap(&d);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&d,data_size,1,mat->fp);
-                    data[i] = d;
-                }
-            }
-            break;
-        }
-        case MAT_T_SINGLE:
-        {
-            float f;
-
-            data_size = sizeof(float);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&f,data_size,1,mat->fp);
-                    data[i] = Mat_floatSwap(&f);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&f,data_size,1,mat->fp);
-                    data[i] = f;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT32:
-        {
-            mat_int32_t i32;
-
-            data_size = sizeof(mat_int32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i32,data_size,1,mat->fp);
-                    data[i] = Mat_int32Swap(&i32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i32,data_size,1,mat->fp);
-                    data[i] = i32;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            mat_uint32_t ui32;
-
-            data_size = sizeof(mat_uint32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui32,data_size,1,mat->fp);
-                    data[i] = Mat_uint32Swap(&ui32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui32,data_size,1,mat->fp);
-                    data[i] = ui32;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            mat_int16_t i16;
-
-            data_size = sizeof(mat_int16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i16,data_size,1,mat->fp);
-                    data[i] = Mat_int16Swap(&i16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i16,data_size,1,mat->fp);
-                    data[i] = i16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t ui16;
-
-            data_size = sizeof(mat_uint16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui16,data_size,1,mat->fp);
-                    data[i] = Mat_uint16Swap(&ui16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui16,data_size,1,mat->fp);
-                    data[i] = ui16;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            mat_int8_t i8;
-
-            data_size = sizeof(mat_int8_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i8,data_size,1,mat->fp);
-                    data[i] = i8;
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i8,data_size,1,mat->fp);
-                    data[i] = i8;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t ui8;
-
-            data_size = sizeof(mat_uint8_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui8,data_size,1,mat->fp);
-                    data[i] = ui8;
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&ui8,data_size,1,mat->fp);
-                    data[i] = ui8;
-                }
-            }
-            break;
-        }
-    }
-    bytesread *= data_size;
-    return bytesread;
-}
-
-#if defined(HAVE_ZLIB)
-/** @brief Reads data of type @c data_type into an unsigned 8-bit integer type
- *
- * Reads from the MAT file @c len compressed elements of data type @c data_type
- * storing them as unsigned 8-bit integers in @c data.
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param z Pointer to the zlib stream for inflation
- * @param data Pointer to store the output 8-bit integer values
- *             (len*sizeof(mat_uint8_t))
- * @param data_type one of the @c matio_types enumerations which is the source
- *                  data type in the file
- * @param len Number of elements of type @c data_type to read from the file
- * @retval Number of bytes read from the file
- */
-int
-ReadCompressedUInt8Data(mat_t *mat,z_stream *z,mat_uint8_t *data,
-    int data_type,int len)
-{
-    int nBytes = 0, data_size = 0, i;
-
-    if ( (mat == NULL) || (data == NULL) || (z == NULL) )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_DOUBLE:
-        {
-            double d;
-
-            data_size = sizeof(double);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&d,data_size);
-                    data[i] = Mat_doubleSwap(&d);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&d,data_size);
-                    data[i] = d;
-                }
-            }
-            break;
-        }
-        case MAT_T_SINGLE:
-        {
-            float f;
-
-            data_size = sizeof(float);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&f,data_size);
-                    data[i] = Mat_floatSwap(&f);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&f,data_size);
-                    data[i] = f;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT32:
-        {
-            mat_int32_t i32;
-
-            data_size = sizeof(mat_int32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i32,data_size);
-                    data[i] = Mat_int32Swap(&i32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i32,data_size);
-                    data[i] = i32;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT32:
-        {
-            mat_uint32_t ui32;
-
-            data_size = sizeof(mat_uint32_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui32,data_size);
-                    data[i] = Mat_uint32Swap(&ui32);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui32,data_size);
-                    data[i] = ui32;
-                }
-            }
-            break;
-        }
-        case MAT_T_INT16:
-        {
-            mat_int16_t i16;
-
-            data_size = sizeof(mat_int16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i16,data_size);
-                    data[i] = Mat_int16Swap(&i16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i16,data_size);
-                    data[i] = i16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t ui16;
-
-            data_size = sizeof(mat_uint16_t);
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui16,data_size);
-                    data[i] = Mat_uint16Swap(&ui16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&ui16,data_size);
-                    data[i] = ui16;
-                }
-            }
-            break;
-        }
-        case MAT_T_UINT8:
-        {
-            mat_uint8_t ui8;
-
-            data_size = sizeof(mat_uint8_t);
-            for ( i = 0; i < len; i++ ) {
-                InflateData(mat,z,&ui8,data_size);
-                data[i] = ui8;
-            }
-            break;
-        }
-        case MAT_T_INT8:
-        {
-            mat_int8_t i8;
-
-            data_size = sizeof(mat_int8_t);
-            for ( i = 0; i < len; i++ ) {
-                InflateData(mat,z,&i8,data_size);
-                data[i] = i8;
-            }
-            break;
-        }
-    }
-    nBytes = len*data_size;
-    return nBytes;
-}
-#endif
-
-#if defined(HAVE_ZLIB)
-/** @brief Reads data of type @c data_type into a char type
- *
- * Reads from the MAT file @c len compressed elements of data type @c data_type
- * storing them as char's in @c data.
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param z Pointer to the zlib stream for inflation
- * @param data Pointer to store the output char values (len*sizeof(char))
- * @param data_type one of the @c matio_types enumerations which is the source
- *                  data type in the file
- * @param len Number of elements of type @c data_type to read from the file
- * @retval Number of bytes read from the file
- */
-int
-ReadCompressedCharData(mat_t *mat,z_stream *z,char *data,int data_type,int len)
-{
-    int nBytes = 0, data_size = 0, i;
-
-    if ( (mat   == NULL) || (data   == NULL) || (mat->fp == NULL) )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_UTF8:
-            data_size = 1;
-            for ( i = 0; i < len; i++ )
-                InflateData(mat,z,data+i,data_size);
-            break;
-        case MAT_T_INT8:
-        case MAT_T_UINT8:
-            data_size = 1;
-            for ( i = 0; i < len; i++ )
-                InflateData(mat,z,data+i,data_size);
-            break;
-        case MAT_T_INT16:
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t i16;
-
-            data_size = 2;
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i16,data_size);
-                    data[i] = Mat_uint16Swap(&i16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    InflateData(mat,z,&i16,data_size);
-                    data[i] = i16;
-                }
-            }
-            break;
-        }
-        default:
-            printf("Character data not supported type: %d",data_type);
-            break;
-    }
-    nBytes = len*data_size;
-    return nBytes;
-}
-#endif
-
-int
-ReadCharData(mat_t *mat,char *data,int data_type,int len)
-{
-    int bytesread = 0, data_size = 0, i;
-
-    if ( (mat   == NULL) || (data   == NULL) || (mat->fp == NULL) )
-        return 0;
-
-    switch ( data_type ) {
-        case MAT_T_UTF8:
-            for ( i = 0; i < len; i++ )
-                bytesread += fread(data+i,1,1,mat->fp);
-            break;
-        case MAT_T_INT8:
-        case MAT_T_UINT8:
-            for ( i = 0; i < len; i++ )
-                bytesread += fread(data+i,1,1,mat->fp);
-            break;
-        case MAT_T_INT16:
-        case MAT_T_UINT16:
-        {
-            mat_uint16_t i16;
-
-            if ( mat->byteswap ) {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i16,2,1,mat->fp);
-                    data[i] = Mat_uint16Swap(&i16);
-                }
-            } else {
-                for ( i = 0; i < len; i++ ) {
-                    bytesread += fread(&i16,2,1,mat->fp);
-                    data[i] = i16;
-                }
-            }
-            break;
-        }
-        default:
-            printf("Character data not supported type: %d",data_type);
-            break;
-    }
-    bytesread *= data_size;
-    return bytesread;
-}
-
-/*
- *-------------------------------------------------------------------
- *  Routines to read "slabs" of data
- *-------------------------------------------------------------------
- */
-
-/** @brief Reads data of type @c data_type by user-defined dimensions
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param data Pointer to store the output data
- * @param class_type Type of data class (matio_classes enumerations)
- * @param data_type Datatype of the stored data (matio_types enumerations)
- * @param rank Number of dimensions in the data
- * @param dims Dimensions of the data
- * @param start Index to start reading data in each dimension
- * @param stride Read every @c stride elements in each dimension
- * @param edge Number of elements to read in each dimension
- * @retval Number of bytes read from the file, or -1 on error
- */
-int
-ReadDataSlabN(mat_t *mat,void *data,int class_type,int data_type,int rank,
-    int *dims,int *start,int *stride,int *edge)
-{
-    int nBytes = 0, i, j, N, I = 0;
-    int inc[10] = {0,}, cnt[10] = {0,}, dimp[10] = {0,};
-
-    if ( (mat   == NULL) || (data   == NULL) || (mat->fp == NULL) ||
-         (start == NULL) || (stride == NULL) || (edge    == NULL) ) {
-        return -1;
-    } else if ( rank > 10 ) {
-        return -1; 
-    }
-
-    switch ( class_type ) {
-        case MAT_C_DOUBLE:
-        {
-            inc[0]  = stride[0]-1;
-            dimp[0] = dims[0];
-            N       = edge[0];
-            I       = start[0];
-            for ( i = 1; i < rank; i++ ) {
-                inc[i]  = stride[i]-1;
-                dimp[i] = dims[i-1];
-                for ( j = i ; j--; ) {
-                    inc[i]  *= dims[j];
-                    dimp[i] *= dims[j+1];
-                }
-                N *= edge[i];
-                I += dimp[i-1]*start[i];
-            }
-            fseek(mat->fp,I*Mat_SizeOf(data_type),SEEK_CUR);
-            for ( i = 0; i < N; i+=edge[0] ) {
-                for ( j = 0; j < edge[0]; j++ ) {
-                    ReadDoubleData(mat,(double*)data+i+j,data_type,1);
-                    fseek(mat->fp,Mat_SizeOf(data_type)*(stride[0]-1),SEEK_CUR);
-                    I += stride[0];
-                }
-                I += dims[0]-edge[0]*stride[0]-start[0];
-                fseek(mat->fp,Mat_SizeOf(data_type)*
-                      (dims[0]-edge[0]*stride[0]-start[0]),SEEK_CUR);
-                for ( j = 1; j < rank-1; j++ ) {
-                    cnt[j]++;
-                    if ( (cnt[j] % edge[j]) == 0 ) {
-                        cnt[j] = 0;
-                        if ( (I % dimp[j]) != 0 ) {
-                            fseek(mat->fp,Mat_SizeOf(data_type)*
-                                  (dimp[j]-(I % dimp[j])),SEEK_CUR);
-                            I += dimp[j]-(I % dimp[j]);
-                        }
-                    } else {
-                        I += inc[j];
-                        fseek(mat->fp,Mat_SizeOf(data_type)*inc[j],SEEK_CUR);
-                        break;
-                    }
-                }
-            }
-            break;
-        }
-        case MAT_C_SINGLE:
-        {
-            inc[0]  = stride[0]-1;
-            dimp[0] = dims[0];
-            N       = edge[0];
-            I       = start[0];
-            for ( i = 1; i < rank; i++ ) {
-                inc[i]  = stride[i]-1;
-                dimp[i] = dims[i-1];
-                for ( j = i ; j--; ) {
-                    inc[i]  *= dims[j];
-                    dimp[i] *= dims[j+1];
-                }
-                N *= edge[i];
-                I += dimp[i-1]*start[i];
-            }
-            fseek(mat->fp,I*Mat_SizeOf(data_type),SEEK_CUR);
-            for ( i = 0; i < N; i+=edge[0] ) {
-                for ( j = 0; j < edge[0]; j++ ) {
-                    ReadSingleData(mat,(float*)data+i+j,data_type,1);
-                    fseek(mat->fp,Mat_SizeOf(data_type)*(stride[0]-1),SEEK_CUR);
-                    I += stride[0];
-                }
-                I += dims[0]-edge[0]*stride[0]-start[0];
-                fseek(mat->fp,Mat_SizeOf(data_type)*
-                      (dims[0]-edge[0]*stride[0]-start[0]),SEEK_CUR);
-                for ( j = 1; j < rank-1; j++ ) {
-                    cnt[j]++;
-                    if ( (cnt[j] % edge[j]) == 0 ) {
-                        cnt[j] = 0;
-                        if ( (I % dimp[j]) != 0 ) {
-                            fseek(mat->fp,Mat_SizeOf(data_type)*
-                                  (dimp[j]-(I % dimp[j])),SEEK_CUR);
-                            I += dimp[j]-(I % dimp[j]);
-                        }
-                    } else {
-                        I += inc[j];
-                        fseek(mat->fp,Mat_SizeOf(data_type)*inc[j],SEEK_CUR);
-                        break;
-                    }
-                }
-            }
-            break;
-        }
-#ifdef HAVE_MAT_INT64_T
-        case MAT_C_INT64:
-        {
-            inc[0]  = stride[0]-1;
-            dimp[0] = dims[0];
-            N       = edge[0];
-            I       = start[0];
-            for ( i = 1; i < rank; i++ ) {
-                inc[i]  = stride[i]-1;
-                dimp[i] = dims[i-1];
-                for ( j = i ; j--; ) {
-                    inc[i]  *= dims[j];
-                    dimp[i] *= dims[j+1];
-                }
-                N *= edge[i];
-                I += dimp[i-1]*start[i];
-            }
-            fseek(mat->fp,I*Mat_SizeOf(data_type),SEEK_CUR);
-            for ( i = 0; i < N; i+=edge[0] ) {
-                for ( j = 0; j < edge[0]; j++ ) {
-                    ReadInt64Data(mat,(mat_int64_t*)data+i+j,data_type,1);
-                    fseek(mat->fp,Mat_SizeOf(data_type)*(stride[0]-1),SEEK_CUR);
-                    I += stride[0];
-                }
-                I += dims[0]-edge[0]*stride[0]-start[0];
-                fseek(mat->fp,Mat_SizeOf(data_type)*
-                      (dims[0]-edge[0]*stride[0]-start[0]),SEEK_CUR);
-                for ( j = 1; j < rank-1; j++ ) {
-                    cnt[j]++;
-                    if ( (cnt[j] % edge[j]) == 0 ) {
-                        cnt[j] = 0;
-                        if ( (I % dimp[j]) != 0 ) {
-                            fseek(mat->fp,Mat_SizeOf(data_type)*
-                                  (dimp[j]-(I % dimp[j])),SEEK_CUR);
-                            I += dimp[j]-(I % dimp[j]);
-                        }
-                    } else {
-                        I += inc[j];
-                        fseek(mat->fp,Mat_SizeOf(data_type)*inc[j],SEEK_CUR);
-                        break;
-                    }
-                }
-            }
-            break;
-        }
-#endif /* HAVE_MAT_INT64_T */
-#ifdef HAVE_MAT_UINT64_T
-        case MAT_C_UINT64:
-        {
-            inc[0]  = stride[0]-1;
-            dimp[0] = dims[0];
-            N       = edge[0];
-            I       = start[0];
-            for ( i = 1; i < rank; i++ ) {
-                inc[i]  = stride[i]-1;
-                dimp[i] = dims[i-1];
-                for ( j = i ; j--; ) {
-                    inc[i]  *= dims[j];
-                    dimp[i] *= dims[j+1];
-                }
-                N *= edge[i];
-                I += dimp[i-1]*start[i];
-            }
-            fseek(mat->fp,I*Mat_SizeOf(data_type),SEEK_CUR);
-            for ( i = 0; i < N; i+=edge[0] ) {
-                for ( j = 0; j < edge[0]; j++ ) {
-                    ReadUInt64Data(mat,(mat_uint64_t*)data+i+j,data_type,1);
-                    fseek(mat->fp,Mat_SizeOf(data_type)*(stride[0]-1),SEEK_CUR);
-                    I += stride[0];
-                }
-                I += dims[0]-edge[0]*stride[0]-start[0];
-                fseek(mat->fp,Mat_SizeOf(data_type)*
-                      (dims[0]-edge[0]*stride[0]-start[0]),SEEK_CUR);
-                for ( j = 1; j < rank-1; j++ ) {
-                    cnt[j]++;
-                    if ( (cnt[j] % edge[j]) == 0 ) {
-                        cnt[j] = 0;
-                        if ( (I % dimp[j]) != 0 ) {
-                            fseek(mat->fp,Mat_SizeOf(data_type)*
-                                  (dimp[j]-(I % dimp[j])),SEEK_CUR);
-                            I += dimp[j]-(I % dimp[j]);
-                        }
-                    } else {
-                        I += inc[j];
-                        fseek(mat->fp,Mat_SizeOf(data_type)*inc[j],SEEK_CUR);
-                        break;
-                    }
-                }
-            }
-            break;
-        }
-#endif /* HAVE_MAT_UINT64_T */
-        case MAT_C_INT32:
-        {
-            inc[0]  = stride[0]-1;
-            dimp[0] = dims[0];
-            N       = edge[0];
-            I       = start[0];
-            for ( i = 1; i < rank; i++ ) {
-                inc[i]  = stride[i]-1;
-                dimp[i] = dims[i-1];
-                for ( j = i ; j--; ) {
-                    inc[i]  *= dims[j];
-                    dimp[i] *= dims[j+1];
-                }
-                N *= edge[i];
-                I += dimp[i-1]*start[i];
-            }
-            fseek(mat->fp,I*Mat_SizeOf(data_type),SEEK_CUR);
-            for ( i = 0; i < N; i+=edge[0] ) {
-                for ( j = 0; j < edge[0]; j++ ) {
-                    ReadInt32Data(mat,(mat_int32_t*)data+i+j,data_type,1);
-                    fseek(mat->fp,Mat_SizeOf(data_type)*(stride[0]-1),SEEK_CUR);
-                    I += stride[0];
-                }
-                I += dims[0]-edge[0]*stride[0]-start[0];
-                fseek(mat->fp,Mat_SizeOf(data_type)*
-                      (dims[0]-edge[0]*stride[0]-start[0]),SEEK_CUR);
-                for ( j = 1; j < rank-1; j++ ) {
-                    cnt[j]++;
-                    if ( (cnt[j] % edge[j]) == 0 ) {
-                        cnt[j] = 0;
-                        if ( (I % dimp[j]) != 0 ) {
-                            fseek(mat->fp,Mat_SizeOf(data_type)*
-                                  (dimp[j]-(I % dimp[j])),SEEK_CUR);
-                            I += dimp[j]-(I % dimp[j]);
-                        }
-                    } else {
-                        I += inc[j];
-                        fseek(mat->fp,Mat_SizeOf(data_type)*inc[j],SEEK_CUR);
-                        break;
-                    }
-                }
-            }
-            break;
-        }
-        case MAT_C_UINT32:
-        {
-            inc[0]  = stride[0]-1;
-            dimp[0] = dims[0];
-            N       = edge[0];
-            I       = start[0];
-            for ( i = 1; i < rank; i++ ) {
-                inc[i]  = stride[i]-1;
-                dimp[i] = dims[i-1];
-                for ( j = i ; j--; ) {
-                    inc[i]  *= dims[j];
-                    dimp[i] *= dims[j+1];
-                }
-                N *= edge[i];
-                I += dimp[i-1]*start[i];
-            }
-            fseek(mat->fp,I*Mat_SizeOf(data_type),SEEK_CUR);
-            for ( i = 0; i < N; i+=edge[0] ) {
-                for ( j = 0; j < edge[0]; j++ ) {
-                    ReadUInt32Data(mat,(mat_uint32_t*)data+i+j,data_type,1);
-                    fseek(mat->fp,Mat_SizeOf(data_type)*(stride[0]-1),SEEK_CUR);
-                    I += stride[0];
-                }
-                I += dims[0]-edge[0]*stride[0]-start[0];
-                fseek(mat->fp,Mat_SizeOf(data_type)*
-                      (dims[0]-edge[0]*stride[0]-start[0]),SEEK_CUR);
-                for ( j = 1; j < rank-1; j++ ) {
-                    cnt[j]++;
-                    if ( (cnt[j] % edge[j]) == 0 ) {
-                        cnt[j] = 0;
-                        if ( (I % dimp[j]) != 0 ) {
-                            fseek(mat->fp,Mat_SizeOf(data_type)*
-                                  (dimp[j]-(I % dimp[j])),SEEK_CUR);
-                            I += dimp[j]-(I % dimp[j]);
-                        }
-                    } else {
-                        I += inc[j];
-                        fseek(mat->fp,Mat_SizeOf(data_type)*inc[j],SEEK_CUR);
-                        break;
-                    }
-                }
-            }
-            break;
-        }
-        case MAT_C_INT16:
-        {
-            inc[0]  = stride[0]-1;
-            dimp[0] = dims[0];
-            N       = edge[0];
-            I       = start[0];
-            for ( i = 1; i < rank; i++ ) {
-                inc[i]  = stride[i]-1;
-                dimp[i] = dims[i-1];
-                for ( j = i ; j--; ) {
-                    inc[i]  *= dims[j];
-                    dimp[i] *= dims[j+1];
-                }
-                N *= edge[i];
-                I += dimp[i-1]*start[i];
-            }
-            fseek(mat->fp,I*Mat_SizeOf(data_type),SEEK_CUR);
-            for ( i = 0; i < N; i+=edge[0] ) {
-                for ( j = 0; j < edge[0]; j++ ) {
-                    ReadInt16Data(mat,(mat_int16_t*)data+i+j,data_type,1);
-                    fseek(mat->fp,Mat_SizeOf(data_type)*(stride[0]-1),SEEK_CUR);
-                    I += stride[0];
-                }
-                I += dims[0]-edge[0]*stride[0]-start[0];
-                fseek(mat->fp,Mat_SizeOf(data_type)*
-                      (dims[0]-edge[0]*stride[0]-start[0]),SEEK_CUR);
-                for ( j = 1; j < rank-1; j++ ) {
-                    cnt[j]++;
-                    if ( (cnt[j] % edge[j]) == 0 ) {
-                        cnt[j] = 0;
-                        if ( (I % dimp[j]) != 0 ) {
-                            fseek(mat->fp,Mat_SizeOf(data_type)*
-                                  (dimp[j]-(I % dimp[j])),SEEK_CUR);
-                            I += dimp[j]-(I % dimp[j]);
-                        }
-                    } else {
-                        I += inc[j];
-                        fseek(mat->fp,Mat_SizeOf(data_type)*inc[j],SEEK_CUR);
-                        break;
-                    }
-                }
-            }
-            break;
-        }
-        case MAT_C_UINT16:
-        {
-            inc[0]  = stride[0]-1;
-            dimp[0] = dims[0];
-            N       = edge[0];
-            I       = start[0];
-            for ( i = 1; i < rank; i++ ) {
-                inc[i]  = stride[i]-1;
-                dimp[i] = dims[i-1];
-                for ( j = i ; j--; ) {
-                    inc[i]  *= dims[j];
-                    dimp[i] *= dims[j+1];
-                }
-                N *= edge[i];
-                I += dimp[i-1]*start[i];
-            }
-            fseek(mat->fp,I*Mat_SizeOf(data_type),SEEK_CUR);
-            for ( i = 0; i < N; i+=edge[0] ) {
-                for ( j = 0; j < edge[0]; j++ ) {
-                    ReadUInt16Data(mat,(mat_uint16_t*)data+i+j,data_type,1);
-                    fseek(mat->fp,Mat_SizeOf(data_type)*(stride[0]-1),SEEK_CUR);
-                    I += stride[0];
-                }
-                I += dims[0]-edge[0]*stride[0]-start[0];
-                fseek(mat->fp,Mat_SizeOf(data_type)*
-                      (dims[0]-edge[0]*stride[0]-start[0]),SEEK_CUR);
-                for ( j = 1; j < rank-1; j++ ) {
-                    cnt[j]++;
-                    if ( (cnt[j] % edge[j]) == 0 ) {
-                        cnt[j] = 0;
-                        if ( (I % dimp[j]) != 0 ) {
-                            fseek(mat->fp,Mat_SizeOf(data_type)*
-                                  (dimp[j]-(I % dimp[j])),SEEK_CUR);
-                            I += dimp[j]-(I % dimp[j]);
-                        }
-                    } else {
-                        I += inc[j];
-                        fseek(mat->fp,Mat_SizeOf(data_type)*inc[j],SEEK_CUR);
-                        break;
-                    }
-                }
-            }
-            break;
-        }
-        case MAT_C_INT8:
-        {
-            inc[0]  = stride[0]-1;
-            dimp[0] = dims[0];
-            N       = edge[0];
-            I       = start[0];
-            for ( i = 1; i < rank; i++ ) {
-                inc[i]  = stride[i]-1;
-                dimp[i] = dims[i-1];
-                for ( j = i ; j--; ) {
-                    inc[i]  *= dims[j];
-                    dimp[i] *= dims[j+1];
-                }
-                N *= edge[i];
-                I += dimp[i-1]*start[i];
-            }
-            fseek(mat->fp,I*Mat_SizeOf(data_type),SEEK_CUR);
-            for ( i = 0; i < N; i+=edge[0] ) {
-                for ( j = 0; j < edge[0]; j++ ) {
-                    ReadInt8Data(mat,(mat_int8_t*)data+i+j,data_type,1);
-                    fseek(mat->fp,Mat_SizeOf(data_type)*(stride[0]-1),SEEK_CUR);
-                    I += stride[0];
-                }
-                I += dims[0]-edge[0]*stride[0]-start[0];
-                fseek(mat->fp,Mat_SizeOf(data_type)*
-                      (dims[0]-edge[0]*stride[0]-start[0]),SEEK_CUR);
-                for ( j = 1; j < rank-1; j++ ) {
-                    cnt[j]++;
-                    if ( (cnt[j] % edge[j]) == 0 ) {
-                        cnt[j] = 0;
-                        if ( (I % dimp[j]) != 0 ) {
-                            fseek(mat->fp,Mat_SizeOf(data_type)*
-                                  (dimp[j]-(I % dimp[j])),SEEK_CUR);
-                            I += dimp[j]-(I % dimp[j]);
-                        }
-                    } else {
-                        I += inc[j];
-                        fseek(mat->fp,Mat_SizeOf(data_type)*inc[j],SEEK_CUR);
-                        break;
-                    }
-                }
-            }
-            break;
-        }
-        case MAT_C_UINT8:
-        {
-            inc[0]  = stride[0]-1;
-            dimp[0] = dims[0];
-            N       = edge[0];
-            I       = start[0];
-            for ( i = 1; i < rank; i++ ) {
-                inc[i]  = stride[i]-1;
-                dimp[i] = dims[i-1];
-                for ( j = i ; j--; ) {
-                    inc[i]  *= dims[j];
-                    dimp[i] *= dims[j+1];
-                }
-                N *= edge[i];
-                I += dimp[i-1]*start[i];
-            }
-            fseek(mat->fp,I*Mat_SizeOf(data_type),SEEK_CUR);
-            for ( i = 0; i < N; i+=edge[0] ) {
-                for ( j = 0; j < edge[0]; j++ ) {
-                    ReadUInt8Data(mat,(mat_uint8_t*)data+i+j,data_type,1);
-                    fseek(mat->fp,Mat_SizeOf(data_type)*(stride[0]-1),SEEK_CUR);
-                    I += stride[0];
-                }
-                I += dims[0]-edge[0]*stride[0]-start[0];
-                fseek(mat->fp,Mat_SizeOf(data_type)*
-                      (dims[0]-edge[0]*stride[0]-start[0]),SEEK_CUR);
-                for ( j = 1; j < rank-1; j++ ) {
-                    cnt[j]++;
-                    if ( (cnt[j] % edge[j]) == 0 ) {
-                        cnt[j] = 0;
-                        if ( (I % dimp[j]) != 0 ) {
-                            fseek(mat->fp,Mat_SizeOf(data_type)*
-                                  (dimp[j]-(I % dimp[j])),SEEK_CUR);
-                            I += dimp[j]-(I % dimp[j]);
-                        }
-                    } else {
-                        I += inc[j];
-                        fseek(mat->fp,Mat_SizeOf(data_type)*inc[j],SEEK_CUR);
-                        break;
-                    }
-                }
-            }
-            break;
-        }
-        default:
-            nBytes = 0;
-    }
-    return nBytes;
-}
-
-#if defined(HAVE_ZLIB)
-/** @brief Reads data of type @c data_type by user-defined dimensions
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param z zlib compression stream
- * @param data Pointer to store the output data
- * @param class_type Type of data class (matio_classes enumerations)
- * @param data_type Datatype of the stored data (matio_types enumerations)
- * @param rank Number of dimensions in the data
- * @param dims Dimensions of the data
- * @param start Index to start reading data in each dimension
- * @param stride Read every @c stride elements in each dimension
- * @param edge Number of elements to read in each dimension
- * @retval Number of bytes read from the file, or -1 on error
- */
-int
-ReadCompressedDataSlabN(mat_t *mat,z_stream *z,void *data,int class_type,
-    int data_type,int rank,int *dims,int *start,int *stride,int *edge)
-{
-    int nBytes = 0, i, j, N, I = 0;
-    int inc[10] = {0,}, cnt[10] = {0,}, dimp[10] = {0,};
-    z_stream z_copy = {0,};
-
-    if ( (mat   == NULL) || (data   == NULL) || (mat->fp == NULL) ||
-         (start == NULL) || (stride == NULL) || (edge    == NULL) ) {
-        return 1;
-    } else if ( rank > 10 ) {
-        return 1;
-    }
-
-    i = inflateCopy(&z_copy,z);
-    switch ( class_type ) {
-        case MAT_C_DOUBLE:
-        {
-            double *ptr;
-
-            ptr     = data;
-            inc[0]  = stride[0]-1;
-            dimp[0] = dims[0];
-            N       = edge[0];
-            I       = start[0];
-            for ( i = 1; i < rank; i++ ) {
-                inc[i]  = stride[i]-1;
-                dimp[i] = dims[i-1];
-                for ( j = i ; j--; ) {
-                    inc[i]  *= dims[j];
-                    dimp[i] *= dims[j+1];
-                }
-                N *= edge[i];
-                I += dimp[i-1]*start[i];
-            }
-            /* Skip all data to the starting indeces */
-            InflateSkipData(mat,&z_copy,data_type,I);
-            for ( i = 0; i < N; i+=edge[0] ) {
-                for ( j = 0; j < edge[0]-1; j++ ) {
-                    ReadCompressedDoubleData(mat,&z_copy,ptr+i+j,data_type,1);
-                    InflateSkipData(mat,&z_copy,data_type,(stride[0]-1));
-                    I += stride[0];
-                }
-                ReadCompressedDoubleData(mat,&z_copy,ptr+i+j,data_type,1);
-                I += stride[0];
-                for ( j = 1; j < rank-1; j++ ) {
-                    cnt[j]++;
-                    if ( (cnt[j] % edge[j]) == 0 ) {
-                        cnt[j] = 0;
-                        if ( (I % dimp[j]) != 0 ) {
-                            InflateSkipData(mat,&z_copy,data_type,
-                                  dimp[j]-(I % dimp[j]));
-                            I += dimp[j]-(I % dimp[j]);
-                        }
-                    } else {
-                        I += dims[0]-edge[0]*stride[0]-start[0];
-                        InflateSkipData(mat,&z_copy,data_type,
-                              dims[0]-edge[0]*stride[0]-start[0]);
-                        I += inc[j];
-                        InflateSkipData(mat,&z_copy,data_type,inc[j]);
-                        break;
-                    }
-                }
-            }
-            break;
-        }
-        case MAT_C_SINGLE:
-        {
-            float *ptr;
-
-            ptr     = data;
-            inc[0]  = stride[0]-1;
-            dimp[0] = dims[0];
-            N       = edge[0];
-            I       = start[0];
-            for ( i = 1; i < rank; i++ ) {
-                inc[i]  = stride[i]-1;
-                dimp[i] = dims[i-1];
-                for ( j = i ; j--; ) {
-                    inc[i]  *= dims[j];
-                    dimp[i] *= dims[j+1];
-                }
-                N *= edge[i];
-                I += dimp[i-1]*start[i];
-            }
-            /* Skip all data to the starting indeces */
-            InflateSkipData(mat,&z_copy,data_type,I);
-            for ( i = 0; i < N; i+=edge[0] ) {
-                for ( j = 0; j < edge[0]-1; j++ ) {
-                    ReadCompressedSingleData(mat,&z_copy,ptr+i+j,data_type,1);
-                    InflateSkipData(mat,&z_copy,data_type,(stride[0]-1));
-                    I += stride[0];
-                }
-                ReadCompressedSingleData(mat,&z_copy,ptr+i+j,data_type,1);
-                I += stride[0];
-                for ( j = 1; j < rank-1; j++ ) {
-                    cnt[j]++;
-                    if ( (cnt[j] % edge[j]) == 0 ) {
-                        cnt[j] = 0;
-                        if ( (I % dimp[j]) != 0 ) {
-                            InflateSkipData(mat,&z_copy,data_type,
-                                  dimp[j]-(I % dimp[j]));
-                            I += dimp[j]-(I % dimp[j]);
-                        }
-                    } else {
-                        I += dims[0]-edge[0]*stride[0]-start[0];
-                        InflateSkipData(mat,&z_copy,data_type,
-                              dims[0]-edge[0]*stride[0]-start[0]);
-                        I += inc[j];
-                        InflateSkipData(mat,&z_copy,data_type,inc[j]);
-                        break;
-                    }
-                }
-            }
-            break;
-        }
-#ifdef HAVE_MAT_INT64_T
-        case MAT_C_INT64:
-        {
-            mat_int64_t *ptr;
-
-            ptr     = data;
-            inc[0]  = stride[0]-1;
-            dimp[0] = dims[0];
-            N       = edge[0];
-            I       = start[0];
-            for ( i = 1; i < rank; i++ ) {
-                inc[i]  = stride[i]-1;
-                dimp[i] = dims[i-1];
-                for ( j = i ; j--; ) {
-                    inc[i]  *= dims[j];
-                    dimp[i] *= dims[j+1];
-                }
-                N *= edge[i];
-                I += dimp[i-1]*start[i];
-            }
-            /* Skip all data to the starting indeces */
-            InflateSkipData(mat,&z_copy,data_type,I);
-            for ( i = 0; i < N; i+=edge[0] ) {
-                for ( j = 0; j < edge[0]-1; j++ ) {
-                    ReadCompressedInt64Data(mat,&z_copy,ptr+i+j,data_type,1);
-                    InflateSkipData(mat,&z_copy,data_type,(stride[0]-1));
-                    I += stride[0];
-                }
-                ReadCompressedInt64Data(mat,&z_copy,ptr+i+j,data_type,1);
-                I += stride[0];
-                for ( j = 1; j < rank-1; j++ ) {
-                    cnt[j]++;
-                    if ( (cnt[j] % edge[j]) == 0 ) {
-                        cnt[j] = 0;
-                        if ( (I % dimp[j]) != 0 ) {
-                            InflateSkipData(mat,&z_copy,data_type,
-                                  dimp[j]-(I % dimp[j]));
-                            I += dimp[j]-(I % dimp[j]);
-                        }
-                    } else {
-                        I += dims[0]-edge[0]*stride[0]-start[0];
-                        InflateSkipData(mat,&z_copy,data_type,
-                              dims[0]-edge[0]*stride[0]-start[0]);
-                        I += inc[j];
-                        InflateSkipData(mat,&z_copy,data_type,inc[j]);
-                        break;
-                    }
-                }
-            }
-            break;
-        }
-#endif /* HAVE_MAT_INT64_T */
-#ifdef HAVE_MAT_INT64_T
-        case MAT_C_UINT64:
-        {
-            mat_uint64_t *ptr;
-
-            ptr     = data;
-            inc[0]  = stride[0]-1;
-            dimp[0] = dims[0];
-            N       = edge[0];
-            I       = start[0];
-            for ( i = 1; i < rank; i++ ) {
-                inc[i]  = stride[i]-1;
-                dimp[i] = dims[i-1];
-                for ( j = i ; j--; ) {
-                    inc[i]  *= dims[j];
-                    dimp[i] *= dims[j+1];
-                }
-                N *= edge[i];
-                I += dimp[i-1]*start[i];
-            }
-            /* Skip all data to the starting indeces */
-            InflateSkipData(mat,&z_copy,data_type,I);
-            for ( i = 0; i < N; i+=edge[0] ) {
-                for ( j = 0; j < edge[0]-1; j++ ) {
-                    ReadCompressedUInt64Data(mat,&z_copy,ptr+i+j,data_type,1);
-                    InflateSkipData(mat,&z_copy,data_type,(stride[0]-1));
-                    I += stride[0];
-                }
-                ReadCompressedUInt64Data(mat,&z_copy,ptr+i+j,data_type,1);
-                I += stride[0];
-                for ( j = 1; j < rank-1; j++ ) {
-                    cnt[j]++;
-                    if ( (cnt[j] % edge[j]) == 0 ) {
-                        cnt[j] = 0;
-                        if ( (I % dimp[j]) != 0 ) {
-                            InflateSkipData(mat,&z_copy,data_type,
-                                  dimp[j]-(I % dimp[j]));
-                            I += dimp[j]-(I % dimp[j]);
-                        }
-                    } else {
-                        I += dims[0]-edge[0]*stride[0]-start[0];
-                        InflateSkipData(mat,&z_copy,data_type,
-                              dims[0]-edge[0]*stride[0]-start[0]);
-                        I += inc[j];
-                        InflateSkipData(mat,&z_copy,data_type,inc[j]);
-                        break;
-                    }
-                }
-            }
-            break;
-        }
-#endif /* HAVE_MAT_UINT64_T */
-        case MAT_C_INT32:
-        {
-            mat_int32_t *ptr;
-
-            ptr     = data;
-            inc[0]  = stride[0]-1;
-            dimp[0] = dims[0];
-            N       = edge[0];
-            I       = start[0];
-            for ( i = 1; i < rank; i++ ) {
-                inc[i]  = stride[i]-1;
-                dimp[i] = dims[i-1];
-                for ( j = i ; j--; ) {
-                    inc[i]  *= dims[j];
-                    dimp[i] *= dims[j+1];
-                }
-                N *= edge[i];
-                I += dimp[i-1]*start[i];
-            }
-            /* Skip all data to the starting indeces */
-            InflateSkipData(mat,&z_copy,data_type,I);
-            for ( i = 0; i < N; i+=edge[0] ) {
-                for ( j = 0; j < edge[0]-1; j++ ) {
-                    ReadCompressedInt32Data(mat,&z_copy,ptr+i+j,data_type,1);
-                    InflateSkipData(mat,&z_copy,data_type,(stride[0]-1));
-                    I += stride[0];
-                }
-                ReadCompressedInt32Data(mat,&z_copy,ptr+i+j,data_type,1);
-                I += stride[0];
-                for ( j = 1; j < rank-1; j++ ) {
-                    cnt[j]++;
-                    if ( (cnt[j] % edge[j]) == 0 ) {
-                        cnt[j] = 0;
-                        if ( (I % dimp[j]) != 0 ) {
-                            InflateSkipData(mat,&z_copy,data_type,
-                                  dimp[j]-(I % dimp[j]));
-                            I += dimp[j]-(I % dimp[j]);
-                        }
-                    } else {
-                        I += dims[0]-edge[0]*stride[0]-start[0];
-                        InflateSkipData(mat,&z_copy,data_type,
-                              dims[0]-edge[0]*stride[0]-start[0]);
-                        I += inc[j];
-                        InflateSkipData(mat,&z_copy,data_type,inc[j]);
-                        break;
-                    }
-                }
-            }
-            break;
-        }
-        case MAT_C_UINT32:
-        {
-            mat_uint32_t *ptr;
-
-            ptr     = data;
-            inc[0]  = stride[0]-1;
-            dimp[0] = dims[0];
-            N       = edge[0];
-            I       = start[0];
-            for ( i = 1; i < rank; i++ ) {
-                inc[i]  = stride[i]-1;
-                dimp[i] = dims[i-1];
-                for ( j = i ; j--; ) {
-                    inc[i]  *= dims[j];
-                    dimp[i] *= dims[j+1];
-                }
-                N *= edge[i];
-                I += dimp[i-1]*start[i];
-            }
-            /* Skip all data to the starting indeces */
-            InflateSkipData(mat,&z_copy,data_type,I);
-            for ( i = 0; i < N; i+=edge[0] ) {
-                for ( j = 0; j < edge[0]-1; j++ ) {
-                    ReadCompressedUInt32Data(mat,&z_copy,ptr+i+j,data_type,1);
-                    InflateSkipData(mat,&z_copy,data_type,(stride[0]-1));
-                    I += stride[0];
-                }
-                ReadCompressedUInt32Data(mat,&z_copy,ptr+i+j,data_type,1);
-                I += stride[0];
-                for ( j = 1; j < rank-1; j++ ) {
-                    cnt[j]++;
-                    if ( (cnt[j] % edge[j]) == 0 ) {
-                        cnt[j] = 0;
-                        if ( (I % dimp[j]) != 0 ) {
-                            InflateSkipData(mat,&z_copy,data_type,
-                                  dimp[j]-(I % dimp[j]));
-                            I += dimp[j]-(I % dimp[j]);
-                        }
-                    } else {
-                        I += dims[0]-edge[0]*stride[0]-start[0];
-                        InflateSkipData(mat,&z_copy,data_type,
-                              dims[0]-edge[0]*stride[0]-start[0]);
-                        I += inc[j];
-                        InflateSkipData(mat,&z_copy,data_type,inc[j]);
-                        break;
-                    }
-                }
-            }
-            break;
-        }
-        case MAT_C_INT16:
-        {
-            mat_int16_t *ptr;
-
-            ptr     = data;
-            inc[0]  = stride[0]-1;
-            dimp[0] = dims[0];
-            N       = edge[0];
-            I       = start[0];
-            for ( i = 1; i < rank; i++ ) {
-                inc[i]  = stride[i]-1;
-                dimp[i] = dims[i-1];
-                for ( j = i ; j--; ) {
-                    inc[i]  *= dims[j];
-                    dimp[i] *= dims[j+1];
-                }
-                N *= edge[i];
-                I += dimp[i-1]*start[i];
-            }
-            /* Skip all data to the starting indeces */
-            InflateSkipData(mat,&z_copy,data_type,I);
-            for ( i = 0; i < N; i+=edge[0] ) {
-                for ( j = 0; j < edge[0]-1; j++ ) {
-                    ReadCompressedInt16Data(mat,&z_copy,ptr+i+j,data_type,1);
-                    InflateSkipData(mat,&z_copy,data_type,(stride[0]-1));
-                    I += stride[0];
-                }
-                ReadCompressedInt16Data(mat,&z_copy,ptr+i+j,data_type,1);
-                I += stride[0];
-                for ( j = 1; j < rank-1; j++ ) {
-                    cnt[j]++;
-                    if ( (cnt[j] % edge[j]) == 0 ) {
-                        cnt[j] = 0;
-                        if ( (I % dimp[j]) != 0 ) {
-                            InflateSkipData(mat,&z_copy,data_type,
-                                  dimp[j]-(I % dimp[j]));
-                            I += dimp[j]-(I % dimp[j]);
-                        }
-                    } else {
-                        I += dims[0]-edge[0]*stride[0]-start[0];
-                        InflateSkipData(mat,&z_copy,data_type,
-                              dims[0]-edge[0]*stride[0]-start[0]);
-                        I += inc[j];
-                        InflateSkipData(mat,&z_copy,data_type,inc[j]);
-                        break;
-                    }
-                }
-            }
-            break;
-        }
-        case MAT_C_UINT16:
-        {
-            mat_uint16_t *ptr;
-
-            ptr     = data;
-            inc[0]  = stride[0]-1;
-            dimp[0] = dims[0];
-            N       = edge[0];
-            I       = start[0];
-            for ( i = 1; i < rank; i++ ) {
-                inc[i]  = stride[i]-1;
-                dimp[i] = dims[i-1];
-                for ( j = i ; j--; ) {
-                    inc[i]  *= dims[j];
-                    dimp[i] *= dims[j+1];
-                }
-                N *= edge[i];
-                I += dimp[i-1]*start[i];
-            }
-            /* Skip all data to the starting indeces */
-            InflateSkipData(mat,&z_copy,data_type,I);
-            for ( i = 0; i < N; i+=edge[0] ) {
-                for ( j = 0; j < edge[0]-1; j++ ) {
-                    ReadCompressedUInt16Data(mat,&z_copy,ptr+i+j,data_type,1);
-                    InflateSkipData(mat,&z_copy,data_type,(stride[0]-1));
-                    I += stride[0];
-                }
-                ReadCompressedUInt16Data(mat,&z_copy,ptr+i+j,data_type,1);
-                I += stride[0];
-                for ( j = 1; j < rank-1; j++ ) {
-                    cnt[j]++;
-                    if ( (cnt[j] % edge[j]) == 0 ) {
-                        cnt[j] = 0;
-                        if ( (I % dimp[j]) != 0 ) {
-                            InflateSkipData(mat,&z_copy,data_type,
-                                  dimp[j]-(I % dimp[j]));
-                            I += dimp[j]-(I % dimp[j]);
-                        }
-                    } else {
-                        I += dims[0]-edge[0]*stride[0]-start[0];
-                        InflateSkipData(mat,&z_copy,data_type,
-                              dims[0]-edge[0]*stride[0]-start[0]);
-                        I += inc[j];
-                        InflateSkipData(mat,&z_copy,data_type,inc[j]);
-                        break;
-                    }
-                }
-            }
-            break;
-        }
-        case MAT_C_INT8:
-        {
-            mat_int8_t *ptr;
-
-            ptr     = data;
-            inc[0]  = stride[0]-1;
-            dimp[0] = dims[0];
-            N       = edge[0];
-            I       = start[0];
-            for ( i = 1; i < rank; i++ ) {
-                inc[i]  = stride[i]-1;
-                dimp[i] = dims[i-1];
-                for ( j = i ; j--; ) {
-                    inc[i]  *= dims[j];
-                    dimp[i] *= dims[j+1];
-                }
-                N *= edge[i];
-                I += dimp[i-1]*start[i];
-            }
-            /* Skip all data to the starting indeces */
-            InflateSkipData(mat,&z_copy,data_type,I);
-            for ( i = 0; i < N; i+=edge[0] ) {
-                for ( j = 0; j < edge[0]-1; j++ ) {
-                    ReadCompressedInt8Data(mat,&z_copy,ptr+i+j,data_type,1);
-                    InflateSkipData(mat,&z_copy,data_type,(stride[0]-1));
-                    I += stride[0];
-                }
-                ReadCompressedInt8Data(mat,&z_copy,ptr+i+j,data_type,1);
-                I += stride[0];
-                for ( j = 1; j < rank-1; j++ ) {
-                    cnt[j]++;
-                    if ( (cnt[j] % edge[j]) == 0 ) {
-                        cnt[j] = 0;
-                        if ( (I % dimp[j]) != 0 ) {
-                            InflateSkipData(mat,&z_copy,data_type,
-                                  dimp[j]-(I % dimp[j]));
-                            I += dimp[j]-(I % dimp[j]);
-                        }
-                    } else {
-                        I += dims[0]-edge[0]*stride[0]-start[0];
-                        InflateSkipData(mat,&z_copy,data_type,
-                              dims[0]-edge[0]*stride[0]-start[0]);
-                        I += inc[j];
-                        InflateSkipData(mat,&z_copy,data_type,inc[j]);
-                        break;
-                    }
-                }
-            }
-            break;
-        }
-        case MAT_C_UINT8:
-        {
-            mat_uint8_t *ptr;
-
-            ptr     = data;
-            inc[0]  = stride[0]-1;
-            dimp[0] = dims[0];
-            N       = edge[0];
-            I       = start[0];
-            for ( i = 1; i < rank; i++ ) {
-                inc[i]  = stride[i]-1;
-                dimp[i] = dims[i-1];
-                for ( j = i ; j--; ) {
-                    inc[i]  *= dims[j];
-                    dimp[i] *= dims[j+1];
-                }
-                N *= edge[i];
-                I += dimp[i-1]*start[i];
-            }
-            /* Skip all data to the starting indeces */
-            InflateSkipData(mat,&z_copy,data_type,I);
-            for ( i = 0; i < N; i+=edge[0] ) {
-                for ( j = 0; j < edge[0]-1; j++ ) {
-                    ReadCompressedUInt8Data(mat,&z_copy,ptr+i+j,data_type,1);
-                    InflateSkipData(mat,&z_copy,data_type,(stride[0]-1));
-                    I += stride[0];
-                }
-                ReadCompressedUInt8Data(mat,&z_copy,ptr+i+j,data_type,1);
-                I += stride[0];
-                for ( j = 1; j < rank-1; j++ ) {
-                    cnt[j]++;
-                    if ( (cnt[j] % edge[j]) == 0 ) {
-                        cnt[j] = 0;
-                        if ( (I % dimp[j]) != 0 ) {
-                            InflateSkipData(mat,&z_copy,data_type,
-                                  dimp[j]-(I % dimp[j]));
-                            I += dimp[j]-(I % dimp[j]);
-                        }
-                    } else {
-                        I += dims[0]-edge[0]*stride[0]-start[0];
-                        InflateSkipData(mat,&z_copy,data_type,
-                              dims[0]-edge[0]*stride[0]-start[0]);
-                        I += inc[j];
-                        InflateSkipData(mat,&z_copy,data_type,inc[j]);
-                        break;
-                    }
-                }
-            }
-            break;
-        }
-        default:
-            nBytes = 0;
-    }
-    inflateEnd(&z_copy);
-    return nBytes;
-}
-#endif
-
-/** @brief Reads data of type @c data_type by user-defined dimensions for 2-D
- *         data
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param data Pointer to store the output data
- * @param class_type Type of data class (matio_classes enumerations)
- * @param data_type Datatype of the stored data (matio_types enumerations)
- * @param dims Dimensions of the data
- * @param start Index to start reading data in each dimension
- * @param stride Read every @c stride elements in each dimension
- * @param edge Number of elements to read in each dimension
- * @retval Number of bytes read from the file, or -1 on error
- */
-int
-ReadDataSlab2(mat_t *mat,void *data,int class_type,int data_type,
-    int *dims,int *start,int *stride,int *edge)
-{
-    int nBytes = 0, data_size, i, j;
-    long pos, row_stride, col_stride;
-
-    if ( (mat   == NULL) || (data   == NULL) || (mat->fp == NULL) ||
-         (start == NULL) || (stride == NULL) || (edge    == NULL) ) {
-        return 0;
-    }
-
-    data_size = Mat_SizeOf(data_type);
-
-    switch ( class_type ) {
-        case MAT_C_DOUBLE:
-        {
-            double *ptr;
-
-            ptr = (double *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-            pos = ftell(mat->fp);
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    ReadDoubleData(mat,ptr++,data_type,1);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        case MAT_C_SINGLE:
-        {
-            float *ptr;
-
-            ptr = (float *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-            pos = ftell(mat->fp);
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    ReadSingleData(mat,ptr++,data_type,1);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-#ifdef HAVE_MAT_INT64_T
-        case MAT_C_INT64:
-        {
-            mat_int64_t *ptr;
-
-            ptr = (mat_int64_t *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-            pos = ftell(mat->fp);
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    ReadInt64Data(mat,ptr++,data_type,1);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-#endif /* HAVE_MAT_INT64_T */
-#ifdef HAVE_MAT_UINT64_T
-        case MAT_C_UINT64:
-        {
-            mat_uint64_t *ptr;
-
-            ptr = (mat_uint64_t *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-            pos = ftell(mat->fp);
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    ReadUInt64Data(mat,ptr++,data_type,1);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-#endif /* HAVE_MAT_UINT64_T */
-        case MAT_C_INT32:
-        {
-            mat_int32_t *ptr;
-
-            ptr = (mat_int32_t *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-            pos = ftell(mat->fp);
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    ReadInt32Data(mat,ptr++,data_type,1);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        case MAT_C_UINT32:
-        {
-            mat_uint32_t *ptr;
-
-            ptr = (mat_uint32_t *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-            pos = ftell(mat->fp);
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    ReadUInt32Data(mat,ptr++,data_type,1);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        case MAT_C_INT16:
-        {
-            mat_int16_t *ptr;
-
-            ptr = (mat_int16_t *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-            pos = ftell(mat->fp);
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    ReadInt16Data(mat,ptr++,data_type,1);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        case MAT_C_UINT16:
-        {
-            mat_uint16_t *ptr;
-
-            ptr = (mat_uint16_t *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-            pos = ftell(mat->fp);
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    ReadUInt16Data(mat,ptr++,data_type,1);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        case MAT_C_INT8:
-        {
-            mat_int8_t *ptr;
-
-            ptr = (mat_int8_t *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-            pos = ftell(mat->fp);
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    ReadInt8Data(mat,ptr++,data_type,1);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        case MAT_C_UINT8:
-        {
-            mat_uint8_t *ptr;
-
-            ptr = (mat_uint8_t *)data;
-            row_stride = (stride[0]-1)*data_size;
-            col_stride = stride[1]*dims[0]*data_size;
-            pos = ftell(mat->fp);
-            fseek(mat->fp,start[1]*dims[0]*data_size,SEEK_CUR);
-            for ( i = 0; i < edge[1]; i++ ) {
-                pos = ftell(mat->fp);
-                fseek(mat->fp,start[0]*data_size,SEEK_CUR);
-                for ( j = 0; j < edge[0]; j++ ) {
-                    ReadUInt8Data(mat,ptr++,data_type,1);
-                    fseek(mat->fp,row_stride,SEEK_CUR);
-                }
-                pos = pos+col_stride-ftell(mat->fp);
-                fseek(mat->fp,pos,SEEK_CUR);
-            }
-            break;
-        }
-        default:
-            nBytes = 0;
-    }
-    return nBytes;
-}
-
-#if defined(HAVE_ZLIB)
-/** @brief Reads data of type @c data_type by user-defined dimensions for 2-D
- *         data
- *
- * @ingroup mat_internal
- * @param mat MAT file pointer
- * @param z zlib compression stream
- * @param data Pointer to store the output data
- * @param class_type Type of data class (matio_classes enumerations)
- * @param data_type Datatype of the stored data (matio_types enumerations)
- * @param dims Dimensions of the data
- * @param start Index to start reading data in each dimension
- * @param stride Read every @c stride elements in each dimension
- * @param edge Number of elements to read in each dimension
- * @retval Number of bytes read from the file, or -1 on error
- */
-int
-ReadCompressedDataSlab2(mat_t *mat,z_stream *z,void *data,int class_type,
-    int data_type,int *dims,int *start,int *stride,int *edge)
-{
-    int nBytes = 0, data_size, i, j, err;
-    int pos, row_stride, col_stride;
-    z_stream z_copy = {0,};
-
-    if ( (mat   == NULL) || (data   == NULL) || (mat->fp == NULL) ||
-         (start == NULL) || (stride == NULL) || (edge    == NULL) ) {
-        return 0;
-    }
-
-    err = inflateCopy(&z_copy,z);
-    switch ( class_type ) {
-        case MAT_C_DOUBLE:
-        {
-            double *ptr;
-
-            data_size = sizeof(double);
-            ptr = data;
-            row_stride = (stride[0]-1);
-            col_stride = (stride[1]-1)*dims[0];
-            InflateSkipData(mat,&z_copy,data_type,start[1]*dims[0]);
-            /* If stride[0] is 1 and stride[1] is 1, we are reading all of the
-             * data so get rid of the loops.  If stride[0] is 1 and stride[1]
-             * is not 0, we are reading whole columns, so get rid of inner loop
-             * to speed up the code
-             */
-#if 0
-            if ( (stride[0] == 1 && edge[0] == dims[0]) && 
-                 (stride[1] == 1) ) {
-                ReadCompressedDoubleData(mat,&z_copy,ptr,data_type,
-                                         edge[0]*edge[1]);
-            } else if ( stride[0] == 1 ) {
-                for ( i = 0; i < edge[1]; i++ ) {
-                    InflateSkipData(mat,&z_copy,data_type,start[0]);
-                    ReadCompressedDoubleData(mat,&z_copy,ptr,data_type,edge[0]);
-                    ptr += edge[0];
-                    pos = dims[0]-(edge[0]-1)*stride[0]-1-start[0] + col_stride;
-                    InflateSkipData(mat,&z_copy,data_type,pos);
-                }
-            } else {
-#endif
-            for ( i = 0; i < edge[1]; i++ ) {
-                InflateSkipData(mat,&z_copy,data_type,start[0]);
-                for ( j = 0; j < edge[0]-1; j++ ) {
-                    ReadCompressedDoubleData(mat,&z_copy,ptr++,data_type,1);
-                    InflateSkipData(mat,&z_copy,data_type,stride[0]-1);
-                }
-                ReadCompressedDoubleData(mat,&z_copy,ptr++,data_type,1);
-                pos = dims[0]-(edge[0]-1)*stride[0]-1-start[0] + col_stride;
-                InflateSkipData(mat,&z_copy,data_type,pos);
-            }
-#if 0
-            }
-#endif
-            break;
-        }
-        case MAT_C_SINGLE:
-        {
-            float *ptr;
-
-            data_size = sizeof(float);
-            ptr = data;
-            row_stride = (stride[0]-1);
-            col_stride = (stride[1]-1)*dims[0];
-            InflateSkipData(mat,&z_copy,data_type,start[1]*dims[0]);
-            for ( i = 0; i < edge[1]; i++ ) {
-                InflateSkipData(mat,&z_copy,data_type,start[0]);
-                for ( j = 0; j < edge[0]-1; j++ ) {
-                    ReadCompressedSingleData(mat,&z_copy,ptr++,data_type,1);
-                    InflateSkipData(mat,&z_copy,data_type,stride[0]-1);
-                }
-                ReadCompressedSingleData(mat,&z_copy,ptr++,data_type,1);
-                pos = dims[0]-(edge[0]-1)*stride[0]-1-start[0] + col_stride;
-                InflateSkipData(mat,&z_copy,data_type,pos);
-            }
-            break;
-        }
-#ifdef HAVE_MAT_UINT64_T
-        case MAT_C_INT64:
-        {
-            mat_int64_t *ptr;
-
-            data_size = sizeof(mat_int64_t);
-            ptr = data;
-            row_stride = (stride[0]-1);
-            col_stride = (stride[1]-1)*dims[0];
-            InflateSkipData(mat,&z_copy,data_type,start[1]*dims[0]);
-            for ( i = 0; i < edge[1]; i++ ) {
-                InflateSkipData(mat,&z_copy,data_type,start[0]);
-                for ( j = 0; j < edge[0]-1; j++ ) {
-                    ReadCompressedInt64Data(mat,&z_copy,ptr++,data_type,1);
-                    InflateSkipData(mat,&z_copy,data_type,stride[0]-1);
-                }
-                ReadCompressedInt64Data(mat,&z_copy,ptr++,data_type,1);
-                pos = dims[0]-(edge[0]-1)*stride[0]-1-start[0] + col_stride;
-                InflateSkipData(mat,&z_copy,data_type,pos);
-            }
-            break;
-        }
-#endif /* HAVE_MAT_INT64_T */
-#ifdef HAVE_MAT_UINT64_T
-        case MAT_C_UINT64:
-        {
-            mat_uint64_t *ptr;
-
-            data_size = sizeof(mat_uint64_t);
-            ptr = data;
-            row_stride = (stride[0]-1);
-            col_stride = (stride[1]-1)*dims[0];
-            InflateSkipData(mat,&z_copy,data_type,start[1]*dims[0]);
-            for ( i = 0; i < edge[1]; i++ ) {
-                InflateSkipData(mat,&z_copy,data_type,start[0]);
-                for ( j = 0; j < edge[0]-1; j++ ) {
-                    ReadCompressedUInt64Data(mat,&z_copy,ptr++,data_type,1);
-                    InflateSkipData(mat,&z_copy,data_type,stride[0]-1);
-                }
-                ReadCompressedUInt64Data(mat,&z_copy,ptr++,data_type,1);
-                pos = dims[0]-(edge[0]-1)*stride[0]-1-start[0] + col_stride;
-                InflateSkipData(mat,&z_copy,data_type,pos);
-            }
-            break;
-        }
-#endif /* HAVE_MAT_UINT64_T */
-        case MAT_C_INT32:
-        {
-            mat_int32_t *ptr;
-
-            data_size = sizeof(mat_int32_t);
-            ptr = data;
-            row_stride = (stride[0]-1);
-            col_stride = (stride[1]-1)*dims[0];
-            InflateSkipData(mat,&z_copy,data_type,start[1]*dims[0]);
-            for ( i = 0; i < edge[1]; i++ ) {
-                InflateSkipData(mat,&z_copy,data_type,start[0]);
-                for ( j = 0; j < edge[0]-1; j++ ) {
-                    ReadCompressedInt32Data(mat,&z_copy,ptr++,data_type,1);
-                    InflateSkipData(mat,&z_copy,data_type,stride[0]-1);
-                }
-                ReadCompressedInt32Data(mat,&z_copy,ptr++,data_type,1);
-                pos = dims[0]-(edge[0]-1)*stride[0]-1-start[0] + col_stride;
-                InflateSkipData(mat,&z_copy,data_type,pos);
-            }
-            break;
-        }
-        case MAT_C_UINT32:
-        {
-            mat_uint32_t *ptr;
-
-            data_size = sizeof(mat_uint32_t);
-            ptr = data;
-            row_stride = (stride[0]-1);
-            col_stride = (stride[1]-1)*dims[0];
-            InflateSkipData(mat,&z_copy,data_type,start[1]*dims[0]);
-            for ( i = 0; i < edge[1]; i++ ) {
-                InflateSkipData(mat,&z_copy,data_type,start[0]);
-                for ( j = 0; j < edge[0]-1; j++ ) {
-                    ReadCompressedUInt32Data(mat,&z_copy,ptr++,data_type,1);
-                    InflateSkipData(mat,&z_copy,data_type,stride[0]-1);
-                }
-                ReadCompressedUInt32Data(mat,&z_copy,ptr++,data_type,1);
-                pos = dims[0]-(edge[0]-1)*stride[0]-1-start[0] + col_stride;
-                InflateSkipData(mat,&z_copy,data_type,pos);
-            }
-            break;
-        }
-        case MAT_C_INT16:
-        {
-            mat_int16_t *ptr;
-
-            data_size = sizeof(mat_int16_t);
-            ptr = data;
-            row_stride = (stride[0]-1);
-            col_stride = (stride[1]-1)*dims[0];
-            InflateSkipData(mat,&z_copy,data_type,start[1]*dims[0]);
-            for ( i = 0; i < edge[1]; i++ ) {
-                InflateSkipData(mat,&z_copy,data_type,start[0]);
-                for ( j = 0; j < edge[0]-1; j++ ) {
-                    ReadCompressedInt16Data(mat,&z_copy,ptr++,data_type,1);
-                    InflateSkipData(mat,&z_copy,data_type,stride[0]-1);
-                }
-                ReadCompressedInt16Data(mat,&z_copy,ptr++,data_type,1);
-                pos = dims[0]-(edge[0]-1)*stride[0]-1-start[0] + col_stride;
-                InflateSkipData(mat,&z_copy,data_type,pos);
-            }
-            break;
-        }
-        case MAT_C_UINT16:
-        {
-            mat_uint16_t *ptr;
-
-            data_size = sizeof(mat_uint16_t);
-            ptr = data;
-            row_stride = (stride[0]-1);
-            col_stride = (stride[1]-1)*dims[0];
-            InflateSkipData(mat,&z_copy,data_type,start[1]*dims[0]);
-            for ( i = 0; i < edge[1]; i++ ) {
-                InflateSkipData(mat,&z_copy,data_type,start[0]);
-                for ( j = 0; j < edge[0]-1; j++ ) {
-                    ReadCompressedUInt16Data(mat,&z_copy,ptr++,data_type,1);
-                    InflateSkipData(mat,&z_copy,data_type,stride[0]-1);
-                }
-                ReadCompressedUInt16Data(mat,&z_copy,ptr++,data_type,1);
-                pos = dims[0]-(edge[0]-1)*stride[0]-1-start[0] + col_stride;
-                InflateSkipData(mat,&z_copy,data_type,pos);
-            }
-            break;
-        }
-        case MAT_C_INT8:
-        {
-            mat_int8_t *ptr;
-
-            data_size = sizeof(mat_int8_t);
-            ptr = data;
-            row_stride = (stride[0]-1);
-            col_stride = (stride[1]-1)*dims[0];
-            InflateSkipData(mat,&z_copy,data_type,start[1]*dims[0]);
-            for ( i = 0; i < edge[1]; i++ ) {
-                InflateSkipData(mat,&z_copy,data_type,start[0]);
-                for ( j = 0; j < edge[0]-1; j++ ) {
-                    ReadCompressedInt8Data(mat,&z_copy,ptr++,data_type,1);
-                    InflateSkipData(mat,&z_copy,data_type,stride[0]-1);
-                }
-                ReadCompressedInt8Data(mat,&z_copy,ptr++,data_type,1);
-                pos = dims[0]-(edge[0]-1)*stride[0]-1-start[0] + col_stride;
-                InflateSkipData(mat,&z_copy,data_type,pos);
-            }
-            break;
-        }
-        case MAT_C_UINT8:
-        {
-            mat_uint8_t *ptr;
-
-            data_size = sizeof(mat_uint8_t);
-            ptr = data;
-            row_stride = (stride[0]-1);
-            col_stride = (stride[1]-1)*dims[0];
-            InflateSkipData(mat,&z_copy,data_type,start[1]*dims[0]);
-            for ( i = 0; i < edge[1]; i++ ) {
-                InflateSkipData(mat,&z_copy,data_type,start[0]);
-                for ( j = 0; j < edge[0]-1; j++ ) {
-                    ReadCompressedUInt8Data(mat,&z_copy,ptr++,data_type,1);
-                    InflateSkipData(mat,&z_copy,data_type,stride[0]-1);
-                }
-                ReadCompressedUInt8Data(mat,&z_copy,ptr++,data_type,1);
-                pos = dims[0]-(edge[0]-1)*stride[0]-1-start[0] + col_stride;
-                InflateSkipData(mat,&z_copy,data_type,pos);
-            }
-            break;
-        }
-        case MAT_C_CHAR:
-        {
-            char *ptr;
-
-            data_size = 1;
-            ptr = data;
-            row_stride = (stride[0]-1);
-            col_stride = (stride[1]-1)*dims[0];
-            InflateSkipData(mat,&z_copy,data_type,start[1]*dims[0]);
-            for ( i = 0; i < edge[1]; i++ ) {
-                InflateSkipData(mat,&z_copy,data_type,start[0]);
-                for ( j = 0; j < edge[0]-1; j++ ) {
-                    ReadCompressedCharData(mat,&z_copy,ptr++,data_type,1);
-                    InflateSkipData(mat,&z_copy,data_type,stride[0]-1);
-                }
-                ReadCompressedCharData(mat,&z_copy,ptr++,data_type,1);
-                pos = dims[0]-(edge[0]-1)*stride[0]-1-start[0] + col_stride;
-                InflateSkipData(mat,&z_copy,data_type,pos);
-            }
-            break;
-        }
-        default:
-            nBytes = 0;
-    }
-    inflateEnd(&z_copy);
-    return nBytes;
-}
-#endif

+ 0 - 852
matlabAccess/matio/src/snprintf.c

@@ -1,852 +0,0 @@
-/*
- * Copyright Patrick Powell 1995
- * This code is based on code written by Patrick Powell (papowell@astart.com)
- * It may be used for any purpose as long as this notice remains intact
- * on all source code distributions
- */
-
-/*=============================================================
- * Original:
- * Patrick Powell Tue Apr 11 09:48:21 PDT 1995
- * A bombproof version of doprnt (dopr) included.
- * Sigh.  This sort of thing is always nasty do deal with.  Note that
- * the version here does not include floating point...
- *
- * snprintf() is used instead of sprintf() as it does limit checks
- * for string length.  This covers a nasty loophole.
- *
- * The other functions are there to prevent NULL pointers from
- * causing nast effects.
- *
- * More Recently:
- *  Brandon Long <blong@fiction.net> 9/15/96 for mutt 0.43
- *  This was ugly.  It is still ugly.  I opted out of floating point
- *  numbers, but the formatter understands just about everything
- *  from the normal C string format, at least as far as I can tell from
- *  the Solaris 2.5 printf(3S) man page.
- *
- *  Brandon Long <blong@fiction.net> 10/22/97 for mutt 0.87.1
- *    Ok, added some minimal floating point support, which means this
- *    probably requires libm on most operating systems.  Don't yet
- *    support the exponent (e,E) and sigfig (g,G).  Also, fmtint()
- *    was pretty badly broken, it just wasn't being exercised in ways
- *    which showed it, so that's been fixed.  Also, formated the code
- *    to mutt conventions, and removed dead code left over from the
- *    original.  Also, there is now a builtin-test, just compile with:
- *           gcc -DTEST_SNPRINTF -o snprintf snprintf.c -lm
- *    and run snprintf for results.
- * 
- *  Thomas Roessler <roessler@guug.de> 01/27/98 for mutt 0.89i
- *    The PGP code was using unsigned hexadecimal formats. 
- *    Unfortunately, unsigned formats simply didn't work.
- *
- *  Michael Elkins <me@cs.hmc.edu> 03/05/98 for mutt 0.90.8
- *    The original code assumed that both snprintf() and vsnprintf() were
- *    missing.  Some systems only have snprintf() but not vsnprintf(), so
- *    the code is now broken down under HAVE_SNPRINTF and HAVE_VSNPRINTF.
- *
- *  Andrew Tridgell (tridge@samba.org) Oct 1998
- *    fixed handling of %.0f
- *    added test for HAVE_LONG_DOUBLE
- *
- * tridge@samba.org, idra@samba.org, April 2001
- *    got rid of fcvt code (twas buggy and made testing harder)
- *    added C99 semantics
- *
- * date: 2002/12/19 19:56:31;  author: herb;  state: Exp;  lines: +2 -0
- * actually print args for %g and %e
- * 
- * date: 2002/06/03 13:37:52;  author: jmcd;  state: Exp;  lines: +8 -0
- * Since includes.h isn't included here, VA_COPY has to be defined here.  I don't
- * see any include file that is guaranteed to be here, so I'm defining it
- * locally.  Fixes AIX and Solaris builds.
- * 
- * date: 2002/06/03 03:07:24;  author: tridge;  state: Exp;  lines: +5 -13
- * put the ifdef for HAVE_VA_COPY in one place rather than in lots of
- * functions
- * 
- * date: 2002/05/17 14:51:22;  author: jmcd;  state: Exp;  lines: +21 -4
- * Fix usage of va_list passed as an arg.  Use __va_copy before using it
- * when it exists.
- * 
- * date: 2002/04/16 22:38:04;  author: idra;  state: Exp;  lines: +20 -14
- * Fix incorrect zpadlen handling in fmtfp.
- * Thanks to Ollie Oldham <ollie.oldham@metro-optix.com> for spotting it.
- * few mods to make it easier to compile the tests.
- * addedd the "Ollie" test to the floating point ones.
- *
- * Martin Pool (mbp@samba.org) April 2003
- *    Remove NO_CONFIG_H so that the test case can be built within a source
- *    tree with less trouble.
- *    Remove unnecessary SAFE_FREE() definition.
- *
- * Martin Pool (mbp@samba.org) May 2003
- *    Put in a prototype for dummy_snprintf() to quiet compiler warnings.
- *
- *    Move #endif to make sure VA_COPY, LDOUBLE, etc are defined even
- *    if the C library has some snprintf functions already.
- =============================================================*/
-
-#include "matioConfig.h"
-#if defined(HAVE_STRING_H) || defined(STDC_HEADERS)
-#include <string.h>
-#endif
-
-#if defined(HAVE_STRINGS_H)
-#include <strings.h>
-#endif
-#if defined(HAVE_CTYPE_H) || defined(STDC_HEADERS)
-#include <ctype.h>
-#endif
-#include <sys/types.h>
-#include <stdarg.h>
-#if defined(HAVE_STDLIB_H) || defined(STDC_HEADERS)
-#include <stdlib.h>
-#endif
-#include <stdio.h>
-
-#ifdef HAVE_LONG_DOUBLE
-#define LDOUBLE long double
-#else
-#define LDOUBLE double
-#endif
-
-#ifdef HAVE_LONG_LONG
-#define LLONG long long
-#else
-#define LLONG long
-#endif
-
-#ifndef VA_COPY
-#ifdef HAVE_VA_COPY
-#define VA_COPY(dest, src) va_copy(dest, src)
-#else
-#ifdef HAVE___VA_COPY
-#define VA_COPY(dest, src) __va_copy(dest, src)
-#else
-#define VA_COPY(dest, src) (dest) = (src)
-#endif
-#endif
-
-/*
- * dopr(): poor man's version of doprintf
- */
-
-/* format read states */
-#define DP_S_DEFAULT 0
-#define DP_S_FLAGS   1
-#define DP_S_MIN     2
-#define DP_S_DOT     3
-#define DP_S_MAX     4
-#define DP_S_MOD     5
-#define DP_S_CONV    6
-#define DP_S_DONE    7
-
-/* format flags - Bits */
-#define DP_F_MINUS      (1 << 0)
-#define DP_F_PLUS       (1 << 1)
-#define DP_F_SPACE      (1 << 2)
-#define DP_F_NUM        (1 << 3)
-#define DP_F_ZERO       (1 << 4)
-#define DP_F_UP         (1 << 5)
-#define DP_F_UNSIGNED   (1 << 6)
-
-/* Conversion Flags */
-#define DP_C_SHORT   1
-#define DP_C_LONG    2
-#define DP_C_LDOUBLE 3
-#define DP_C_LLONG   4
-
-#define char_to_int(p) ((p)- '0')
-#ifndef MAX
-#define MAX(p,q) (((p) >= (q)) ? (p) : (q))
-#endif
-
-/* yes this really must be a ||. Don't muck with this (tridge) */
-#if !defined(HAVE_VSNPRINTF) || !defined(HAVE_C99_VSNPRINTF)
-static size_t dopr(char *buffer, size_t maxlen, const char *format, 
-                   va_list args_in);
-static void fmtstr(char *buffer, size_t *currlen, size_t maxlen,
-                    char *value, int flags, int min, int max);
-static void fmtint(char *buffer, size_t *currlen, size_t maxlen,
-                    long value, int base, int min, int max, int flags);
-static void fmtfp(char *buffer, size_t *currlen, size_t maxlen,
-                   LDOUBLE fvalue, int min, int max, int flags);
-static void dopr_outch(char *buffer, size_t *currlen, size_t maxlen, char c);
-
-static size_t dopr(char *buffer, size_t maxlen, const char *format, va_list args_in)
-{
-        char ch;
-        LLONG value;
-        LDOUBLE fvalue;
-        char *strvalue;
-        int min;
-        int max;
-        int state;
-        int flags;
-        int cflags;
-        size_t currlen;
-        va_list args;
-
-        VA_COPY(args, args_in);
-        
-        state = DP_S_DEFAULT;
-        currlen = flags = cflags = min = 0;
-        max = -1;
-        ch = *format++;
-        
-        while (state != DP_S_DONE) {
-                if (ch == '\0') 
-                        state = DP_S_DONE;
-
-                switch(state) {
-                case DP_S_DEFAULT:
-                        if (ch == '%') 
-                                state = DP_S_FLAGS;
-                        else 
-                                dopr_outch (buffer, &currlen, maxlen, ch);
-                        ch = *format++;
-                        break;
-                case DP_S_FLAGS:
-                        switch (ch) {
-                        case '-':
-                                flags |= DP_F_MINUS;
-                                ch = *format++;
-                                break;
-                        case '+':
-                                flags |= DP_F_PLUS;
-                                ch = *format++;
-                                break;
-                        case ' ':
-                                flags |= DP_F_SPACE;
-                                ch = *format++;
-                                break;
-                        case '#':
-                                flags |= DP_F_NUM;
-                                ch = *format++;
-                                break;
-                        case '0':
-                                flags |= DP_F_ZERO;
-                                ch = *format++;
-                                break;
-                        default:
-                                state = DP_S_MIN;
-                                break;
-                        }
-                        break;
-                case DP_S_MIN:
-                        if (isdigit((unsigned char)ch)) {
-                                min = 10*min + char_to_int (ch);
-                                ch = *format++;
-                        } else if (ch == '*') {
-                                min = va_arg (args, int);
-                                ch = *format++;
-                                state = DP_S_DOT;
-                        } else {
-                                state = DP_S_DOT;
-                        }
-                        break;
-                case DP_S_DOT:
-                        if (ch == '.') {
-                                state = DP_S_MAX;
-                                ch = *format++;
-                        } else { 
-                                state = DP_S_MOD;
-                        }
-                        break;
-                case DP_S_MAX:
-                        if (isdigit((unsigned char)ch)) {
-                                if (max < 0)
-                                        max = 0;
-                                max = 10*max + char_to_int (ch);
-                                ch = *format++;
-                        } else if (ch == '*') {
-                                max = va_arg (args, int);
-                                ch = *format++;
-                                state = DP_S_MOD;
-                        } else {
-                                state = DP_S_MOD;
-                        }
-                        break;
-                case DP_S_MOD:
-                        switch (ch) {
-                        case 'h':
-                                cflags = DP_C_SHORT;
-                                ch = *format++;
-                                break;
-                        case 'l':
-                                cflags = DP_C_LONG;
-                                ch = *format++;
-                                if (ch == 'l') {        /* It's a long long */
-                                        cflags = DP_C_LLONG;
-                                        ch = *format++;
-                                }
-                                break;
-                        case 'L':
-                                cflags = DP_C_LDOUBLE;
-                                ch = *format++;
-                                break;
-                        default:
-                                break;
-                        }
-                        state = DP_S_CONV;
-                        break;
-                case DP_S_CONV:
-                        switch (ch) {
-                        case 'd':
-                        case 'i':
-                                if (cflags == DP_C_SHORT) 
-                                        value = va_arg (args, int);
-                                else if (cflags == DP_C_LONG)
-                                        value = va_arg (args, long int);
-                                else if (cflags == DP_C_LLONG)
-                                        value = va_arg (args, LLONG);
-                                else
-                                        value = va_arg (args, int);
-                                fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags);
-                                break;
-                        case 'o':
-                                flags |= DP_F_UNSIGNED;
-                                if (cflags == DP_C_SHORT)
-                                        value = va_arg (args, unsigned int);
-                                else if (cflags == DP_C_LONG)
-                                        value = (long)va_arg (args, unsigned long int);
-                                else if (cflags == DP_C_LLONG)
-                                        value = (long)va_arg (args, unsigned LLONG);
-                                else
-                                        value = (long)va_arg (args, unsigned int);
-                                fmtint (buffer, &currlen, maxlen, value, 8, min, max, flags);
-                                break;
-                        case 'u':
-                                flags |= DP_F_UNSIGNED;
-                                if (cflags == DP_C_SHORT)
-                                        value = va_arg (args, unsigned int);
-                                else if (cflags == DP_C_LONG)
-                                        value = (long)va_arg (args, unsigned long int);
-                                else if (cflags == DP_C_LLONG)
-                                        value = (LLONG)va_arg (args, unsigned LLONG);
-                                else
-                                        value = (long)va_arg (args, unsigned int);
-                                fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags);
-                                break;
-                        case 'X':
-                                flags |= DP_F_UP;
-                        case 'x':
-                                flags |= DP_F_UNSIGNED;
-                                if (cflags == DP_C_SHORT)
-                                        value = va_arg (args, unsigned int);
-                                else if (cflags == DP_C_LONG)
-                                        value = (long)va_arg (args, unsigned long int);
-                                else if (cflags == DP_C_LLONG)
-                                        value = (LLONG)va_arg (args, unsigned LLONG);
-                                else
-                                        value = (long)va_arg (args, unsigned int);
-                                fmtint (buffer, &currlen, maxlen, value, 16, min, max, flags);
-                                break;
-                        case 'f':
-                                if (cflags == DP_C_LDOUBLE)
-                                        fvalue = va_arg (args, LDOUBLE);
-                                else
-                                        fvalue = va_arg (args, double);
-                                /* um, floating point? */
-                                fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags);
-                                break;
-                        case 'E':
-                                flags |= DP_F_UP;
-                        case 'e':
-                                if (cflags == DP_C_LDOUBLE)
-                                        fvalue = va_arg (args, LDOUBLE);
-                                else
-                                        fvalue = va_arg (args, double);
-                                fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags);
-                                break;
-                        case 'G':
-                                flags |= DP_F_UP;
-                        case 'g':
-                                if (cflags == DP_C_LDOUBLE)
-                                        fvalue = va_arg (args, LDOUBLE);
-                                else
-                                        fvalue = va_arg (args, double);
-                                fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags);
-                                break;
-                        case 'c':
-                                dopr_outch (buffer, &currlen, maxlen, va_arg (args, int));
-                                break;
-                        case 's':
-                                strvalue = va_arg (args, char *);
-                                if (!strvalue) strvalue = "(NULL)";
-                                if (max == -1) {
-                                        max = strlen(strvalue);
-                                }
-                                if (min > 0 && max >= 0 && min > max) max = min;
-                                fmtstr (buffer, &currlen, maxlen, strvalue, flags, min, max);
-                                break;
-                        case 'p':
-                                strvalue = va_arg (args, void *);
-                                fmtint (buffer, &currlen, maxlen, (long) strvalue, 16, min, max, flags);
-                                break;
-                        case 'n':
-                                if (cflags == DP_C_SHORT) {
-                                        short int *num;
-                                        num = va_arg (args, short int *);
-                                        *num = currlen;
-                                } else if (cflags == DP_C_LONG) {
-                                        long int *num;
-                                        num = va_arg (args, long int *);
-                                        *num = (long int)currlen;
-                                } else if (cflags == DP_C_LLONG) {
-                                        LLONG *num;
-                                        num = va_arg (args, LLONG *);
-                                        *num = (LLONG)currlen;
-                                } else {
-                                        int *num;
-                                        num = va_arg (args, int *);
-                                        *num = currlen;
-                                }
-                                break;
-                        case '%':
-                                dopr_outch (buffer, &currlen, maxlen, ch);
-                                break;
-                        case 'w':
-                                /* not supported yet, treat as next char */
-                                ch = *format++;
-                                break;
-                        default:
-                                /* Unknown, skip */
-                                break;
-                        }
-                        ch = *format++;
-                        state = DP_S_DEFAULT;
-                        flags = cflags = min = 0;
-                        max = -1;
-                        break;
-                case DP_S_DONE:
-                        break;
-                default:
-                        /* hmm? */
-                        break; /* some picky compilers need this */
-                }
-        }
-        if (maxlen != 0) {
-                if (currlen < maxlen - 1) 
-                        buffer[currlen] = '\0';
-                else if (maxlen > 0) 
-                        buffer[maxlen - 1] = '\0';
-        }
-        
-        return currlen;
-}
-
-static void fmtstr(char *buffer, size_t *currlen, size_t maxlen,
-                    char *value, int flags, int min, int max)
-{
-        int padlen, strln;     /* amount to pad */
-        int cnt = 0;
-
-#ifdef DEBUG_SNPRINTF
-        printf("fmtstr min=%d max=%d s=[%s]\n", min, max, value);
-#endif
-        if (value == 0) {
-                value = "<NULL>";
-        }
-
-        for (strln = 0; value[strln]; ++strln); /* strlen */
-        padlen = min - strln;
-        if (padlen < 0) 
-                padlen = 0;
-        if (flags & DP_F_MINUS) 
-                padlen = -padlen; /* Left Justify */
-        
-        while ((padlen > 0) && (cnt < max)) {
-                dopr_outch (buffer, currlen, maxlen, ' ');
-                --padlen;
-                ++cnt;
-        }
-        while (*value && (cnt < max)) {
-                dopr_outch (buffer, currlen, maxlen, *value++);
-                ++cnt;
-        }
-        while ((padlen < 0) && (cnt < max)) {
-                dopr_outch (buffer, currlen, maxlen, ' ');
-                ++padlen;
-                ++cnt;
-        }
-}
-
-/* Have to handle DP_F_NUM (ie 0x and 0 alternates) */
-
-static void fmtint(char *buffer, size_t *currlen, size_t maxlen,
-                    long value, int base, int min, int max, int flags)
-{
-        int signvalue = 0;
-        unsigned long uvalue;
-        char convert[20];
-        int place = 0;
-        int spadlen = 0; /* amount to space pad */
-        int zpadlen = 0; /* amount to zero pad */
-        int caps = 0;
-        
-        if (max < 0)
-                max = 0;
-        
-        uvalue = value;
-        
-        if(!(flags & DP_F_UNSIGNED)) {
-                if( value < 0 ) {
-                        signvalue = '-';
-                        uvalue = -value;
-                } else {
-                        if (flags & DP_F_PLUS)  /* Do a sign (+/i) */
-                                signvalue = '+';
-                        else if (flags & DP_F_SPACE)
-                                signvalue = ' ';
-                }
-        }
-  
-        if (flags & DP_F_UP) caps = 1; /* Should characters be upper case? */
-
-        do {
-                convert[place++] =
-                        (caps? "0123456789ABCDEF":"0123456789abcdef")
-                        [uvalue % (unsigned)base  ];
-                uvalue = (uvalue / (unsigned)base );
-        } while(uvalue && (place < 20));
-        if (place == 20) place--;
-        convert[place] = 0;
-
-        zpadlen = max - place;
-        spadlen = min - MAX (max, place) - (signvalue ? 1 : 0);
-        if (zpadlen < 0) zpadlen = 0;
-        if (spadlen < 0) spadlen = 0;
-        if (flags & DP_F_ZERO) {
-                zpadlen = MAX(zpadlen, spadlen);
-                spadlen = 0;
-        }
-        if (flags & DP_F_MINUS) 
-                spadlen = -spadlen; /* Left Justifty */
-
-#ifdef DEBUG_SNPRINTF
-        printf("zpad: %d, spad: %d, min: %d, max: %d, place: %d\n",
-               zpadlen, spadlen, min, max, place);
-#endif
-
-        /* Spaces */
-        while (spadlen > 0) {
-                dopr_outch (buffer, currlen, maxlen, ' ');
-                --spadlen;
-        }
-
-        /* Sign */
-        if (signvalue) 
-                dopr_outch (buffer, currlen, maxlen, signvalue);
-
-        /* Zeros */
-        if (zpadlen > 0) {
-                while (zpadlen > 0) {
-                        dopr_outch (buffer, currlen, maxlen, '0');
-                        --zpadlen;
-                }
-        }
-
-        /* Digits */
-        while (place > 0) 
-                dopr_outch (buffer, currlen, maxlen, convert[--place]);
-  
-        /* Left Justified spaces */
-        while (spadlen < 0) {
-                dopr_outch (buffer, currlen, maxlen, ' ');
-                ++spadlen;
-        }
-}
-
-static LDOUBLE abs_val(LDOUBLE value)
-{
-        LDOUBLE result = value;
-
-        if (value < 0)
-                result = -value;
-        
-        return result;
-}
-
-static LDOUBLE POW10(int exp)
-{
-        LDOUBLE result = 1;
-        
-        while (exp) {
-                result *= 10;
-                exp--;
-        }
-  
-        return result;
-}
-
-static LLONG ROUND(LDOUBLE value)
-{
-        LLONG intpart;
-
-        intpart = (LLONG)value;
-        value = value - intpart;
-        if (value >= 0.5) intpart++;
-        
-        return intpart;
-}
-
-/* a replacement for modf that doesn't need the math library. Should
-   be portable, but slow */
-static double my_modf(double x0, double *iptr)
-{
-        int i;
-        long l;
-        double x = x0;
-        double f = 1.0;
-
-        for (i=0;i<100;i++) {
-                l = (long)x;
-                if (l <= (x+1) && l >= (x-1)) break;
-                x *= 0.1;
-                f *= 10.0;
-        }
-
-        if (i == 100) {
-                /* yikes! the number is beyond what we can handle. What do we do? */
-                (*iptr) = 0;
-                return 0;
-        }
-
-        if (i != 0) {
-                double i2;
-                double ret;
-
-                ret = my_modf(x0-l*f, &i2);
-                (*iptr) = l*f + i2;
-                return ret;
-        } 
-
-        (*iptr) = l;
-        return x - (*iptr);
-}
-
-
-static void fmtfp (char *buffer, size_t *currlen, size_t maxlen,
-                   LDOUBLE fvalue, int min, int max, int flags)
-{
-        int signvalue = 0;
-        double ufvalue;
-        char iconvert[311];
-        char fconvert[311];
-        int iplace = 0;
-        int fplace = 0;
-        int padlen = 0; /* amount to pad */
-        int zpadlen = 0; 
-        int caps = 0;
-        int idx;
-        double intpart;
-        double fracpart;
-        double temp;
-  
-        /* 
-         * AIX manpage says the default is 0, but Solaris says the default
-         * is 6, and sprintf on AIX defaults to 6
-         */
-        if (max < 0)
-                max = 6;
-
-        ufvalue = abs_val (fvalue);
-
-        if (fvalue < 0) {
-                signvalue = '-';
-        } else {
-                if (flags & DP_F_PLUS) { /* Do a sign (+/i) */
-                        signvalue = '+';
-                } else {
-                        if (flags & DP_F_SPACE)
-                                signvalue = ' ';
-                }
-        }
-
-#if 0
-        if (flags & DP_F_UP) caps = 1; /* Should characters be upper case? */
-#endif
-
-#if 0
-         if (max == 0) ufvalue += 0.5; /* if max = 0 we must round */
-#endif
-
-        /* 
-         * Sorry, we only support 16 digits past the decimal because of our 
-         * conversion method
-         */
-        if (max > 16)
-                max = 16;
-
-        /* We "cheat" by converting the fractional part to integer by
-         * multiplying by a factor of 10
-         */
-
-        temp = ufvalue;
-        my_modf(temp, &intpart);
-
-        fracpart = ROUND((POW10(max)) * (ufvalue - intpart));
-        
-        if (fracpart >= POW10(max)) {
-                intpart++;
-                fracpart -= POW10(max);
-        }
-
-
-        /* Convert integer part */
-        do {
-                temp = intpart*0.1;
-                my_modf(temp, &intpart);
-                idx = (int) ((temp -intpart +0.05)* 10.0);
-                /* idx = (int) (((double)(temp*0.1) -intpart +0.05) *10.0); */
-                /* printf ("%llf, %f, %x\n", temp, intpart, idx); */
-                iconvert[iplace++] =
-                        (caps? "0123456789ABCDEF":"0123456789abcdef")[idx];
-        } while (intpart && (iplace < 311));
-        if (iplace == 311) iplace--;
-        iconvert[iplace] = 0;
-
-        /* Convert fractional part */
-        if (fracpart)
-        {
-                do {
-                        temp = fracpart*0.1;
-                        my_modf(temp, &fracpart);
-                        idx = (int) ((temp -fracpart +0.05)* 10.0);
-                        /* idx = (int) ((((temp/10) -fracpart) +0.05) *10); */
-                        /* printf ("%lf, %lf, %ld\n", temp, fracpart, idx ); */
-                        fconvert[fplace++] =
-                        (caps? "0123456789ABCDEF":"0123456789abcdef")[idx];
-                } while(fracpart && (fplace < 311));
-                if (fplace == 311) fplace--;
-        }
-        fconvert[fplace] = 0;
-  
-        /* -1 for decimal point, another -1 if we are printing a sign */
-        padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0); 
-        zpadlen = max - fplace;
-        if (zpadlen < 0) zpadlen = 0;
-        if (padlen < 0) 
-                padlen = 0;
-        if (flags & DP_F_MINUS) 
-                padlen = -padlen; /* Left Justifty */
-        
-        if ((flags & DP_F_ZERO) && (padlen > 0)) {
-                if (signvalue) {
-                        dopr_outch (buffer, currlen, maxlen, signvalue);
-                        --padlen;
-                        signvalue = 0;
-                }
-                while (padlen > 0) {
-                        dopr_outch (buffer, currlen, maxlen, '0');
-                        --padlen;
-                }
-        }
-        while (padlen > 0) {
-                dopr_outch (buffer, currlen, maxlen, ' ');
-                --padlen;
-        }
-        if (signvalue) 
-                dopr_outch (buffer, currlen, maxlen, signvalue);
-        
-        while (iplace > 0) 
-                dopr_outch (buffer, currlen, maxlen, iconvert[--iplace]);
-
-#ifdef DEBUG_SNPRINTF
-        printf("fmtfp: fplace=%d zpadlen=%d\n", fplace, zpadlen);
-#endif
-
-        /*
-         * Decimal point.  This should probably use locale to find the correct
-         * char to print out.
-         */
-        if (max > 0) {
-                dopr_outch (buffer, currlen, maxlen, '.');
-                
-                while (zpadlen > 0) {
-                        dopr_outch (buffer, currlen, maxlen, '0');
-                        --zpadlen;
-                }
-
-                while (fplace > 0) 
-                        dopr_outch (buffer, currlen, maxlen, fconvert[--fplace]);
-        }
-
-        while (padlen < 0) {
-                dopr_outch (buffer, currlen, maxlen, ' ');
-                ++padlen;
-        }
-}
-
-static void dopr_outch(char *buffer, size_t *currlen, size_t maxlen, char c)
-{
-        if (*currlen < maxlen) {
-                buffer[(*currlen)] = c;
-        }
-        (*currlen)++;
-}
-
-int mat_vsnprintf (char *str, size_t count, const char *fmt, va_list args)
-{
-        return dopr(str, count, fmt, args);
-}
-#else
-int mat_vsnprintf (char *str, size_t count, const char *fmt, va_list args)
-{
-        return vsnprintf(str, count, fmt, args);
-}
-#endif
-
-int mat_snprintf(char *str,size_t count,const char *fmt,...)
-{
-        size_t ret;
-        va_list ap;
-    
-        va_start(ap, fmt);
-        ret = mat_vsnprintf(str, count, fmt, ap);
-        va_end(ap);
-        return ret;
-}
-#endif 
-
-#ifndef HAVE_VASPRINTF
- int mat_vasprintf(char **ptr, const char *format, va_list ap)
-{
-        int ret;
-        va_list ap2;
-
-        VA_COPY(ap2, ap);
-        
-        ret = mat_vsnprintf(NULL, 0, format, ap2);
-        if (ret <= 0) return ret;
-
-        (*ptr) = (char *)malloc(ret+1);
-        if (!*ptr) return -1;
-
-        VA_COPY(ap2, ap);
-
-        ret = mat_vsnprintf(*ptr, ret+1, format, ap2);
-
-        return ret;
-}
-#else
-int mat_vasprintf(char **ptr, const char *format, va_list ap)
-{
-    return vasprintf(ptr,format,ap);
-}
-#endif
-
-int mat_asprintf(char **ptr, const char *format, ...)
-{
-        va_list ap;
-        int ret;
-        
-        *ptr = NULL;
-        va_start(ap, format);
-        ret = mat_vasprintf(ptr, format, ap);
-        va_end(ap);
-
-        return ret;
-}

+ 0 - 151
matlabAccess/progs/testMatFileIO.cpp

@@ -1,151 +0,0 @@
-/** 
-* @file testMatFileIO.cpp
-* @brief 
-* @author Paul Bodesheim
-* @date 06/01/2012 (dd-mm-yyyy)
-*/
-
-#include <vector>
-#include <iostream>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <string.h>
-#include <math.h>
-#include "vislearning/matlabAccess/matio/src/matio.h"
-#include "vislearning/matlabAccess/MatFileIO.h"
-
-using namespace std;
-using namespace NICE;
-
-int main (int argc, char* argv[]) {
-	
-  std::string filenameA = "/home/bodesheim/data/2012-01-09-testMatFileIO/sparse3x3matrixA.mat";
-
-  // A
-  MatFileIO matfileIOA = MatFileIO(filenameA,MAT_ACC_RDONLY);
-  printf("\n%d \n", matfileIOA.getNumberOfVariables());
-  
-  sparse_t sparseA;
-  matfileIOA.getSparseVariableViaName(sparseA,"A");
-  for (uint i = 0; i < sparseA.nzmax; i++) std::cout << ((double*)sparseA.data)[i]<< "  "; 
-  std::cerr << std::endl;
-  std::cerr << "now start reading imagenet-data" << std::endl;
-  
-  std::string filename = "/home/dbv/bilder/imagenet/devkit-1.0/demo/demo.train.mat";
-  std::string variable1 = "training_instance_matrix";
-  std::string variable2 = "training_label_vector";
-
-  //
-  // test matvar functions
-  //
-  
-  mat_t * mat;
-  matvar_t * matvar;
-  
-  mat = Mat_Open(filename.c_str(),MAT_ACC_RDONLY);
-  matvar = Mat_VarReadNext(mat);
-
-  while (matvar != NULL) {
-
-    printf("dimension of variable: %i : ",matvar->rank);
-    printf("%i ",*(matvar->dims));
-    for (int i = 2; i<=matvar->rank; i++) {
-		  
-      matvar->dims++;	  
-      printf("x %i ",*(matvar->dims));
-      
-    }
-    printf("\n");
-    matvar = Mat_VarReadNext(mat);
-
-  };
-  
-  //
-  // test class MatFileIO
-  //
-  
-  MatFileIO matfileIO = MatFileIO(filename,MAT_ACC_RDONLY);
-  printf("\nnumber of variables: %d \n", matfileIO.getNumberOfVariables()); 
-  
-  sparse_t *sparse;
-  matfileIO.getSparseVariableViaName(*sparse,variable1);
-  
-  printf("\nSparse Matrix \n"); 
-
-  for ( int i = 0; i < 5; i++ ) {
-    for ( int j = sparse->jc[i]; j < sparse->jc[i+1] && j < sparse->ndata && j < sparse->jc[i]+5; j++ ) {
-                              
-	printf("\t\t(%d,%d)\t%f", sparse->ir[j]+1,i+1,((double*)sparse->data)[j]);
-    }
-    printf("\n");
-  }
-  
-//   int count = 0;
-//   
-//   for ( int i = 0; i < sparse->njc-1; i++ ) {
-//     for ( int j = sparse->jc[i]; j < sparse->jc[i+1] && j < sparse->ndata; j++ )
-//                          
-//       if (count < 15) {
-//       
-// 	printf("    (%d,%d)  %f\n", sparse->ir[j]+1,i+1, data[j]);
-// 	count++;
-//       }     
-//   }
-
-  NICE::Vector vec;
-  matfileIO.getVectorViaName(vec,variable2);
-  
-  std::cout << std::endl << "Vector" << std::endl << std::endl; 
-  
-  for (size_t k = 0; k < 15; k++) {
-    
-    std::cout << vec[k] << "  ";
-  }
-  
-  std::cout << "..." <<std::endl;
-  
-  return 0;
-}
-
-
-// int main (int argc, char* argv[]) {
-//  
-//   std::string filenameA = "/home/bodesheim/data/2012-01-09-testMatFileIO/sparse3x3matrixA.mat";
-//   std::string filenameB = "/home/bodesheim/data/2012-01-09-testMatFileIO/full3x3matrixB.mat";
-//   std::string filenameC = "/home/bodesheim/data/2012-01-09-testMatFileIO/uint8bit3x3matrixC.mat";
-//   std::string filenameD = "/home/bodesheim/data/2012-01-09-testMatFileIO/int8bit3x3matrixD.mat";
-// 
-//   // A
-//   MatFileIO matfileIO = MatFileIO(filenameA,MAT_ACC_RDONLY);
-//   printf("\n%d \n", matfileIO.getNumberOfVariables());
-//   
-//   sparse_t sparse;
-//   matfileIO.getSparseVariableViaName(sparse,"A");
-//   for (uint i = 0; i < sparse.nzmax; i++) std::cout << ((double*)sparse.data)[i]<< "  "; 
-//   
-//   // B
-//   matfileIO = MatFileIO(filenameB,MAT_ACC_RDONLY);
-//   printf("\n%d \n", matfileIO.getNumberOfVariables());
-//   
-//   std::vector<std::vector<double> > features;
-//   matfileIO.getFeatureMatrixViaName(features,"B");
-//   for (uint i = 0; i < features.size(); i++) for (uint j = 0; j < features[i].size(); j++) std::cout << (features[i])[j] << "  "; 
-//   
-//   // C
-//   matfileIO = MatFileIO(filenameC,MAT_ACC_RDONLY);
-//   printf("\n%d \n", matfileIO.getNumberOfVariables());
-// 
-//   matfileIO.getFeatureMatrixViaName(features,"C");
-//   for (uint i = 0; i < features.size(); i++) for (uint j = 0; j < features[i].size(); j++) std::cout << (features[i])[j] << "  "; 
-//   
-//   // D
-//   matfileIO = MatFileIO(filenameD,MAT_ACC_RDONLY);
-//   printf("\n%d \n", matfileIO.getNumberOfVariables());
-//   
-//   matfileIO.getFeatureMatrixViaName(features,"D");
-//   for (uint i = 0; i < features.size(); i++) for (uint j = 0; j < features[i].size(); j++) std::cout << (features[i])[j] << "  "; 
-//   printf("\n");
-//   
-//   return 0;
-// }

+ 0 - 0
matlabAccess/ImageNetData.cpp → matlabAccessHighLevel/ImageNetData.cpp


+ 1 - 1
matlabAccess/ImageNetData.h → matlabAccessHighLevel/ImageNetData.h

@@ -11,10 +11,10 @@
 
 #include <core/vector/VectorT.h>
 #include <core/vector/SparseVector.h>
+#include <core/matlabAccess/MatFileIO.h>
 
 #include "vislearning/cbaselib/LabeledSet.h"
 
-#include "vislearning/matlabAccess/MatFileIO.h"
 
 namespace NICE {
   

+ 0 - 0
matlabAccess/Makefile → matlabAccessHighLevel/Makefile


+ 0 - 0
matlabAccess/Makefile.inc → matlabAccessHighLevel/Makefile.inc


+ 4 - 0
matlabAccessHighLevel/libdepend.inc

@@ -0,0 +1,4 @@
+$(call PKG_DEPEND_INT,core/vector/)
+$(call PKG_DEPEND_INT,core/basics/)
+$(call PKG_DEPEND_INT,core/matlabAccess/)
+$(call PKG_DEPEND_INT,vislearning/cbaselib/)

+ 0 - 0
matlabAccess/progs/Makefile.inc → matlabAccessHighLevel/progs/Makefile.inc


+ 1 - 1
regression/gpregression/GPRegressionOptimizationProblem.h

@@ -9,7 +9,7 @@
 
 #include "core/vector/VVector.h"
 #include "vislearning/math/kernels/ParameterizedKernel.h"
-#include "core/optimization/OptimizationProblemFirst.h"
+#include "core/optimization/limun/OptimizationProblemFirst.h"
 
 #include "vislearning/math/kernels/KernelData.h"
 

+ 3 - 3
regression/gpregression/RegGaussianProcess.cpp

@@ -8,9 +8,9 @@
 #include <iostream>
 #include <sstream>
 
-#include "core/optimization/OptimizationAlgorithmFirst.h"
-#include "core/optimization/FirstOrderTrustRegion.h"
-#include "core/optimization/FirstOrderRasmussen.h"
+#include "core/optimization/limun/OptimizationAlgorithmFirst.h"
+#include "core/optimization/limun/FirstOrderTrustRegion.h"
+#include "core/optimization/limun/FirstOrderRasmussen.h"
 
 #include "core/vector/Algorithms.h"
 #include "core/algebra/CholeskyRobust.h"

+ 1 - 1
regression/gpregression/modelselcrit/GPMSCLooEstimates.cpp

@@ -11,7 +11,7 @@
 #include "vislearning/cbaselib/ClassificationResults.h"
 #include "vislearning/classifier/kernelclassifier/LikelihoodFunction.h"
 #include "core/algebra/CholeskyRobustAuto.h"
-#include "core/optimization/FirstOrderTrustRegion.h"
+#include "core/optimization/limun/FirstOrderTrustRegion.h"
 
 #include "core/vector/Algorithms.h"
 

+ 1 - 1
regression/gpregression/modelselcrit/GPMSCLooEstimates.h

@@ -11,7 +11,7 @@
 #include "vislearning/math/kernels/KernelData.h"
 #include "vislearning/regression/gpregression/modelselcrit/GPModelSelectionCriterion.h"
 
-#include "core/optimization/OptimizationProblemFirst.h"
+#include "core/optimization/limun/OptimizationProblemFirst.h"
 
 namespace OBJREC {