bbb45aa1a9ee51f5bbcbf1cf9c8cdb34889fdc7e
[scilab.git] / scilab / modules / core / src / cpp / storeCommand.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2010-2010 - DIGITEO - 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 extern "C"
14 {
15 #include "storeCommand.h"
16 #include "Thread_Wrapper.h"
17 }
18
19 #include "parser.hxx"
20 #include "execvisitor.hxx"
21 #include "tasks.hxx"
22 #include "scilabWrite.hxx"
23 #include "scilabexception.hxx"
24 #include "localization.hxx"
25
26 using namespace ast;
27 /*--------------------------------------------------------------------------*/
28 /*
29  *  Command queue functions
30  *  This function is used to store Scilab command in a queue
31  *
32  *  PUBLIC : int StoreCommand( char *command)
33  *           int C2F(ismenu)()
34  *           int C2F(getmen)(char * btn_cmd,int * lb, int * entry)
35  */
36 /*--------------------------------------------------------------------------*/
37 #define IMPORT_SIGNAL extern
38 /*--------------------------------------------------------------------------*/
39 typedef struct commandRec
40 {
41     char              *command;         /* command info one string two integers */
42     int               flag; /* 1 if the command execution cannot be interrupted */
43     struct commandRec *next;
44 } CommandRec;
45 /*--------------------------------------------------------------------------*/
46 /* Extern Signal to say we git a StoreCommand. */
47 IMPORT_SIGNAL __threadSignal LaunchScilab;
48 /*--------------------------------------------------------------------------*/
49 static CommandRec *commandQueue = NULL;
50 static __threadLock commandQueueSingleAccess = __StaticInitLock;
51 /*--------------------------------------------------------------------------*/
52 int StoreCommand (wchar_t *command)
53 {
54     return StoreCommandWithFlag (command, 0);
55 }
56 /*--------------------------------------------------------------------------*/
57 /*
58  * try to execute a command or add it to the end of command queue
59  * flag = 0 : the command is not shown in scilab window
60  * flag = 1 : the command is shown in scilab window (if at prompt) and executed sequentially
61  */
62 int StoreCommandWithFlag (wchar_t *command, int flag)
63 {
64     Parser parser;
65     try
66     {
67         parser.parse(command);
68         if (parser.getExitStatus() == Parser::Succeded)
69         {
70             ast::ExecVisitor exec;
71             parser.getTree()->accept(exec);
72         }
73         else
74         {
75             throw ast::ScilabException(parser.getErrorMessage());
76         }
77     }
78     catch (const ast::ScilabException& se)
79     {
80         scilabErrorW(L"\n");
81         scilabErrorW(L"\n");
82         scilabErrorW(command);
83         scilabErrorW(L"\n");
84         scilabErrorW(se.GetErrorMessage().c_str());
85         scilabErrorW(L"\n");
86         scilabErrorW(_W("while executing a callback").c_str());
87     }
88
89     delete parser.getTree();
90     return 0;
91 }
92 /*--------------------------------------------------------------------------*/
93 /*
94  * try to execute a command or add it to the _BEGINNING_ of command queue
95  * flag = 0 : the command is not shown in scilab window
96  * flag = 1 : the command is shown in scilab window (if at prompt) and executed sequentially
97  */
98 int StorePrioritaryCommandWithFlag (wchar_t *command, int flag)
99 {
100     Parser parser;
101
102     try
103     {
104         parser.parse(command);
105         if (parser.getExitStatus() == Parser::Succeded)
106         {
107             ast::ExecVisitor exec;
108             parser.getTree()->accept(exec);
109         }
110         else
111         {
112             throw ast::ScilabException(parser.getErrorMessage());
113         }
114     }
115     catch (const ast::ScilabException& se)
116     {
117         scilabErrorW(L"\n");
118         scilabErrorW(L"\n");
119         scilabErrorW(command);
120         scilabErrorW(L"\n");
121         scilabErrorW(se.GetErrorMessage().c_str());
122         scilabErrorW(L"\n");
123         scilabErrorW(_W("while executing a callback").c_str());
124     }
125
126     delete parser.getTree();
127     return (0);
128 }
129 /*--------------------------------------------------------------------------*/
130 int isEmptyCommandQueue(void)
131 {
132 #pragma message("WARNING : isEmptyCommandQueue is deprecated. It will be removed _BEFORE_ Scilab 6.0.")
133     // FIXME : Do not forget to remove me.
134     return 0;
135 }
136 /*--------------------------------------------------------------------------*/
137 /*
138  * Gets info on the first queue element
139  * and remove it from the queue
140  */
141 int GetCommand ( char *str)
142 {
143 #pragma message("WARNING : GetCommand is deprecated. It will be removed _BEFORE_ Scilab 6.0.")
144     // FIXME : Do not forget to remove me.
145     return 0;
146 }
147 /*--------------------------------------------------------------------------*/
148 int ismenu(void)
149 {
150 #pragma message("WARNING : ismenu is deprecated. It will be removed _BEFORE_ Scilab 6.0.")
151     // FIXME : Do not forget to remove me.
152     return 0;
153 }
154 /*--------------------------------------------------------------------------*/
155 /* menu/button info for Scilab */
156 int C2F(getmen)(char * btn_cmd, int * lb, int * entry)
157 {
158 #pragma message("WARNING : C2F(getmen) is deprecated. It will be removed _BEFORE_ Scilab 6.0.")
159     // FIXME : Do not forget to remove me.
160     return 0;
161 }
162 /*--------------------------------------------------------------------------*/