add support for Enums
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/branches/gsoc2009-sploving@11288 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
4e9cbd8a7c
commit
ed84d6b162
19 changed files with 865 additions and 222 deletions
|
|
@ -17,19 +17,25 @@ Scilab Options (available with -scilab)\n\
|
|||
|
||||
|
||||
class SCILAB:public Language {
|
||||
private:
|
||||
|
||||
private:
|
||||
File *f_begin;
|
||||
File *f_runtime;
|
||||
File *f_header;
|
||||
File *f_wrappers;
|
||||
File *f_init;
|
||||
File *f_builder;
|
||||
|
||||
String *f_builder_code;
|
||||
String *f_example_code;
|
||||
|
||||
public:
|
||||
SCILAB():f_begin(0), f_runtime(0), f_header(0),f_wrappers(0),
|
||||
f_init(0) {}
|
||||
bool hasfunction_flag;
|
||||
bool hasconstant_flag;
|
||||
|
||||
public:
|
||||
SCILAB():
|
||||
f_builder_code(NewString("")), f_example_code(NewString("")), hasfunction_flag(false), hasconstant_flag(false) {
|
||||
}
|
||||
|
||||
|
||||
/* ------------------------------------------------------------
|
||||
* main()
|
||||
* ------------------------------------------------------------ */
|
||||
|
|
@ -43,16 +49,16 @@ class SCILAB:public Language {
|
|||
}
|
||||
}
|
||||
|
||||
//Set language-specific subdirectory in SWIG library
|
||||
/* Set language-specific subdirectory in SWIG library */
|
||||
SWIG_library_directory("scilab");
|
||||
|
||||
// Add a symbol to the parser for conditional compilation
|
||||
/* Add a symbol to the parser for conditional compilation */
|
||||
Preprocessor_define("SWIGSCILAB 1", 0);
|
||||
|
||||
// Set scilab configuration file
|
||||
/* Set scilab configuration file */
|
||||
SWIG_config_file("scilab.swg");
|
||||
|
||||
//Set typemap for scilab
|
||||
/* Set typemap for scilab */
|
||||
SWIG_typemap_lang("scilab");
|
||||
}
|
||||
|
||||
|
|
@ -62,20 +68,14 @@ class SCILAB:public Language {
|
|||
|
||||
virtual int top(Node *n) {
|
||||
|
||||
Node *mod = Getattr(n, "module");
|
||||
|
||||
/*Get the name of the module*/
|
||||
/* Get the name of the module */
|
||||
String *module = Getattr(n, "name");
|
||||
|
||||
/*One output file for as the wrapper file*/
|
||||
/* One output file for as the wrapper file */
|
||||
String *outfile = Getattr(n, "outfile");
|
||||
f_begin = NewFile(outfile, "w", SWIG_output_files());
|
||||
|
||||
/*Another output file to generate the .so or .dll */
|
||||
String *builder = NewStringf("%sbuilder.sce",SWIG_output_directory());
|
||||
f_builder=NewFile(builder,"w",SWIG_output_files());
|
||||
|
||||
/* Initialize all of the output files */
|
||||
/* Initialize the output files */
|
||||
if (!f_begin) {
|
||||
FileErrorDisplay(outfile);
|
||||
SWIG_exit(EXIT_FAILURE);
|
||||
|
|
@ -92,32 +92,52 @@ class SCILAB:public Language {
|
|||
Swig_register_filebyname("wrapper", f_wrappers);
|
||||
Swig_register_filebyname("init", f_init);
|
||||
|
||||
/*Insert the banner at the beginning */
|
||||
/* Insert the banner at the beginning */
|
||||
Swig_banner(f_begin);
|
||||
|
||||
/*Include some header file of scilab*/
|
||||
/* Include some header file of scilab */
|
||||
Printf(f_runtime, "#include \"stack-c.h\"\n");
|
||||
Printf(f_runtime, "#include \"sciprint.h\"\n");
|
||||
Printf(f_runtime, "#include \"Scierror.h\"\n");
|
||||
Printf(f_runtime, "#include \"variable_api.h\"\n");
|
||||
Printf(f_runtime, "#include \"localization.h\"\n");
|
||||
|
||||
/* Initialize the builder.sce file code */
|
||||
Printf(f_builder_code,"ilib_name = \"%slib\";\n",module);
|
||||
Printf(f_builder_code,"files = [\"%s\",\"%s.o\"];\n", outfile,module);
|
||||
Printf(f_builder_code,"libs = [];\n");
|
||||
Printf(f_builder_code, "table = [");
|
||||
|
||||
/*Initialize the builder.sce file*/
|
||||
Printf(f_builder,"ilib_name = \"%slib\";\n",module);
|
||||
Printf(f_builder,"files = [\"%s\",\"%s.o\"];\n", outfile,module);
|
||||
Printf(f_builder,"libs = [];\n");
|
||||
Printf(f_builder, "table = [");
|
||||
|
||||
|
||||
/*Emit code for children*/
|
||||
/* Emit code for children */
|
||||
Language::top(n);
|
||||
|
||||
/*Finish off the builder.sce file*/
|
||||
Printf(f_builder,"];\n");
|
||||
Printf(f_builder,"ilib_build(ilib_name,table,files,libs);");
|
||||
/* create the file to generate the module: "builder.sce" */
|
||||
if(hasfunction_flag) {
|
||||
Printf(f_builder_code,"];\n");
|
||||
Printf(f_builder_code,"ilib_build(ilib_name,table,files,libs);");
|
||||
File *f_builder=NewFile(NewStringf("%sbuilder.sce",SWIG_output_directory()),"w",SWIG_output_files());
|
||||
Printv(f_builder,f_builder_code,NIL);
|
||||
Close(f_builder);
|
||||
Delete(f_builder);
|
||||
Delete(f_builder_code);
|
||||
}
|
||||
else {
|
||||
Delete(f_builder_code);
|
||||
}
|
||||
|
||||
/*Dump out all the files*/
|
||||
/* create the file for constants: "module.sce" */
|
||||
if(hasconstant_flag) {
|
||||
File *f_example=NewFile(NewStringf("%s%s.sce",SWIG_output_directory(),module),"w",SWIG_output_files());
|
||||
Printv(f_example,f_example_code,NIL);
|
||||
Close(f_example);
|
||||
Delete(f_example);
|
||||
Delete(f_example_code);
|
||||
}
|
||||
else {
|
||||
Delete(f_example_code);
|
||||
}
|
||||
|
||||
/* Dump out all the files */
|
||||
Dump(f_runtime, f_begin);
|
||||
Dump(f_header, f_begin);
|
||||
Dump(f_wrappers, f_begin);
|
||||
|
|
@ -129,34 +149,32 @@ class SCILAB:public Language {
|
|||
Delete(f_header);
|
||||
Delete(f_runtime);
|
||||
Close(f_begin);
|
||||
Close(f_builder);
|
||||
Delete(f_begin);
|
||||
Delete(f_builder);
|
||||
|
||||
|
||||
return SWIG_OK;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
/* ----------------------------------------------------------------------
|
||||
* functionWrapper()
|
||||
* ---------------------------------------------------------------------- */
|
||||
|
||||
virtual int functionWrapper(Node *n) {
|
||||
|
||||
// A new wrapper function object
|
||||
Wrapper *f = NewWrapper();
|
||||
hasfunction_flag=true;
|
||||
|
||||
/* A new wrapper function object */
|
||||
Wrapper *f = NewWrapper();
|
||||
Parm *p;
|
||||
String *tm;
|
||||
int j;
|
||||
|
||||
//Get the useful information from the node
|
||||
/* Get the useful information from the node */
|
||||
String *nodeType = Getattr(n, "nodeType");
|
||||
int constructor = (!Cmp(nodeType, "constructor"));
|
||||
int destructor = (!Cmp(nodeType, "destructor"));
|
||||
// int destructor = (!Cmp(nodeType, "destructor"));
|
||||
String *storage = Getattr(n, "storage");
|
||||
|
||||
bool overloaded = !!Getattr(n, "sym:overloaded");
|
||||
bool last_overload = overloaded && !Getattr(n, "sym:nextSibling");
|
||||
//bool last_overload = overloaded && !Getattr(n, "sym:nextSibling");
|
||||
String *iname = Getattr(n, "sym:name");
|
||||
String *wname = Swig_name_wrapper(iname);
|
||||
String *overname = Copy(wname);
|
||||
|
|
@ -169,19 +187,19 @@ class SCILAB:public Language {
|
|||
if (overloaded)
|
||||
Append(overname, Getattr(n, "sym:overname"));
|
||||
|
||||
Printv(f->def, "int ", overname, " (char *fname,unsigned long fname_len) {", NIL);
|
||||
Printv(f->def, "int ", overname, " (char *fname,unsigned long fname_len) {\nint iOutNum=1;\nint iVarOut=Rhs+1;", NIL);
|
||||
|
||||
// Emit all of the local variables for holding arguments
|
||||
/* Emit all of the local variables for holding arguments */
|
||||
emit_parameter_variables(l, f);
|
||||
|
||||
//Attach typemaps to the parameter list
|
||||
/* Attach typemaps to the parameter list */
|
||||
emit_attach_parmmaps(l, f);
|
||||
Setattr(n, "wrap:parms", l);
|
||||
|
||||
// Get number of required and total arguments
|
||||
/* Get number of required and total arguments */
|
||||
int num_arguments = emit_num_arguments(l);
|
||||
int num_required = emit_num_required(l);
|
||||
int varargs = emit_isvarargs(l);
|
||||
//int varargs = emit_isvarargs(l);
|
||||
|
||||
if (constructor && num_arguments == 1 && num_required == 1) {
|
||||
if (Cmp(storage, "explicit") == 0) {
|
||||
|
|
@ -194,7 +212,7 @@ class SCILAB:public Language {
|
|||
}
|
||||
}
|
||||
|
||||
//Walk the function parameter list and generate code to get arguments
|
||||
/* Walk the function parameter list and generate code to get arguments */
|
||||
for (j = 0, p = l; j < num_arguments; ++j) {
|
||||
while (checkAttribute(p, "tmap:in:numinputs", "0")) {
|
||||
p = Getattr(p, "tmap:in:next");
|
||||
|
|
@ -202,7 +220,7 @@ class SCILAB:public Language {
|
|||
|
||||
SwigType *pt = Getattr(p, "type");
|
||||
|
||||
// Get typemap for this argument
|
||||
/* Get typemap for this argument */
|
||||
String *tm = Getattr(p, "tmap:in");
|
||||
|
||||
if (tm) {
|
||||
|
|
@ -224,15 +242,15 @@ class SCILAB:public Language {
|
|||
|
||||
Setattr(n, "wrap:name", overname);
|
||||
|
||||
// Now write code to make the function call
|
||||
/* Now write code to make the function call */
|
||||
Swig_director_emit_dynamic_cast(n, f);
|
||||
String *actioncode = emit_action(n);
|
||||
|
||||
//Insert the return variable
|
||||
/* Insert the return variable */
|
||||
emit_return_variable(n, d, f);
|
||||
|
||||
if ((tm = Swig_typemap_lookup_out("out", n, "result", f, actioncode))) {
|
||||
|
||||
Replaceall(tm, "$result", "result");
|
||||
Printf(f->code, "%s\n", tm);
|
||||
|
||||
}
|
||||
|
|
@ -261,7 +279,7 @@ class SCILAB:public Language {
|
|||
/* Dump the wrapper function */
|
||||
Wrapper_print(f, f_wrappers);
|
||||
DelWrapper(f);
|
||||
Printf(f_builder, "\"%s\",\"%s\";",iname,wname);
|
||||
Printf(f_builder_code, "\"%s\",\"%s\";",iname,wname);
|
||||
|
||||
Delete(overname);
|
||||
Delete(wname);
|
||||
|
|
@ -275,14 +293,18 @@ class SCILAB:public Language {
|
|||
* ----------------------------------------------------------------------- */
|
||||
|
||||
virtual int variableWrapper(Node *n) {
|
||||
|
||||
|
||||
hasfunction_flag=true;
|
||||
|
||||
/* Get the useful information from the node */
|
||||
String *name = Getattr(n, "name");
|
||||
String *iname = Getattr(n, "sym:name");
|
||||
SwigType *t = Getattr(n, "type");
|
||||
|
||||
if (!addSymbol(iname, n))
|
||||
return SWIG_ERROR;
|
||||
|
||||
|
||||
/* two wrapper function to get and set the variable */
|
||||
String *tm;
|
||||
Wrapper *getf = NewWrapper();
|
||||
Wrapper *setf = NewWrapper();
|
||||
|
|
@ -290,106 +312,153 @@ class SCILAB:public Language {
|
|||
String *getname = Swig_name_get(iname);
|
||||
String *setname = Swig_name_set(iname);
|
||||
|
||||
Printv(setf->def, "int ", setname, " (char *fname,unsigned long fname_len) {", NIL);
|
||||
|
||||
Printv(setf->def, "int ", setname, " (char *fname,unsigned long fname_len) {\nint iOutNum=1;\nint iVarOut=Rhs+1;", NIL);
|
||||
|
||||
/* add the local variable */
|
||||
Wrapper_add_local(setf, "piAddrVar", "int *piAddrVar");
|
||||
Wrapper_add_local(setf, "iRows", "int iRows");
|
||||
Wrapper_add_local(setf, "iCols", "int iCols");
|
||||
|
||||
|
||||
/* deal with the set function */
|
||||
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));
|
||||
//}
|
||||
Replaceall(tm, "$argnum", "1");
|
||||
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);");
|
||||
}
|
||||
else {
|
||||
}
|
||||
Append(setf->code, "}\n");
|
||||
Wrapper_print(setf, f_wrappers);
|
||||
Printf(f_builder, "\"%s\",\"%s\";",setname,setname);
|
||||
|
||||
Printf(f_builder_code, "\"%s\",\"%s\";",setname,setname);
|
||||
|
||||
/* deal with the get function */
|
||||
Setattr(n, "wrap:name", getname);
|
||||
int addfail = 0;
|
||||
Printv(getf->def, "int ", getname, " (char *fname,unsigned long fname_len){", NIL);
|
||||
Printv(getf->def, "int ", getname, " (char *fname,unsigned long fname_len){\nint iOutNum=1;\nint iVarOut=Rhs+1;", NIL);
|
||||
|
||||
/* add local variabe */
|
||||
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");
|
||||
Replaceall(tm, "$result", name);
|
||||
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));
|
||||
}
|
||||
|
||||
/*Dump the wrapper function */
|
||||
Append(getf->code, "}\n");
|
||||
Wrapper_print(getf, f_wrappers);
|
||||
Printf(f_builder, "\"%s\",\"%s\";",getname,getname);
|
||||
Printf(f_builder_code, "\"%s\",\"%s\";",getname,getname);
|
||||
|
||||
return SWIG_OK;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------
|
||||
/* -----------------------------------------------------------------------
|
||||
* constantWrapper()
|
||||
* ----------------------------------------------------------------------- */
|
||||
|
||||
virtual int constantWrapper(Node *n) {
|
||||
String *name = Getattr(n, "name");
|
||||
|
||||
/* set the flag so to generate the example.sce */
|
||||
hasconstant_flag=true;
|
||||
|
||||
/* Get the useful information from the node */
|
||||
String *iname = Getattr(n, "sym:name");
|
||||
SwigType *type = Getattr(n, "type");
|
||||
String *rawval = Getattr(n, "rawval");
|
||||
String *value = rawval ? rawval : Getattr(n, "value");
|
||||
String *tm;
|
||||
|
||||
if (!addSymbol(iname, n))
|
||||
return SWIG_ERROR;
|
||||
|
||||
Wrapper *getf = NewWrapper();
|
||||
String *getname = Swig_name_get(iname);
|
||||
String *tempvalue=NewString("");
|
||||
|
||||
Setattr(n, "wrap:name", getname);
|
||||
Printv(getf->def, "int ", getname, " (char *fname,unsigned long fname_len) {", 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");
|
||||
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(type, 0));
|
||||
/* set the value format to be the scilab format */
|
||||
if(!Strcmp(type,"char")){
|
||||
value=Getattr(n,"rawvalue");
|
||||
char *temp=(Char(value));
|
||||
tempvalue=NewString("ascii");
|
||||
Printf(tempvalue,"(%i)",(int)*temp);
|
||||
value=Copy(tempvalue);
|
||||
}
|
||||
else{
|
||||
if(!Strcmp(type,"p.char")){
|
||||
char *temp=(Char(value));
|
||||
int len=strlen(temp);
|
||||
for(int i=0;i<len;++i){
|
||||
if(temp[i]=='\\'){
|
||||
temp[i]='"';
|
||||
++i;
|
||||
}
|
||||
}
|
||||
Printf(tempvalue,"%s",temp);
|
||||
value=Copy(tempvalue);
|
||||
}
|
||||
}
|
||||
|
||||
Append(getf->code, "}\n");
|
||||
Wrapper_print(getf, f_wrappers);
|
||||
Printf(f_header, "const %s %s=%s;\n",SwigType_str(type,0),iname,value);
|
||||
Printf(f_builder, "\"%s\",\"%s\";",iname,getname);
|
||||
|
||||
/* write into the code string */
|
||||
Printf(f_example_code, "example.%s = %s\n",iname,value);
|
||||
|
||||
return SWIG_OK;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
* enumDeclaration()
|
||||
* --------------------------------------------------------------------- */
|
||||
|
||||
virtual int enumDeclaration(Node *n) {
|
||||
|
||||
/* set the flag so to generate the example.sce */
|
||||
hasconstant_flag=true;
|
||||
return Language::enumDeclaration(n);
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
* enumvalueDeclaration()
|
||||
* --------------------------------------------------------------------- */
|
||||
|
||||
virtual int enumvalueDeclaration(Node *n) {
|
||||
|
||||
/* get the name of the enumvalue */
|
||||
String *iname = Getattr(n, "sym:name");
|
||||
|
||||
/* get the name of the enum name */
|
||||
String *parentName=Getattr(parentNode(n), "sym:name");
|
||||
|
||||
/* set the name to be the enum.enumvalue format */
|
||||
String *temp=Copy(parentName);
|
||||
Printf(temp,".%s",iname);
|
||||
Setattr(n,"sym:name",temp);
|
||||
|
||||
/* set the value attribute to be the integer */
|
||||
String *value;
|
||||
String *enumvalue=Getattr(n,"enumvalue");
|
||||
if(enumvalue) {
|
||||
Setattr(n,"value",enumvalue);
|
||||
}
|
||||
else {
|
||||
if(n!=firstChild(parentNode(n))) {
|
||||
enumvalue=Getattr(n,"enumvalueex");
|
||||
value=Copy(parentName);
|
||||
Printf(value,".%s",enumvalue);
|
||||
Setattr(n,"value",value);
|
||||
}
|
||||
else {
|
||||
Setattr(n,"value",Getattr(n,"enumvalueex"));
|
||||
}
|
||||
}
|
||||
value=Getattr(n,"value");
|
||||
|
||||
/* write into the code string */
|
||||
Printf(f_example_code, "%s.%s=%s;\n",parentName,iname,value);
|
||||
|
||||
return SWIG_OK;
|
||||
}
|
||||
};
|
||||
|
||||
extern "C" Language *swig_scilab(void) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue