Remove memory leaks
[scilab.git] / scilab / modules / output_stream / src / c / error_internal.c
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) INRIA - Allan CORNET
4 * Copyright (C) DIGITEO - 2010-2011 - Allan CORNET
5
6 * This file must be used under the terms of the CeCILL.
7 * This source file is licensed as described in the file COPYING, which
8 * you should have received as part of this distribution.  The terms
9 * are also available at    
10 * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11 *
12 */
13
14 #include <string.h>
15 #include "error_internal.h"
16 #include "sciprint.h"
17 #include "msgstore.h"
18 #include "BOOL.h"
19 #include "stack-def.h"
20 #include "errmds.h"
21 #include "lasterror.h"
22 #include "MALLOC.h"
23 #include "strsubst.h"
24 /*--------------------------------------------------------------------------*/
25 extern int C2F(errloc) (int *n);    /* fortran */
26 extern int C2F(errmgr) ();      /* fortran */
27 extern int C2F(errcontext) ();  /* fortran */
28 extern int C2F(whatln) (int *lpt1, int *lpt2, int *lpt6, int *nct, int *idebut, int *ifin); /* fortran */
29
30 /*--------------------------------------------------------------------------*/
31 int error_internal(int *n, char *buffer)
32 {
33     int len = 0;
34     int num = 0;
35     int lct1 = 0;
36     int imode = 0;
37     int imess = 0;
38     int errtyp = 0;
39
40     /* extract error modes out of errct variable */
41     C2F(errmds) (&num, &imess, &imode);
42
43     /* de-activate output control */
44     lct1 = C2F(iop).lct[0];
45     C2F(iop).lct[0] = 0;
46
47     /* errors are recoverable */
48     errtyp = 0;
49
50     if (C2F(errgst).err1 == 0)
51     {
52         BOOL trace = !((num < 0 || num == *n) && imess != 0);
53
54         /* locate the error in the current statement */
55         if (trace)
56         {
57             C2F(errloc) (n);
58         }
59         else
60         {
61             /* get the number of the line where the error occurs */
62             int nlc = 0;
63             int l1 = 0;
64             int ifin = 0;
65
66             C2F(whatln) (C2F(iop).lpt, C2F(iop).lpt + 1, C2F(iop).lpt + 5, &nlc, &l1, &ifin);
67             C2F(iop).lct[7] = C2F(iop).lct[7] - nlc;
68             /* disable error display */
69             C2F(iop).lct[0] = -1;
70         }
71
72         len = (int)strlen(buffer);
73
74         /* free message table */
75         clearInternalLastError();
76
77         /* store error number */
78         setInternalLastErrorValue(*n);
79
80         /* store message */
81
82         C2F(msgstore) (buffer, &len);
83
84         /* display error */
85         if (C2F(iop).lct[0] != -1)
86         {
87             char *msgTmp = strsub(buffer, "%%", "%");
88
89             if (msgTmp)
90             {
91                 sciprint("%s", msgTmp);
92                 FREE(msgTmp);
93                 msgTmp = NULL;
94             }
95         }
96
97         C2F(iop).lct[0] = 0;
98     }
99     C2F(errcontext) ();
100     /* handle the error */
101     C2F(errmgr) (n, &errtyp);
102
103     /* re-activate output control */
104     C2F(iop).lct[0] = lct1;
105
106     return 0;
107 }
108
109 /*--------------------------------------------------------------------------*/