Index: Source/Swig/swig.h =================================================================== RCS file: /cvsroot/SWIG/Source/Swig/swig.h,v retrieving revision 1.81 diff -u -4 -r1.81 swig.h --- Source/Swig/swig.h 27 Jan 2004 23:39:35 -0000 1.81 +++ Source/Swig/swig.h 30 Jan 2004 22:22:10 -0000 @@ -364,8 +364,10 @@ extern void Swig_print_tags(File *obj, Node *root); extern void Swig_print_tree(Node *obj); extern void Swig_print_node(Node *obj); +extern void Swig_print_xml(Node *obj, String* filename); + /* -- Wrapper function Object */ typedef struct { Hash *localh; Index: Source/Modules/main.cxx =================================================================== RCS file: /cvsroot/SWIG/Source/Modules/main.cxx,v retrieving revision 1.33 diff -u -4 -r1.33 main.cxx --- Source/Modules/main.cxx 22 Jan 2004 22:42:15 -0000 1.33 +++ Source/Modules/main.cxx 30 Jan 2004 22:22:11 -0000 @@ -91,15 +91,17 @@ -w+321,401,-402 \n\ \n\ where code 321(+) is added, and 401(no sign) and 402(-) \n\ are suppressed. See documentation for code meanings.\n\ + -xmlout - Write an XML version of the parse tree to file after normal processing\n\ \n"; // Local variables static int freeze = 0; static String *lang_config = 0; static char *cpp_extension = (char *) "cxx"; static String *outdir = 0; +static String *xmlout = 0; // ----------------------------------------------------------------------------- // check_suffix(char *name) // @@ -215,8 +217,9 @@ char *includefiles[256]; int includecount = 0; int dump_tags = 0; int dump_tree = 0; + int dump_xml = 0; int browse = 0; int dump_typedef = 0; int dump_classes = 0; int werror = 0; @@ -483,8 +486,20 @@ Swig_mark_arg(i); } else if (strcmp(argv[i],"-dump_tree") == 0) { dump_tree = 1; Swig_mark_arg(i); + } else if (strcmp(argv[i],"-dump_xml") == 0) { + dump_xml = 1; + Swig_mark_arg(i); + } else if (strcmp(argv[i],"-xmlout") == 0) { + dump_xml = 1; + Swig_mark_arg(i); + if (argv[i+1]) { + xmlout = NewString(argv[i+1]); + Swig_mark_arg(i+1); + } else { + Swig_arg_error(); + } } else if (strcmp(argv[i],"-nocontract") == 0) { Swig_mark_arg(i); Swig_contract_mode_set(0); } else if (strcmp(argv[i],"-browse") == 0) { @@ -734,8 +749,11 @@ } } if (dump_tree) { Swig_print_tree(top); + } + if (dump_xml) { + Swig_print_xml(top, xmlout); } } if (tm_debug) Swig_typemap_debug(); if (memory_debug) DohMemoryDebug(); Index: Source/Modules/xml.cxx =================================================================== RCS file: /cvsroot/SWIG/Source/Modules/xml.cxx,v retrieving revision 1.10 diff -u -4 -r1.10 xml.cxx --- Source/Modules/xml.cxx 22 Jan 2004 22:42:18 -0000 1.10 +++ Source/Modules/xml.cxx 30 Jan 2004 22:22:11 -0000 @@ -197,18 +197,19 @@ Replaceall( o, "&", "&" ); Replaceall( o, "<", "<" ); Replaceall( o, "\"", """ ); Replaceall( o, "\\", "\\\\" ); - Printf(out,"\n", ck, o, ++id, o ); + Replaceall( o, "\n", " " ); + Printf(out,"\n", ck, o, ++id, o ); Delete(o); Delete(ck); } else { o = Getattr(obj,k); String *ck = NewString(k); Replaceall( ck, ":", "_" ); - Printf(out,"\n", ck, o, ++id, o ); + Printf(out,"\n", ck, o, ++id, o ); Delete(ck); } } ki = Next(ki); @@ -318,11 +319,10 @@ { print_indent(0); Printf( out, "<%ssitem id=\"%ld\" addr=\"%x\" >\n", markup, ++id, n.item ); Xml_print_attributes( n.item ); - Printf( out, "\n", markup ); print_indent(0); - Printf( out, " />\n" ); + Printf( out, "\n", markup ); n = Next(n); } indent_level -= 4; print_indent(0); @@ -336,5 +336,36 @@ return new XML(); } extern "C" Language * swig_xml( void ) { return new_swig_xml(); +} + + +/* ----------------------------------------------------------------------------- + * Swig_print_xml + * + * Dump an XML version of the parse tree. This is different from using the -xml + * language module normally as it allows the real language module to process the + * tree first, possibly stuffing in new attributes, so the XML that is output ends + * up being a post-processing version of the tree. + * ----------------------------------------------------------------------------- */ + +void +Swig_print_xml(DOH *obj, String* filename) +{ + XML xml; + xmllite = 1; + + if (! filename) { + out = stdout; + } + else { + out = NewFile(filename, "w"); + if (!out) { + Printf(stderr,"*** Can't open '%s'\n", filename); + SWIG_exit(EXIT_FAILURE); + } + } + + Printf( out, " \n" ); + xml.Xml_print_tree(obj); }