]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/common/xml-utils.c
89093cf8e51e27357e3d6194c106555c4cf8925d
[thirdparty/binutils-gdb.git] / gdb / common / xml-utils.c
1 /* Shared helper routines for manipulating XML.
2
3 Copyright (C) 2006-2013 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20 #ifdef GDBSERVER
21 #include "server.h"
22 #else
23 #include "defs.h"
24 #endif
25
26 #include "xml-utils.h"
27
28 #include <string.h>
29
30 /* Return a malloc allocated string with special characters from TEXT
31 replaced by entity references. */
32
33 char *
34 xml_escape_text (const char *text)
35 {
36 char *result;
37 int i, special;
38
39 /* Compute the length of the result. */
40 for (i = 0, special = 0; text[i] != '\0'; i++)
41 switch (text[i])
42 {
43 case '\'':
44 case '\"':
45 special += 5;
46 break;
47 case '&':
48 special += 4;
49 break;
50 case '<':
51 case '>':
52 special += 3;
53 break;
54 default:
55 break;
56 }
57
58 /* Expand the result. */
59 result = xmalloc (i + special + 1);
60 for (i = 0, special = 0; text[i] != '\0'; i++)
61 switch (text[i])
62 {
63 case '\'':
64 strcpy (result + i + special, "&apos;");
65 special += 5;
66 break;
67 case '\"':
68 strcpy (result + i + special, "&quot;");
69 special += 5;
70 break;
71 case '&':
72 strcpy (result + i + special, "&amp;");
73 special += 4;
74 break;
75 case '<':
76 strcpy (result + i + special, "&lt;");
77 special += 3;
78 break;
79 case '>':
80 strcpy (result + i + special, "&gt;");
81 special += 3;
82 break;
83 default:
84 result[i + special] = text[i];
85 break;
86 }
87 result[i + special] = '\0';
88
89 return result;
90 }