1 /**
2 * Copyright (C) ARM Limited 2010-2011. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 */
9 #include <stdio.h>
10 #include <string.h>
11 #include <stdarg.h>
12 #include "XMLOut.h"
14 XMLOut::XMLOut() {
15 indent = 0;
16 incomplete = false;
17 xml_string[0] = 0;
18 }
20 XMLOut::~XMLOut() {
21 }
23 void XMLOut::writeTabs() {
24 for (int i = 0; i < indent; i++) {
25 writeData(" ");
26 }
27 }
29 void XMLOut::encodeAttributeData(const char* data) {
30 if (data) {
31 while (*data) {
32 char ch = *data++;
34 if (ch == '<') {
35 writeData("<");
36 } else if (ch == '>') {
37 writeData(">");
38 } else if (ch == '&') {
39 writeData("&");
40 } else if (ch == '"') {
41 writeData(""");
42 } else if (ch == '\'') {
43 writeData("'");
44 } else if (ch >= ' ' && ch <= '~') {
45 writeData("%c",ch);
46 } else {
47 writeData("&#%u;",(unsigned int)ch);
48 }
49 }
50 }
51 }
53 void XMLOut::writeData(const char *format, ...) {
54 va_list ap;
56 va_start(ap, format);
57 vsnprintf(temp_buffer, sizeof(temp_buffer), format, ap);
58 va_end(ap);
60 strncat(xml_string, temp_buffer, sizeof(xml_string) - strlen(xml_string) - 1);
61 }
63 const XMLOut & XMLOut::xmlHeader(void) {
64 writeData("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
65 incomplete = false;
66 return *this;
67 }
69 const XMLOut & XMLOut::comment(const char* text, const bool newline) {
70 if (incomplete) {
71 writeData(">\n");
72 }
73 writeTabs();
74 writeData("<!-- %s -->", text);
75 if (newline) {
76 writeData("\n");
77 }
78 incomplete = false;
79 return *this;
80 }
82 const XMLOut & XMLOut::startElement(const char* tag) {
83 if (incomplete) {
84 writeData(">\n");
85 }
86 writeTabs();
87 writeData("<%s", tag);
88 incomplete = true;
89 indent++;
90 return *this;
91 }
93 const XMLOut & XMLOut::startElement(const char* tag, int index) {
94 if (incomplete) {
95 writeData(">\n");
96 }
97 writeTabs();
98 writeData("<!-- %d -->", index);
99 writeData("<%s", tag);
100 incomplete = true;
101 indent++;
102 return *this;
103 }
105 const XMLOut & XMLOut::endElement(const char* tag) {
106 indent--;
107 if (indent < 0) {
108 indent = 0;
109 }
110 if (incomplete) {
111 writeData("/>\n");
112 incomplete = false;
113 } else {
114 writeTabs();
115 writeData("</%s>\n", tag);
116 }
117 return *this;
118 }
120 const XMLOut & XMLOut::attributeString(const char* name, const char* value) {
121 writeData(" %s=\"", name);
122 encodeAttributeData(value);
123 writeData("\"");
124 return *this;
125 }
127 const XMLOut & XMLOut::attributeInt(const char* name, int value) {
128 writeData(" %s=\"%d\"", name, value);
129 return *this;
130 }
132 const XMLOut & XMLOut::attributeUInt(const char* name, unsigned int value) {
133 writeData(" %s=\"%u\"", name, value);
134 return *this;
135 }
137 const XMLOut & XMLOut::attributeLong(const char* name, long value) {
138 writeData(" %s=\"%ld\"", name, value);
139 return *this;
140 }
142 const XMLOut & XMLOut::attributeULong(const char* name, unsigned long value) {
143 writeData(" %s=\"%lu\"", name, value);
144 return *this;
145 }
147 const XMLOut & XMLOut::attributeLongLong(const char* name, long long value) {
148 writeData(" %s=\"%lld\"", name, value);
149 return *this;
150 }
152 const XMLOut & XMLOut::attributeULongLong(const char* name, unsigned long long value) {
153 writeData(" %s=\"%llu\"", name, value);
154 return *this;
155 }
157 const XMLOut & XMLOut::attributeDouble(const char* name, double value) {
158 writeData(" %s=\"%f\"", name, value);
159 return *this;
160 }
162 const XMLOut & XMLOut::attributeBool(const char* name, bool value) {
163 writeData(" %s=\"%s\"", name, value ? "yes" : "no");
164 return *this;
165 }
167 const XMLOut & XMLOut::attributeHex4(const char* name, int value) {
168 writeData(" %s=\"0x%04x\"", name, value);
169 return *this;
170 }
172 const XMLOut & XMLOut::attributeHex8(const char* name, int value) {
173 writeData(" %s=\"0x%08x\"", name, value);
174 return *this;
175 }