Skip to content

Commit 8eac054

Browse files
committed
Refactor: libcrmcommon: Functionize appending XML-escaped character
Signed-off-by: Reid Wahl <nrwahl@protonmail.com>
1 parent 204d349 commit 8eac054

1 file changed

Lines changed: 88 additions & 74 deletions

File tree

lib/common/xml.c

Lines changed: 88 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1160,6 +1160,93 @@ pcmk__xml_needs_escape(const char *text, enum pcmk__xml_escape_type type)
11601160
return false;
11611161
}
11621162

1163+
/*!
1164+
* \internal
1165+
* \brief Append an XML-escaped character to a buffer
1166+
*
1167+
* \param[in] current_char Character to escape
1168+
* \param[in] type Type of escaping
1169+
* \param[in,out] buffer Buffer
1170+
*/
1171+
static void
1172+
append_xml_escaped_char(char current_char, enum pcmk__xml_escape_type type,
1173+
GString *buffer)
1174+
{
1175+
switch (type) {
1176+
case pcmk__xml_escape_text:
1177+
switch (current_char) {
1178+
case '<':
1179+
g_string_append(buffer, PCMK__XML_ENTITY_LT);
1180+
return;
1181+
case '>':
1182+
g_string_append(buffer, PCMK__XML_ENTITY_GT);
1183+
return;
1184+
case '&':
1185+
g_string_append(buffer, PCMK__XML_ENTITY_AMP);
1186+
return;
1187+
case '\n':
1188+
case '\t':
1189+
g_string_append_c(buffer, current_char);
1190+
return;
1191+
default:
1192+
if (g_ascii_iscntrl(current_char)) {
1193+
g_string_append_printf(buffer, "&#x%.2X;",
1194+
current_char);
1195+
} else {
1196+
g_string_append_c(buffer, current_char);
1197+
}
1198+
return;
1199+
}
1200+
1201+
case pcmk__xml_escape_attr:
1202+
switch (current_char) {
1203+
case '<':
1204+
g_string_append(buffer, PCMK__XML_ENTITY_LT);
1205+
return;
1206+
case '>':
1207+
g_string_append(buffer, PCMK__XML_ENTITY_GT);
1208+
return;
1209+
case '&':
1210+
g_string_append(buffer, PCMK__XML_ENTITY_AMP);
1211+
return;
1212+
case '"':
1213+
g_string_append(buffer, PCMK__XML_ENTITY_QUOT);
1214+
return;
1215+
default:
1216+
if (g_ascii_iscntrl(current_char)) {
1217+
g_string_append_printf(buffer, "&#x%.2X;",
1218+
current_char);
1219+
} else {
1220+
g_string_append_c(buffer, current_char);
1221+
}
1222+
return;
1223+
}
1224+
1225+
case pcmk__xml_escape_attr_pretty:
1226+
switch (current_char) {
1227+
case '"':
1228+
g_string_append(buffer, "\\\"");
1229+
return;
1230+
case '\n':
1231+
g_string_append(buffer, "\\n");
1232+
return;
1233+
case '\r':
1234+
g_string_append(buffer, "\\r");
1235+
return;
1236+
case '\t':
1237+
g_string_append(buffer, "\\t");
1238+
return;
1239+
default:
1240+
g_string_append_c(buffer, current_char);
1241+
return;
1242+
}
1243+
1244+
default: // Invalid enum value
1245+
pcmk__assert(false);
1246+
return;
1247+
}
1248+
}
1249+
11631250
/*!
11641251
* \internal
11651252
* \brief Replace special characters with their XML escape sequences
@@ -1199,80 +1286,7 @@ pcmk__xml_escape(const char *text, enum pcmk__xml_escape_type type)
11991286
continue;
12001287
}
12011288

1202-
switch (type) {
1203-
case pcmk__xml_escape_text:
1204-
switch (*text) {
1205-
case '<':
1206-
g_string_append(copy, PCMK__XML_ENTITY_LT);
1207-
break;
1208-
case '>':
1209-
g_string_append(copy, PCMK__XML_ENTITY_GT);
1210-
break;
1211-
case '&':
1212-
g_string_append(copy, PCMK__XML_ENTITY_AMP);
1213-
break;
1214-
case '\n':
1215-
case '\t':
1216-
g_string_append_c(copy, *text);
1217-
break;
1218-
default:
1219-
if (g_ascii_iscntrl(*text)) {
1220-
g_string_append_printf(copy, "&#x%.2X;", *text);
1221-
} else {
1222-
g_string_append_c(copy, *text);
1223-
}
1224-
break;
1225-
}
1226-
break;
1227-
1228-
case pcmk__xml_escape_attr:
1229-
switch (*text) {
1230-
case '<':
1231-
g_string_append(copy, PCMK__XML_ENTITY_LT);
1232-
break;
1233-
case '>':
1234-
g_string_append(copy, PCMK__XML_ENTITY_GT);
1235-
break;
1236-
case '&':
1237-
g_string_append(copy, PCMK__XML_ENTITY_AMP);
1238-
break;
1239-
case '"':
1240-
g_string_append(copy, PCMK__XML_ENTITY_QUOT);
1241-
break;
1242-
default:
1243-
if (g_ascii_iscntrl(*text)) {
1244-
g_string_append_printf(copy, "&#x%.2X;", *text);
1245-
} else {
1246-
g_string_append_c(copy, *text);
1247-
}
1248-
break;
1249-
}
1250-
break;
1251-
1252-
case pcmk__xml_escape_attr_pretty:
1253-
switch (*text) {
1254-
case '"':
1255-
g_string_append(copy, "\\\"");
1256-
break;
1257-
case '\n':
1258-
g_string_append(copy, "\\n");
1259-
break;
1260-
case '\r':
1261-
g_string_append(copy, "\\r");
1262-
break;
1263-
case '\t':
1264-
g_string_append(copy, "\\t");
1265-
break;
1266-
default:
1267-
g_string_append_c(copy, *text);
1268-
break;
1269-
}
1270-
break;
1271-
1272-
default: // Invalid enum value
1273-
pcmk__assert(false);
1274-
break;
1275-
}
1289+
append_xml_escaped_char(*text, type, copy);
12761290

12771291
text = g_utf8_next_char(text);
12781292
}

0 commit comments

Comments
 (0)