2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2007 - INRIA - Allan CORNET
4 * Copyright (C) 2009-2010 - DIGITEO - Allan CORNET
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
15 #include "call_scilab.h"
18 #include "localization.h"
19 #include "freeArrayOfString.h"
21 #include "strdup_windows.h"
23 #include "api_scilab.h"
24 #include "call_scilab_engine_state.h"
25 /*--------------------------------------------------------------------------*/
26 static BOOL RemoveCharsFromEOL(char *line, char CharToRemove);
27 static BOOL RemoveComments(char *line);
28 static BOOL CleanBuffers(char *bufCommands, char **LOCALJOBS, int numberjobs);
29 static BOOL SetLastJob(char *JOB);
30 static char *lastjob = NULL;
32 /*--------------------------------------------------------------------------*/
33 /* see call_scilab.h more information */
34 /*--------------------------------------------------------------------------*/
35 int SendScilabJob(char *job)
41 #define COMMAND_EXECSTR "Err_Job = execstr(TMP_EXEC_STRING,\"errcatch\",\"n\");quit;"
42 #define COMMAND_CLEAR "clear TMP_EXEC_STRING;clear Err_Job;quit;"
44 if (getCallScilabEngineState() == CALL_SCILAB_ENGINE_STOP)
46 fprintf(stderr, "Error: SendScilabJob call_scilab engine not started.\n");
50 command = strdup(job);
57 /* clear prev. Err , TMP_EXEC_STRING scilab variables */
58 C2F(scirun) (COMMAND_CLEAR, (long int)strlen(COMMAND_CLEAR));
62 /* Creation of a temp variable in Scilab which contains the command */
63 sciErr = createNamedMatrixOfString(pvApiCtx, "TMP_EXEC_STRING", 1, 1, &command);
66 printError(&sciErr, 0);
68 fprintf(stderr, "Error: SendScilabJob (1) call_scilab failed to create the temporary variable 'TMP_EXEC_STRING'.\n");
80 /* Run the command within an execstr */
81 C2F(scirun) (COMMAND_EXECSTR, (long int)strlen(COMMAND_EXECSTR));
82 sciErr = getNamedVarDimension(pvApiCtx, "Err_Job", &m, &n);
85 printError(&sciErr, 0);
86 fprintf(stderr, "Error: SendScilabJob (2) call_scilab failed to detect the temporary variable 'Err_Job' size.\n");
98 if ((m != 1) && (n != 1))
100 fprintf(stderr, "Error: SendScilabJob (3) call_scilab detected a badly formated 'Err_Job' variable. Size [1,1] expected.\n");
112 sciErr = readNamedMatrixOfDouble(pvApiCtx, "Err_Job", &m, &n, &Err_Job);
115 printError(&sciErr, 0);
116 fprintf(stderr, "Error: SendScilabJob (4) call_scilab failed to read the temporary variable 'Err_Job'.\n");
134 retCode = (int)Err_Job;
136 /* clear prev. Err , TMP_EXEC_STRING scilab variables */
137 C2F(scirun) (COMMAND_CLEAR, (long int)strlen(COMMAND_CLEAR));
141 fprintf(stderr, "Error: SendScilabJob (5) call_scilab failed to create the 'command' variable (MALLOC).\n");
148 /*--------------------------------------------------------------------------*/
149 static BOOL SetLastJob(char *JOB)
159 lastjob = strdup(JOB);
168 /*--------------------------------------------------------------------------*/
169 BOOL GetLastJob(char *JOB, int nbcharsJOB)
173 if ((int)strlen(lastjob) < nbcharsJOB)
175 strcpy(JOB, lastjob);
178 strncpy(JOB, lastjob, nbcharsJOB);
184 /*--------------------------------------------------------------------------*/
185 int SendScilabJobs(char **jobs, int numberjobs)
187 #define BUFFERSECURITYSIZE 64
195 char *bufCommands = NULL;
196 char **LOCALJOBS = NULL;
200 LOCALJOBS = (char **)MALLOC(sizeof(char *) * numberjobs);
204 for (i = 0; i < numberjobs; i++)
208 nbcharsjobs = nbcharsjobs + (int)strlen(jobs[i]);
209 LOCALJOBS[i] = (char *)MALLOC(sizeof(char) * (strlen(jobs[i]) + BUFFERSECURITYSIZE));
212 strcpy(LOCALJOBS[i], jobs[i]);
216 CleanBuffers(bufCommands, LOCALJOBS, numberjobs);
217 fprintf(stderr, "Error: SendScilabJobs (1) 'LOCALJOBS[%d] MALLOC'.\n", i);
223 fprintf(stderr, "Error: SendScilabJobs (2) 'jobs[%d] == NULL'.\n", i);
228 bufCommands = (char *)MALLOC(sizeof(char) * (nbcharsjobs + numberjobs + BUFFERSECURITYSIZE));
232 strcpy(bufCommands, "");
234 for (jobsloop = 0; jobsloop < numberjobs; jobsloop++)
238 char *currentline = NULL;
243 AddSemiColon = FALSE;
251 currentline = LOCALJOBS[jobsloop];
253 RemoveCharsFromEOL(currentline, '\n');
254 RemoveComments(currentline);
255 RemoveCharsFromEOL(currentline, ' ');
257 if (RemoveCharsFromEOL(currentline, '.'))
259 RemoveCharsFromEOL(currentline, ' ');
260 strcat(bufCommands, currentline);
262 AddSemiColon = FALSE;
269 strcat(currentline, ";");
273 strcat(bufCommands, ";");
276 strcat(bufCommands, currentline);
281 retcode = SendScilabJob(bufCommands);
282 CleanBuffers(bufCommands, LOCALJOBS, numberjobs);
286 CleanBuffers(bufCommands, LOCALJOBS, numberjobs);
287 fprintf(stderr, "Error: SendScilabJobs (3) 'bufCommands MALLOC'.\n");
293 CleanBuffers(bufCommands, LOCALJOBS, numberjobs);
294 fprintf(stderr, "Error: SendScilabJobs (4) 'LOCALJOBS == NULL'.\n");
300 fprintf(stderr, "Error: SendScilabJobs (5) 'jobs == NULL'.\n");
307 /*--------------------------------------------------------------------------*/
308 static BOOL RemoveCharsFromEOL(char *line, char CharToRemove)
314 len = (int)strlen(line);
315 for (l = (len - 1); l > 0; l--)
317 if (line[l] == CharToRemove)
328 /*--------------------------------------------------------------------------*/
329 static BOOL RemoveComments(char *line)
335 len = (int)strlen(line);
336 for (l = len - 1; l > 0; l--)
342 if (line[l - 1] == '/')
357 /*--------------------------------------------------------------------------*/
358 static BOOL CleanBuffers(char *bufCommands, char **LOCALJOBS, int numberjobs)
365 freeArrayOfString(LOCALJOBS, numberjobs);
369 /*--------------------------------------------------------------------------*/