Work in Progress
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@530 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
b23b433bb3
commit
79841da9d6
1 changed files with 74 additions and 21 deletions
|
|
@ -132,7 +132,7 @@ emit_function(DOH *obj, void *clientdata) {
|
||||||
DOHHash *p;
|
DOHHash *p;
|
||||||
SwigWrapper *wf;
|
SwigWrapper *wf;
|
||||||
int numarg = 0, numopt = 0;
|
int numarg = 0, numopt = 0;
|
||||||
int i;
|
int i, pn;
|
||||||
|
|
||||||
if (ExternMode) return 0;
|
if (ExternMode) return 0;
|
||||||
|
|
||||||
|
|
@ -164,20 +164,25 @@ emit_function(DOH *obj, void *clientdata) {
|
||||||
DOHString *inputstr;
|
DOHString *inputstr;
|
||||||
DOHString *checkstr;
|
DOHString *checkstr;
|
||||||
DOHString *initstr;
|
DOHString *initstr;
|
||||||
|
DOHString *targetstr;
|
||||||
|
|
||||||
parsestr = NewString("");
|
parsestr = NewString("");
|
||||||
argstr = NewString("");
|
argstr = NewString("");
|
||||||
inputstr = NewString("");
|
inputstr = NewString("");
|
||||||
checkstr = NewString("");
|
checkstr = NewString("");
|
||||||
initstr = NewString("");
|
initstr = NewString("");
|
||||||
|
targetstr = NewString("");
|
||||||
|
|
||||||
p = parms;
|
p = parms;
|
||||||
i = 0;
|
pn = 0;
|
||||||
|
|
||||||
while (p) {
|
while (p) {
|
||||||
int nmatch = 0;
|
int nmatch = 0;
|
||||||
DOHHash *map;
|
DOHHash *map;
|
||||||
DOHHash *rules;
|
DOHHash *rules;
|
||||||
|
char suffix[32];
|
||||||
|
|
||||||
|
sprintf(suffix,"_%d", pn);
|
||||||
|
|
||||||
map = Swig_map_match(Rules, "argument", p, &nmatch);
|
map = Swig_map_match(Rules, "argument", p, &nmatch);
|
||||||
|
|
||||||
|
|
@ -185,22 +190,23 @@ emit_function(DOH *obj, void *clientdata) {
|
||||||
Printf(stderr,"%s:%d. No argument rule for %S\n", Getfile(p),Getline(p),SwigType_cstr(Getattr(p,"type"),Getattr(p,"name")));
|
Printf(stderr,"%s:%d. No argument rule for %S\n", Getfile(p),Getline(p),SwigType_cstr(Getattr(p,"type"),Getattr(p,"name")));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Printf(stdout,"Got match: %s\n", Getattr(map,"parms"));
|
|
||||||
|
|
||||||
/* Pull out the rules */
|
/* Pull out the rules */
|
||||||
|
|
||||||
rules = Getattr(map,"rules");
|
rules = Getattr(map,"rules");
|
||||||
if (rules) {
|
if (rules) {
|
||||||
DOH *linit;
|
DOH *linit;
|
||||||
DOH *lparse;
|
DOH *lparse;
|
||||||
DOH *linput;
|
DOH *linput;
|
||||||
DOH *lcheck;
|
DOH *lcheck;
|
||||||
|
DOH *largstr;
|
||||||
|
DOH *ltarget;
|
||||||
|
|
||||||
linit = Getattr(rules,"init");
|
linit = Copy(Getattr(rules,"init"));
|
||||||
lparse = Getattr(rules,"parse");
|
lparse = Copy(Getattr(rules,"parse"));
|
||||||
linput = Getattr(rules,"input");
|
linput = Copy(Getattr(rules,"input"));
|
||||||
lcheck = Getattr(rules,"check");
|
lcheck = Copy(Getattr(rules,"check"));
|
||||||
|
ltarget = Copy(Getattr(rules,"target"));
|
||||||
|
|
||||||
|
largstr = 0;
|
||||||
/* Construct the parse and argument strings */
|
/* Construct the parse and argument strings */
|
||||||
|
|
||||||
if (lparse) {
|
if (lparse) {
|
||||||
|
|
@ -209,9 +215,6 @@ emit_function(DOH *obj, void *clientdata) {
|
||||||
int i;
|
int i;
|
||||||
Seek(lparse,0,SEEK_SET);
|
Seek(lparse,0,SEEK_SET);
|
||||||
sp = DohSplit(lparse,",",-1);
|
sp = DohSplit(lparse,",",-1);
|
||||||
|
|
||||||
Printf(stdout,"*** %s\n", sp);
|
|
||||||
|
|
||||||
pstr = Getitem(sp,0);
|
pstr = Getitem(sp,0);
|
||||||
if (pstr) {
|
if (pstr) {
|
||||||
char *c = Char(pstr);
|
char *c = Char(pstr);
|
||||||
|
|
@ -222,33 +225,83 @@ emit_function(DOH *obj, void *clientdata) {
|
||||||
c++;
|
c++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
largstr = NewString("");
|
||||||
for (i = 1; i < Len(sp); i++) {
|
for (i = 1; i < Len(sp); i++) {
|
||||||
Printf(argstr,",%s",Getitem(sp,i));
|
Printf(largstr,",%s",Getitem(sp,i));
|
||||||
|
}
|
||||||
|
Delete(sp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Variable substitution. We're going to walk down the map's children and perform variable name
|
||||||
|
replacements */
|
||||||
|
|
||||||
|
{
|
||||||
|
DOH *c = Getattr(map,"child");
|
||||||
|
while (c) {
|
||||||
|
if (Cmp(Getattr(c,"tag"),"variable") == 0) {
|
||||||
|
DOH *vname;
|
||||||
|
DOH *rname;
|
||||||
|
DOH *vtype;
|
||||||
|
DOH *vvalue;
|
||||||
|
DOH *storage;
|
||||||
|
DOH *local;
|
||||||
|
|
||||||
|
storage = Getattr(c,"storage");
|
||||||
|
vname = Getattr(c,"name");
|
||||||
|
vtype = Getattr(c,"type");
|
||||||
|
vvalue = Getattr(c,"value");
|
||||||
|
|
||||||
|
rname = NewStringf("%s_%d",vname,pn);
|
||||||
|
|
||||||
|
if (largstr) Replace(largstr,vname,rname,DOH_REPLACE_ID | DOH_REPLACE_NOQUOTE);
|
||||||
|
if (linit) Replace(linit,vname,rname,DOH_REPLACE_ID | DOH_REPLACE_NOQUOTE);
|
||||||
|
if (linput) Replace(linput,vname,rname,DOH_REPLACE_ID | DOH_REPLACE_NOQUOTE);
|
||||||
|
if (lcheck) Replace(lcheck,vname,rname,DOH_REPLACE_ID | DOH_REPLACE_NOQUOTE);
|
||||||
|
if (ltarget) Replace(ltarget,vname,rname, DOH_REPLACE_ID | DOH_REPLACE_NOQUOTE);
|
||||||
|
|
||||||
|
/* Declare as local to wrapper function */
|
||||||
|
local = NewString("");
|
||||||
|
Printf(local,"%S", SwigType_cstr(vtype,rname));
|
||||||
|
if (vvalue) {
|
||||||
|
Printf(local," = %s", vvalue);
|
||||||
|
}
|
||||||
|
SwigWrapper_add_local(wf,local,rname);
|
||||||
|
Delete(local);
|
||||||
|
Delete(rname);
|
||||||
|
}
|
||||||
|
c = Swig_next(c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (largstr) Append(argstr, largstr);
|
||||||
if (linput) Append(inputstr,linput);
|
if (linput) Append(inputstr,linput);
|
||||||
if (lcheck) Append(checkstr,lcheck);
|
if (lcheck) Append(checkstr,lcheck);
|
||||||
if (linit) Append(initstr,linit);
|
if (linit) Append(initstr,linit);
|
||||||
|
if (ltarget) Printf(targetstr,"%s,", ltarget);
|
||||||
|
Delete(largstr);
|
||||||
|
Delete(linput);
|
||||||
|
Delete(lcheck);
|
||||||
|
Delete(linit);
|
||||||
|
Delete(ltarget);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
while (nmatch > 0) {
|
while (nmatch > 0) {
|
||||||
p = Swig_next(p);
|
p = Swig_next(p);
|
||||||
nmatch--;
|
nmatch--;
|
||||||
|
pn++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Dump out the wrapper code */
|
||||||
|
|
||||||
|
if (pn > 0)
|
||||||
|
Delitem(targetstr,DOH_END);
|
||||||
|
|
||||||
Printv(wf->code,
|
Printv(wf->code,
|
||||||
"init:\n",
|
|
||||||
initstr,
|
initstr,
|
||||||
"\nparse:\n",
|
"if (PyParse_Args(\"", parsestr, "\"", argstr, ") == NULL) return NULL;\n",
|
||||||
parsestr,
|
|
||||||
"\nargstr:\n",
|
|
||||||
argstr,
|
|
||||||
"\ninput:\n",
|
|
||||||
inputstr,
|
inputstr,
|
||||||
"\ncheck:\n",
|
|
||||||
checkstr,
|
checkstr,
|
||||||
|
"result = ", name, "(", targetstr, ");\n",
|
||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue