Move common-utils.h to common-defs.h
[platform/upstream/binutils.git] / gdb / common / xml-utils.c
1 /* Shared helper routines for manipulating XML.
2
3    Copyright (C) 2006-2014 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 }