From 25f17ae46364c41c3ec630fb51dc7b0a66348b66 Mon Sep 17 00:00:00 2001 From: Baozeng Ding Date: Sun, 7 Jun 2009 01:44:39 +0000 Subject: [PATCH] global variable git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/branches/gsoc2009-sploving@11249 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- Doc/Manual/Scilab.html | 16 +++ Examples/octave/variables/example.c | 10 +- Lib/scilab/scilab.swg | 1 + Lib/scilab/scitypemaps.swg | 155 ++++++++++++++++------------ Source/Modules/scilab.cxx | 73 ++++++++++++- 5 files changed, 183 insertions(+), 72 deletions(-) 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);
Scilab:1>fact(4)
 ant=24 
+

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; + + } };