// // aegis - project change supervisor // Copyright (C) 2005, 2006, 2008 Peter Miller // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see // . // #include #include #include #include xml_node_dump::~xml_node_dump() { } xml_node_dump::xml_node_dump(const output::pointer &arg) : op(arg) { } static void c_escape(output::pointer op, const char *s, int len) { while (len-- > 0) { unsigned char c = *s++; switch (c) { case 0: return; case '\r': op->fputs("\\r"); break; case '\n': op->fputs("\\n"); break; case '\t': op->fputs("\\t"); break; case '\b': op->fputs("\\b"); break; case '\f': op->fputs("\\f"); break; case '"': case '\\': op->fputc('\\'); op->fputc(c); break; default: // C locale if (isprint(c)) op->fputc(c); else op->fprintf("\\%03o", c); break; } } } static void c_escape(output::pointer op, const nstring &s) { c_escape(op, s.c_str(), s.size()); } static void print_one(output::pointer op, const char *caption, const nstring &name, const nstring &value) { op->fputs(caption); op->fputs(":"); bool comma = false; if (!name.empty()) { op->fputs(" name = \""); c_escape(op, name); op->fputc('"'); comma = true; } if (!value.empty()) { if (comma) op->fputc(','); op->fputs(" value = \""); c_escape(op, value); op->fputc('"'); } op->fputc('\n'); } void xml_node_dump::none(const nstring &name, const nstring &value) { print_one(op, "none", name, value); } void xml_node_dump::attribute(const nstring &name, const nstring &value) { print_one(op, "attribute", name, value); } void xml_node_dump::comment(const nstring &value) { print_one(op, "comment", "", value); } void xml_node_dump::document(const nstring &value) { print_one(op, "document", "", value); } void xml_node_dump::document_fragment(const nstring &value) { print_one(op, "document fragment", "", value); } void xml_node_dump::document_type(const nstring &name, const nstring &value) { print_one(op, "document type", name, value); } void xml_node_dump::element_begin(const nstring &name) { print_one(op, "element begin", name, ""); } void xml_node_dump::element_end(const nstring &name) { print_one(op, "element end", name, ""); } void xml_node_dump::entity_begin(const nstring &name, const nstring &value) { print_one(op, "entity begin", name, value); } void xml_node_dump::entity_end(const nstring &name, const nstring &value) { print_one(op, "entity end", name, value); } void xml_node_dump::entity_reference(const nstring &name, const nstring &value) { print_one(op, "entity reference", name, value); } void xml_node_dump::notation(const nstring &name, const nstring &value) { print_one(op, "notation", name, value); } void xml_node_dump::processing_instruction(const nstring &name, const nstring &value) { print_one(op, "processing instruction", name, value); } void xml_node_dump::text(const nstring &value) { print_one(op, "text", "", value); } void xml_node_dump::whitespace(const nstring &value) { print_one(op, "whitespace", "", value); } void xml_node_dump::xml_declaration(const nstring &name, const nstring &value) { print_one(op, "xml declaration", name, value); }