| // Copyright (C) 2008-2012 IBM Corporation and Others. All Rights Reserved. |
| #include <stdio.h> |
| #include "xmlout.h" |
| #include <unistd.h> |
| #include <stdlib.h> |
| |
| XMLFile::XMLFile(FILE *f) { |
| file = f; |
| level = 0; |
| } |
| |
| XMLFile::~XMLFile() |
| { |
| |
| } |
| |
| void XMLFile::write(const char *s) { |
| fputs(s, file); |
| } |
| |
| void XMLFile::writeln(const char *s) { |
| writeIndent(); |
| write(s); |
| write("\n"); |
| } |
| |
| int XMLFile::indent(const char *s, bool single) { |
| int oldLevel = level; |
| writeln(s); |
| level++; |
| if(single) { |
| level--; |
| } |
| return oldLevel; |
| } |
| int XMLFile::outdent(const char *s) { |
| level--; |
| writeln(s); |
| return level; |
| } |
| |
| void XMLFile::writeIndent() { |
| for(int i=0;i<level;i++) { |
| write("\t"); |
| } |
| } |
| |
| XMLElement::XMLElement(XMLFile &f, const char *name, const char *attribs, bool single) : file(f), name(name), single(single) { |
| char outs[200]; |
| if(attribs!=NULL) { |
| sprintf(outs,"<%s %s", name, attribs); |
| } else { |
| sprintf(outs, "<%s", name); |
| } |
| if(single) { |
| strcat(outs, "/>"); |
| } else { |
| strcat(outs, ">"); |
| } |
| oldlevel = file.indent(outs, single); |
| } |
| |
| XMLElement::~XMLElement() { |
| if(!single) { |
| char outs[200]; |
| sprintf(outs,"</%s>", name); |
| int newlevel = file.outdent(outs); |
| if(newlevel != oldlevel) { |
| fprintf(stderr, "@@@ ERROR: elemet %s popped out to level %d but expected %d. Abort.\n", name, newlevel, oldlevel); |
| fflush(stderr); |
| abort(); |
| } |
| } |
| } |
| |
| |
| |