12e5b6d6dSopenharmony_ci// © 2017 and later: Unicode, Inc. and others. 22e5b6d6dSopenharmony_ci// License & terms of use: http://www.unicode.org/copyright.html 32e5b6d6dSopenharmony_ci// Copyright (C) 2008-2012 IBM Corporation and Others. All Rights Reserved. 42e5b6d6dSopenharmony_ci#include <stdio.h> 52e5b6d6dSopenharmony_ci#include "xmlout.h" 62e5b6d6dSopenharmony_ci#include <unistd.h> 72e5b6d6dSopenharmony_ci#include <stdlib.h> 82e5b6d6dSopenharmony_ci 92e5b6d6dSopenharmony_ciXMLFile::XMLFile(FILE *f) { 102e5b6d6dSopenharmony_ci file = f; 112e5b6d6dSopenharmony_ci level = 0; 122e5b6d6dSopenharmony_ci} 132e5b6d6dSopenharmony_ci 142e5b6d6dSopenharmony_ciXMLFile::~XMLFile() 152e5b6d6dSopenharmony_ci{ 162e5b6d6dSopenharmony_ci 172e5b6d6dSopenharmony_ci} 182e5b6d6dSopenharmony_ci 192e5b6d6dSopenharmony_civoid XMLFile::write(const char *s) { 202e5b6d6dSopenharmony_ci fputs(s, file); 212e5b6d6dSopenharmony_ci} 222e5b6d6dSopenharmony_ci 232e5b6d6dSopenharmony_civoid XMLFile::writeln(const char *s) { 242e5b6d6dSopenharmony_ci writeIndent(); 252e5b6d6dSopenharmony_ci write(s); 262e5b6d6dSopenharmony_ci write("\n"); 272e5b6d6dSopenharmony_ci} 282e5b6d6dSopenharmony_ci 292e5b6d6dSopenharmony_ciint XMLFile::indent(const char *s, bool single) { 302e5b6d6dSopenharmony_ci int oldLevel = level; 312e5b6d6dSopenharmony_ci writeln(s); 322e5b6d6dSopenharmony_ci level++; 332e5b6d6dSopenharmony_ci if(single) { 342e5b6d6dSopenharmony_ci level--; 352e5b6d6dSopenharmony_ci } 362e5b6d6dSopenharmony_ci return oldLevel; 372e5b6d6dSopenharmony_ci} 382e5b6d6dSopenharmony_ciint XMLFile::outdent(const char *s) { 392e5b6d6dSopenharmony_ci level--; 402e5b6d6dSopenharmony_ci writeln(s); 412e5b6d6dSopenharmony_ci return level; 422e5b6d6dSopenharmony_ci} 432e5b6d6dSopenharmony_ci 442e5b6d6dSopenharmony_civoid XMLFile::writeIndent() { 452e5b6d6dSopenharmony_ci for(int i=0;i<level;i++) { 462e5b6d6dSopenharmony_ci write("\t"); 472e5b6d6dSopenharmony_ci } 482e5b6d6dSopenharmony_ci} 492e5b6d6dSopenharmony_ci 502e5b6d6dSopenharmony_ciXMLElement::XMLElement(XMLFile &f, const char *name, const char *attribs, bool single) : file(f), name(name), single(single) { 512e5b6d6dSopenharmony_ci char outs[200]; 522e5b6d6dSopenharmony_ci if(attribs!=NULL) { 532e5b6d6dSopenharmony_ci sprintf(outs,"<%s %s", name, attribs); 542e5b6d6dSopenharmony_ci } else { 552e5b6d6dSopenharmony_ci sprintf(outs, "<%s", name); 562e5b6d6dSopenharmony_ci } 572e5b6d6dSopenharmony_ci if(single) { 582e5b6d6dSopenharmony_ci strcat(outs, "/>"); 592e5b6d6dSopenharmony_ci } else { 602e5b6d6dSopenharmony_ci strcat(outs, ">"); 612e5b6d6dSopenharmony_ci } 622e5b6d6dSopenharmony_ci oldlevel = file.indent(outs, single); 632e5b6d6dSopenharmony_ci} 642e5b6d6dSopenharmony_ci 652e5b6d6dSopenharmony_ciXMLElement::~XMLElement() { 662e5b6d6dSopenharmony_ci if(!single) { 672e5b6d6dSopenharmony_ci char outs[200]; 682e5b6d6dSopenharmony_ci sprintf(outs,"</%s>", name); 692e5b6d6dSopenharmony_ci int newlevel = file.outdent(outs); 702e5b6d6dSopenharmony_ci if(newlevel != oldlevel) { 712e5b6d6dSopenharmony_ci fprintf(stderr, "@@@ ERROR: elemet %s popped out to level %d but expected %d. Abort.\n", name, newlevel, oldlevel); 722e5b6d6dSopenharmony_ci fflush(stderr); 732e5b6d6dSopenharmony_ci abort(); 742e5b6d6dSopenharmony_ci } 752e5b6d6dSopenharmony_ci } 762e5b6d6dSopenharmony_ci} 772e5b6d6dSopenharmony_ci 782e5b6d6dSopenharmony_ci 792e5b6d6dSopenharmony_ci 80