Added some support for inline texinfo documentation, and fixed a handful of small items needed to get OpenCV bindings to build.

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@10313 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Xavier Delacour 2008-03-17 18:46:30 +00:00
commit e314d97f32
3 changed files with 100 additions and 31 deletions

View file

@ -42,7 +42,6 @@ SWIGRUNTIME octave_value SWIG_Error(int code,const char* msg) {
#define SWIG_fail goto fail
#define SWIG_Octave_ConvertPtr(obj, pptr, type, flags) SWIG_Octave_ConvertPtrAndOwn(obj, pptr, type, flags, 0)
#define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Octave_ConvertPtr(obj, pptr, type, flags)
#define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Octave_ConvertPtrAndOwn(obj, pptr, type, flags, own)
@ -66,6 +65,10 @@ SWIGRUNTIME octave_value SWIG_Error(int code,const char* msg) {
#define Octave_Error_Occurred() 0
#define SWIG_Octave_AddErrorMsg(msg) {;}
// For backward compatibility only
#define SWIG_POINTER_EXCEPTION 0
#define SWIG_arg_fail(arg) 0
SWIGRUNTIME swig_module_info* SWIG_Octave_GetModule(void* clientdata) {
octave_value tmp = get_global_value ("__SWIG_MODULE__", true);
if (!tmp.is_defined()||!tmp.is_uint64_type())
@ -142,6 +145,7 @@ struct swig_octave_member {
octave_func get_method;
octave_func set_method;
int flags; // 1 static, 2 global
const char* doc;
bool is_static() const {
return flags&1;
}
@ -216,7 +220,7 @@ class octave_swig_type : public octave_base_value {
if (it!=members.end())
return &it->second;
const swig_octave_member* m;
for (int j=0;j<types.size();++j)
for (unsigned int j=0;j<types.size();++j)
if ((m=find_member(types[j].first,name)))
return &members.insert
(std::make_pair(name,std::make_pair(m,octave_value()))).first->second;
@ -228,7 +232,7 @@ class octave_swig_type : public octave_base_value {
const swig_type_info* find_base(const std::string& name,
const swig_type_info* base) {
if (!base) {
for (int j=0;j<types.size();++j) {
for (unsigned int j=0;j<types.size();++j) {
assert(types[j].first->clientdata);
swig_octave_class* cj=(swig_octave_class*)types[j].first->clientdata;
if (cj->name==name)
@ -250,7 +254,7 @@ class octave_swig_type : public octave_base_value {
return 0;
assert(c->base[j]->clientdata);
swig_octave_class* cj=(swig_octave_class*)c->base[j]->clientdata;
if (c->name==name)
if (cj->name==name)
return c->base[j];
}
return 0;
@ -346,7 +350,7 @@ class octave_swig_type : public octave_base_value {
~octave_swig_type() {
if (own) {
++count;
for (int j=0;j<types.size();++j) {
for (unsigned int j=0;j<types.size();++j) {
if (!types[j].first||!types[j].first->clientdata)
continue;
swig_octave_class* c=(swig_octave_class*)types[j].first->clientdata;
@ -356,7 +360,7 @@ class octave_swig_type : public octave_base_value {
}
}
}
for (int j=0;j<types.size();++j)
for (unsigned int j=0;j<types.size();++j)
Swig::erase_rtdir(types[j].second.ptr);
}
@ -381,7 +385,7 @@ class octave_swig_type : public octave_base_value {
// * need some way to manually name subclasses.
// * eg optional first arg to subclass(), or named_subclass()
std::string ret;
for (int j=0;j<types.size();++j) {
for (unsigned int j=0;j<types.size();++j) {
if (j)
ret+="_";
if (types[j].first->clientdata) {
@ -394,7 +398,7 @@ class octave_swig_type : public octave_base_value {
}
void merge(octave_swig_type& rhs) {
rhs.own=0;
for (int j=0;j<rhs.types.size();++j) {
for (unsigned int j=0;j<rhs.types.size();++j) {
assert(!rhs.types[j].second.destroyed);
Swig::Director* d=Swig::get_rtdir(rhs.types[j].second.ptr);
if (d)
@ -407,10 +411,9 @@ class octave_swig_type : public octave_base_value {
}
void install_global() {
for (member_map::const_iterator it=members.begin();it!=members.end();++it) {
const char* it_first=it->first.c_str();
member_value_pair it_second=it->second;
if (it->second.first&&it->second.first->method)
install_builtin_function(it->second.first->method,it->first,std::string());
install_builtin_function(it->second.first->method,it->first,
/*it->second.first->doc?it->second.first->doc:*/std::string());
else if (it->second.second.is_defined()) {
link_to_global_variable(curr_sym_tab->lookup(it->first,true));
set_global_value(it->first,it->second.second);
@ -424,10 +427,10 @@ class octave_swig_type : public octave_base_value {
own = 0;
if (!type&&types.size())
return types[0].second.ptr;
for (int j=0;j<types.size();++j)
for (unsigned int j=0;j<types.size();++j)
if (type==types[j].first)
return types[j].second.ptr;
for (int j=0;j<types.size();++j) {
for (unsigned int j=0;j<types.size();++j) {
swig_cast_info *tc=SWIG_TypeCheck(types[j].first->name,type);
if (!tc)
continue;
@ -443,7 +446,7 @@ class octave_swig_type : public octave_base_value {
}
void director_destroyed(Swig::Director* d) {
bool found=false;
for (int j=0;j<types.size();++j) {
for (unsigned int j=0;j<types.size();++j) {
Swig::Director* dj=Swig::get_rtdir(types[j].second.ptr);
if (dj==d) {
types[j].second.destroyed=true;
@ -519,7 +522,7 @@ class octave_swig_type : public octave_base_value {
subname=subname_ovl(0).string_value();
const swig_type_info* next_base=find_base(subname,base);
if (!next_base||skip>=ops.size()||ops[skip]!='.')
if (!next_base||skip>=(int)ops.size()||ops[skip]!='.')
break;
base=next_base;
}
@ -536,7 +539,7 @@ class octave_swig_type : public octave_base_value {
if (!m->first||(!m->first->is_static()&&
!m->first->is_global()))
args.append(as_value());
if (skip<ops.size()&&ops[skip]=='('&&
if (skip<(int)ops.size()&&ops[skip]=='('&&
((m->first&&m->first->method)||m->second.is_function()||
m->second.is_function_handle())) {
args.append(*idx_it++);
@ -564,7 +567,7 @@ class octave_swig_type : public octave_base_value {
}
}
if (skip>=ops.size())
if (skip>=(int)ops.size())
return sub_ovl;
if (sub_ovl.length()<1) {
error("bad subs ref");
@ -743,7 +746,7 @@ class octave_swig_type : public octave_base_value {
}
os<<"{"<<std::endl;
for (int j=0;j<types.size();++j) {
for (unsigned int j=0;j<types.size();++j) {
if (types[j].first->clientdata) {
const swig_octave_class* c=(const swig_octave_class*)types[j].first->clientdata;
os<<" "<<c->name<<", ptr = "<<types[j].second.ptr<<std::endl;
@ -757,7 +760,7 @@ class octave_swig_type : public octave_base_value {
const char* modifier=(it->second.first->flags&1)?"static":
(it->second.first->flags&2)?"global":"";
os<<it->second.first->name<<" (c++ "<<
modifier<<")"<<std::endl;
modifier<<" "<<objtype<<")"<<std::endl;
assert(it->second.first->name==it->first);
} else {
os<<it->first<<" (octave value)"<<std::endl;

View file

@ -43,6 +43,8 @@
SWIG_Octave_SetConstant(module_ns,"$symname",octave_value($value));
}
%typecheck(SWIG_TYPECHECK_SWIGOBJECT) SWIG_Object "$1 = (*$input).is_defined();";
/*
// Smart Pointers
%typemap(out,noblock=1) const SWIGTYPE & SMARTPOINTER {

View file

@ -11,6 +11,7 @@ char cvsroot_octave_cxx[] = "$Id$";
#include "swigmod.h"
#include <string>
#include <map>
static const char *usage = (char *) "\
Octave Options (available with -octave)\n\
@ -19,9 +20,9 @@ Octave Options (available with -octave)\n\
class OCTAVE:public Language {
private:
File *f_runtime;
File *f_header;
File *f_doc;
File *f_wrappers;
File *f_init;
File *f_initbeforefunc;
@ -35,9 +36,41 @@ private:
int have_destructor;
String *constructor_name;
public:
class doc_info {
doc_info& operator= (const doc_info& rhs);
public:
String *decl_info;
String *cdecl_info;
String *synopsis;
String *inarg_info;
String *outarg_info;
doc_info() {
decl_info=NewString("");
cdecl_info=NewString("");
synopsis=NewString("");
inarg_info=NewString("");
outarg_info=NewString("");
}
doc_info(const doc_info& x) {
decl_info = Copy(x.decl_info);
cdecl_info = Copy(x.cdecl_info);
synopsis = Copy(x.synopsis);
inarg_info = Copy(x.inarg_info);
outarg_info = Copy(x.outarg_info);
}
~doc_info() {
Delete(decl_info);
Delete(cdecl_info);
Delete(synopsis);
Delete(inarg_info);
Delete(outarg_info);
}
};
typedef std::map<std::string, doc_info> doc_info_map;
doc_info_map docs;
OCTAVE():f_runtime(0), f_header(0), f_wrappers(0),
public:
OCTAVE():f_runtime(0), f_header(0), f_doc(0), f_wrappers(0),
f_init(0), f_initbeforefunc(0), f_directors(0), f_directors_h(0),
s_global_tab(0), s_members_tab(0), class_name(0) {
enable_cplus_runtime_mode();
@ -92,6 +125,7 @@ public:
SWIG_exit(EXIT_FAILURE);
}
f_header = NewString("");
f_doc = NewString("");
f_wrappers = NewString("");
f_init = NewString("");
f_initbeforefunc = NewString("");
@ -100,6 +134,7 @@ public:
s_global_tab = NewString("");
Swig_register_filebyname("runtime", f_runtime);
Swig_register_filebyname("header", f_header);
Swig_register_filebyname("doc", f_doc);
Swig_register_filebyname("wrapper", f_wrappers);
Swig_register_filebyname("init", f_init);
Swig_register_filebyname("initbeforefunc", f_initbeforefunc);
@ -129,16 +164,19 @@ public:
if (!CPlusPlus)
Printf(f_header,"}\n");
if (docs.size())
emit_doc_texinfo();
if (directorsEnabled())
Swig_insert_file("director.swg", f_runtime);
Printf(f_init, "}\n");
Printf(s_global_tab, "{0,0,0,0,0}\n};\n");
Printf(s_global_tab, "static swig_octave_class swig_module_globals = {" "SWIG_name_d,0,0,0,0,swig_globals,0};\n");
Printv(f_wrappers, s_global_tab, NIL);
SwigType_emit_type_table(f_runtime, f_wrappers);
Dump(f_header, f_runtime);
Dump(f_doc, f_runtime);
if (directorsEnabled()) {
Dump(f_directors_h, f_runtime);
Dump(f_directors, f_runtime);
@ -151,6 +189,7 @@ public:
Delete(f_initbeforefunc);
Delete(f_init);
Delete(f_wrappers);
Delete(f_doc);
Delete(f_header);
Delete(f_directors);
Delete(f_directors_h);
@ -160,6 +199,21 @@ public:
return SWIG_OK;
}
void emit_doc_texinfo() {
for (doc_info_map::iterator it=docs.begin();
it!=docs.end();++it) {
doc_info& d=it->second;
String *wrap_name=NewString(it->first.c_str());
Printf(f_doc,"const char* %s_texinfo = \"",wrap_name);
Delete(wrap_name);
Printf(f_doc,"-*- texinfo -*-\\n");
Printv(f_doc,d.decl_info,d.cdecl_info,d.inarg_info,d.outarg_info,NIL);
Printf(f_doc,"@end deftypefn");
Printf(f_doc,"\";\n");
}
Printf(f_doc,"\n");
}
virtual int importDirective(Node *n) {
String *modname = Getattr(n, "module");
if (modname)
@ -202,7 +256,7 @@ public:
Printv(f->def, "static octave_value_list ", overname, " (const octave_value_list& args, int nargout) {", NIL);
if (!overloaded || last_overload)
Printf(s_global_tab, "{\"%s\",%s,0,0,2},\n", iname, wname);
Printf(s_global_tab, "{\"%s\",%s,0,0,2,%s_texinfo},\n", iname, wname, wname);
emit_args(d, l, f);
emit_attach_parmmaps(l, f);
@ -213,7 +267,7 @@ public:
int varargs = emit_isvarargs(l);
char source[64];
Printf(f->code, "if (!SWIG_check_num_args(\"%s\",args.length(),%i,%i)) " "{\n return octave_value_list();\n }\n", iname, num_arguments, num_required);
Printf(f->code, "if (!SWIG_check_num_args(\"%s\",args.length(),%i,%i)) " "{\n SWIG_fail;\n }\n", iname, num_arguments, num_required);
if (constructor && num_arguments == 1 && num_required == 1) {
if (Cmp(storage, "explicit") == 0) {
@ -392,6 +446,14 @@ public:
Replaceall(f->code, "$symname", iname);
// SwigType_str(Getattr(sibl, "name"), 0), ParmList_protostr(Getattr(sibl, "wrap:parms")
{
const char* wname_cstr = (const char*)Data(wname);
doc_info& d=docs[wname_cstr];
Printf(d.cdecl_info, "%s(%s)\\n", iname, ParmList_protostr(l));
}
Wrapper_print(f, f_wrappers);
DelWrapper(f);
Delete(overname);
@ -493,7 +555,7 @@ public:
Append(getf->code, "}\n");
Wrapper_print(getf, f_wrappers);
Printf(s_global_tab, "{\"%s\",0,_wrap_%s,_wrap_%s,2},\n", iname, getname, setname);
Printf(s_global_tab, "{\"%s\",0,_wrap_%s,_wrap_%s,2,0},\n", iname, getname, setname);
return SWIG_OK;
}
@ -592,7 +654,7 @@ public:
Printf(disown_shadow, "}\n");
Printv(f_wrappers, disown_shadow, NIL);
Delete(disown_shadow);
Printf(s_members_tab, "{\"__disown\",_wrap_disown_%s_shadow,0,0,0},\n", class_name);
Printf(s_members_tab, "{\"__disown\",_wrap_disown_%s_shadow,0,0,0,0},\n", class_name);
}
Printf(s_members_tab, "{0,0,0,0}\n};\n");
@ -660,7 +722,8 @@ public:
String *rname = Swig_name_wrapper(Swig_name_member(class_name, realname));
if (!Getattr(n, "sym:nextSibling"))
Printf(s_members_tab, "{\"%s\",%s,0,0,0},\n", realname, rname);
Printf(s_members_tab, "{\"%s\",%s,0,0,0,%s_texinfo},\n",
realname, rname, rname);
Delete(rname);
return SWIG_OK;
@ -677,7 +740,7 @@ public:
NewString("octave_set_immutable") : Swig_name_wrapper(Swig_name_set(Swig_name_member(class_name, symname)));
assert(s_members_tab);
Printf(s_members_tab, "{\"%s\",0,%s,%s,0},\n", symname, getname, setname);
Printf(s_members_tab, "{\"%s\",0,%s,%s,0,0},\n", symname, getname, setname);
Delete(getname);
Delete(setname);
@ -727,7 +790,8 @@ public:
String *rname = Swig_name_wrapper(Swig_name_member(class_name, realname));
if (!Getattr(n, "sym:nextSibling"))
Printf(s_members_tab, "{\"%s\",%s,0,0,1},\n", realname, rname);
Printf(s_members_tab, "{\"%s\",%s,0,0,1,%s_texinfo},\n",
realname, rname, rname);
Delete(rname);
return SWIG_OK;
@ -749,7 +813,7 @@ public:
NewString("octave_set_immutable") : Swig_name_wrapper(Swig_name_set(Swig_name_member(class_name, symname)));
assert(s_members_tab);
Printf(s_members_tab, "{\"%s\",0,%s,%s,1},\n", symname, getname, setname);
Printf(s_members_tab, "{\"%s\",0,%s,%s,1,0},\n", symname, getname, setname);
Delete(getname);
Delete(setname);