* Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
* Copyright (C) 2010 - DIGITEO - Allan CORNET
* Copyright (C) 2012 - Scilab Enterprises - Clement DAVID
+ * Copyright (C) 2015 - Scilab Enterprises - Paul Bignier
*
* This file must be used under the terms of the CeCILL.
* This source file is licensed as described in the file COPYING, which
*/
/*--------------------------------------------------------------------------*/
-#include <iostream>
-
#include "Xcos.hxx"
#include "loadStatus.hxx"
+#include "gw_xcos.hxx"
+
+#include "string.hxx"
+#include "mlist.hxx"
+#include "user.hxx"
+#include "function.hxx"
+#include "overload.hxx"
+
extern "C" {
-#include "gw_xcos.h"
#include "sci_malloc.h"
-#include "freeArrayOfString.h"
-#include "api_scilab.h"
-#include "localization.h"
#include "getFullFilename.h"
-#include "Scierror.h"
#include "getScilabJavaVM.h"
+#include "Scierror.h"
+#include "localization.h"
}
using namespace org_scilab_modules_xcos;
static int callXcos(char* fname, char* file, char* var);
/*--------------------------------------------------------------------------*/
-int sci_Xcos(char *fname, void *pvApiCtx)
-{
- CheckRhs(0, 2);
- CheckLhs(0, 1);
+static char funname[] = "xcos";
- int *piAddressVar = NULL;
- int iType = 0;
- SciErr sciErr;
-
- /*
- * xcos() call
- */
- if (Rhs == 0)
+types::Function::ReturnValue sci_Xcos(types::typed_list &in, int _iRetCount, types::typed_list &/*out*/)
+{
+ if (in.size() > 2)
{
- int ret = callXcos(fname, NULL, NULL);
- LhsVar(1) = 0;
- PutLhsVar();
- return ret;
+ Scierror(77, _("%s: Wrong number of input argument(s): %d to %d expected.\n"), funname, 0, 2);
+ return types::Function::Error;
}
- sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddressVar);
- if (sciErr.iErr)
+ if (_iRetCount > 1)
{
- printError(&sciErr, 0);
- Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
- return 0;
+ Scierror(78, _("%s: Wrong number of output argument(s): %d expected.\n"), funname, 1);
+ return types::Function::Error;
}
- sciErr = getVarType(pvApiCtx, piAddressVar, &iType);
- if (sciErr.iErr)
+ /*
+ * xcos() call
+ */
+ if (in.empty())
{
- printError(&sciErr, 0);
- Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
- return 0;
+ callXcos(funname, nullptr, nullptr);
+ return types::Function::OK;
}
/*
* xcos("file.zcos") or xcos(["file.zcos" "foo.zcos"]) call
*/
- if (Rhs == 1 && iType == sci_strings)
+ if (in.size() == 1 && in[0]->isString())
{
- int i;
- int m = 0, n = 0;
- int* len = NULL;
- char **var = NULL;
-
- sciErr = getMatrixOfString(pvApiCtx, piAddressVar, &m, &n, NULL, NULL);
- if (sciErr.iErr)
- {
- printError(&sciErr, 0);
- Scierror(999, _("%s: Can not read input argument #%d.\n"), fname,
- 1);
- return 0;
- }
-
- len = (int*) MALLOC(sizeof(int) * (m * n));
- if (len == NULL)
- {
- Scierror(999, _("%s: No more memory.\n"), fname);
- return 0;
- }
-
- sciErr = getMatrixOfString(pvApiCtx, piAddressVar, &m, &n, len, NULL);
- if (sciErr.iErr)
- {
- FREE(len);
-
- printError(&sciErr, 0);
- Scierror(999, _("%s: Can not read input argument #%d.\n"), fname,
- 1);
- return 0;
- }
-
- var = (char**) MALLOC(sizeof(char*) * (m * n));
- if (var == NULL)
- {
- FREE(len);
- Scierror(999, _("%s: No more memory.\n"), fname);
- return 0;
- }
+ types::String* arg1 = in[0]->getAs<types::String>();
- for (i = 0; i < m * n; i++)
+ for (int i = 0; i < arg1->getSize(); ++i)
{
- var[i] = (char*) MALLOC(sizeof(char) * (len[i] + 1));
- if (var[i] == NULL)
+ char* c_str = wide_string_to_UTF8(arg1->get(0));
+ char* file = getFullFilename(c_str);
+ FREE(c_str);
+ if (file == nullptr)
{
- FREE(len);
- freeArrayOfString(var, i);
-
- Scierror(999, _("%s: No more memory.\n"), fname);
- return 0;
+ return types::Function::Error;
}
- }
-
- sciErr = getMatrixOfString(pvApiCtx, piAddressVar, &m, &n, len,
- var);
- if (sciErr.iErr)
- {
- FREE(len);
- freeArrayOfString(var, m * n);
-
- printError(&sciErr, 0);
- Scierror(999, _("%s: Can not read input argument #%d.\n"), fname,
- 1);
- return 0;
- }
-
- for (i = m * n - 1; i >= 0; i--)
- {
- char* file = getFullFilename(var[i]);
- if (file == NULL)
+ if (callXcos(funname, file, nullptr))
{
- FREE(len);
- freeArrayOfString(var, m * n);
- return 1;
- }
- if (callXcos(fname, file, NULL))
- {
- FREE(len);
- freeArrayOfString(var, m * n);
- return 1;
+ return types::Function::Error;
}
}
- FREE(len);
- freeArrayOfString(var, m * n);
-
- LhsVar(1) = 0;
- PutLhsVar();
- return 0;
+ return types::Function::OK;
}
/*
* xcos(scs_m) call
*/
- if (Rhs == 1 && iType == sci_mlist)
+ if (in.size() == 1 && (in[0]->isUserType() || in[0]->isMList())) // Kept MList for compatibility with Scilab 5
{
- int lw = 1;
+ if (in[0]->getShortTypeStr() != L"diagram")
+ {
+ Scierror(77, _("%s: Wrong type for input argument #%d: ""%s"" expected.\n"), funname, 1, "diagram");
+ return types::Function::Error;
+ }
- // FIXME
// overloaded by %diagram_xcos.sci
- //C2F(overload)(&lw, fname, fname_len);
+ std::wstring wstFuncName = L"%" + in[0]->getShortTypeStr() + L"_xcos";
+ types::typed_list out;
+ types::Function::ReturnValue ret = Overload::call(wstFuncName, in, _iRetCount, out);
- LhsVar(1) = 0;
- PutLhsVar();
- return 0;
+ return types::Function::OK;
}
/*
* xcos(scs_m, "scs_m") call (usually from the overload macro)
*/
- if (Rhs == 2 && iType == sci_mlist)
+ if (in.size() == 2 && in[0]->isMList()) // For compatibility with Scilab 5
{
- char* variable = NULL;
+ if (in[1]->isString() == false)
+ {
+ Scierror(999, _("%s: Wrong type for input argument #%d : A string expected.\n"), funname, 2);
+ return types::Function::Error;
+ }
- sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddressVar);
- if (sciErr.iErr)
+ types::String* arg2 = in[1]->getAs<types::String>();
+ if (arg2->isScalar() == false)
{
- printError(&sciErr, 0);
- Scierror(999, _("%s: Can not read input argument #%d.\n"), fname,
- 2);
- return 0;
+ Scierror(999, _("%s: Wrong size for input argument #%d : A single string expected.\n"), funname, 2);
+ return types::Function::Error;
}
- if (getAllocatedSingleString(pvApiCtx, piAddressVar, &variable))
+ char* c_str = wide_string_to_UTF8(arg2->get(0));
+ int ret = callXcos(funname, nullptr, c_str);
+ FREE(c_str);
+ if (ret == 1)
{
- Scierror(999, _("%s: No more memory.\n"), fname);
- return 0;
+ return types::Function::Error;
+ }
+ else
+ {
+ return types::Function::OK;
+ }
+ }
+ if (in.size() == 2 && in[0]->isUserType())
+ {
+ if (in[1]->isString() == false)
+ {
+ Scierror(999, _("%s: Wrong type for input argument #%d : A string expected.\n"), funname, 2);
+ return types::Function::Error;
+ }
+
+ types::String* arg2 = in[1]->getAs<types::String>();
+ if (arg2->isScalar() == false)
+ {
+ Scierror(999, _("%s: Wrong size for input argument #%d : A single string expected.\n"), funname, 2);
+ return types::Function::Error;
}
- LhsVar(1) = 0;
- PutLhsVar();
- return callXcos(fname, NULL, variable);
+ char* c_str = wide_string_to_UTF8(arg2->get(0));
+ int ret = callXcos(funname, nullptr, c_str);
+ FREE(c_str);
+ if (ret == 1)
+ {
+ return types::Function::Error;
+ }
+ else
+ {
+ return types::Function::OK;
+ }
}
/*
- * if not returned yet, disp the error message.
+ * If not returned yet, display the error message.
*/
- Scierror(999,
- _("%s: Wrong type for input argument #%d: A string expected.\n"),
- fname, 1);
- return 0;
+ Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), funname, 1);
+ return types::Function::Error;
}
/*--------------------------------------------------------------------------*/
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<ClCompile>
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
<Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>.;../cpp;../jni;../../includes;$(SCILAB_JDK32)/include;$(SCILAB_JDK32)/include/win32;../../../../libs/intl;../../../api_scilab/includes;../../../core/includes;../../../localization/includes;../../../jvm/includes;../../../fileio/includes;../../../output_stream/includes;../../../commons/src/jni;../../../ast/includes/types;../../../ast/includes/ast;../../../ast/includes/analysis;../../../ast/includes/exps;../../../ast/includes/operations;../../../ast/includes/symbol;../../../ast/includes/system_env;../../../scicos/includes;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>.;../cpp;../jni;../../includes;$(SCILAB_JDK32)/include;$(SCILAB_JDK32)/include/win32;../../../../libs/intl;../../../api_scilab/includes;../../../core/includes;../../../localization/includes;../../../jvm/includes;../../../fileio/includes;../../../output_stream/includes;../../../commons/src/jni;../../../ast/includes/types;../../../ast/includes/ast;../../../ast/includes/analysis;../../../ast/includes/exps;../../../ast/includes/operations;../../../ast/includes/symbol;../../../ast/includes/system_env;../../../scicos/includes;../../../dynamic_link/includes;../../../string/includes;../../../threads/includes;../../../console/includes;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_DEPRECATE;FORDLL;_DEBUG;_WINDOWS;_USRDLL;XCOS_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
</Midl>
<ClCompile>
<Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>.;../cpp;../jni;../../includes;$(SCILAB_JDK64)/include;$(SCILAB_JDK64)/include/win32;../../../../libs/intl;../../../api_scilab/includes;../../../core/includes;../../../localization/includes;../../../jvm/includes;../../../fileio/includes;../../../output_stream/includes;../../../commons/src/jni;../../../ast/includes/types;../../../ast/includes/ast;../../../ast/includes/analysis;../../../ast/includes/exps;../../../ast/includes/operations;../../../ast/includes/symbol;../../../ast/includes/system_env;../../../scicos/includes;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>.;../cpp;../jni;../../includes;$(SCILAB_JDK64)/include;$(SCILAB_JDK64)/include/win32;../../../../libs/intl;../../../api_scilab/includes;../../../core/includes;../../../localization/includes;../../../jvm/includes;../../../fileio/includes;../../../output_stream/includes;../../../commons/src/jni;../../../ast/includes/types;../../../ast/includes/ast;../../../ast/includes/analysis;../../../ast/includes/exps;../../../ast/includes/operations;../../../ast/includes/symbol;../../../ast/includes/system_env;../../../scicos/includes;../../../dynamic_link/includes;../../../string/includes;../../../threads/includes;../../../console/includes;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_DEPRECATE;FORDLL;_DEBUG;_WINDOWS;_USRDLL;XCOS_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<WholeProgramOptimization>false</WholeProgramOptimization>
- <AdditionalIncludeDirectories>.;../cpp;../jni;../../includes;$(SCILAB_JDK32)/include;$(SCILAB_JDK32)/include/win32;../../../../libs/intl;../../../api_scilab/includes;../../../core/includes;../../../localization/includes;../../../jvm/includes;../../../fileio/includes;../../../output_stream/includes;../../../commons/src/jni;../../../ast/includes/types;../../../ast/includes/ast;../../../ast/includes/analysis;../../../ast/includes/exps;../../../ast/includes/operations;../../../ast/includes/symbol;../../../ast/includes/system_env;../../../scicos/includes;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>.;../cpp;../jni;../../includes;$(SCILAB_JDK32)/include;$(SCILAB_JDK32)/include/win32;../../../../libs/intl;../../../api_scilab/includes;../../../core/includes;../../../localization/includes;../../../jvm/includes;../../../fileio/includes;../../../output_stream/includes;../../../commons/src/jni;../../../ast/includes/types;../../../ast/includes/ast;../../../ast/includes/analysis;../../../ast/includes/exps;../../../ast/includes/operations;../../../ast/includes/symbol;../../../ast/includes/system_env;../../../scicos/includes;../../../dynamic_link/includes;../../../string/includes;../../../threads/includes;../../../console/includes;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_DEPRECATE;FORDLL;NDEBUG;_WINDOWS;_USRDLL;XCOS_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<WholeProgramOptimization>false</WholeProgramOptimization>
- <AdditionalIncludeDirectories>.;../cpp;../jni;../../includes;$(SCILAB_JDK64)/include;$(SCILAB_JDK64)/include/win32;../../../../libs/intl;../../../api_scilab/includes;../../../core/includes;../../../localization/includes;../../../jvm/includes;../../../fileio/includes;../../../output_stream/includes;../../../commons/src/jni;../../../ast/includes/types;../../../ast/includes/ast;../../../ast/includes/analysis;../../../ast/includes/exps;../../../ast/includes/operations;../../../ast/includes/symbol;../../../ast/includes/system_env;../../../scicos/includes;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>.;../cpp;../jni;../../includes;$(SCILAB_JDK64)/include;$(SCILAB_JDK64)/include/win32;../../../../libs/intl;../../../api_scilab/includes;../../../core/includes;../../../localization/includes;../../../jvm/includes;../../../fileio/includes;../../../output_stream/includes;../../../commons/src/jni;../../../ast/includes/types;../../../ast/includes/ast;../../../ast/includes/analysis;../../../ast/includes/exps;../../../ast/includes/operations;../../../ast/includes/symbol;../../../ast/includes/system_env;../../../scicos/includes;../../../dynamic_link/includes;../../../string/includes;../../../threads/includes;../../../console/includes;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_DEPRECATE;FORDLL;NDEBUG;_WINDOWS;_USRDLL;XCOS_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<ItemGroup>
<ClInclude Include="..\..\includes\dynlib_xcos.h" />
<ClInclude Include="..\..\includes\gw_xcos.h" />
+ <ClInclude Include="..\..\includes\gw_xcos.hxx" />
<ClInclude Include="..\..\includes\xcosUtilities.hxx" />
<ClInclude Include="..\cpp\loadStatus.hxx" />
<ClInclude Include="..\jni\Modelica.hxx" />