[bug_14020] mscanf fixed about empty data.
[scilab.git] / scilab / modules / ast / includes / ast / scilabexception.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2010 - DIGITEO - Antoine ELIAS
4  *
5  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #ifndef AST_SCILABEXCEPTION_HXX
14 #define AST_SCILABEXCEPTION_HXX
15
16 #include <string>
17 #include <stdexcept>
18 #include "location.hxx"
19 #include "localization.hxx"
20 //#include "configvariable.hxx"
21
22 extern "C"
23 {
24 #include "lasterror.h"
25 #include "sci_malloc.h"
26 #include "localization.h"
27 }
28
29 //disable warnings about exports STL items
30 #ifdef _MSC_VER
31 #pragma warning (disable : 4251)
32 #endif
33
34 namespace ast
35 {
36
37 enum ExceptionType
38 {
39     TYPE_ERROR,
40     TYPE_EXCEPTION
41 };
42
43 class ScilabException : public std::exception
44 {
45 public :
46     ScilabException() {}
47
48     ScilabException(const std::wstring& _wstErrorMesssage)
49     {
50         m_type = TYPE_EXCEPTION;
51         createScilabException(_wstErrorMesssage, 999, Location());
52     }
53
54     ScilabException(const std::string& _stErrorMesssage)
55     {
56         m_type = TYPE_EXCEPTION;
57         wchar_t* pwst = to_wide_string(_stErrorMesssage.c_str());
58         createScilabException(pwst, 999, Location());
59         FREE(pwst);
60     }
61
62     ScilabException(const std::wstring& _wstErrorMesssage, int _iErrorNumber, const Location& _ErrorLocation)
63     {
64         m_type = TYPE_EXCEPTION;
65         createScilabException(_wstErrorMesssage, _iErrorNumber, _ErrorLocation);
66     }
67
68     virtual ~ScilabException() throw() {};
69
70     void SetErrorMessage(const std::wstring& _wstErrorMesssage)
71     {
72         m_wstErrorMessage = _wstErrorMesssage;
73     }
74
75     std::wstring GetErrorMessage(void) const
76     {
77         return m_wstErrorMessage;
78     }
79
80     void SetErrorNumber(int _iErrorNumber)
81     {
82         m_iErrorNumber = _iErrorNumber;
83     }
84
85     int GetErrorNumber(void) const
86     {
87         return m_iErrorNumber;
88     }
89
90     void SetErrorLocation(const Location& _ErrorLocation)
91     {
92         m_ErrorLocation = _ErrorLocation;
93     }
94
95     const Location& GetErrorLocation(void) const
96     {
97         return m_ErrorLocation;
98     }
99
100     void SetErrorType(ExceptionType _type)
101     {
102         m_type = _type;
103     }
104
105     ExceptionType GetErrorType(void)
106     {
107         return m_type;
108     }
109
110 protected :
111     std::wstring m_wstErrorMessage;
112     int m_iErrorNumber;
113     Location m_ErrorLocation;
114     ExceptionType m_type;
115
116 protected :
117     void createScilabException(const std::wstring& _wstErrorMessage, int _iErrorNumber, const Location& _ErrorLocation)
118     {
119         m_wstErrorMessage = _wstErrorMessage;
120         m_iErrorNumber = _iErrorNumber;
121         m_ErrorLocation = _ErrorLocation;
122     }
123 };
124
125 class InternalError : public ScilabException
126 {
127 public :
128     InternalError(std::wstring _wstErrorMesssage) : ScilabException(_wstErrorMesssage)
129     {
130         m_type = TYPE_ERROR;
131         // check on error number because error message can be empty.
132         if (getLastErrorNumber() == 0)
133         {
134             setLastError(999, _wstErrorMesssage.c_str(), 0, NULL);
135         }
136     }
137
138     InternalError(std::string _stErrorMesssage) : ScilabException(_stErrorMesssage)
139     {
140         m_type = TYPE_ERROR;
141         // check on error number because error message can be empty.
142         if (getLastErrorNumber() == 0)
143         {
144             setLastError(999, m_wstErrorMessage.c_str(), 0, NULL);
145         }
146     }
147
148     InternalError(std::wstring _wstErrorMesssage, int _iErrorNumber, const Location& _ErrorLocation) : ScilabException(_wstErrorMesssage, _iErrorNumber, _ErrorLocation)
149     {
150         m_type = TYPE_ERROR;
151         // check on error number because error message can be empty.
152         if (getLastErrorNumber() == 0)
153         {
154             setLastError(_iErrorNumber, _wstErrorMesssage.c_str(), _ErrorLocation.first_line, NULL);
155         }
156     }
157 };
158
159 class InternalAbort : public ScilabException
160 {
161 public :
162     InternalAbort() {}
163 };
164 }
165 #endif // !AST_SCILABEXCEPTION_HXX