Merge remote-tracking branch 'origin/master' into YaSp 92/10192/1
Sylvestre Ledru [Fri, 11 Jan 2013 09:05:18 +0000 (10:05 +0100)]
Change-Id: I0b5b271489da7b6e64b82e505448c82835712aee

1  2 
scilab/modules/commons/src/c/core_Import.def
scilab/modules/matio/sci_gateway/c/sci_matfile_listvar.c

@@@ -14,3 -16,4 +14,4 @@@ getScilabVersionMajo
  getScilabVersionMinor
  getScilabVersionMaintenance
  getScilabVersionTimestamp
 -getScilabVersionAsString
++getScilabVersionAsString
  #include "Scierror.h"
  #include "MALLOC.h"
  #include "freeArrayOfString.h"
 -#ifdef _MSC_VER
 -#include "strdup_Windows.h"
 -#endif
 +#include "os_strdup.h"
  
 -int sci_matfile_listvar(char *fname, unsigned long fname_len)
 -{
 -    int nbRow = 0, nbCol = 0;
 -    mat_t *matfile = NULL;
 -    matvar_t *matvar = NULL;
 -    int fileIndex = 0;
 -    char **varnames = NULL;
 -    double *varclasses = NULL;
 -    double *vartypes = NULL;
 -    int nbvar = 0, var_type;
 -    int * fd_addr = NULL;
 -    double tmp_dbl;
 -    SciErr sciErr;
 -
 -    CheckRhs(1, 1);
 -    CheckLhs(1, 3);
 -
 -    /* First Rhs is the index of the file to read */
 -
 -    sciErr = getVarAddressFromPosition(pvApiCtx, 1, &fd_addr);
 -    if (sciErr.iErr)
 -    {
 -        printError(&sciErr, 0);
 -        return 0;
 -    }
 -    sciErr = getVarType(pvApiCtx, fd_addr, &var_type);
 -    if (sciErr.iErr)
 -    {
 -        printError(&sciErr, 0);
 -        return 0;
 -    }
  
 -    if (var_type == sci_matrix)
 -    {
 -        getScalarDouble(pvApiCtx, fd_addr, &tmp_dbl);
 -        if (!isScalar(pvApiCtx, fd_addr))
 -        {
 -            Scierror(999, _("%s: Wrong size for first input argument: Single double expected.\n"), fname);
 -            return FALSE;
 -        }
 -        fileIndex = (int)tmp_dbl;
 +
 +#define MATIO_ERROR if(_SciErr.iErr)       \
 +    {                                      \
 +      printError(&_SciErr, 0);                     \
 +      return 1;                                    \
      }
 -    else
 +
 +int sci_matfile_listvar(char* fname, void* pvApiCtx)
 +{
 +  int nbRow = 0, nbCol = 0;
 +  mat_t *matfile = NULL;
 +  matvar_t *matvar = NULL;
 +  int fileIndex = 0;
 +  char **varnames = NULL;
 +  double *varclasses = NULL;
 +  double *vartypes = NULL;
 +  int nbvar = 0, var_type;
 +  int * fd_addr = NULL;
 +  double tmp_dbl;
 +  SciErr _SciErr;
 +
 +  CheckRhs(1, 1);
 +  CheckLhs(1, 3);
 +
 +  /* First Rhs is the index of the file to read */
 +
 +  _SciErr = getVarAddressFromPosition(pvApiCtx, 1, &fd_addr); MATIO_ERROR;
 +  _SciErr = getVarType(pvApiCtx, fd_addr, &var_type); MATIO_ERROR;
 +
 +  if (var_type == sci_matrix)
      {
 -        Scierror(999, _("%s: Wrong type for first input argument: Double expected.\n"), fname);
 -        return FALSE;
 +      getScalarDouble(pvApiCtx, fd_addr, &tmp_dbl);
 +      if (!isScalar(pvApiCtx, fd_addr))
 +      {
 +        Scierror(999, _("%s: Wrong size for first input argument: Single double expected.\n"), fname);
 +        return 1;
 +      }
 +      fileIndex = (int)tmp_dbl;
      }
 -
 -    /* Gets the corresponding matfile */
 -    matfile_manager(MATFILEMANAGER_GETFILE, &fileIndex, &matfile);
 -
 -    if (matfile == NULL)
 +  else
      {
 -        Scierror(999, _("%s: Invalid file identifier.\n"), fname);
 -        return FALSE;
 +      Scierror(999, _("%s: Wrong type for first input argument: Double expected.\n"), fname);
 +      return 1;
      }
  
 -    /* Back to the beginning of the file */
 -    if (Mat_Rewind(matfile) != 0)
 +  /* Gets the corresponding matfile */
 +  matfile_manager(MATFILEMANAGER_GETFILE, &fileIndex, &matfile);
++  if (matfile == NULL)
++  {
++      Scierror(999, _("%s: Invalid file identifier.\n"), fname);
++      return FALSE;
++  }
++  
 +  /* Back to the beginning of the file */
 +  if (Mat_Rewind(matfile) != 0)
      {
 -        Scierror(999, _("%s: Could not rewind the file %s.\n"), "matfile_listvar", matfile->filename);
 -        return FALSE;
 +      Scierror(999, _("%s: Could not rewind the file %s.\n"), "matfile_listvar", matfile->filename);
 +      return 1;
      }
  
 -    matvar = Mat_VarReadNext(matfile);
 -    while (matvar != NULL && matvar->name != NULL)
 +  matvar = Mat_VarReadNext(matfile);
 +  while (matvar != NULL && matvar->name != NULL)
      {
 -        nbvar++;
 -        varnames = (char**) REALLOC(varnames, nbvar * sizeof(char*));
 -        if (varnames == NULL)
 -        {
 -            Scierror(999, _("%s: No more memory.\n"), "matfile_listvar");
 -            return FALSE;
 -        }
 -        varnames[nbvar - 1] = strdup(matvar->name);
 -        varclasses = (double*) REALLOC(varclasses, nbvar * sizeof(double));
 -        if (varnames == NULL)
 -        {
 -            Scierror(999, _("%s: No more memory.\n"), "matfile_listvar");
 -            return FALSE;
 -        }
 -        varclasses[nbvar - 1] = (double) matvar->class_type;
 -        vartypes = (double*) REALLOC(vartypes, nbvar * sizeof(double));
 -        if (varnames == NULL)
 -        {
 -            Scierror(999, _("%s: No more memory.\n"), "matfile_listvar");
 -            return FALSE;
 -        }
 -        vartypes[nbvar - 1] = (double) matvar->data_type;
 -
 -        Mat_VarFree(matvar);
 -        matvar = Mat_VarReadNext(matfile);
 +      nbvar++;
 +      varnames = (char**) REALLOC(varnames, nbvar*sizeof(char*));
 +      if (varnames == NULL)
 +      {
 +        Scierror(999, _("%s: No more memory.\n"), "matfile_listvar");
 +        return 1;
 +      }
 +      varnames[nbvar-1] = os_strdup(matvar->name);
 +      varclasses = (double*) REALLOC(varclasses, nbvar*sizeof(double));
 +      if (varnames == NULL)
 +      {
 +        Scierror(999, _("%s: No more memory.\n"), "matfile_listvar");
 +        return 1;
 +      }
 +      varclasses[nbvar-1] = (double) matvar->class_type;
 +      vartypes = (double*) REALLOC(vartypes, nbvar*sizeof(double));
 +      if (varnames == NULL)
 +      {
 +        Scierror(999, _("%s: No more memory.\n"), "matfile_listvar");
 +        return 1;
 +      }
 +      vartypes[nbvar-1] = (double) matvar->data_type;
 +
 +      Mat_VarFree(matvar);
 +      matvar = Mat_VarReadNext(matfile);
      }
  
 -    Mat_VarFree(matvar);
 +  Mat_VarFree(matvar);
  
 -    /* Return the variable names list */
 -    nbRow = nbvar;
 -    nbCol = 1;
 -    sciErr = createMatrixOfString(pvApiCtx, Rhs + 1, nbRow, nbCol, varnames);
 -    if (sciErr.iErr)
 -    {
 -        printError(&sciErr, 0);
 -        return 0;
 -    }
 -    LhsVar(1) = Rhs + 1;
 +  /* Return the variable names list */
 +  nbRow = nbvar; nbCol = 1;
 +  _SciErr = createMatrixOfString(pvApiCtx, Rhs+1, nbRow, nbCol, varnames); MATIO_ERROR;
 +  LhsVar(1) = Rhs+1;
  
 -    /* Return the variable classes */
 -    if (Lhs >= 2)
 +  /* Return the variable classes */
 +  if (Lhs >= 2)
      {
 -        sciErr = createMatrixOfDouble(pvApiCtx, Rhs + 2, nbRow, nbCol, varclasses);
 -        if (sciErr.iErr)
 -        {
 -            printError(&sciErr, 0);
 -            return 0;
 -        }
 -        LhsVar(2) = Rhs + 2;
 +      _SciErr = createMatrixOfDouble(pvApiCtx, Rhs+2, nbRow, nbCol, varclasses); MATIO_ERROR;
 +      LhsVar(2) = Rhs+2;
      }
  
 -    /* Return the variable types */
 -    if (Lhs >= 3)
 +  /* Return the variable types */
 +  if (Lhs >= 3)
      {
 -        sciErr = createMatrixOfDouble(pvApiCtx, Rhs + 3, nbRow, nbCol, vartypes);
 -        if (sciErr.iErr)
 -        {
 -            printError(&sciErr, 0);
 -            return 0;
 -        }
 -        LhsVar(3) = Rhs + 3;
 +      _SciErr = createMatrixOfDouble(pvApiCtx, Rhs+3, nbRow, nbCol, vartypes); MATIO_ERROR;
 +      LhsVar(3) = Rhs+3;
      }
  
 -    freeArrayOfString(varnames, nbvar);
 -    FREE(varclasses);
 -    FREE(vartypes);
 +  freeArrayOfString(varnames, nbvar);
 +  FREE(varclasses);
 +  FREE(vartypes);
  
 -    PutLhsVar();
 +  PutLhsVar();
  
 -    return TRUE;
 +  return 0;
  }