bug 7921 + cleaning 68/1768/3
Allan CORNET [Wed, 1 Sep 2010 12:02:56 +0000 (14:02 +0200)]
Change-Id: Idc9890ed46969a339b05b322909ada56ac769fd5

12 files changed:
scilab/modules/core/sci_gateway/c/sci_lasterror.c
scilab/modules/output_stream/Makefile.am
scilab/modules/output_stream/Makefile.in
scilab/modules/output_stream/includes/lasterror.h [new file with mode: 0644]
scilab/modules/output_stream/src/c/String_Import.def
scilab/modules/output_stream/src/c/errmsg.c
scilab/modules/output_stream/src/c/error.c
scilab/modules/output_stream/src/c/error_internal.c
scilab/modules/output_stream/src/c/lasterror.c [new file with mode: 0644]
scilab/modules/output_stream/src/c/msgstore.c
scilab/modules/output_stream/src/c/msgstore.h
scilab/modules/output_stream/src/c/output_stream.vcproj

index 1e8f783..0ec7b11 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2006 - INRIA - Allan CORNET
+ * Copyright (C) 2010 - DIGITEO - Allan CORNET
  *
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
  *
  */
+/*--------------------------------------------------------------------------*/
 #include "gw_core.h"
+#include "api_scilab.h"
 #include "stack-c.h"
-/*--------------------------------------------------------------------------*/
-extern int C2F(lasterror)(char *fname,unsigned long fname_len);
+#include "lasterror.h"
+#include "BOOL.h"
+#include "localization.h"
+#include "Scierror.h"
 /*--------------------------------------------------------------------------*/
 int C2F(sci_lasterror)(char *fname,unsigned long fname_len)
 {
-       C2F(lasterror)(fname,fname_len);
-       return 0;
+    SciErr sciErr;
+    BOOL bClearLastError = TRUE;
+    int NbLines = 0;
+    const char **errorMessage = NULL;
+
+    Rhs = Max(0, Rhs);
+    CheckRhs(0,1);
+    CheckLhs(1,4);
+
+    if (Rhs == 1)
+    {
+        int iType = 0;
+        int *piAddressVarOne = NULL;
+
+        /* get Address of inputs */
+        sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddressVarOne);
+        if(sciErr.iErr)
+        {
+            printError(&sciErr, 0);
+            return 0;
+        }
+
+        if (isBooleanType(pvApiCtx, piAddressVarOne))
+        {
+            if (isScalar(pvApiCtx, piAddressVarOne))
+            {
+                getScalarBoolean(pvApiCtx, piAddressVarOne, &bClearLastError);
+            }
+            else
+            {
+                Scierror(999,_("%s: Wrong size for input argument #%d: A boolean expected.\n"), fname, 1);
+            }
+        }
+        else
+        {
+            Scierror(999,_("%s: Wrong type for input argument #%d: A boolean expected.\n"), fname, 1);
+        }
+    }
+
+    errorMessage = getLastErrorMessage(&NbLines);
+
+    if ((NbLines <= 0) || (errorMessage == NULL))
+    {
+        createEmptyMatrix(pvApiCtx, Rhs + 1);
+    }
+    else
+    {
+        sciErr = createMatrixOfString(pvApiCtx, Rhs + 1, NbLines, 1, (char**)errorMessage);
+        if(sciErr.iErr)
+        {
+            printError(&sciErr, 0);
+            return 0;
+        }
+    }
+    LhsVar(1) = Rhs + 1;
+
+    if (Lhs >= 2)
+    {
+        double dLastErrorValue = (double) getLastErrorValue();
+        createScalarDouble(pvApiCtx, Rhs + 2, dLastErrorValue);
+        LhsVar(2) = Rhs + 2;
+    }
+
+    if (Lhs >= 3)
+    {
+        double dLinePosition = (double)  getLastErrorLinePosition();
+        createScalarDouble(pvApiCtx, Rhs + 3, dLinePosition);
+        LhsVar(3) = Rhs + 3;
+    }
+
+    if (Lhs == 4)
+    {
+        createSingleString(pvApiCtx, Rhs + 4, (char*)getLastErrorFunctionName());
+        LhsVar(4) = Rhs + 4;
+    }
+
+    if (bClearLastError)
+    {
+        clearLastError();
+    }
+
+    C2F(putlhsvar)();
+
+    return 0;
 }
 /*--------------------------------------------------------------------------*/
index 06867f3..b558413 100644 (file)
@@ -1,5 +1,6 @@
 # Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 # Copyright (C) 2007 - INRIA - Bruno JOFRET
+# Copyright (C) 2010 - DIGITEO - Bruno JOFRET
 #
 # This file must be used under the terms of the CeCILL.
 # This source file is licensed as described in the file COPYING, which
@@ -30,7 +31,8 @@ OUTPUT_STREAM_C_SOURCES =     src/c/erro.c \
                                src/c/error.c \
                                src/c/error_internal.c \
                                src/c/do_xxprintf.c \
-                               src/c/set_xxprintf.c
+                               src/c/set_xxprintf.c \
+                               src/c/lasterror.c
 
 OUTPUT_STREAM_FORTRAN_SOURCES = src/fortran/wspdsp.f \
                src/fortran/wmdsp.f \
index 5c2ba22..1e1174d 100644 (file)
@@ -17,6 +17,7 @@
 
 # Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 # Copyright (C) 2007 - INRIA - Bruno JOFRET
+# Copyright (C) 2010 - DIGITEO - Bruno JOFRET
 #
 # This file must be used under the terms of the CeCILL.
 # This source file is licensed as described in the file COPYING, which
@@ -133,7 +134,8 @@ am__objects_1 = libscioutput_stream_la-erro.lo \
        libscioutput_stream_la-error.lo \
        libscioutput_stream_la-error_internal.lo \
        libscioutput_stream_la-do_xxprintf.lo \
-       libscioutput_stream_la-set_xxprintf.lo
+       libscioutput_stream_la-set_xxprintf.lo \
+       libscioutput_stream_la-lasterror.lo
 am__objects_2 = libscioutput_stream_la-Diary.lo \
        libscioutput_stream_la-DiaryList.lo \
        libscioutput_stream_la-diary_manager.lo \
@@ -460,7 +462,8 @@ OUTPUT_STREAM_C_SOURCES = src/c/erro.c \
                                src/c/error.c \
                                src/c/error_internal.c \
                                src/c/do_xxprintf.c \
-                               src/c/set_xxprintf.c
+                               src/c/set_xxprintf.c \
+                               src/c/lasterror.c
 
 OUTPUT_STREAM_FORTRAN_SOURCES = src/fortran/wspdsp.f \
                src/fortran/wmdsp.f \
@@ -689,6 +692,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscioutput_stream_la-getDiaryDate.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscioutput_stream_la-getFullFilename.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscioutput_stream_la-gw_output_stream.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscioutput_stream_la-lasterror.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscioutput_stream_la-msgout.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscioutput_stream_la-msgs.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscioutput_stream_la-msgstore.Plo@am__quote@
@@ -835,6 +839,13 @@ libscioutput_stream_la-set_xxprintf.lo: src/c/set_xxprintf.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscioutput_stream_la_CPPFLAGS) $(CPPFLAGS) $(libscioutput_stream_la_CFLAGS) $(CFLAGS) -c -o libscioutput_stream_la-set_xxprintf.lo `test -f 'src/c/set_xxprintf.c' || echo '$(srcdir)/'`src/c/set_xxprintf.c
 
+libscioutput_stream_la-lasterror.lo: src/c/lasterror.c
+@am__fastdepCC_TRUE@   $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscioutput_stream_la_CPPFLAGS) $(CPPFLAGS) $(libscioutput_stream_la_CFLAGS) $(CFLAGS) -MT libscioutput_stream_la-lasterror.lo -MD -MP -MF $(DEPDIR)/libscioutput_stream_la-lasterror.Tpo -c -o libscioutput_stream_la-lasterror.lo `test -f 'src/c/lasterror.c' || echo '$(srcdir)/'`src/c/lasterror.c
+@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/libscioutput_stream_la-lasterror.Tpo $(DEPDIR)/libscioutput_stream_la-lasterror.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='src/c/lasterror.c' object='libscioutput_stream_la-lasterror.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscioutput_stream_la_CPPFLAGS) $(CPPFLAGS) $(libscioutput_stream_la_CFLAGS) $(CFLAGS) -c -o libscioutput_stream_la-lasterror.lo `test -f 'src/c/lasterror.c' || echo '$(srcdir)/'`src/c/lasterror.c
+
 libscioutput_stream_la-gw_output_stream.lo: sci_gateway/c/gw_output_stream.c
 @am__fastdepCC_TRUE@   $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscioutput_stream_la_CPPFLAGS) $(CPPFLAGS) $(libscioutput_stream_la_CFLAGS) $(CFLAGS) -MT libscioutput_stream_la-gw_output_stream.lo -MD -MP -MF $(DEPDIR)/libscioutput_stream_la-gw_output_stream.Tpo -c -o libscioutput_stream_la-gw_output_stream.lo `test -f 'sci_gateway/c/gw_output_stream.c' || echo '$(srcdir)/'`sci_gateway/c/gw_output_stream.c
 @am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/libscioutput_stream_la-gw_output_stream.Tpo $(DEPDIR)/libscioutput_stream_la-gw_output_stream.Plo
diff --git a/scilab/modules/output_stream/includes/lasterror.h b/scilab/modules/output_stream/includes/lasterror.h
new file mode 100644 (file)
index 0000000..4aee4bf
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) DIGITEO - 2010 - Allan CORNET
+ * 
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at    
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+#ifndef __LASTERROR_H__
+#define __LASTERROR_H__
+
+#include "dynlib_output_stream.h"
+
+/**
+* set last recorded error
+* @param[in] new recorded error number
+* @param[in] new recorded error message
+* @param[in] size of new recorded error message
+* @param[in] new line position in function
+* @param[in] new function name
+* @return 0
+*/
+OUTPUT_STREAM_IMPEXP int setLastError(int iErr, 
+                                      char** strErrorMessage,
+                                      int iNbLines,
+                                      int iLinePos,
+                                      char *strFunctionName);
+
+/**
+* clear last error
+* @return 0
+*/
+OUTPUT_STREAM_IMPEXP int clearLastError(void);
+
+/**
+* set current last error text buffer
+* @param[in] new buffer text
+* @param[in] size of new text buffer
+* @return 0
+*/
+OUTPUT_STREAM_IMPEXP int setLastErrorMessage(char** strErrorMessage, int iNbLines);
+
+/**
+* get current last error buffer
+* @param[out] returns size of returned buffer 
+* @return buffer last error (no need to free)
+*/
+OUTPUT_STREAM_IMPEXP const char** getLastErrorMessage(int *iNbLines);
+
+/**
+* Append a line to current last error buffer
+* @param[in] strErrorMessage line to append
+* @return 0 if OK , 1 if NOT OK
+*/
+OUTPUT_STREAM_IMPEXP int appendStringToLastErrorMessage(char *strErrorMessage);
+
+/**
+* Returns Last Error Value
+* @return last error value (int)
+*/
+OUTPUT_STREAM_IMPEXP int getLastErrorValue(void);
+
+/**
+* set Last Error Value
+* @param[in] int: new value of last error
+* @return int: previous value of last error
+*/
+OUTPUT_STREAM_IMPEXP int setLastErrorValue(int iVal);
+
+/**
+* get last recorded function line position
+* @return line position
+*/
+OUTPUT_STREAM_IMPEXP int getLastErrorLinePosition(void);
+
+/**
+* set last recorded function line position
+* @param[in] new line position
+* @return previous line position
+*/
+OUTPUT_STREAM_IMPEXP int setLastErrorLinePosition(int iLinePosition);
+
+/**
+* get last recorded function name
+* @return function name (no need to free)
+*/
+OUTPUT_STREAM_IMPEXP const char *getLastErrorFunctionName(void);
+
+/**
+* set last recorded function name
+* @param[in] function name
+* @return 0
+*/
+OUTPUT_STREAM_IMPEXP int setLastErrorFunctionName(char *strFunctionName);
+
+#endif /* __LASTERROR_H__ */
index 63a9c64..cf8104f 100644 (file)
@@ -4,5 +4,6 @@
 EXPORTS
        cvstr_
        SciStrtoStr
+       strsub
        
        
\ No newline at end of file
index 9c47b78..58e1741 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) INRIA - Allan CORNET
+ * Copyright (C) DIGITEO - 2010 - Allan CORNET
  * 
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
@@ -22,6 +23,7 @@
 #include "inffic.h"
 #include "msgstore.h"
 #include "msgout.h"
+#include "lasterror.h"
 #ifdef _MSC_VER
 #include "strdup_Windows.h"
 #endif
@@ -55,7 +57,7 @@ int C2F(errmsg)(int *n,int *errtyp)
     resetLastError();
 
     /* store error code (lasterror) */
-    C2F(errstore)(n);
+    setLastErrorValue(*n);
 
     *errtyp = 0; /* by default errors are recoverable */
     /* errors not recoverable aren't catchable by top
index c9b52d1..562e9d9 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) INRIA - Allan CORNET
+ * Copyright (C) DIGITEO - 2010 - Allan CORNET
  * 
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
 #include "MALLOC.h" /* NULL*/
 #include "error_internal.h"
 #include "msgstore.h"
+#include "lasterror.h"
 /*--------------------------------------------------------------------------*/ 
 int C2F(error)(int *n)
 {
-       return error_internal(n,NULL,ERROR_FROM_FORTRAN);
+    return error_internal(n,NULL,ERROR_FROM_FORTRAN);
 } 
 /*--------------------------------------------------------------------------*/ 
 void SciError(int n)
 {
-       C2F(error)(&n);
+    C2F(error)(&n);
 }
-
+/*--------------------------------------------------------------------------*/
 void SciStoreError(int n)
 {
-       C2F(errstore)(&n);
+    setLastErrorValue(n);
 }
 /*--------------------------------------------------------------------------*/
index 7213363..417b4bd 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) INRIA - Allan CORNET
+ * Copyright (C) DIGITEO - 2010 - Allan CORNET
  * 
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
@@ -18,6 +19,7 @@
 #include "stack-def.h"
 #include "errmsg.h"
 #include "errmds.h"
+#include "lasterror.h"
 /*--------------------------------------------------------------------------*/ 
 extern int C2F(errloc)(int *n); /* fortran */
 extern int C2F(errmgr)(); /* fortran */
@@ -27,72 +29,72 @@ extern int C2F(whatln)(int *lpt1,int *lpt2,int *lpt6,int *nct,int *idebut,int *i
 /*--------------------------------------------------------------------------*/ 
 int error_internal(int *n,char *buffer,int mode)
 {
-       int num = 0;
-       int lct1 = 0;
-       int imode = 0;
-       int imess = 0;
-       int errtyp = 0;
+    int num = 0;
+    int lct1 = 0;
+    int imode = 0;
+    int imess = 0;
+    int errtyp = 0;
 
-       /* extract error modes out of errct variable */
-       C2F(errmds)(&num, &imess, &imode);
+    /* extract error modes out of errct variable */
+    C2F(errmds)(&num, &imess, &imode);
 
-       /* de-activate output control */
-       lct1 = C2F(iop).lct[0];
-       C2F(iop).lct[0] = 0;
+    /* de-activate output control */
+    lct1 = C2F(iop).lct[0];
+    C2F(iop).lct[0] = 0;
 
-       /* errors are recoverable */
-       errtyp = 0;
+    /* errors are recoverable */
+    errtyp = 0;
 
-       if (C2F(errgst).err1 == 0) 
-       {
-               BOOL trace = ! ((num < 0 || num == *n) && imess != 0);
-               /* locate the error in the current statement */
-               if (trace) 
-               {
-                       C2F(errloc)(n);
-               }
-               else
-               {
-                       /* get the number of the line where the error occurs */
-                       int nlc = 0;
-                       int l1 = 0;
-                       int ifin = 0;
-                       C2F(whatln)(C2F(iop).lpt,C2F(iop).lpt+1,C2F(iop).lpt+5,&nlc,&l1,&ifin);
-                       C2F(iop).lct[7] = C2F(iop).lct[7]-nlc;
-                       /* disable error display */
-                       C2F(iop).lct[0] = -1;
-               }
+    if (C2F(errgst).err1 == 0) 
+    {
+        BOOL trace = ! ((num < 0 || num == *n) && imess != 0);
+        /* locate the error in the current statement */
+        if (trace) 
+        {
+            C2F(errloc)(n);
+        }
+        else
+        {
+            /* get the number of the line where the error occurs */
+            int nlc = 0;
+            int l1 = 0;
+            int ifin = 0;
+            C2F(whatln)(C2F(iop).lpt,C2F(iop).lpt+1,C2F(iop).lpt+5,&nlc,&l1,&ifin);
+            C2F(iop).lct[7] = C2F(iop).lct[7]-nlc;
+            /* disable error display */
+            C2F(iop).lct[0] = -1;
+        }
 
-               if (mode == ERROR_FROM_FORTRAN)
-               {
-                       /* output and store error message */
-                       C2F(errmsg)(n, &errtyp);
-               }
-               else /* ERROR_FROM_C */
-               {
-                       int len = (int) strlen(buffer);
+        if (mode == ERROR_FROM_FORTRAN)
+        {
+            /* output and store error message */
+            C2F(errmsg)(n, &errtyp);
+        }
+        else /* ERROR_FROM_C */
+        {
+            int len = (int) strlen(buffer);
 
-                       /* free message table */
-                       C2F(freemsgtable)();
+            /* free message table */
+            C2F(freemsgtable)();
 
-                       /* store error number */
-                       C2F(errstore)(n);
+            /* store error number */
+            setLastErrorValue(*n);
 
-                       /* store message */
-                       C2F(msgstore)(buffer,&len);
+            /* store message */
+            C2F(msgstore)(buffer,&len);
 
-                       /* display error */
-                       if (C2F(iop).lct[0] != -1) sciprint(buffer);
-               }
-               C2F(iop).lct[0] = 0;
-       }
-       C2F(errcontext)(); 
-       /* handle the error */
-       C2F(errmgr)(n, &errtyp);
+            /* display error */
+            if (C2F(iop).lct[0] != -1) sciprint(buffer);
+        }
+        C2F(iop).lct[0] = 0;
+    }
+    C2F(errcontext)(); 
+    /* handle the error */
+    C2F(errmgr)(n, &errtyp);
 
-       /* re-activate output control */
-       C2F(iop).lct[0] = lct1;
+    /* re-activate output control */
+    C2F(iop).lct[0] = lct1;
 
-       return 0;
+    return 0;
 }
 /*--------------------------------------------------------------------------*/ 
diff --git a/scilab/modules/output_stream/src/c/lasterror.c b/scilab/modules/output_stream/src/c/lasterror.c
new file mode 100644 (file)
index 0000000..c20c1f4
--- /dev/null
@@ -0,0 +1,197 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) DIGITEO - 2010 - Allan CORNET
+ * 
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at    
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+/*--------------------------------------------------------------------------*/ 
+#include <string.h>
+#include <stdlib.h>
+#include "MALLOC.h"
+#include "lasterror.h"
+#include "stack-def.h"
+#include "freeArrayOfString.h"
+#ifdef _MSC_VER
+#include "strdup_windows.h"
+#endif
+#include "strsubst.h"
+/*--------------------------------------------------------------------------*/
+/* max numbers of lines in "error" buffer for compatibility */
+#define MAX_ERROR_MESSAGE_NB_LINES  20
+#define NO_ERROR_VALUE 0
+#define NO_ERROR_MESSAGE ""
+#define NO_ERROR_MESSAGE_NB_LINES 0
+#define NO_ERROR_LINEPOSITION 0
+#define NO_ERROR_FUNCTIONNAME ""
+#define CR "\n"
+#define LF "\r"
+#define EMPTY_STRING ""
+/*--------------------------------------------------------------------------*/
+static int iLastErrorValue = NO_ERROR_VALUE;
+static char **strLastErrorMessage = NULL;
+static int iLastErrorMessageNbLines = NO_ERROR_MESSAGE_NB_LINES;
+static int iLastErrorLinePostion = NO_ERROR_LINEPOSITION;
+static char strLastErrorFunctionName[nlgh + 1] = NO_ERROR_FUNCTIONNAME;
+/*--------------------------------------------------------------------------*/
+static void allocLastErrorMessage(void)
+{
+    strLastErrorMessage = (char **)MALLOC(sizeof(char*) * MAX_ERROR_MESSAGE_NB_LINES);
+    iLastErrorMessageNbLines = NO_ERROR_MESSAGE_NB_LINES;
+}
+/*--------------------------------------------------------------------------*/
+static void freeLastErrorMessage(void)
+{
+    if (strLastErrorMessage)
+    {
+        freeArrayOfString(strLastErrorMessage, iLastErrorMessageNbLines);
+    }
+    iLastErrorMessageNbLines = NO_ERROR_MESSAGE_NB_LINES;
+}
+/*--------------------------------------------------------------------------*/ 
+int setLastError(int iErr, char** strErrorMessage, int iNbLines, int iLinePos, char *strFunctionName)
+{
+    setLastErrorValue(iErr);
+
+    if (iNbLines == 0)
+    {
+        setLastErrorMessage(NULL, iNbLines);
+    }
+    else
+    {
+        setLastErrorMessage(strErrorMessage, iNbLines);
+    }
+
+    setLastErrorLinePosition(iLinePos);
+    setLastErrorFunctionName(strFunctionName);
+    return 0;
+}
+/*--------------------------------------------------------------------------*/ 
+int clearLastError(void)
+{
+    return setLastError(NO_ERROR_VALUE, 
+        NULL, 
+        NO_ERROR_MESSAGE_NB_LINES, 
+        NO_ERROR_LINEPOSITION, 
+        NO_ERROR_FUNCTIONNAME);
+}
+/*--------------------------------------------------------------------------*/ 
+int setLastErrorMessage(char** strErrorMessage, int iNbLines)
+{
+    int i = 0;
+    if (strLastErrorMessage)
+    {
+        freeArrayOfString(strLastErrorMessage, iLastErrorMessageNbLines);
+    }
+    allocLastErrorMessage();
+
+    for (i = 0; i < iNbLines; i++)
+    {
+        appendStringToLastErrorMessage(strErrorMessage[i]);
+    }
+    return 0;
+}
+/*--------------------------------------------------------------------------*/ 
+const char** getLastErrorMessage(int *iNbLines)
+{
+    if (iLastErrorMessageNbLines > 0)
+    {
+        *iNbLines = iLastErrorMessageNbLines;
+        return strLastErrorMessage;
+    }
+    else
+    {
+        *iNbLines = 0;
+        return NULL;
+    }
+}
+/*--------------------------------------------------------------------------*/ 
+int appendStringToLastErrorMessage(char *strErrorMessage)
+{
+    if (iLastErrorMessageNbLines >= MAX_ERROR_MESSAGE_NB_LINES)
+    {
+        return 1;
+    }
+    else
+    {
+        if (strLastErrorMessage)
+        {
+            if (strErrorMessage == NULL)
+            {
+                strLastErrorMessage[iLastErrorMessageNbLines] = strdup(NO_ERROR_MESSAGE);
+            }
+            else
+            {
+                char *withoutCR = strsub(strErrorMessage, CR, EMPTY_STRING);
+                strLastErrorMessage[iLastErrorMessageNbLines] = strsub(withoutCR, LF, EMPTY_STRING);
+                if (withoutCR)
+                {
+                    FREE(withoutCR);
+                    withoutCR = NULL;
+                }
+            }
+            iLastErrorMessageNbLines++;
+        }
+        else
+        {
+            return 1;
+        }
+    }
+    return 0;
+}
+/*--------------------------------------------------------------------------*/ 
+int setLastErrorValue(int iVal)
+{
+    int iPrevValue = iLastErrorValue;
+    iLastErrorValue = iVal;
+    return iPrevValue;
+}
+/*--------------------------------------------------------------------------*/ 
+int getLastErrorValue(void)
+{
+    return iLastErrorValue;
+}
+/*--------------------------------------------------------------------------*/ 
+int setLastErrorLinePosition(int iLinePosition)
+{
+    int iPrevLinePosition = iLastErrorLinePostion;
+    iLastErrorLinePostion = iLinePosition;
+    return iPrevLinePosition;
+}
+/*--------------------------------------------------------------------------*/ 
+int getLastErrorLinePosition(void)
+{
+    return iLastErrorLinePostion;
+}
+/*--------------------------------------------------------------------------*/ 
+int setLastErrorFunctionName(char *strFunctionName)
+{
+    if (strFunctionName)
+    {
+        if (strlen(strFunctionName) > nlgh)
+        {
+            strncpy(strLastErrorFunctionName, strFunctionName, nlgh);
+            strLastErrorFunctionName[nlgh] = 0;
+        }
+        else
+        {
+            strcpy(strLastErrorFunctionName, strFunctionName);
+        }
+    }
+    else
+    {
+        strcpy(strLastErrorFunctionName, NO_ERROR_FUNCTIONNAME);
+    }
+    return 0;
+}
+/*--------------------------------------------------------------------------*/ 
+const char *getLastErrorFunctionName(void)
+{
+    return strLastErrorFunctionName;
+}
+/*--------------------------------------------------------------------------*/ 
index bd1e001..f25f942 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) INRIA
+ * Copyright (C) DIGITEO - 2010 - Allan CORNET
  * 
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
  *
  */
 #include <string.h>
+#include <stdlib.h>
 #include "MALLOC.h"
 #include "stack-c.h"
 #include "msgstore.h"
-#include "freeArrayOfString.h"
-/*--------------------------------------------------------------------------*/
-#define MEM_LACK 3
-#define MAX_LINES 2
-/*--------------------------------------------------------------------------*/
-static char *msg_buff[MAX_MSG_LINES];
-static char funname[nlgh+1];    /* Francois VOGEL August 2004 - Replaced 24 by 25 (nlgh+1) (bug 803)*/
-static int where = 0;
-static int err_n = 0;
-static int msg_line_counter=0;
-/*--------------------------------------------------------------------------*/
-int C2F(errstore)(int *n)
-{
-  err_n = *n;
-  return 0;
-}
+#include "lasterror.h"
+#ifdef _MSC_VER
+#include "strdup_windows.h"
+#endif
 /*--------------------------------------------------------------------------*/
 int C2F(linestore)(int *n)
 {
-  where = *n;
-  return 0;
+    setLastErrorLinePosition(*n);
+    return 0;
 }
 /*--------------------------------------------------------------------------*/
-int C2F(funnamestore)(char *str,int *n,int lenstr)
+int C2F(funnamestore)(char *str, int *n, int lenstr)
 {
-  memset(funname,'\0',nlgh+1);    /* Francois VOGEL August 2004 (bug 803)*/
-  strncpy(funname, str, (size_t)*n);
-  return 0;
-}
-/*--------------------------------------------------------------------------*/
-int C2F(msgstore)(char *str,int *n)
-{
-  char *line, c;
-  int i,count=0;
-  if (msg_line_counter >= MAX_MSG_LINES)
-  {
-    return(MAX_LINES);
-  }
-  if ( (line = (char *) MALLOC((*n + 1)*sizeof(char))) == (char *)0) 
-  {
-    return(MEM_LACK);
-  }
-  /* do not store\n" */ 
-  for ( i= 0 ; i < *n ; i++ ) 
-  {
-    if ( (c=str[i]) != '\n' && c != '\r')
+    char *functionName = strdup(str);
+    if ( (functionName) && (*n >= 0) )
     {
-      line[count++]=c;
+        functionName[*n] = 0;
+        setLastErrorFunctionName(functionName);
     }
-  }
-  line[count]='\0';
-  msg_buff[msg_line_counter++]=line;
-  return 0;
-}
-/*--------------------------------------------------------------------------*/
-void C2F(freemsgtable)()
-{
-  int k;
-  for (k=0 ; k< msg_line_counter ; k++)
-  {
-    FREE(msg_buff[k]);
-  }
-  msg_line_counter=0;
-  err_n = 0;
-}
-/*--------------------------------------------------------------------------*/
-int C2F(lasterror)(char *fname, unsigned long fname_len)
-{
-  int k, one=1, l1, zero=0, m1, n1, clear, lr;
-  int sz[MAX_MSG_LINES];
 
-  Rhs = Max(0, Rhs);
-  CheckRhs(0,1);
-  CheckLhs(1,4);
-  if (msg_line_counter == 0)
-  {
-    CreateVar(1,MATRIX_OF_DOUBLE_DATATYPE,&zero,&zero,&l1);
-    LhsVar(1)=1;
-    if (Lhs >= 2) 
-    {
-      CreateVar(2,MATRIX_OF_DOUBLE_DATATYPE,&one,&one,&l1);
-      *stk(l1) = (double)0.0;
-      LhsVar(2)=2;
-    }
-    /* Francois VOGEL August 2004 - Added initialization of missing lhs vars in case
-       there is no current 'last error' (bug 955)*/
-    if (Lhs >= 3)
-    {
-      CreateVar(3,MATRIX_OF_DOUBLE_DATATYPE,&one,&one,&l1);
-      *stk(l1) = (double)0.0;
-      LhsVar(3)=3;
-    }
-    if (Lhs >= 4)
+    if (functionName)
     {
-      l1=0;
-      CreateVar(4,STRING_DATATYPE, &one,&l1 , &lr);
-      strcpy(cstk(lr),"");
-      LhsVar(4)=4;
+        FREE(functionName);
+        functionName = NULL;
     }
-  }
-  else
-  {
-    clear = 1;
-    if (Rhs==1)
-    {
-      GetRhsVar(1,MATRIX_OF_BOOLEAN_DATATYPE,&m1,&n1,&l1);
-      clear = *istk(l1);
-    }
-    for (k=0;k<msg_line_counter ; k++)
-    {
-      sz[k]=(int)strlen(msg_buff[k])-1;
-    }
-    CreateVarFromPtr(one,MATRIX_OF_STRING_DATATYPE, &msg_line_counter, &one,(void *) msg_buff);
-    LhsVar(1) = 1;
-    if (Lhs >= 2)
-    {
-      CreateVar(2,MATRIX_OF_DOUBLE_DATATYPE,&one,&one,&l1);
-      *stk(l1) = (double)err_n;
-      LhsVar(2)=2;
-    }
-    if (Lhs >= 3)
+
+    return 0;
+}
+/*--------------------------------------------------------------------------*/
+int C2F(msgstore)(char *str, int *n)
+{
+    int iRes = 0;
+    char *msg = strdup(str);
+    if (msg)
     {
-      CreateVar(3,MATRIX_OF_DOUBLE_DATATYPE,&one,&one,&l1);
-      *stk(l1) = (double)where;
-      LhsVar(3)=3;
+        msg[*n] = 0;
     }
-    if (Lhs >= 4)
+    iRes = appendStringToLastErrorMessage(msg);
+
+    if (msg)
     {
-      l1=(int)strlen(funname);
-      CreateVar(4,STRING_DATATYPE, &one,&l1 , &lr);
-      strcpy(cstk(lr),funname);
-      LhsVar(4)=4;
-    }
-    if (clear) {
-      where=0;
-      funname[0]='\0';
-      C2F(freemsgtable)();
+        FREE(msg);
+        msg = NULL;
     }
-  }
-  C2F(putlhsvar)();
-  return(0);
+
+    return iRes;
+}
+/*--------------------------------------------------------------------------*/
+void C2F(freemsgtable)()
+{
+    clearLastError();
 }
 /*--------------------------------------------------------------------------*/
 int GetLastErrorCode(void)
 {
-  return err_n;
+    return getLastErrorValue();
 }
 /*--------------------------------------------------------------------------*/
+
index ca3e3a3..10193b2 100644 (file)
@@ -1,7 +1,7 @@
-
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) INRIA - AS
+ * Copyright (C) DIGITEO - 2010 - Allan CORNET
  * 
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
 #include "machine.h"
 #include "dynlib_output_stream.h"
 
-/* max numbers of lines in "error" buffer */
-#define MAX_MSG_LINES  20
-
-/**
- * TODO : comment
- * @param n
- */
-OUTPUT_STREAM_IMPEXP int C2F(errstore)(int *n);
-
+/* all these functions are obsolete */
+/* only used from fortran */
+/* see lasterror.h */
 
 /**
- * TODO : comment
- * @param n
- */
+* TODO : comment
+* @param n
+*/
 OUTPUT_STREAM_IMPEXP int C2F(linestore)(int *n);
 
 /**
- * TODO : comment
- * @param str
- * @param n
- * @param length str (required by fortran)
- */
+* TODO : comment
+* @param str
+* @param n
+* @param length str (required by fortran)
+*/
 OUTPUT_STREAM_IMPEXP int C2F(funnamestore)(char *str,int *n,int lenstr);
 
 /**
- * TODO : comment
- * @param str
- * @param n
- */
+* TODO : comment
+* @param str
+* @param n
+*/
 OUTPUT_STREAM_IMPEXP int C2F(msgstore)(char *str,int *n);
 
 /**
- * TODO : comment
- */
+* TODO : comment
+*/
 OUTPUT_STREAM_IMPEXP void C2F(freemsgtable)(void);
 
-
 /**
- * TODO : comment
- * @param fname
- * @param fname_len
- */
-OUTPUT_STREAM_IMPEXP int C2F(lasterror)(char *fname, unsigned long fname_len);
-
-
-/**
- * TODO : comment
- */
+* TODO : comment
+*/
 OUTPUT_STREAM_IMPEXP int GetLastErrorCode(void);
 
 #endif /* __MSGSTORE_H__ */
index fc803fd..a599245 100644 (file)
                                >
                        </File>
                        <File
+                               RelativePath=".\lasterror.c"
+                               >
+                       </File>
+                       <File
                                RelativePath=".\msgout.c"
                                >
                        </File>
                                >
                        </File>
                        <File
+                               RelativePath="..\..\includes\lasterror.h"
+                               >
+                       </File>
+                       <File
                                RelativePath=".\msgout.h"
                                >
                        </File>