xref: /dragonfly/contrib/gdb-7/gdb/common/xml-utils.c (revision f2c43266)
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 }
91