Translate '<' and '&' always in writer

This commit is contained in:
Stefan Ritt 2005-03-29 14:37:46 +00:00
parent 7bdb3bbfa1
commit 6f0e017341

79
mxml.c
View File

@ -37,6 +37,9 @@
deleting nodes. deleting nodes.
$Log$ $Log$
Revision 1.3 2005/03/29 14:37:46 ritt
Translate '<' and '&' always in writer
Revision 1.2 2005/03/29 14:14:38 ritt Revision 1.2 2005/03/29 14:14:38 ritt
Implemented mxml_set_translate Implemented mxml_set_translate
@ -252,7 +255,7 @@ MXML_WRITER *mxml_open_file(const char *file_name)
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
void mxml_encode(char *src, int size) void mxml_encode(char *src, int size, int translate)
/* convert '<' '>' '&' '"' ''' into &xx; */ /* convert '<' '>' '&' '"' ''' into &xx; */
{ {
char *ps, *pd; char *ps, *pd;
@ -272,29 +275,45 @@ void mxml_encode(char *src, int size)
ps = src; ps = src;
pd = buffer; pd = buffer;
for (ps = src ; *ps && (size_t)pd - (size_t)buffer < (size_t)(size-10) ; ps++) { for (ps = src ; *ps && (size_t)pd - (size_t)buffer < (size_t)(size-10) ; ps++) {
switch (*ps) {
case '<': if (translate) { // tranlate "<", ">", "&", """, "'"
strcpy(pd, "&lt;"); switch (*ps) {
pd += 4; case '<':
break; strcpy(pd, "&lt;");
case '>': pd += 4;
strcpy(pd, "&gt;"); break;
pd += 4; case '>':
break; strcpy(pd, "&gt;");
case '&': pd += 4;
strcpy(pd, "&amp;"); break;
pd += 5; case '&':
break; strcpy(pd, "&amp;");
case '\"': pd += 5;
strcpy(pd, "&quot;"); break;
pd += 6; case '\"':
break; strcpy(pd, "&quot;");
case '\'': pd += 6;
strcpy(pd, "&apos;"); break;
pd += 6; case '\'':
break; strcpy(pd, "&apos;");
default: pd += 6;
*pd++ = *ps; break;
default:
*pd++ = *ps;
}
} else {
switch (*ps) { // translate only illegal XML characters "<" and "&"
case '<':
strcpy(pd, "&lt;");
pd += 4;
break;
case '&':
strcpy(pd, "&amp;");
pd += 5;
break;
default:
*pd++ = *ps;
}
} }
} }
*pd = 0; *pd = 0;
@ -368,8 +387,7 @@ int mxml_start_element(MXML_WRITER *writer, const char *name)
strlcat(line, XML_INDENT, sizeof(line)); strlcat(line, XML_INDENT, sizeof(line));
strlcat(line, "<", sizeof(line)); strlcat(line, "<", sizeof(line));
strlcpy(name_enc, name, sizeof(name_enc)); strlcpy(name_enc, name, sizeof(name_enc));
if (writer->translate) mxml_encode(name_enc, sizeof(name_enc), writer->translate);
mxml_encode(name_enc, sizeof(name_enc));
strlcat(line, name_enc, sizeof(line)); strlcat(line, name_enc, sizeof(line));
/* put element on stack */ /* put element on stack */
@ -438,11 +456,9 @@ int mxml_write_attribute(MXML_WRITER *writer, const char *name, const char *valu
return FALSE; return FALSE;
strcpy(name_enc, name); strcpy(name_enc, name);
if (writer->translate) mxml_encode(name_enc, sizeof(name_enc), writer->translate);
mxml_encode(name_enc, sizeof(name_enc));
strcpy(val_enc, value); strcpy(val_enc, value);
if (writer->translate) mxml_encode(val_enc, sizeof(val_enc), writer->translate);
mxml_encode(val_enc, sizeof(val_enc));
sprintf(line, " %s=\"%s\"", name_enc, val_enc); sprintf(line, " %s=\"%s\"", name_enc, val_enc);
@ -474,8 +490,7 @@ int mxml_write_value(MXML_WRITER *writer, const char *data)
} }
strcpy(data_enc, data); strcpy(data_enc, data);
if (writer->translate) mxml_encode(data_enc, data_size, writer->translate);
mxml_encode(data_enc, data_size);
return mxml_write_line(writer, data_enc) == (int)strlen(data_enc); return mxml_write_line(writer, data_enc) == (int)strlen(data_enc);
} }