diff options
| -rw-r--r-- | libpiano/src/xml.c | 34 | 
1 files changed, 14 insertions, 20 deletions
| diff --git a/libpiano/src/xml.c b/libpiano/src/xml.c index a9be0a8..377affb 100644 --- a/libpiano/src/xml.c +++ b/libpiano/src/xml.c @@ -548,33 +548,27 @@ PianoReturn_t PianoXmlParseSearch (char *searchXml,   *	@return encoded string   */  char *PianoXmlEncodeString (const char *s) { -	char *replacements[] = {"&&", "''", "\""", "<<", ">>"}; -	char *s_new = NULL; -	unsigned int s_new_n = 0; -	unsigned int i; -	char found = 0; - -	s_new_n = strlen (s) + 1; -	s_new = calloc (s_new_n, 1); - -	while (*s) { +	char *replacements[] = {"&&", "''", "\""", "<<", +			">>", NULL}; +	char **r; +	char *sOut = calloc (strlen (s) * 5 + 1, sizeof (*sOut)); +	char found; + +	while (*s != '\0') { +		r = replacements;  		found = 0; -		for (i = 0; i < sizeof (replacements) / sizeof (*replacements); i++) { -			if (*s == replacements[i][0]) { -				/* replacements[i]+1 is our replacement, and -1 'cause we -				 * "overwrite" one byte */ -				s_new_n += strlen (replacements[i]+1)-1; -				s_new = realloc (s_new, s_new_n); -				strncat (s_new, replacements[i]+1, strlen (replacements[i]+1)); +		while (*r != NULL) { +			if (*s == *r[0]) {  				found = 1; -				/* no need to look for other entities */ +				strcat (sOut, (*r) + 1);  				break;  			} +			r++;  		}  		if (!found) { -			strncat (s_new, s, 1); +			strncat (sOut, s, 1);  		}  		s++;  	} -	return s_new; +	return sOut;  } | 
