I'm trying to write an equivalent of PHP's htmlspecialchars() in C. What is my implementation missing or doing wrong?
char www_specialchars_html(char *dest, char *dest_last, char *src) {
while (*src != 0) {
switch(*src) {
//If a special character is found, replace with its HTML entity.
case '&':
if ((dest + 5) > dest_last) {
return 1;
}
*dest = '&';
dest++;
*dest = 'a';
dest++;
*dest = 'm';
dest++;
*dest = 'p';
dest++;
*dest = ';';
dest++;
src++;
break;
case '"':
if ((dest + 6) > dest_last) {
return 1;
}
*dest = '&';
dest++;
*dest = 'q';
dest++;
*dest = 'u';
dest++;
*dest = 'o';
dest++;
*dest = 't';
dest++;
*dest = ';';
dest++;
src++;
break;
case '\'':
if ((dest + 6) > dest_last) {
return 1;
}
*dest = '&';
dest++;
*dest = '#';
dest++;
*dest = '0';
dest++;
*dest = '3';
dest++;
*dest = '9';
dest++;
*dest = ';';
dest++;
src++;
break;
case '<':
if ((dest + 4) > dest_last) {
return 1;
}
*dest = '&';
dest++;
*dest = 'l';
dest++;
*dest = 't';
dest++;
*dest = ';';
dest++;
src++;
break;
case '>':
if ((dest + 4) > dest_last) {
return 1;
}
*dest = '&';
dest++;
*dest = 'g';
dest++;
*dest = 't';
dest++;
*dest = ';';
dest++;
src++;
break;
case '\\': //Not required in HTML.
if ((dest) > dest_last) {
return 1;
}
src++;
break;
default:
//Default for characters that don't need to be replaced.
if ((dest + 1) > dest_last) {
return 1;
}
*dest = *src;
src++;
dest++;
break;
}
}
*dest = 0;
return 0;
}
The function takes pointers to the destination, the last element of the destination and the source. It returns 1 if it can't write to the destination, and returns 0 when it has successfully copied to the destination. I'm still a relatively new C programmer.
case
that handles the backslash character? \$\endgroup\$htmlspecialchars()
. You can then follow the function calls to see how they do it. If you're goal is to write an equivalent implementation, it would be a lot more work because of all thathtmlspecialchars()
does \$\endgroup\$