Remove memory leaks
[scilab.git] / scilab / modules / output_stream / src / c / lasterror.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) DIGITEO - 2010 - Allan CORNET
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 /*--------------------------------------------------------------------------*/ 
14 #include <string.h>
15 #include <stdlib.h>
16 #include "MALLOC.h"
17 #include "lasterror.h"
18 #include "stack-def.h"
19 #include "freeArrayOfString.h"
20 #ifdef _MSC_VER
21 #include "strdup_windows.h"
22 #endif
23 #include "strsubst.h"
24 /*--------------------------------------------------------------------------*/
25 /* max numbers of lines in "error" buffer for compatibility */
26 #define MAX_ERROR_MESSAGE_NB_LINES  20
27 #define NO_ERROR_VALUE 0
28 #define NO_ERROR_MESSAGE ""
29 #define NO_ERROR_MESSAGE_NB_LINES 0
30 #define NO_ERROR_LINEPOSITION 0
31 #define NO_ERROR_FUNCTIONNAME ""
32 #define CR "\n"
33 #define LF "\r"
34 #define EMPTY_STRING ""
35 /*--------------------------------------------------------------------------*/
36 static int iLastErrorValue = NO_ERROR_VALUE;
37 static char **strLastErrorMessage = NULL;
38 static int iLastErrorMessageNbLines = NO_ERROR_MESSAGE_NB_LINES;
39 static int iLastErrorLinePostion = NO_ERROR_LINEPOSITION;
40 static char strLastErrorFunctionName[nlgh + 1] = NO_ERROR_FUNCTIONNAME;
41 /*--------------------------------------------------------------------------*/
42 static void allocLastErrorMessage(void)
43 {
44     strLastErrorMessage = (char **)MALLOC(sizeof(char*) * MAX_ERROR_MESSAGE_NB_LINES);
45     iLastErrorMessageNbLines = NO_ERROR_MESSAGE_NB_LINES;
46 }
47 /*--------------------------------------------------------------------------*/
48 int setInternalLastError(int iErr, char** strErrorMessage, int iNbLines, int iLinePos, char *strFunctionName)
49 {
50     setInternalLastErrorValue(iErr);
51
52     if (iNbLines == 0)
53     {
54         setInternalLastErrorMessage(NULL, iNbLines);
55     }
56     else
57     {
58         setInternalLastErrorMessage(strErrorMessage, iNbLines);
59     }
60
61     setInternalLastErrorLinePosition(iLinePos);
62     setInternalLastErrorFunctionName(strFunctionName);
63     return 0;
64 }
65 /*--------------------------------------------------------------------------*/ 
66 int clearInternalLastError(void)
67 {
68     return setInternalLastError(NO_ERROR_VALUE, 
69         NULL, 
70         NO_ERROR_MESSAGE_NB_LINES, 
71         NO_ERROR_LINEPOSITION, 
72         NO_ERROR_FUNCTIONNAME);
73 }
74 /*--------------------------------------------------------------------------*/ 
75 int setInternalLastErrorMessage(char** strErrorMessage, int iNbLines)
76 {
77     int i = 0;
78     if (strLastErrorMessage)
79     {
80         freeArrayOfString(strLastErrorMessage, iLastErrorMessageNbLines);
81     }
82     allocLastErrorMessage();
83
84     for (i = 0; i < iNbLines; i++)
85     {
86         appendStringToInternalLastErrorMessage(strErrorMessage[i]);
87     }
88     return 0;
89 }
90 /*--------------------------------------------------------------------------*/ 
91 const char** getInternalLastErrorMessage(int *iNbLines)
92 {
93     if (iLastErrorMessageNbLines > 0)
94     {
95         *iNbLines = iLastErrorMessageNbLines;
96         return (const char **)strLastErrorMessage;
97     }
98     else
99     {
100         *iNbLines = 0;
101         return NULL;
102     }
103 }
104 /*--------------------------------------------------------------------------*/ 
105 int appendStringToInternalLastErrorMessage(char *strErrorMessage)
106 {
107     if (iLastErrorMessageNbLines >= MAX_ERROR_MESSAGE_NB_LINES)
108     {
109         return 1;
110     }
111     else
112     {
113         if (strLastErrorMessage)
114         {
115             if (strErrorMessage == NULL)
116             {
117                 strLastErrorMessage[iLastErrorMessageNbLines] = strdup(NO_ERROR_MESSAGE);
118             }
119             else
120             {
121                 char *withoutCR = strsub(strErrorMessage, CR, EMPTY_STRING);
122                 strLastErrorMessage[iLastErrorMessageNbLines] = strsub(withoutCR, LF, EMPTY_STRING);
123                 if (withoutCR)
124                 {
125                     FREE(withoutCR);
126                     withoutCR = NULL;
127                 }
128             }
129             iLastErrorMessageNbLines++;
130         }
131         else
132         {
133             return 1;
134         }
135     }
136     return 0;
137 }
138 /*--------------------------------------------------------------------------*/ 
139 int setInternalLastErrorValue(int iVal)
140 {
141     int iPrevValue = iLastErrorValue;
142     iLastErrorValue = iVal;
143     return iPrevValue;
144 }
145 /*--------------------------------------------------------------------------*/ 
146 int getInternalLastErrorValue(void)
147 {
148     return iLastErrorValue;
149 }
150 /*--------------------------------------------------------------------------*/ 
151 int setInternalLastErrorLinePosition(int iLinePosition)
152 {
153     int iPrevLinePosition = iLastErrorLinePostion;
154     iLastErrorLinePostion = iLinePosition;
155     return iPrevLinePosition;
156 }
157 /*--------------------------------------------------------------------------*/ 
158 int getInternalLastErrorLinePosition(void)
159 {
160     return iLastErrorLinePostion;
161 }
162 /*--------------------------------------------------------------------------*/ 
163 int setInternalLastErrorFunctionName(char *strFunctionName)
164 {
165     if (strFunctionName)
166     {
167         if (strlen(strFunctionName) > nlgh)
168         {
169             strncpy(strLastErrorFunctionName, strFunctionName, nlgh);
170             strLastErrorFunctionName[nlgh] = 0;
171         }
172         else
173         {
174             strcpy(strLastErrorFunctionName, strFunctionName);
175         }
176     }
177     else
178     {
179         strcpy(strLastErrorFunctionName, NO_ERROR_FUNCTIONNAME);
180     }
181     return 0;
182 }
183 /*--------------------------------------------------------------------------*/ 
184 const char *getInternalLastErrorFunctionName(void)
185 {
186     return strLastErrorFunctionName;
187 }
188 /*--------------------------------------------------------------------------*/