* Bug #13102 fixed - matio: 7.3 support
[scilab.git] / scilab / modules / matio / sci_gateway / c / sci_matfile_open.c
index f57d90e..b753dbc 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2014 - Scilab Enterprises - Paul Bignier: bug #13102 fixed
  * Copyright (C) 2008 - INRIA - Vincent COUVERT
  * Copyright (C) 2010 - DIGITEO - Yann COLLETTE
  *
@@ -30,10 +31,12 @@ int sci_matfile_open(char *fname, unsigned long fname_len)
     char * filename  = NULL;
     char * optionStr = NULL;
     int option = 0, var_type;
-    int * filename_addr = NULL, * option_addr = NULL;
+    int * filename_addr = NULL, * option_addr = NULL, * version_addr = NULL;
+    char * versionStr = NULL;
+    int version = MAT_FT_MAT5; // By default, use MAtlab 5 files
     SciErr sciErr;
 
-    CheckRhs(1, 2);
+    CheckRhs(1, 3);
     CheckLhs(1, 1);
 
     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &filename_addr);
@@ -73,7 +76,7 @@ int sci_matfile_open(char *fname, unsigned long fname_len)
         return FALSE;
     }
 
-    if (Rhs == 2)
+    if (Rhs >= 2)
     {
         sciErr = getVarAddressFromPosition(pvApiCtx, 2, &option_addr);
         if (sciErr.iErr)
@@ -140,12 +143,63 @@ int sci_matfile_open(char *fname, unsigned long fname_len)
         option = MAT_ACC_RDONLY;
     }
 
-    if (option == MAT_ACC_RDWR)
+    if (Rhs >= 3)
     {
-        /* create a Matlab 5 file */
-        matfile = Mat_CreateVer(filename, NULL, 0);
+        sciErr = getVarAddressFromPosition(pvApiCtx, 3, &version_addr);
+        if (sciErr.iErr)
+        {
+            printError(&sciErr, 0);
+            return 0;
+        }
+
+        sciErr = getVarType(pvApiCtx, version_addr, &var_type);
+        if (sciErr.iErr)
+        {
+            printError(&sciErr, 0);
+            return 0;
+        }
+        printf("sci_strings %d %d\n", var_type, sci_strings);
+        if (var_type == sci_strings)
+        {
+            getAllocatedSingleString(pvApiCtx, version_addr, &versionStr);
+            sciErr = getVarDimension(pvApiCtx, version_addr, &nbRow, &nbCol);
+            if (sciErr.iErr)
+            {
+                printError(&sciErr, 0);
+                return 0;
+            }
+            if (nbCol != 1)
+            {
+                Scierror(999, _("%s: Wrong size for input argument #%d: Single string expected.\n"), fname, 3);
+                freeAllocatedSingleString(filename);
+                freeAllocatedSingleString(optionStr);
+                freeAllocatedSingleString(versionStr);
+
+                return FALSE;
+            }
+
+            if (strcmp(versionStr, "7.3") == 0)
+            {
+                version = MAT_FT_MAT73; // Matlab 7.3 file
+            }
+            else
+            {
+                version = MAT_FT_MAT5; // Default, Matlab 5 file
+            }
+        }
+        else
+        {
+            Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 3);
+            return 0;
+        }
     }
-    else
+
+    if (option == MAT_ACC_RDWR) // Write, option = "w"
+    {
+        /* create a Matlab 5 or 7.3 file */
+        matfile = Mat_CreateVer(filename, NULL, version);
+    }
+    else // Read, option = "r"
     {
         /* Try to open the file (as a Matlab 5 file) */
         matfile = Mat_Open(filename, option);
@@ -168,6 +222,7 @@ int sci_matfile_open(char *fname, unsigned long fname_len)
 
     freeAllocatedSingleString(filename);
     freeAllocatedSingleString(optionStr);
+    freeAllocatedSingleString(versionStr);
 
     LhsVar(1) = Rhs + 1;
     PutLhsVar();