(Xml_print_attributes): Do "&" replacement

before any others that might introduce "&" into
the stream.


git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@4230 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Thien-Thi Nguyen 2003-01-08 12:19:28 +00:00
parent ae4f3e72b3
commit 25c8a3d592
1 changed files with 64 additions and 63 deletions

View File

@ -1,13 +1,13 @@
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
* Xml.cxx * Xml.cxx
* *
* A web-base parse tree Xml using SWILL. This is an optional * A web-base parse tree Xml using SWILL. This is an optional
* feature that's normally disabled. * feature that's normally disabled.
* *
* Author(s) : David Beazley (beazley@cs.uchicago.edu) * Author(s) : David Beazley (beazley@cs.uchicago.edu)
* *
* Copyright (C) 2002. The University of Chicago * Copyright (C) 2002. The University of Chicago
* See the file LICENSE for information on usage and redistribution. * See the file LICENSE for information on usage and redistribution.
* ----------------------------------------------------------------------------- */ * ----------------------------------------------------------------------------- */
char cvsroot_xml_cxx[] = "$Header$"; char cvsroot_xml_cxx[] = "$Header$";
@ -20,9 +20,9 @@ XML Options (available with -xml)\n\
//static Node *view_top = 0; //static Node *view_top = 0;
static File *out = 0; static File *out = 0;
class XML class XML
: public Language : public Language
{ {
@ -55,7 +55,7 @@ public:
Swig_mark_arg (iX); Swig_mark_arg (iX);
String * outfile = NewString( argv[iX] ); String * outfile = NewString( argv[iX] );
out = NewFile(outfile,"w"); out = NewFile(outfile,"w");
if (!out) if (!out)
{ {
Printf(stderr,"*** Can't open '%s'\n", outfile); Printf(stderr,"*** Can't open '%s'\n", outfile);
SWIG_exit(EXIT_FAILURE); SWIG_exit(EXIT_FAILURE);
@ -75,18 +75,18 @@ public:
fputs( usage, stderr ); fputs( usage, stderr );
} }
} }
} }
/* Top of the parse tree */ /* Top of the parse tree */
virtual int top(Node *n) virtual int top(Node *n)
{ {
if( out == 0 ) if( out == 0 )
{ {
String *outfile = Getattr(n,"outfile"); String *outfile = Getattr(n,"outfile");
Replaceall(outfile,"_wrap.cxx", ".xml"); Replaceall(outfile,"_wrap.cxx", ".xml");
out = NewFile(outfile,"w"); out = NewFile(outfile,"w");
if (!out) if (!out)
{ {
Printf(stderr,"*** Can't open '%s'\n", outfile); Printf(stderr,"*** Can't open '%s'\n", outfile);
SWIG_exit(EXIT_FAILURE); SWIG_exit(EXIT_FAILURE);
@ -99,22 +99,22 @@ public:
void print_indent(int l) void print_indent(int l)
{ {
int i; int i;
for (i = 0; i < indent_level; i++) for (i = 0; i < indent_level; i++)
{ {
Printf(out, " "); Printf(out, " ");
} }
if (l) if (l)
{ {
Printf(out, " "); Printf(out, " ");
} }
} }
void Xml_print_tree(DOH *obj) void Xml_print_tree(DOH *obj)
{ {
while (obj) while (obj)
{ {
Xml_print_node(obj); Xml_print_node(obj);
obj = nextSibling(obj); obj = nextSibling(obj);
@ -127,61 +127,62 @@ public:
indent_level += 4; indent_level += 4;
print_indent(0); print_indent(0);
Printf( out, "<attributelist id=\"%ld\" addr=\"%x\" >\n", ++id, obj ); Printf( out, "<attributelist id=\"%ld\" addr=\"%x\" >\n", ++id, obj );
indent_level += 4; indent_level += 4;
k = Firstkey(obj); k = Firstkey(obj);
while (k) while (k)
{ {
if ((Cmp(k,"nodeType") == 0) if ((Cmp(k,"nodeType") == 0)
|| (Cmp(k,"firstChild") == 0) || (Cmp(k,"firstChild") == 0)
|| (Cmp(k,"lastChild") == 0) || (Cmp(k,"lastChild") == 0)
|| (Cmp(k,"parentNode") == 0) || (Cmp(k,"parentNode") == 0)
|| (Cmp(k,"nextSibling") == 0) || (Cmp(k,"nextSibling") == 0)
|| (Cmp(k,"previousSibling") == 0) || (Cmp(k,"previousSibling") == 0)
|| (*(Char(k)) == '$')) || (*(Char(k)) == '$'))
{ {
/* Do nothing */ /* Do nothing */
} }
else if (Cmp(k,"module") == 0) else if (Cmp(k,"module") == 0)
{ {
Xml_print_module( Getattr(obj,k) ); Xml_print_module( Getattr(obj,k) );
} }
else if (Cmp(k,"baselist") == 0) else if (Cmp(k,"baselist") == 0)
{ {
Xml_print_baselist( Getattr(obj,k) ); Xml_print_baselist( Getattr(obj,k) );
} }
else if (Cmp(k,"typescope") == 0) else if (Cmp(k,"typescope") == 0)
{ {
Xml_print_typescope( Getattr(obj,k) ); Xml_print_typescope( Getattr(obj,k) );
} }
else if (Cmp(k,"typetab") == 0) else if (Cmp(k,"typetab") == 0)
{ {
Xml_print_typetab( Getattr(obj,k) ); Xml_print_typetab( Getattr(obj,k) );
} }
else if (Cmp(k,"kwargs") == 0) else if (Cmp(k,"kwargs") == 0)
{ {
Xml_print_kwargs( Getattr(obj,k) ); Xml_print_kwargs( Getattr(obj,k) );
} }
else if (Cmp(k,"parms") == 0 || Cmp(k, "pattern") == 0 ) else if (Cmp(k,"parms") == 0 || Cmp(k, "pattern") == 0 )
{ {
Xml_print_parmlist( Getattr(obj,k) ); Xml_print_parmlist( Getattr(obj,k) );
} }
else else
{ {
DOH *o; DOH *o;
print_indent(0); print_indent(0);
if (DohIsString(Getattr(obj,k))) if (DohIsString(Getattr(obj,k)))
{ {
o = Str(Getattr(obj,k)); o = Str(Getattr(obj,k));
Replaceall( k, ":", "_" ); Replaceall( k, ":", "_" );
Replaceall( o, "<", "&lt;" ); /* Do first to avoid aliasing errors. */
Replaceall( o, "&", "&amp;" ); Replaceall( o, "&", "&amp;" );
Replaceall( o, "<", "&lt;" );
Replaceall( o, "\"", "&quot;" ); Replaceall( o, "\"", "&quot;" );
Replaceall( o, "\\", "\\\\" ); Replaceall( o, "\\", "\\\\" );
Printf(out,"<attribute name=\"%s\" value=\"%s\" id=\"%ld\" addr=\"%x\" />\n", k, o, ++id, o ); Printf(out,"<attribute name=\"%s\" value=\"%s\" id=\"%ld\" addr=\"%x\" />\n", k, o, ++id, o );
Delete(o); Delete(o);
} }
else else
{ {
o = Getattr(obj,k); o = Getattr(obj,k);
Replaceall( k, ":", "_" ); Replaceall( k, ":", "_" );
@ -196,22 +197,22 @@ public:
indent_level -= 4; indent_level -= 4;
} }
void Xml_print_node(Node *obj) void Xml_print_node(Node *obj)
{ {
Node *cobj; Node *cobj;
print_indent(0); print_indent(0);
Printf(out,"<%s id=\"%ld\" addr=\"%x\" >\n", nodeType(obj), ++id, obj); Printf(out,"<%s id=\"%ld\" addr=\"%x\" >\n", nodeType(obj), ++id, obj);
Xml_print_attributes( obj ); Xml_print_attributes( obj );
cobj = firstChild(obj); cobj = firstChild(obj);
if (cobj) if (cobj)
{ {
indent_level += 4; indent_level += 4;
Printf(out,"\n"); Printf(out,"\n");
Xml_print_tree(cobj); Xml_print_tree(cobj);
indent_level -= 4; indent_level -= 4;
} }
else else
{ {
print_indent(1); print_indent(1);
Printf(out,"\n"); Printf(out,"\n");
@ -221,13 +222,13 @@ public:
} }
void Xml_print_parmlist(ParmList *p) void Xml_print_parmlist(ParmList *p)
{ {
print_indent(0); print_indent(0);
Printf( out, "<parmlist id=\"%ld\" addr=\"%x\" >\n", ++id, p ); Printf( out, "<parmlist id=\"%ld\" addr=\"%x\" >\n", ++id, p );
indent_level += 4; indent_level += 4;
while(p) while(p)
{ {
print_indent(0); print_indent(0);
Printf( out, "<parm id=\"%ld\">\n", ++id ); Printf( out, "<parm id=\"%ld\">\n", ++id );
@ -236,62 +237,62 @@ public:
Printf( out, "</parm >\n" ); Printf( out, "</parm >\n" );
p = nextSibling(p); p = nextSibling(p);
} }
indent_level -= 4; indent_level -= 4;
print_indent(0); print_indent(0);
Printf( out, "</parmlist >\n" ); Printf( out, "</parmlist >\n" );
} }
void Xml_print_baselist(List *p) void Xml_print_baselist(List *p)
{ {
print_indent(0); print_indent(0);
Printf( out, "<baselist id=\"%ld\" addr=\"%x\" >\n", ++id, p ); Printf( out, "<baselist id=\"%ld\" addr=\"%x\" >\n", ++id, p );
indent_level += 4; indent_level += 4;
String *s; String *s;
for (s = Firstitem(p); s; s = Nextitem(p)) for (s = Firstitem(p); s; s = Nextitem(p))
{ {
print_indent(0); print_indent(0);
Printf( out, "<base name=\"%s\" id=\"%ld\" addr=\"%x\" />\n", s, ++id, s ); Printf( out, "<base name=\"%s\" id=\"%ld\" addr=\"%x\" />\n", s, ++id, s );
} }
indent_level -= 4; indent_level -= 4;
print_indent(0); print_indent(0);
Printf( out, "</baselist >\n" ); Printf( out, "</baselist >\n" );
} }
void Xml_print_module(Node *p) void Xml_print_module(Node *p)
{ {
print_indent(0); print_indent(0);
Printf( out, "<attribute name=\"module\" value=\"%s\" id=\"%ld\" addr=\"%x\" />\n", Getattr( p, "name"), ++id, p ); Printf( out, "<attribute name=\"module\" value=\"%s\" id=\"%ld\" addr=\"%x\" />\n", Getattr( p, "name"), ++id, p );
} }
void Xml_print_kwargs(Hash *p) void Xml_print_kwargs(Hash *p)
{ {
Xml_print_hash( p, "kwargs" ); Xml_print_hash( p, "kwargs" );
} }
void Xml_print_typescope(Hash *p) void Xml_print_typescope(Hash *p)
{ {
Xml_print_hash( p, "typescope" ); Xml_print_hash( p, "typescope" );
} }
void Xml_print_typetab(Hash *p) void Xml_print_typetab(Hash *p)
{ {
Xml_print_hash( p, "typetab" ); Xml_print_hash( p, "typetab" );
} }
void Xml_print_hash(Hash *p, const char * markup) void Xml_print_hash(Hash *p, const char * markup)
{ {
print_indent(0); print_indent(0);
Printf( out, "<%s id=\"%ld\" addr=\"%x\" >\n", markup, ++id, p ); Printf( out, "<%s id=\"%ld\" addr=\"%x\" >\n", markup, ++id, p );
Xml_print_attributes( p ); Xml_print_attributes( p );
indent_level += 4; indent_level += 4;
Node * n = Firstitem( p ); Node * n = Firstitem( p );
while(n) while(n)
{ {
print_indent(0); print_indent(0);
Printf( out, "<%ssitem id=\"%ld\" addr=\"%x\" >\n", markup, ++id, n ); Printf( out, "<%ssitem id=\"%ld\" addr=\"%x\" >\n", markup, ++id, n );
@ -301,7 +302,7 @@ public:
Printf( out, " />\n" ); Printf( out, " />\n" );
n = Nextkey(p); n = Nextkey(p);
} }
indent_level -= 4; indent_level -= 4;
print_indent(0); print_indent(0);
Printf( out, "</%s >\n", markup ); Printf( out, "</%s >\n", markup );
} }