utf: ast 2
[scilab.git] / scilab / modules / ast / src / cpp / parse / printerror.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2007-2008 - INRIA - Bruno JOFRET
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 #include <fstream>
14 #include <string>
15 #include "parser_private.hxx"
16 #include "configvariable.hxx"
17
18 extern "C"
19 {
20 #include "charEncoding.h"
21 }
22
23 void ParserSingleInstance::PrintError(const std::string& msg)
24 {
25     std::ostringstream ostr;
26     char *codeLine = (char *) malloc(4096 * sizeof(char));
27
28     //If the error is a the very beginning of a line
29     if (yylloc.first_line == yylloc.last_line
30             && yylloc.first_column == 1
31             && yylloc.last_column == 1)
32     {
33         --yylloc.first_line;
34     }
35
36     // fill call stack
37     ConfigVariable::fillWhereError(yylloc.first_line);
38
39     /** Print where in the script the error is located */
40     char* str = ParserSingleInstance::getCodeLine(yylloc.first_line, &codeLine);
41     ostr << str;
42     // add EOL only if the code line doesn't already contains it.
43     if (strcmp(str + strlen(str) - 1, "\n") != 0)
44     {
45         ostr << std::endl;
46     }
47     free(codeLine);
48
49     /** Underline what causes the trouble */
50     int i = 0;
51     for (i = 1 ; i < yylloc.first_column ; ++i)
52     {
53         ostr << " ";
54     }
55     ostr << "^";
56     for (i = i + 1 ; i < yylloc.last_column ; ++i)
57     {
58         ostr << "~";
59     }
60     if ( yylloc.first_column != yylloc.last_column )
61     {
62         ostr << "^" ;
63     }
64     ostr << std::endl;
65
66     /** Display Parser message  */
67     ostr << _("Error: ") << msg << std::endl;
68
69     ParserSingleInstance::appendErrorMessage(ostr.str());
70 }