Major refactoring of DOH List/Hash iterators. See CHANGES

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@5101 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Dave Beazley 2003-09-11 20:26:57 +00:00
commit 8ae4c60d39
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,$$);