git repos / blockattack-game

blame: source/code/Libs/include/cereal/external/rapidxml/rapidxml_print.hpp

normal view · raw

7a956470 sago007 2016-02-14 17:09 1
#ifndef RAPIDXML_PRINT_HPP_INCLUDED
7a956470 sago007 2016-02-14 17:09 2
#define RAPIDXML_PRINT_HPP_INCLUDED
7a956470 sago007 2016-02-14 17:09 3
7a956470 sago007 2016-02-14 17:09 4
// Copyright (C) 2006, 2009 Marcin Kalicinski
7a956470 sago007 2016-02-14 17:09 5
// Version 1.13
7a956470 sago007 2016-02-14 17:09 6
// Revision $DateTime: 2009/05/13 01:46:17 $
7a956470 sago007 2016-02-14 17:09 7
7a956470 sago007 2016-02-14 17:09 8
#include "rapidxml.hpp"
7a956470 sago007 2016-02-14 17:09 9
7a956470 sago007 2016-02-14 17:09 10
// Only include streams if not disabled
7a956470 sago007 2016-02-14 17:09 11
#ifndef RAPIDXML_NO_STREAMS
7a956470 sago007 2016-02-14 17:09 12
    #include <ostream>
7a956470 sago007 2016-02-14 17:09 13
    #include <iterator>
7a956470 sago007 2016-02-14 17:09 14
#endif
7a956470 sago007 2016-02-14 17:09 15
7a956470 sago007 2016-02-14 17:09 16
namespace rapidxml
7a956470 sago007 2016-02-14 17:09 17
{
7a956470 sago007 2016-02-14 17:09 18
7a956470 sago007 2016-02-14 17:09 19
    ///////////////////////////////////////////////////////////////////////
7a956470 sago007 2016-02-14 17:09 20
    // Printing flags
7a956470 sago007 2016-02-14 17:09 21
7a956470 sago007 2016-02-14 17:09 22
    const int print_no_indenting = 0x1;   //!< Printer flag instructing the printer to suppress indenting of XML. See print() function.
7a956470 sago007 2016-02-14 17:09 23
7a956470 sago007 2016-02-14 17:09 24
    ///////////////////////////////////////////////////////////////////////
7a956470 sago007 2016-02-14 17:09 25
    // Internal
7a956470 sago007 2016-02-14 17:09 26
7a956470 sago007 2016-02-14 17:09 27
    //! \cond internal
7a956470 sago007 2016-02-14 17:09 28
    namespace internal
7a956470 sago007 2016-02-14 17:09 29
    {
7a956470 sago007 2016-02-14 17:09 30
7a956470 sago007 2016-02-14 17:09 31
        ///////////////////////////////////////////////////////////////////////////
7a956470 sago007 2016-02-14 17:09 32
        // Internal character operations
7a956470 sago007 2016-02-14 17:09 33
7a956470 sago007 2016-02-14 17:09 34
        // Copy characters from given range to given output iterator
7a956470 sago007 2016-02-14 17:09 35
        template<class OutIt, class Ch>
7a956470 sago007 2016-02-14 17:09 36
        inline OutIt copy_chars(const Ch *begin, const Ch *end, OutIt out)
7a956470 sago007 2016-02-14 17:09 37
        {
7a956470 sago007 2016-02-14 17:09 38
            while (begin != end)
7a956470 sago007 2016-02-14 17:09 39
                *out++ = *begin++;
7a956470 sago007 2016-02-14 17:09 40
            return out;
7a956470 sago007 2016-02-14 17:09 41
        }
7a956470 sago007 2016-02-14 17:09 42
7a956470 sago007 2016-02-14 17:09 43
        // Copy characters from given range to given output iterator and expand
7a956470 sago007 2016-02-14 17:09 44
        // characters into references (&lt; &gt; &apos; &quot; &amp;)
7a956470 sago007 2016-02-14 17:09 45
        template<class OutIt, class Ch>
7a956470 sago007 2016-02-14 17:09 46
        inline OutIt copy_and_expand_chars(const Ch *begin, const Ch *end, Ch noexpand, OutIt out)
7a956470 sago007 2016-02-14 17:09 47
        {
7a956470 sago007 2016-02-14 17:09 48
            while (begin != end)
7a956470 sago007 2016-02-14 17:09 49
            {
7a956470 sago007 2016-02-14 17:09 50
                if (*begin == noexpand)
7a956470 sago007 2016-02-14 17:09 51
                {
7a956470 sago007 2016-02-14 17:09 52
                    *out++ = *begin;    // No expansion, copy character
7a956470 sago007 2016-02-14 17:09 53
                }
7a956470 sago007 2016-02-14 17:09 54
                else
7a956470 sago007 2016-02-14 17:09 55
                {
7a956470 sago007 2016-02-14 17:09 56
                    switch (*begin)
7a956470 sago007 2016-02-14 17:09 57
                    {
7a956470 sago007 2016-02-14 17:09 58
                    case Ch('<'):
7a956470 sago007 2016-02-14 17:09 59
                        *out++ = Ch('&'); *out++ = Ch('l'); *out++ = Ch('t'); *out++ = Ch(';');
7a956470 sago007 2016-02-14 17:09 60
                        break;
7a956470 sago007 2016-02-14 17:09 61
                    case Ch('>'):
7a956470 sago007 2016-02-14 17:09 62
                        *out++ = Ch('&'); *out++ = Ch('g'); *out++ = Ch('t'); *out++ = Ch(';');
7a956470 sago007 2016-02-14 17:09 63
                        break;
7a956470 sago007 2016-02-14 17:09 64
                    case Ch('\''):
7a956470 sago007 2016-02-14 17:09 65
                        *out++ = Ch('&'); *out++ = Ch('a'); *out++ = Ch('p'); *out++ = Ch('o'); *out++ = Ch('s'); *out++ = Ch(';');
7a956470 sago007 2016-02-14 17:09 66
                        break;
7a956470 sago007 2016-02-14 17:09 67
                    case Ch('"'):
7a956470 sago007 2016-02-14 17:09 68
                        *out++ = Ch('&'); *out++ = Ch('q'); *out++ = Ch('u'); *out++ = Ch('o'); *out++ = Ch('t'); *out++ = Ch(';');
7a956470 sago007 2016-02-14 17:09 69
                        break;
7a956470 sago007 2016-02-14 17:09 70
                    case Ch('&'):
7a956470 sago007 2016-02-14 17:09 71
                        *out++ = Ch('&'); *out++ = Ch('a'); *out++ = Ch('m'); *out++ = Ch('p'); *out++ = Ch(';');
7a956470 sago007 2016-02-14 17:09 72
                        break;
7a956470 sago007 2016-02-14 17:09 73
                    default:
7a956470 sago007 2016-02-14 17:09 74
                        *out++ = *begin;    // No expansion, copy character
7a956470 sago007 2016-02-14 17:09 75
                    }
7a956470 sago007 2016-02-14 17:09 76
                }
7a956470 sago007 2016-02-14 17:09 77
                ++begin;    // Step to next character
7a956470 sago007 2016-02-14 17:09 78
            }
7a956470 sago007 2016-02-14 17:09 79
            return out;
7a956470 sago007 2016-02-14 17:09 80
        }
7a956470 sago007 2016-02-14 17:09 81
7a956470 sago007 2016-02-14 17:09 82
        // Fill given output iterator with repetitions of the same character
7a956470 sago007 2016-02-14 17:09 83
        template<class OutIt, class Ch>
7a956470 sago007 2016-02-14 17:09 84
        inline OutIt fill_chars(OutIt out, int n, Ch ch)
7a956470 sago007 2016-02-14 17:09 85
        {
7a956470 sago007 2016-02-14 17:09 86
            for (int i = 0; i < n; ++i)
7a956470 sago007 2016-02-14 17:09 87
                *out++ = ch;
7a956470 sago007 2016-02-14 17:09 88
            return out;
7a956470 sago007 2016-02-14 17:09 89
        }
7a956470 sago007 2016-02-14 17:09 90
7a956470 sago007 2016-02-14 17:09 91
        // Find character
7a956470 sago007 2016-02-14 17:09 92
        template<class Ch, Ch ch>
7a956470 sago007 2016-02-14 17:09 93
        inline bool find_char(const Ch *begin, const Ch *end)
7a956470 sago007 2016-02-14 17:09 94
        {
7a956470 sago007 2016-02-14 17:09 95
            while (begin != end)
7a956470 sago007 2016-02-14 17:09 96
                if (*begin++ == ch)
7a956470 sago007 2016-02-14 17:09 97
                    return true;
7a956470 sago007 2016-02-14 17:09 98
            return false;
7a956470 sago007 2016-02-14 17:09 99
        }
7a956470 sago007 2016-02-14 17:09 100
7a956470 sago007 2016-02-14 17:09 101
        ///////////////////////////////////////////////////////////////////////////
7a956470 sago007 2016-02-14 17:09 102
        // Internal printing operations
7a956470 sago007 2016-02-14 17:09 103
7a956470 sago007 2016-02-14 17:09 104
        // Print node
7a956470 sago007 2016-02-14 17:09 105
        template<class OutIt, class Ch>
7a956470 sago007 2016-02-14 17:09 106
        inline OutIt print_node(OutIt out, const xml_node<Ch> *node, int flags, int indent);
7a956470 sago007 2016-02-14 17:09 107
7a956470 sago007 2016-02-14 17:09 108
        // Print children of the node
7a956470 sago007 2016-02-14 17:09 109
        template<class OutIt, class Ch>
7a956470 sago007 2016-02-14 17:09 110
        inline OutIt print_children(OutIt out, const xml_node<Ch> *node, int flags, int indent)
7a956470 sago007 2016-02-14 17:09 111
        {
7a956470 sago007 2016-02-14 17:09 112
            for (xml_node<Ch> *child = node->first_node(); child; child = child->next_sibling())
7a956470 sago007 2016-02-14 17:09 113
                out = print_node(out, child, flags, indent);
7a956470 sago007 2016-02-14 17:09 114
            return out;
7a956470 sago007 2016-02-14 17:09 115
        }
7a956470 sago007 2016-02-14 17:09 116
7a956470 sago007 2016-02-14 17:09 117
        // Print attributes of the node
7a956470 sago007 2016-02-14 17:09 118
        template<class OutIt, class Ch>
7a956470 sago007 2016-02-14 17:09 119
        inline OutIt print_attributes(OutIt out, const xml_node<Ch> *node, int /*flags*/)
7a956470 sago007 2016-02-14 17:09 120
        {
7a956470 sago007 2016-02-14 17:09 121
            for (xml_attribute<Ch> *attribute = node->first_attribute(); attribute; attribute = attribute->next_attribute())
7a956470 sago007 2016-02-14 17:09 122
            {
7a956470 sago007 2016-02-14 17:09 123
                if (attribute->name() && attribute->value())
7a956470 sago007 2016-02-14 17:09 124
                {
7a956470 sago007 2016-02-14 17:09 125
                    // Print attribute name
7a956470 sago007 2016-02-14 17:09 126
                    *out = Ch(' '), ++out;
7a956470 sago007 2016-02-14 17:09 127
                    out = copy_chars(attribute->name(), attribute->name() + attribute->name_size(), out);
7a956470 sago007 2016-02-14 17:09 128
                    *out = Ch('='), ++out;
7a956470 sago007 2016-02-14 17:09 129
                    // Print attribute value using appropriate quote type
7a956470 sago007 2016-02-14 17:09 130
                    if (find_char<Ch, Ch('"')>(attribute->value(), attribute->value() + attribute->value_size()))
7a956470 sago007 2016-02-14 17:09 131
                    {
7a956470 sago007 2016-02-14 17:09 132
                        *out = Ch('\''), ++out;
7a956470 sago007 2016-02-14 17:09 133
                        out = copy_and_expand_chars(attribute->value(), attribute->value() + attribute->value_size(), Ch('"'), out);
7a956470 sago007 2016-02-14 17:09 134
                        *out = Ch('\''), ++out;
7a956470 sago007 2016-02-14 17:09 135
                    }
7a956470 sago007 2016-02-14 17:09 136
                    else
7a956470 sago007 2016-02-14 17:09 137
                    {
7a956470 sago007 2016-02-14 17:09 138
                        *out = Ch('"'), ++out;
7a956470 sago007 2016-02-14 17:09 139
                        out = copy_and_expand_chars(attribute->value(), attribute->value() + attribute->value_size(), Ch('\''), out);
7a956470 sago007 2016-02-14 17:09 140
                        *out = Ch('"'), ++out;
7a956470 sago007 2016-02-14 17:09 141
                    }
7a956470 sago007 2016-02-14 17:09 142
                }
7a956470 sago007 2016-02-14 17:09 143
            }
7a956470 sago007 2016-02-14 17:09 144
            return out;
7a956470 sago007 2016-02-14 17:09 145
        }
7a956470 sago007 2016-02-14 17:09 146
7a956470 sago007 2016-02-14 17:09 147
        // Print data node
7a956470 sago007 2016-02-14 17:09 148
        template<class OutIt, class Ch>
7a956470 sago007 2016-02-14 17:09 149
        inline OutIt print_data_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)
7a956470 sago007 2016-02-14 17:09 150
        {
7a956470 sago007 2016-02-14 17:09 151
            assert(node->type() == node_data);
7a956470 sago007 2016-02-14 17:09 152
            if (!(flags & print_no_indenting))
7a956470 sago007 2016-02-14 17:09 153
                out = fill_chars(out, indent, Ch('\t'));
7a956470 sago007 2016-02-14 17:09 154
            out = copy_and_expand_chars(node->value(), node->value() + node->value_size(), Ch(0), out);
7a956470 sago007 2016-02-14 17:09 155
            return out;
7a956470 sago007 2016-02-14 17:09 156
        }
7a956470 sago007 2016-02-14 17:09 157
7a956470 sago007 2016-02-14 17:09 158
        // Print data node
7a956470 sago007 2016-02-14 17:09 159
        template<class OutIt, class Ch>
7a956470 sago007 2016-02-14 17:09 160
        inline OutIt print_cdata_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)
7a956470 sago007 2016-02-14 17:09 161
        {
7a956470 sago007 2016-02-14 17:09 162
            assert(node->type() == node_cdata);
7a956470 sago007 2016-02-14 17:09 163
            if (!(flags & print_no_indenting))
7a956470 sago007 2016-02-14 17:09 164
                out = fill_chars(out, indent, Ch('\t'));
7a956470 sago007 2016-02-14 17:09 165
            *out = Ch('<'); ++out;
7a956470 sago007 2016-02-14 17:09 166
            *out = Ch('!'); ++out;
7a956470 sago007 2016-02-14 17:09 167
            *out = Ch('['); ++out;
7a956470 sago007 2016-02-14 17:09 168
            *out = Ch('C'); ++out;
7a956470 sago007 2016-02-14 17:09 169
            *out = Ch('D'); ++out;
7a956470 sago007 2016-02-14 17:09 170
            *out = Ch('A'); ++out;
7a956470 sago007 2016-02-14 17:09 171
            *out = Ch('T'); ++out;
7a956470 sago007 2016-02-14 17:09 172
            *out = Ch('A'); ++out;
7a956470 sago007 2016-02-14 17:09 173
            *out = Ch('['); ++out;
7a956470 sago007 2016-02-14 17:09 174
            out = copy_chars(node->value(), node->value() + node->value_size(), out);
7a956470 sago007 2016-02-14 17:09 175
            *out = Ch(']'); ++out;
7a956470 sago007 2016-02-14 17:09 176
            *out = Ch(']'); ++out;
7a956470 sago007 2016-02-14 17:09 177
            *out = Ch('>'); ++out;
7a956470 sago007 2016-02-14 17:09 178
            return out;
7a956470 sago007 2016-02-14 17:09 179
        }
7a956470 sago007 2016-02-14 17:09 180
7a956470 sago007 2016-02-14 17:09 181
        // Print element node
7a956470 sago007 2016-02-14 17:09 182
        template<class OutIt, class Ch>
7a956470 sago007 2016-02-14 17:09 183
        inline OutIt print_element_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)
7a956470 sago007 2016-02-14 17:09 184
        {
7a956470 sago007 2016-02-14 17:09 185
            assert(node->type() == node_element);
7a956470 sago007 2016-02-14 17:09 186
7a956470 sago007 2016-02-14 17:09 187
            // Print element name and attributes, if any
7a956470 sago007 2016-02-14 17:09 188
            if (!(flags & print_no_indenting))
7a956470 sago007 2016-02-14 17:09 189
                out = fill_chars(out, indent, Ch('\t'));
7a956470 sago007 2016-02-14 17:09 190
            *out = Ch('<'), ++out;
7a956470 sago007 2016-02-14 17:09 191
            out = copy_chars(node->name(), node->name() + node->name_size(), out);
7a956470 sago007 2016-02-14 17:09 192
            out = print_attributes(out, node, flags);
7a956470 sago007 2016-02-14 17:09 193
7a956470 sago007 2016-02-14 17:09 194
            // If node is childless
7a956470 sago007 2016-02-14 17:09 195
            if (node->value_size() == 0 && !node->first_node())
7a956470 sago007 2016-02-14 17:09 196
            {
7a956470 sago007 2016-02-14 17:09 197
                // Print childless node tag ending
7a956470 sago007 2016-02-14 17:09 198
                *out = Ch('/'), ++out;
7a956470 sago007 2016-02-14 17:09 199
                *out = Ch('>'), ++out;
7a956470 sago007 2016-02-14 17:09 200
            }
7a956470 sago007 2016-02-14 17:09 201
            else
7a956470 sago007 2016-02-14 17:09 202
            {
7a956470 sago007 2016-02-14 17:09 203
                // Print normal node tag ending
7a956470 sago007 2016-02-14 17:09 204
                *out = Ch('>'), ++out;
7a956470 sago007 2016-02-14 17:09 205
7a956470 sago007 2016-02-14 17:09 206
                // Test if node contains a single data node only (and no other nodes)
7a956470 sago007 2016-02-14 17:09 207
                xml_node<Ch> *child = node->first_node();
7a956470 sago007 2016-02-14 17:09 208
                if (!child)
7a956470 sago007 2016-02-14 17:09 209
                {
7a956470 sago007 2016-02-14 17:09 210
                    // If node has no children, only print its value without indenting
7a956470 sago007 2016-02-14 17:09 211
                    out = copy_and_expand_chars(node->value(), node->value() + node->value_size(), Ch(0), out);
7a956470 sago007 2016-02-14 17:09 212
                }
7a956470 sago007 2016-02-14 17:09 213
                else if (child->next_sibling() == 0 && child->type() == node_data)
7a956470 sago007 2016-02-14 17:09 214
                {
7a956470 sago007 2016-02-14 17:09 215
                    // If node has a sole data child, only print its value without indenting
7a956470 sago007 2016-02-14 17:09 216
                    out = copy_and_expand_chars(child->value(), child->value() + child->value_size(), Ch(0), out);
7a956470 sago007 2016-02-14 17:09 217
                }
7a956470 sago007 2016-02-14 17:09 218
                else
7a956470 sago007 2016-02-14 17:09 219
                {
7a956470 sago007 2016-02-14 17:09 220
                    // Print all children with full indenting
7a956470 sago007 2016-02-14 17:09 221
                    if (!(flags & print_no_indenting))
7a956470 sago007 2016-02-14 17:09 222
                        *out = Ch('\n'), ++out;
7a956470 sago007 2016-02-14 17:09 223
                    out = print_children(out, node, flags, indent + 1);
7a956470 sago007 2016-02-14 17:09 224
                    if (!(flags & print_no_indenting))
7a956470 sago007 2016-02-14 17:09 225
                        out = fill_chars(out, indent, Ch('\t'));
7a956470 sago007 2016-02-14 17:09 226
                }
7a956470 sago007 2016-02-14 17:09 227
7a956470 sago007 2016-02-14 17:09 228
                // Print node end
7a956470 sago007 2016-02-14 17:09 229
                *out = Ch('<'), ++out;
7a956470 sago007 2016-02-14 17:09 230
                *out = Ch('/'), ++out;
7a956470 sago007 2016-02-14 17:09 231
                out = copy_chars(node->name(), node->name() + node->name_size(), out);
7a956470 sago007 2016-02-14 17:09 232
                *out = Ch('>'), ++out;
7a956470 sago007 2016-02-14 17:09 233
            }
7a956470 sago007 2016-02-14 17:09 234
            return out;
7a956470 sago007 2016-02-14 17:09 235
        }
7a956470 sago007 2016-02-14 17:09 236
7a956470 sago007 2016-02-14 17:09 237
        // Print declaration node
7a956470 sago007 2016-02-14 17:09 238
        template<class OutIt, class Ch>
7a956470 sago007 2016-02-14 17:09 239
        inline OutIt print_declaration_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)
7a956470 sago007 2016-02-14 17:09 240
        {
7a956470 sago007 2016-02-14 17:09 241
            // Print declaration start
7a956470 sago007 2016-02-14 17:09 242
            if (!(flags & print_no_indenting))
7a956470 sago007 2016-02-14 17:09 243
                out = fill_chars(out, indent, Ch('\t'));
7a956470 sago007 2016-02-14 17:09 244
            *out = Ch('<'), ++out;
7a956470 sago007 2016-02-14 17:09 245
            *out = Ch('?'), ++out;
7a956470 sago007 2016-02-14 17:09 246
            *out = Ch('x'), ++out;
7a956470 sago007 2016-02-14 17:09 247
            *out = Ch('m'), ++out;
7a956470 sago007 2016-02-14 17:09 248
            *out = Ch('l'), ++out;
7a956470 sago007 2016-02-14 17:09 249
7a956470 sago007 2016-02-14 17:09 250
            // Print attributes
7a956470 sago007 2016-02-14 17:09 251
            out = print_attributes(out, node, flags);
7a956470 sago007 2016-02-14 17:09 252
7a956470 sago007 2016-02-14 17:09 253
            // Print declaration end
7a956470 sago007 2016-02-14 17:09 254
            *out = Ch('?'), ++out;
7a956470 sago007 2016-02-14 17:09 255
            *out = Ch('>'), ++out;
7a956470 sago007 2016-02-14 17:09 256
7a956470 sago007 2016-02-14 17:09 257
            return out;
7a956470 sago007 2016-02-14 17:09 258
        }
7a956470 sago007 2016-02-14 17:09 259
7a956470 sago007 2016-02-14 17:09 260
        // Print comment node
7a956470 sago007 2016-02-14 17:09 261
        template<class OutIt, class Ch>
7a956470 sago007 2016-02-14 17:09 262
        inline OutIt print_comment_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)
7a956470 sago007 2016-02-14 17:09 263
        {
7a956470 sago007 2016-02-14 17:09 264
            assert(node->type() == node_comment);
7a956470 sago007 2016-02-14 17:09 265
            if (!(flags & print_no_indenting))
7a956470 sago007 2016-02-14 17:09 266
                out = fill_chars(out, indent, Ch('\t'));
7a956470 sago007 2016-02-14 17:09 267
            *out = Ch('<'), ++out;
7a956470 sago007 2016-02-14 17:09 268
            *out = Ch('!'), ++out;
7a956470 sago007 2016-02-14 17:09 269
            *out = Ch('-'), ++out;
7a956470 sago007 2016-02-14 17:09 270
            *out = Ch('-'), ++out;
7a956470 sago007 2016-02-14 17:09 271
            out = copy_chars(node->value(), node->value() + node->value_size(), out);
7a956470 sago007 2016-02-14 17:09 272
            *out = Ch('-'), ++out;
7a956470 sago007 2016-02-14 17:09 273
            *out = Ch('-'), ++out;
7a956470 sago007 2016-02-14 17:09 274
            *out = Ch('>'), ++out;
7a956470 sago007 2016-02-14 17:09 275
            return out;
7a956470 sago007 2016-02-14 17:09 276
        }
7a956470 sago007 2016-02-14 17:09 277
7a956470 sago007 2016-02-14 17:09 278
        // Print doctype node
7a956470 sago007 2016-02-14 17:09 279
        template<class OutIt, class Ch>
7a956470 sago007 2016-02-14 17:09 280
        inline OutIt print_doctype_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)
7a956470 sago007 2016-02-14 17:09 281
        {
7a956470 sago007 2016-02-14 17:09 282
            assert(node->type() == node_doctype);
7a956470 sago007 2016-02-14 17:09 283
            if (!(flags & print_no_indenting))
7a956470 sago007 2016-02-14 17:09 284
                out = fill_chars(out, indent, Ch('\t'));
7a956470 sago007 2016-02-14 17:09 285
            *out = Ch('<'), ++out;
7a956470 sago007 2016-02-14 17:09 286
            *out = Ch('!'), ++out;
7a956470 sago007 2016-02-14 17:09 287
            *out = Ch('D'), ++out;
7a956470 sago007 2016-02-14 17:09 288
            *out = Ch('O'), ++out;
7a956470 sago007 2016-02-14 17:09 289
            *out = Ch('C'), ++out;
7a956470 sago007 2016-02-14 17:09 290
            *out = Ch('T'), ++out;
7a956470 sago007 2016-02-14 17:09 291
            *out = Ch('Y'), ++out;
7a956470 sago007 2016-02-14 17:09 292
            *out = Ch('P'), ++out;
7a956470 sago007 2016-02-14 17:09 293
            *out = Ch('E'), ++out;
7a956470 sago007 2016-02-14 17:09 294
            *out = Ch(' '), ++out;
7a956470 sago007 2016-02-14 17:09 295
            out = copy_chars(node->value(), node->value() + node->value_size(), out);
7a956470 sago007 2016-02-14 17:09 296
            *out = Ch('>'), ++out;
7a956470 sago007 2016-02-14 17:09 297
            return out;
7a956470 sago007 2016-02-14 17:09 298
        }
7a956470 sago007 2016-02-14 17:09 299
7a956470 sago007 2016-02-14 17:09 300
        // Print pi node
7a956470 sago007 2016-02-14 17:09 301
        template<class OutIt, class Ch>
7a956470 sago007 2016-02-14 17:09 302
        inline OutIt print_pi_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)
7a956470 sago007 2016-02-14 17:09 303
        {
7a956470 sago007 2016-02-14 17:09 304
            assert(node->type() == node_pi);
7a956470 sago007 2016-02-14 17:09 305
            if (!(flags & print_no_indenting))
7a956470 sago007 2016-02-14 17:09 306
                out = fill_chars(out, indent, Ch('\t'));
7a956470 sago007 2016-02-14 17:09 307
            *out = Ch('<'), ++out;
7a956470 sago007 2016-02-14 17:09 308
            *out = Ch('?'), ++out;
7a956470 sago007 2016-02-14 17:09 309
            out = copy_chars(node->name(), node->name() + node->name_size(), out);
7a956470 sago007 2016-02-14 17:09 310
            *out = Ch(' '), ++out;
7a956470 sago007 2016-02-14 17:09 311
            out = copy_chars(node->value(), node->value() + node->value_size(), out);
7a956470 sago007 2016-02-14 17:09 312
            *out = Ch('?'), ++out;
7a956470 sago007 2016-02-14 17:09 313
            *out = Ch('>'), ++out;
7a956470 sago007 2016-02-14 17:09 314
            return out;
7a956470 sago007 2016-02-14 17:09 315
        }
7a956470 sago007 2016-02-14 17:09 316
7a956470 sago007 2016-02-14 17:09 317
        // Print node
7a956470 sago007 2016-02-14 17:09 318
        template<class OutIt, class Ch>
7a956470 sago007 2016-02-14 17:09 319
        inline OutIt print_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)
7a956470 sago007 2016-02-14 17:09 320
        {
7a956470 sago007 2016-02-14 17:09 321
            // Print proper node type
7a956470 sago007 2016-02-14 17:09 322
            switch (node->type())
7a956470 sago007 2016-02-14 17:09 323
            {
7a956470 sago007 2016-02-14 17:09 324
7a956470 sago007 2016-02-14 17:09 325
            // Document
7a956470 sago007 2016-02-14 17:09 326
            case node_document:
7a956470 sago007 2016-02-14 17:09 327
                out = print_children(out, node, flags, indent);
7a956470 sago007 2016-02-14 17:09 328
                break;
7a956470 sago007 2016-02-14 17:09 329
7a956470 sago007 2016-02-14 17:09 330
            // Element
7a956470 sago007 2016-02-14 17:09 331
            case node_element:
7a956470 sago007 2016-02-14 17:09 332
                out = print_element_node(out, node, flags, indent);
7a956470 sago007 2016-02-14 17:09 333
                break;
7a956470 sago007 2016-02-14 17:09 334
7a956470 sago007 2016-02-14 17:09 335
            // Data
7a956470 sago007 2016-02-14 17:09 336
            case node_data:
7a956470 sago007 2016-02-14 17:09 337
                out = print_data_node(out, node, flags, indent);
7a956470 sago007 2016-02-14 17:09 338
                break;
7a956470 sago007 2016-02-14 17:09 339
7a956470 sago007 2016-02-14 17:09 340
            // CDATA
7a956470 sago007 2016-02-14 17:09 341
            case node_cdata:
7a956470 sago007 2016-02-14 17:09 342
                out = print_cdata_node(out, node, flags, indent);
7a956470 sago007 2016-02-14 17:09 343
                break;
7a956470 sago007 2016-02-14 17:09 344
7a956470 sago007 2016-02-14 17:09 345
            // Declaration
7a956470 sago007 2016-02-14 17:09 346
            case node_declaration:
7a956470 sago007 2016-02-14 17:09 347
                out = print_declaration_node(out, node, flags, indent);
7a956470 sago007 2016-02-14 17:09 348
                break;
7a956470 sago007 2016-02-14 17:09 349
7a956470 sago007 2016-02-14 17:09 350
            // Comment
7a956470 sago007 2016-02-14 17:09 351
            case node_comment:
7a956470 sago007 2016-02-14 17:09 352
                out = print_comment_node(out, node, flags, indent);
7a956470 sago007 2016-02-14 17:09 353
                break;
7a956470 sago007 2016-02-14 17:09 354
7a956470 sago007 2016-02-14 17:09 355
            // Doctype
7a956470 sago007 2016-02-14 17:09 356
            case node_doctype:
7a956470 sago007 2016-02-14 17:09 357
                out = print_doctype_node(out, node, flags, indent);
7a956470 sago007 2016-02-14 17:09 358
                break;
7a956470 sago007 2016-02-14 17:09 359
7a956470 sago007 2016-02-14 17:09 360
            // Pi
7a956470 sago007 2016-02-14 17:09 361
            case node_pi:
7a956470 sago007 2016-02-14 17:09 362
                out = print_pi_node(out, node, flags, indent);
7a956470 sago007 2016-02-14 17:09 363
                break;
7a956470 sago007 2016-02-14 17:09 364
7a956470 sago007 2016-02-14 17:09 365
                // Unknown
7a956470 sago007 2016-02-14 17:09 366
            default:
7a956470 sago007 2016-02-14 17:09 367
                assert(0);
7a956470 sago007 2016-02-14 17:09 368
                break;
7a956470 sago007 2016-02-14 17:09 369
            }
7a956470 sago007 2016-02-14 17:09 370
7a956470 sago007 2016-02-14 17:09 371
            // If indenting not disabled, add line break after node
7a956470 sago007 2016-02-14 17:09 372
            if (!(flags & print_no_indenting))
7a956470 sago007 2016-02-14 17:09 373
                *out = Ch('\n'), ++out;
7a956470 sago007 2016-02-14 17:09 374
7a956470 sago007 2016-02-14 17:09 375
            // Return modified iterator
7a956470 sago007 2016-02-14 17:09 376
            return out;
7a956470 sago007 2016-02-14 17:09 377
        }
7a956470 sago007 2016-02-14 17:09 378
7a956470 sago007 2016-02-14 17:09 379
    }
7a956470 sago007 2016-02-14 17:09 380
    //! \endcond
7a956470 sago007 2016-02-14 17:09 381
7a956470 sago007 2016-02-14 17:09 382
    ///////////////////////////////////////////////////////////////////////////
7a956470 sago007 2016-02-14 17:09 383
    // Printing
7a956470 sago007 2016-02-14 17:09 384
7a956470 sago007 2016-02-14 17:09 385
    //! Prints XML to given output iterator.
7a956470 sago007 2016-02-14 17:09 386
    //! \param out Output iterator to print to.
7a956470 sago007 2016-02-14 17:09 387
    //! \param node Node to be printed. Pass xml_document to print entire document.
7a956470 sago007 2016-02-14 17:09 388
    //! \param flags Flags controlling how XML is printed.
7a956470 sago007 2016-02-14 17:09 389
    //! \return Output iterator pointing to position immediately after last character of printed text.
7a956470 sago007 2016-02-14 17:09 390
    template<class OutIt, class Ch>
7a956470 sago007 2016-02-14 17:09 391
    inline OutIt print(OutIt out, const xml_node<Ch> &node, int flags = 0)
7a956470 sago007 2016-02-14 17:09 392
    {
7a956470 sago007 2016-02-14 17:09 393
        return internal::print_node(out, &node, flags, 0);
7a956470 sago007 2016-02-14 17:09 394
    }
7a956470 sago007 2016-02-14 17:09 395
7a956470 sago007 2016-02-14 17:09 396
#ifndef RAPIDXML_NO_STREAMS
7a956470 sago007 2016-02-14 17:09 397
7a956470 sago007 2016-02-14 17:09 398
    //! Prints XML to given output stream.
7a956470 sago007 2016-02-14 17:09 399
    //! \param out Output stream to print to.
7a956470 sago007 2016-02-14 17:09 400
    //! \param node Node to be printed. Pass xml_document to print entire document.
7a956470 sago007 2016-02-14 17:09 401
    //! \param flags Flags controlling how XML is printed.
7a956470 sago007 2016-02-14 17:09 402
    //! \return Output stream.
7a956470 sago007 2016-02-14 17:09 403
    template<class Ch>
7a956470 sago007 2016-02-14 17:09 404
    inline std::basic_ostream<Ch> &print(std::basic_ostream<Ch> &out, const xml_node<Ch> &node, int flags = 0)
7a956470 sago007 2016-02-14 17:09 405
    {
7a956470 sago007 2016-02-14 17:09 406
        print(std::ostream_iterator<Ch>(out), node, flags);
7a956470 sago007 2016-02-14 17:09 407
        return out;
7a956470 sago007 2016-02-14 17:09 408
    }
7a956470 sago007 2016-02-14 17:09 409
7a956470 sago007 2016-02-14 17:09 410
    //! Prints formatted XML to given output stream. Uses default printing flags. Use print() function to customize printing process.
7a956470 sago007 2016-02-14 17:09 411
    //! \param out Output stream to print to.
7a956470 sago007 2016-02-14 17:09 412
    //! \param node Node to be printed.
7a956470 sago007 2016-02-14 17:09 413
    //! \return Output stream.
7a956470 sago007 2016-02-14 17:09 414
    template<class Ch>
7a956470 sago007 2016-02-14 17:09 415
    inline std::basic_ostream<Ch> &operator <<(std::basic_ostream<Ch> &out, const xml_node<Ch> &node)
7a956470 sago007 2016-02-14 17:09 416
    {
7a956470 sago007 2016-02-14 17:09 417
        return print(out, node);
7a956470 sago007 2016-02-14 17:09 418
    }
7a956470 sago007 2016-02-14 17:09 419
7a956470 sago007 2016-02-14 17:09 420
#endif
7a956470 sago007 2016-02-14 17:09 421
7a956470 sago007 2016-02-14 17:09 422
}
7a956470 sago007 2016-02-14 17:09 423
7a956470 sago007 2016-02-14 17:09 424
#endif
1970-01-01 00:00 425