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