Major refactoring of DOH List/Hash iterators. See CHANGES

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@5101 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Dave Beazley 2003-09-11 20:26:57 +00:00
commit 4cf4dad108
35 changed files with 657 additions and 636 deletions

View file

@ -87,10 +87,12 @@ static Node *new_node(const String_or_char *tag) {
static Node *copy_node(Node *n) {
Node *nn;
String *key;
Iterator k;
nn = NewHash();
Setfile(nn,Getfile(n));
Setline(nn,Getline(n));
for (key = Firstkey(n); key; key = Nextkey(n)) {
for (k = First(n); k.key; k = Next(k)) {
key = k.key;
if ((Strcmp(key,"nextSibling") == 0) ||
(Strcmp(key,"previousSibling") == 0) ||
(Strcmp(key,"parentNode") == 0) ||
@ -102,7 +104,7 @@ static Node *copy_node(Node *n) {
if ((Strcmp(key,"sym:name") == 0) ||
(Strcmp(key,"sym:weak") == 0) ||
(Strcmp(key,"sym:typename") == 0)) {
Setattr(nn,key, Copy(Getattr(n,key)));
Setattr(nn,key, Copy(k.item));
continue;
}
if (Strcmp(key,"sym:symtab") == 0) {
@ -115,7 +117,7 @@ static Node *copy_node(Node *n) {
/* If children. We copy them recursively using this function */
if (Strcmp(key,"firstChild") == 0) {
/* Copy children */
Node *cn = Getattr(n,key);
Node *cn = k.item;
while (cn) {
appendChild(nn,copy_node(cn));
cn = nextSibling(cn);
@ -135,11 +137,11 @@ static Node *copy_node(Node *n) {
continue;
}
if ((Strcmp(key,"parms") == 0) || (Strcmp(key,"pattern") == 0) || (Strcmp(key,"throws") == 0)) {
Setattr(nn,key,CopyParmList(Getattr(n,key)));
Setattr(nn,key,CopyParmList(k.item));
continue;
}
/* Looks okay. Just copy the data using Copy */
Setattr(nn, key, Copy(Getattr(n,key)));
Setattr(nn, key, Copy(k.item));
}
return nn;
}
@ -527,12 +529,12 @@ static void merge_extensions(Node *cls, Node *am) {
extensions for templates */
static void check_extensions() {
String *key;
Iterator ki;
if (!extendhash) return;
for (key = Firstkey(extendhash); key; key = Nextkey(extendhash)) {
Node *n = Getattr(extendhash,key);
if (!Strstr(key,"<")) {
Swig_warning(WARN_PARSE_EXTEND_UNDEF,Getfile(n), Getline(n), "%%extend defined for an undeclared class %s.\n", key);
for (ki = First(extendhash); ki.key; ki = Next(ki)) {
if (!Strstr(ki.key,"<")) {
Swig_warning(WARN_PARSE_EXTEND_UNDEF,Getfile(ki.item), Getline(ki.item), "%%extend defined for an undeclared class %s.\n", ki.key);
}
}
}
@ -1851,6 +1853,7 @@ template_directive: SWIGTEMPLATE LPAREN idstringopt RPAREN idcolonnt LESSTHAN va
if (ns) {
List *scopes;
String *sname;
Iterator si;
String *name = NewString(prefix);
scopes = NewList();
while (name) {
@ -1861,9 +1864,9 @@ template_directive: SWIGTEMPLATE LPAREN idstringopt RPAREN idcolonnt LESSTHAN va
Delete(name);
name = tprefix;
}
for (sname = Firstitem(scopes); sname; sname = Nextitem(scopes)) {
for (si = First(scopes); si.item; si = Next(si)) {
Node *ns1,*ns2;
sname = si.item;
ns1 = Swig_symbol_clookup(sname,0);
assert(ns1);
if (Strcmp(nodeType(ns1),"namespace") == 0) {
@ -1987,9 +1990,9 @@ template_directive: SWIGTEMPLATE LPAREN idstringopt RPAREN idcolonnt LESSTHAN va
if (baselist) {
List *bases = make_inherit_list(Getattr($$,"name"),baselist);
if (bases) {
Node *s;
for (s = Firstitem(bases); s; s = Nextitem(bases)) {
Symtab *st = Getattr(s,"symtab");
Iterator s;
for (s = First(bases); s.item; s = Next(s)) {
Symtab *st = Getattr(s.item,"symtab");
if (st) {
Swig_symbol_inherit(st);
}
@ -2342,9 +2345,9 @@ cpp_class_decl :
Swig_symbol_newscope();
Swig_symbol_setscopename($3);
if (bases) {
Node *s;
for (s = Firstitem(bases); s; s = Nextitem(bases)) {
Symtab *st = Getattr(s,"symtab");
Iterator s;
for (s = First(bases); s.item; s = Next(s)) {
Symtab *st = Getattr(s.item,"symtab");
if (st) {
Swig_symbol_inherit(st);
}
@ -2714,16 +2717,16 @@ cpp_template_decl : TEMPLATE LESSTHAN template_parms GREATERTHAN { template_para
}
/* Patch argument names with typedef */
{
SwigType *tt;
Iterator tt;
List *tparms = SwigType_parmlist(fname);
ffname = SwigType_templateprefix(fname);
Append(ffname,"<(");
for (tt = Firstitem(tparms); tt; ) {
SwigType *ttr = Swig_symbol_typedef_reduce(tt,0);
for (tt = First(tparms); tt.item; ) {
SwigType *ttr = Swig_symbol_typedef_reduce(tt.item,0);
ttr = Swig_symbol_type_qualify(ttr,0);
Append(ffname,ttr);
tt = Nextitem(tparms);
if (tt) Putc(',',ffname);
tt = Next(tt);
if (tt.item) Putc(',',ffname);
}
Append(ffname,")>");
}
@ -2747,16 +2750,16 @@ cpp_template_decl : TEMPLATE LESSTHAN template_parms GREATERTHAN { template_para
/* This needs to be rewritten */
List *tparms;
String *fname;
SwigType *tt;
Iterator tt;
fname = SwigType_templateprefix(tname);
tparms = SwigType_parmlist(tname);
Append(fname,"<(");
for (tt = Firstitem(tparms); tt; ) {
SwigType *ttr = Swig_symbol_typedef_reduce(tt,0);
for (tt = First(tparms); tt.item; ) {
SwigType *ttr = Swig_symbol_typedef_reduce(tt.item,0);
ttr = Swig_symbol_type_qualify(ttr,0);
Append(fname,ttr);
tt = Nextitem(tparms);
if (tt) Putc(',',fname);
tt = Next(tt);
if (tt.item) Putc(',',fname);
}
Append(fname,")>");
Swig_symbol_cadd(fname,$$);

View file

@ -361,11 +361,11 @@ Swig_cparse_template_expand(Node *n, String *rname, ParmList *tparms) {
{
List *bases = Getattr(n,"baselist");
if (bases) {
String *b;
for (b = Firstitem(bases); b; b = Nextitem(bases)) {
String *qn = Swig_symbol_type_qualify(b,0);
Clear(b);
Append(b,qn);
Iterator b;
for (b = First(bases); b.item; b = Next(b)) {
String *qn = Swig_symbol_type_qualify(b.item,0);
Clear(b.item);
Append(b.item,qn);
}
}
}
@ -473,12 +473,13 @@ Swig_cparse_template_locate(String *name, Parm *tparms) {
char tmp[32];
int i;
List *partials;
String *s, *ss;
String *ss;
Iterator pi;
partials = Getattr(templ,"partials");
if (partials) {
for (s = Firstitem(partials); s; s= Nextitem(partials)) {
ss = Copy(s);
for (pi = First(partials); pi.item; pi = Next(pi)) {
ss = Copy(pi.item);
p = parms;
i = 1;
while (p) {
@ -497,10 +498,10 @@ Swig_cparse_template_locate(String *name, Parm *tparms) {
p = nextSibling(p);
}
if (template_debug) {
Printf(stdout," searching: '%s' (partial specialization - %s)\n", ss, s);
Printf(stdout," searching: '%s' (partial specialization - %s)\n", ss, pi.item);
}
if ((Strcmp(ss,tname) == 0) || (Strcmp(ss,rname) == 0)) {
Append(mpartials,s);
Append(mpartials,pi.item);
}
Delete(ss);
}