Scilab: add %feature scilab:const (constants are wrapped by Scilab variables)
This commit is contained in:
parent
fcfb90219e
commit
2cf606c638
10 changed files with 159 additions and 17 deletions
|
|
@ -24,5 +24,17 @@
|
||||||
%constant int iconst = 37;
|
%constant int iconst = 37;
|
||||||
%constant double fconst = 3.14;
|
%constant double fconst = 3.14;
|
||||||
|
|
||||||
|
/* Now constants are wrapped to Scilab variables */
|
||||||
|
%scilabconst(1);
|
||||||
|
|
||||||
|
#define ICONST2 12
|
||||||
|
#define FCONST2 4.60
|
||||||
|
#define CCONST3 'a'
|
||||||
|
#define CCONST4 '\n'
|
||||||
|
#define SCONST3 "Hello World"
|
||||||
|
#define SCONST4 "\"Hello World\""
|
||||||
|
|
||||||
|
%constant int iconst2 = 73;
|
||||||
|
%constant double fconst2 = 6.28;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,17 @@
|
||||||
lines(0);
|
lines(0);
|
||||||
exec loader.sce;
|
exec loader.sce;
|
||||||
|
SWIG_Init();
|
||||||
|
|
||||||
printf("ICONST = %i (should be 42)\n", ICONST_get());
|
printf("\nConstants are wrapped by functions:\n");
|
||||||
printf("FCONST = %f (should be 2.1828)\n", FCONST_get());
|
printf("ICONST_get() = %i (should be 42)\n", ICONST_get());
|
||||||
printf("CCONST = %c (should be ''x'')\n", CCONST_get());
|
printf("FCONST_get() = %5.4f (should be 2.1828)\n", FCONST_get());
|
||||||
printf("CCONST2 = %s (this should be on a new line)\n", CCONST2_get());
|
printf("CCONST_get() = ''%c'' (should be ''x'')\n", CCONST_get());
|
||||||
printf("SCONST = %s (should be ''Hello World'')\n", SCONST_get());
|
printf("CCONST2_get() = %s (this should be on a new line)\n", CCONST2_get());
|
||||||
printf("SCONST2 = %s (should be "'""Hello World"""')\n", SCONST2_get());
|
printf("SCONST_get() = ''%s'' (should be ''Hello World'')\n", SCONST_get());
|
||||||
printf("EXPR = %f (should be 48.5484)\n", EXPR_get());
|
printf("SCONST2_get() = ''%s'' (should be "'""Hello World"""')\n", SCONST2_get());
|
||||||
printf("iconst = %i (should be 37)\n", iconst_get());
|
printf("EXPR_get() = %5.4f (should be 48.5484)\n", EXPR_get());
|
||||||
printf("fconst = %f (should be 3.14)\n", fconst_get());
|
printf("iconst_get() = %i (should be 37)\n", iconst_get());
|
||||||
|
printf("fconst_get() = %3.2f (should be 3.14)\n", fconst_get());
|
||||||
|
|
||||||
try
|
try
|
||||||
printf("EXTERN = %s (Arg! This should not printf(anything)\n", EXTERN_get());
|
printf("EXTERN = %s (Arg! This should not printf(anything)\n", EXTERN_get());
|
||||||
|
|
@ -22,4 +24,14 @@ catch
|
||||||
printf("FOO is not defined (good)\n");
|
printf("FOO is not defined (good)\n");
|
||||||
end
|
end
|
||||||
|
|
||||||
|
printf("\nNow constants are wrapped by Scilab variables (feature scilab:const):\n");
|
||||||
|
printf("ICONST2 = %i (should be 12)\n", ICONST2);
|
||||||
|
printf("FCONST2 = %3.2f (should be 4.60)\n", FCONST2);
|
||||||
|
printf("CCONST3 = ''%c'' (should be ''a'')\n", CCONST3);
|
||||||
|
printf("CCONST4 = %s (this should be on a new line)\n", CCONST4);
|
||||||
|
printf("SCONST3 = ''%s'' (should be ''Hello World'')\n", SCONST3);
|
||||||
|
printf("SCONST4 = ''%s'' (should be "'""Hello World"""')\n", SCONST4);
|
||||||
|
printf("iconst2 = %i (should be 73)\n", iconst2);
|
||||||
|
printf("fconst2 = %3.2f (should be 6.28)\n", fconst2);
|
||||||
|
|
||||||
exit
|
exit
|
||||||
|
|
|
||||||
|
|
@ -252,3 +252,37 @@ SwigScilabStringFromCharPtrArray(void *_pvApiCtx, int _iVarOut, char **_charPtrA
|
||||||
return SWIG_NbInputArgument(pvApiCtx) + _iVarOut;
|
return SWIG_NbInputArgument(pvApiCtx) + _iVarOut;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
%fragment(SWIG_CreateScilabVariable_frag(char), "wrapper") {
|
||||||
|
SWIGINTERN int
|
||||||
|
SWIG_CreateScilabVariable_dec(char)(void *_pvApiCtx, const char* _psVariableName, const char _cVariableValue) {
|
||||||
|
SciErr sciErr;
|
||||||
|
char sValue[2];
|
||||||
|
const char* psStrings[1];
|
||||||
|
|
||||||
|
sValue[0] = _cVariableValue;
|
||||||
|
sValue[1] = '\0';
|
||||||
|
psStrings[0] = sValue;
|
||||||
|
|
||||||
|
sciErr = createNamedMatrixOfString(_pvApiCtx, _psVariableName, 1, 1, psStrings);
|
||||||
|
if (sciErr.iErr) {
|
||||||
|
printError(&sciErr, 0);
|
||||||
|
return SWIG_ERROR;
|
||||||
|
}
|
||||||
|
return SWIG_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
%fragment(SWIG_CreateScilabVariable_frag(charptr), "wrapper") {
|
||||||
|
SWIGINTERN int
|
||||||
|
SWIG_CreateScilabVariable_dec(charptr)(void *_pvApiCtx, const char* _psVariableName, const char* _psVariableValue) {
|
||||||
|
SciErr sciErr;
|
||||||
|
const char* psStrings[1];
|
||||||
|
psStrings[0] = _psVariableValue;
|
||||||
|
|
||||||
|
sciErr = createNamedMatrixOfString(_pvApiCtx, _psVariableName, 1, 1, psStrings);
|
||||||
|
if (sciErr.iErr) {
|
||||||
|
printError(&sciErr, 0);
|
||||||
|
return SWIG_ERROR;
|
||||||
|
}
|
||||||
|
return SWIG_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -118,3 +118,15 @@ SWIG_SciDouble_FromDoubleArrayAndSize(void *_pvApiCtx, int _iVarOut, int _iRows,
|
||||||
return Rhs + _iVarOut;
|
return Rhs + _iVarOut;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
%fragment(SWIG_CreateScilabVariable_frag(double), "wrapper") {
|
||||||
|
SWIGINTERN int
|
||||||
|
SWIG_CreateScilabVariable_dec(double)(void *_pvApiCtx, const char* _psVariableName, const double _dVariableValue) {
|
||||||
|
SciErr sciErr;
|
||||||
|
sciErr = createNamedMatrixOfDouble(_pvApiCtx, _psVariableName, 1, 1, &_dVariableValue);
|
||||||
|
if (sciErr.iErr) {
|
||||||
|
printError(&sciErr, 0);
|
||||||
|
return SWIG_ERROR;
|
||||||
|
}
|
||||||
|
return SWIG_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -196,3 +196,15 @@ SWIG_SciInt32_FromIntArrayAndSize(void *_pvApiCtx, int _iVarOut, int _iRows, int
|
||||||
return Rhs + _iVarOut;
|
return Rhs + _iVarOut;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
%fragment(SWIG_CreateScilabVariable_frag(int), "wrapper") {
|
||||||
|
SWIGINTERN int
|
||||||
|
SWIG_CreateScilabVariable_dec(int)(void *_pvApiCtx, const char* _psVariableName, const int _iVariableValue) {
|
||||||
|
SciErr sciErr;
|
||||||
|
sciErr = createNamedMatrixOfInteger32(_pvApiCtx, _psVariableName, 1, 1, &_iVariableValue);
|
||||||
|
if (sciErr.iErr) {
|
||||||
|
printError(&sciErr, 0);
|
||||||
|
return SWIG_ERROR;
|
||||||
|
}
|
||||||
|
return SWIG_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
%include <typemaps/swigmacros.swg>
|
%include <typemaps/swigmacros.swg>
|
||||||
%include <typemaps/fragments.swg>
|
%include <typemaps/fragments.swg>
|
||||||
|
%include <scimacros.swg>
|
||||||
%include <sciruntime.swg>
|
%include <sciruntime.swg>
|
||||||
%include <scitypemaps.swg>
|
%include <scitypemaps.swg>
|
||||||
|
|
||||||
|
|
|
||||||
5
Lib/scilab/scimacros.swg
Normal file
5
Lib/scilab/scimacros.swg
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
#define %scilabconst(flag) %feature("scilab:const","flag")
|
||||||
|
|
||||||
|
// Create Scilab variable
|
||||||
|
#define SWIG_CreateScilabVariable_frag(Type...) %fragment_name(CreateScilabVariable, Type)
|
||||||
|
#define SWIG_CreateScilabVariable_dec(Type...) %symbol_name(CreateScilabVariable, Type)
|
||||||
|
|
@ -78,7 +78,6 @@ SWIG_Scilab_ErrorMsg(int code, const char *mesg)
|
||||||
/* Used for C++ enums */
|
/* Used for C++ enums */
|
||||||
//#define SWIG_AsVal_int(scilabValue, valuePointer) SWIG_SciDouble_AsInt(pvApiCtx, scilabValue, valuePointer, fname)
|
//#define SWIG_AsVal_int(scilabValue, valuePointer) SWIG_SciDouble_AsInt(pvApiCtx, scilabValue, valuePointer, fname)
|
||||||
|
|
||||||
|
|
||||||
#if SCILAB_VERSION_54_OR_HIGHER
|
#if SCILAB_VERSION_54_OR_HIGHER
|
||||||
#define SWIG_CheckInputArgument(pvApiCtx, minInputArgument, maxInputArgument) CheckInputArgument(pvApiCtx, minInputArgument, maxInputArgument)
|
#define SWIG_CheckInputArgument(pvApiCtx, minInputArgument, maxInputArgument) CheckInputArgument(pvApiCtx, minInputArgument, maxInputArgument)
|
||||||
#define SWIG_CheckOutputArgument(pvApiCtx, minOutputArgument, maxOutputArgument) CheckOutputArgument(pvApiCtx, minOutputArgument, maxOutputArgument)
|
#define SWIG_CheckOutputArgument(pvApiCtx, minOutputArgument, maxOutputArgument) CheckOutputArgument(pvApiCtx, minOutputArgument, maxOutputArgument)
|
||||||
|
|
@ -272,6 +271,8 @@ SWIG_Scilab_SetModule(swig_module_info *swig_module)
|
||||||
%init %{
|
%init %{
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C"
|
extern "C"
|
||||||
|
#endif
|
||||||
int SWIG_Init(char *fname, unsigned long fname_len) {
|
int SWIG_Init(char *fname, unsigned long fname_len) {
|
||||||
SWIG_InitializeModule(NULL);
|
SWIG_InitializeModule(NULL);
|
||||||
|
SWIG_CreateScilabVariables();
|
||||||
%}
|
%}
|
||||||
|
|
|
||||||
|
|
@ -376,3 +376,31 @@
|
||||||
%typecheck(SWIG_TYPECHECK_STRING_ARRAY) char ** { SCILAB_TYPECHECK(isStringType) }
|
%typecheck(SWIG_TYPECHECK_STRING_ARRAY) char ** { SCILAB_TYPECHECK(isStringType) }
|
||||||
|
|
||||||
//%apply int { size_t };
|
//%apply int { size_t };
|
||||||
|
|
||||||
|
/* -----------------------------------------------------------------------------*/
|
||||||
|
/* Constants
|
||||||
|
/* -----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
%typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(int)) int
|
||||||
|
%{
|
||||||
|
if (SWIG_CreateScilabVariable_int(pvApiCtx, "$result", $value) != SWIG_OK)
|
||||||
|
return SWIG_ERROR;
|
||||||
|
%}
|
||||||
|
|
||||||
|
%typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(double)) double
|
||||||
|
%{
|
||||||
|
if (SWIG_CreateScilabVariable_double(pvApiCtx, "$result", $value) != SWIG_OK)
|
||||||
|
return SWIG_ERROR;
|
||||||
|
%}
|
||||||
|
|
||||||
|
%typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(char)) char
|
||||||
|
%{
|
||||||
|
if (SWIG_CreateScilabVariable_char(pvApiCtx, "$result", $value) != SWIG_OK)
|
||||||
|
return SWIG_ERROR;
|
||||||
|
%}
|
||||||
|
|
||||||
|
%typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(charptr)) char *
|
||||||
|
%{
|
||||||
|
if (SWIG_CreateScilabVariable_charptr(pvApiCtx, "$result", $value) != SWIG_OK)
|
||||||
|
return SWIG_ERROR;
|
||||||
|
%}
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ Scilab options\n\
|
||||||
-vbl <level> sets the build verbose level (default 0)\n\n";
|
-vbl <level> sets the build verbose level (default 0)\n\n";
|
||||||
|
|
||||||
const char *SWIG_INIT_FUNCTION_NAME = "SWIG_Init";
|
const char *SWIG_INIT_FUNCTION_NAME = "SWIG_Init";
|
||||||
|
const char *SWIG_CREATE_VARIABLES_FUNCTION_NAME = "SWIG_CreateScilabVariables";
|
||||||
|
|
||||||
class SCILAB:public Language {
|
class SCILAB:public Language {
|
||||||
protected:
|
protected:
|
||||||
|
|
@ -34,6 +35,8 @@ protected:
|
||||||
File *wrappersSection;
|
File *wrappersSection;
|
||||||
File *initSection;
|
File *initSection;
|
||||||
|
|
||||||
|
String *variablesCode;
|
||||||
|
|
||||||
File *builderFile;
|
File *builderFile;
|
||||||
String *builderCode;
|
String *builderCode;
|
||||||
int builderFunctionCount;
|
int builderFunctionCount;
|
||||||
|
|
@ -41,9 +44,8 @@ protected:
|
||||||
List *sourceFileList;
|
List *sourceFileList;
|
||||||
String *cflag;
|
String *cflag;
|
||||||
String *ldflag;
|
String *ldflag;
|
||||||
|
|
||||||
String *verboseBuildLevel;
|
String *verboseBuildLevel;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/* ------------------------------------------------------------------------
|
/* ------------------------------------------------------------------------
|
||||||
* main()
|
* main()
|
||||||
|
|
@ -180,10 +182,12 @@ public:
|
||||||
|
|
||||||
Printf(builderCode, "table = [");
|
Printf(builderCode, "table = [");
|
||||||
|
|
||||||
/* In C++ mode, add initialization function to builder table */
|
/* add initialization function to builder table */
|
||||||
if (CPlusPlus) {
|
addFunctionInBuilder(NewString(SWIG_INIT_FUNCTION_NAME), NewString(SWIG_INIT_FUNCTION_NAME));
|
||||||
Printf(builderCode, "\"%s\",\"%s\";", SWIG_INIT_FUNCTION_NAME, SWIG_INIT_FUNCTION_NAME);
|
|
||||||
}
|
// Open Scilab wrapper variables creation function
|
||||||
|
variablesCode = NewString("");
|
||||||
|
Printf(variablesCode, "int %s() {\n", SWIG_CREATE_VARIABLES_FUNCTION_NAME);
|
||||||
|
|
||||||
/* Emit code for children */
|
/* Emit code for children */
|
||||||
if (CPlusPlus) {
|
if (CPlusPlus) {
|
||||||
|
|
@ -196,6 +200,9 @@ public:
|
||||||
Printf(wrappersSection, "}\n");
|
Printf(wrappersSection, "}\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Close Scilab wrapper variables creation function
|
||||||
|
Printf(variablesCode, " return SWIG_OK;\n}\n");
|
||||||
|
|
||||||
/* Write all to the builder.sce file */
|
/* Write all to the builder.sce file */
|
||||||
Printf(builderCode, "];\n");
|
Printf(builderCode, "];\n");
|
||||||
Printf(builderCode, "if ~isempty(table) then\n");
|
Printf(builderCode, "if ~isempty(table) then\n");
|
||||||
|
|
@ -208,13 +215,14 @@ public:
|
||||||
Delete(builderFile);
|
Delete(builderFile);
|
||||||
|
|
||||||
/* Close the init function (opened in sciinit.swg) */
|
/* Close the init function (opened in sciinit.swg) */
|
||||||
Printf(initSection, "return 0;\n}\n#endif\n");
|
Printf(initSection, "return 0;\n}\n");
|
||||||
|
|
||||||
/* Write all to the wrapper file */
|
/* Write all to the wrapper file */
|
||||||
SwigType_emit_type_table(runtimeSection, wrappersSection); // Declare pointer types, ... (Ex: SWIGTYPE_p_p_double)
|
SwigType_emit_type_table(runtimeSection, wrappersSection); // Declare pointer types, ... (Ex: SWIGTYPE_p_p_double)
|
||||||
Dump(runtimeSection, beginSection);
|
Dump(runtimeSection, beginSection);
|
||||||
Dump(headerSection, beginSection);
|
Dump(headerSection, beginSection);
|
||||||
Dump(wrappersSection, beginSection);
|
Dump(wrappersSection, beginSection);
|
||||||
|
Dump(variablesCode, beginSection);
|
||||||
Wrapper_pretty_print(initSection, beginSection);
|
Wrapper_pretty_print(initSection, beginSection);
|
||||||
|
|
||||||
/* Cleanup files */
|
/* Cleanup files */
|
||||||
|
|
@ -556,6 +564,23 @@ public:
|
||||||
String *constantValue = rawValue ? rawValue : Getattr(node, "value");
|
String *constantValue = rawValue ? rawValue : Getattr(node, "value");
|
||||||
String *constantTypemap = NULL;
|
String *constantTypemap = NULL;
|
||||||
|
|
||||||
|
// Constants of simple type are wrapped to Scilab variables
|
||||||
|
if (GetFlag(node, "feature:scilab:const")) {
|
||||||
|
if ((SwigType_issimple(type)) || (SwigType_type(type) == T_STRING)) {
|
||||||
|
constantTypemap = Swig_typemap_lookup("scilabconstcode", node, nodeName, 0);
|
||||||
|
if (constantTypemap != NULL) {
|
||||||
|
//String *wrapName = NewString("");
|
||||||
|
//Printf(wrapName, "Swig%s", constantName);
|
||||||
|
Setattr(node, "wrap:name", constantName);
|
||||||
|
Replaceall(constantTypemap, "$result", constantName);
|
||||||
|
Replaceall(constantTypemap, "$value", constantValue);
|
||||||
|
emit_action_code(node, variablesCode, constantTypemap);
|
||||||
|
Delete(constantTypemap);
|
||||||
|
return SWIG_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Create variables for member pointer constants, not suppported by typemaps (like Python wrapper does) */
|
/* Create variables for member pointer constants, not suppported by typemaps (like Python wrapper does) */
|
||||||
if (SwigType_type(type) == T_MPOINTER) {
|
if (SwigType_type(type) == T_MPOINTER) {
|
||||||
String *wname = Swig_name_wrapper(constantName);
|
String *wname = Swig_name_wrapper(constantName);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue