1 /* Shared helper routines for manipulating XML. 2 3 Copyright (C) 2006-2012 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, "'"); 65 special += 5; 66 break; 67 case '\"': 68 strcpy (result + i + special, """); 69 special += 5; 70 break; 71 case '&': 72 strcpy (result + i + special, "&"); 73 special += 4; 74 break; 75 case '<': 76 strcpy (result + i + special, "<"); 77 special += 3; 78 break; 79 case '>': 80 strcpy (result + i + special, ">"); 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