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