diff --git a/Doc/Manual/Scilab.html b/Doc/Manual/Scilab.html
index 8ce357baa..e9347e810 100644
--- a/Doc/Manual/Scilab.html
+++ b/Doc/Manual/Scilab.html
@@ -22,6 +22,7 @@
@@ -172,4 +173,19 @@ int fact(int n);
+27.3.3 Global variables
+
+
+ To expose variables, SWIG actually generates two functions, to get and set the value. In this case, Foo_set and Foo_set would be generated. SWIG then automatically calls these functions when you get and set the variable-- in the former case creating a local copy in the interpreter of the C variables, and in the latter case copying an interpreter variables onto the C variable.
+
+
+ scilab:1> exec loader.sce;
+scilab:2> c=Foo
+c = 3
+scilab:3> Foo=4;
+scilab:4> c
+c = 3
+scilab:5> Foo
+ans = 4
+
diff --git a/Examples/octave/variables/example.c b/Examples/octave/variables/example.c
index aa4ffe9b3..3114c7c5f 100644
--- a/Examples/octave/variables/example.c
+++ b/Examples/octave/variables/example.c
@@ -25,7 +25,7 @@ double dvar = 0;
char *strvar = 0;
const char cstrvar[] = "Goodbye";
int *iptrvar = 0;
-char name[256] = "Dave";
+char name[5] = "Dave";
char path[256] = "/home/beazley";
@@ -53,8 +53,8 @@ void print_vars() {
printf("strvar = %s\n", strvar ? strvar : "(null)");
printf("cstrvar = %s\n", cstrvar ? cstrvar : "(null)");
printf("iptrvar = %p\n", iptrvar);
- printf("name = %s\n", name);
- printf("ptptr = %p (%d, %d)\n", ptptr, ptptr ? ptptr->x : 0, ptptr ? ptptr->y : 0);
+ printf("name = %c%c%c%c%c\n", name[0],name[1],name[2],name[3],name[4]);
+ printf("ptptr = %p %s\n", ptptr, Point_print( ptptr ) );
printf("pt = (%d, %d)\n", pt.x, pt.y);
printf("status = %d\n", status);
}
@@ -67,6 +67,10 @@ int *new_int(int value) {
return ip;
}
+int value_int(int *value) {
+ return *value;
+}
+
/* A function to create a point */
Point *new_Point(int x, int y) {
diff --git a/Lib/scilab/scilab.swg b/Lib/scilab/scilab.swg
index 0d280f23f..ec101d74e 100644
--- a/Lib/scilab/scilab.swg
+++ b/Lib/scilab/scilab.swg
@@ -1,4 +1,5 @@
%include
%include
+%include
%include
diff --git a/Lib/scilab/scitypemaps.swg b/Lib/scilab/scitypemaps.swg
index 336af20f3..539969bc3 100644
--- a/Lib/scilab/scitypemaps.swg
+++ b/Lib/scilab/scitypemaps.swg
@@ -12,49 +12,69 @@
//%include
-%typemap(in) char (int m, int n,int l),
- signed char (int m,int n,int l),
- unsigned char(int m,int n,int l)
+%typemap(in) char (int *piAddrVar, int iRows, int iCols),
+ signed char (int *piAddrVar, int iRows, int iCols),
+ unsigned char(int *piAddrVar, int iRows, int iCols)
{
- if (GetType($argnum) == sci_strings)
- {
- GetRhsVar($argnum,STRING_DATATYPE,&m,&n,&l);
- $1=($1_ltype)(*cstk(l));
- }
- else
- Scierror(999,"error ...\n");
+ char* _piData8;
+ getVarAddressFromNumber($argnum, &piAddrVar);
+ getVarDimension(piAddrVar, &iRows, &iCols);
+ if(getVarType(piAddrVar) != sci_matrix || iRows1 != 1 || iCols1 != 1 || isVarComplex(piAddrVar))
+ {
+ Scierror(999,_("%s: Wrong type for input argument #%d: Real scalar expected.\n"), fname, 1);
+ }
+ getMatrixOfInteger8(piAddrVar, &iRows, &iCols, &_piData8);
+ $1=_piData8[0];
}
-%typemap(in) short (int m, int n,int l),
- unsigned short (int m,int n,int l),
- int(int m,int n,int l),
- unsigned int(int m, int n,int l),
- long(int m,int n,int l),
- unsigned long(int m,int n,int l),
- double(int m,int n,int l)
+%typemap(in) short (int *piAddrVar, int iRows, int iCols),
+ unsigned short (int *piAddrVar, int iRows, int iCols)
+{ short* _piData16;
+ getVarAddressFromNumber($argnum, &piAddrVar);
+ getVarDimension(piAddrVar, &iRows, &iCols);
+ if(getVarType(piAddrVar) != sci_matrix || iRows1 != 1 || iCols1 != 1 || isVarComplex(piAddrVar))
+ {
+ Scierror(999,_("%s: Wrong type for input argument #%d: Real scalar expected.\n"), fname, 1);
+ }
+ getMatrixOfInteger16(piAddrVar, &iRows, &iCols, &_piData16);
+ $1= _piData16[0];
+
+}
+
+%typemap(in) int (int *piAddrVar, int iRows, int iCols),
+ unsigned int (int *piAddrVar, int iRows, int iCols)
+
+{ int* _piData32;
+ getVarAddressFromNumber($argnum, &piAddrVar);
+ getVarDimension(piAddrVar, &iRows, &iCols);
+ if(getVarType(piAddrVar) != sci_matrix || iRows1 != 1 || iCols1 != 1 || isVarComplex(piAddrVar))
+ {
+ Scierror(999,_("%s: Wrong type for input argument #%d: Real scalar expected.\n"), fname, 1);
+ }
+ getMatrixOfInteger16(piAddrVar, &iRows, &iCols, &_piData32);
+ $1= _piData32[0];
+
+}
+
+%typemap(in) long(int* piAddrVar,int iRows,int iCols),
+ unsigned long(int* piAddrVar,int iRows,int iCols),
+ double(int* piAddrVar,int iRows,int iCols),
+ float (int* piAddrVar,int iRows,int iCols)
-{
- if (GetType($argnum) == sci_matrix)
- {
- GetRhsVar($argnum,MATRIX_OF_DOUBLE_DATATYPE,&m,&n,&l);
- $1=($1_ltype)(*stk(l));
- }
- else
- Scierror(999,"error ...\n");
-}
-
-%typemap(in) float (int m, int n,int l)
-{
- if (GetType($argnum) == sci_matrix)
- {
- GetRhsVar($argnum,MATRIX_OF_DOUBLE_DATATYPE,&m,&n,&l);
- $1=($1_ltype)(*stk(l));
- }
- else
- Scierror(999,"error ...\n");
+{ double *pdblReal;
+ getVarAddressFromNumber($argnum, &piAddrVar);
+ getVarDimension(piAddrVar, &iRows, &iCols);
+ if(getVarType(piAddrVar) != sci_matrix || iRows1 != 1 || iCols1 != 1 || isVarComplex(piAddrVar))
+ {
+ Scierror(999,_("%s: Wrong type for input argument #%d: Real scalar expected.\n"), fname, 1);
+ }
+ getMatrixOfDouble(piAddrVar, &iRows, &iCols, &pdblReal);
+ $1= pdblReal[0];
+
}
+/*
%typemap(in) char *(int m,int n,int l)
{
if (GetType($argnum) == sci_strings)
@@ -65,54 +85,53 @@
else
Scierror(999,"error ...\n");
-}
+}*/
-%typemap(out) char (int m, int n,int l),
- signed char (int m,int n,int l),
- unsigned char(int m,int n,int l)
+%typemap(out) char (int iRowsOut,int iColsOut,int* _piAddress),
+ signed char (int iRowsOut,int iColsOut,int* _piAddress),
+ unsigned char(int iRowsOut,int iColsOut,int* _piAddress)
{
- m=1,n=1;
- CreateVar(Rhs+1,STRING_DATATYPE,&m,&n,&l);
- *cstk(l)=$1;
+ iRowsOut=1;
+ iColsOut=1;
+ createMatrixOfInteger8(Rhs+1, iRowsOut, iColsOut, &$1, &_piAddress);
LhsVar(1)=Rhs+1;
+ PutLhsVar();
}
-%typemap(out) short (int m, int n,int l),
- unsigned short (int m,int n,int l),
- int(int m,int n,int l),
- unsigned int(int m, int n,int l),
- long(int m,int n,int l),
- unsigned long(int m,int n,int l),
- double(int m,int n,int l)
+%typemap(out) short (int iRowsOut,int iColsOut,int* _piAddress),
+ unsigned short(int iRowsOut,int iColsOut,int* _piAddress)
+
{
- m=1,n=1;
- CreateVar(Rhs+1,MATRIX_OF_DOUBLE_DATATYPE,&m,&n,&l);
- *stk(l)=(double)$1;
+ iRowsOut=1;
+ iColsOut=1;
+ createMatrixOfInteger16(Rhs+1, iRowsOut, iColsOut, &$1, &_piAddress);
LhsVar(1)=Rhs+1;
+ PutLhsVar();
}
-%typemap(out) float (int m, int n,int l)
+%typemap(out) int (int iRowsOut,int iColsOut,int* _piAddress),
+ unsigned int(int iRowsOut,int iColsOut,int* _piAddress)
+
{
- m=1,n=1;
- CreateVar(Rhs+1,MATRIX_OF_DOUBLE_DATATYPE,&m,&n,&l);
- *stk(l)=(double)$1;
+ iRowsOut=1;
+ iColsOut=1;
+ createMatrixOfInteger32(Rhs+1, iRowsOut, iColsOut, &$1, &_piAddress);
LhsVar(1)=Rhs+1;
+ PutLhsVar();
}
-%typemap(out) char *(int m,int n, int l)
+%typemap(out) long(int iRowsOut,int iColsOut,int* _piAddress),
+ unsigned long(int iRowsOut,int iColsOut,int* _piAddress),
+ double(int iRowsOut,int iColsOut,int* _piAddress),
+ float(int iRowsOut,int iColsOut,int* _piAddress)
{
- m=1;
- if ($1)
- n = (int)strlen($1);
- else
- n = (int)strlen("");
-
- CreateVar(Rhs+1,STRING_DATATYPE ,&m,&n,&l);
- if ($1) strcpy(cstk(l),$1);
- else strcpy(cstk(l),"");
- LhsVar(1) = Rhs+1;
+ iRowsOut=1;
+ iColsOut=1;
+ createMatrixDouble(Rhs+1, iRowsOut, iColsOut, &$1, &_piAddress);
+ LhsVar(1)=Rhs+1;
+ PutLhsVar();
}
diff --git a/Source/Modules/scilab.cxx b/Source/Modules/scilab.cxx
index 2f78a4145..106c688ba 100644
--- a/Source/Modules/scilab.cxx
+++ b/Source/Modules/scilab.cxx
@@ -276,9 +276,80 @@ class SCILAB:public Language {
virtual int variableWrapper(Node *n) {
- Language::variableWrapper(n); /* Default to functions */
+ String *name = Getattr(n, "name");
+ String *iname = Getattr(n, "sym:name");
+ SwigType *t = Getattr(n, "type");
+
+ if (!addSymbol(iname, n))
+ return SWIG_ERROR;
+
+ String *tm;
+ Wrapper *getf = NewWrapper();
+ Wrapper *setf = NewWrapper();
+
+ String *getname = Swig_name_get(iname);
+ String *setname = Swig_name_set(iname);
+
+ Printv(setf->def, "int ", setname, " (char *fname){", NIL);
+
+ Wrapper_add_local(setf, "piAddrVar", "int *piAddrVar");
+ Wrapper_add_local(setf, "iRows", "int iRows");
+ Wrapper_add_local(setf, "iCols", "int iCols");
+ // Wrapper_add_local(setf, "pdblReal", "double *pdblReal");
+
+
+ if (is_assignable(n)) {
+ Setattr(n, "wrap:name", setname);
+ if ((tm = Swig_typemap_lookup("in", n, name, 0))) {
+ Replaceall(tm, "$source", "args(0)");
+ Replaceall(tm, "$target", name);
+ Replaceall(tm, "$input", "args(0)");
+ Replaceall(tm, "$argnum", "1");
+ //if (Getattr(n, "tmap:varin:implicitconv")) {
+ //Replaceall(tm, "$implicitconv", get_implicitconv_flag(n));
+ //}
+ emit_action_code(n, setf->code, tm);
+ Delete(tm);
+ } else {
+ Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s.\n", SwigType_str(t, 0));
+ }
+
+ } else {
+ //Printf(setf->code, "return octave_set_immutable(args,nargout);");
+ }
+ Append(setf->code, "}\n");
+ Wrapper_print(setf, f_wrappers);
+ Printf(f_builder, "\"%s\",\"%s\";",iname,setname);
+
+ Setattr(n, "wrap:name", getname);
+ int addfail = 0;
+ Printv(getf->def, "int ", getname, " (char *fname){", NIL);
+
+ Wrapper_add_local(getf, "piAddrOut", "int* _piAddress");
+ Wrapper_add_local(getf, "iRows", "int iRowsOut");
+ Wrapper_add_local(getf, "iColsOut", "int iColsOut ");
+
+ if ((tm = Swig_typemap_lookup("out", n, name, 0))) {
+ Replaceall(tm, "$source", name);
+ Replaceall(tm, "$target", "obj");
+ Replaceall(tm, "$result", "obj");
+ addfail = emit_action_code(n, getf->code, tm);
+ Delete(tm);
+ } else {
+ Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t, 0));
+ }
+ //Append(getf->code, " return obj;\n");
+ //if (addfail) {
+ //Append(getf->code, "fail:\n");
+ //Append(getf->code, " return octave_value_list();\n");
+ //}
+ Append(getf->code, "}\n");
+ Wrapper_print(getf, f_wrappers);
+ Printf(f_builder, "\"%s\",\"%s\";",iname,getname);
return SWIG_OK;
+
+
}
};