Skip to content

Commit 61ac8e0

Browse files
committed
Refactor: libcrmcommon: Functionize XML escape append modes
Signed-off-by: Reid Wahl <nrwahl@protonmail.com>
1 parent 8eac054 commit 61ac8e0

1 file changed

Lines changed: 120 additions & 62 deletions

File tree

lib/common/xml.c

Lines changed: 120 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1160,6 +1160,120 @@ 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 (text escaping)
1166+
*
1167+
* This appends an escaped character in \c pcmk__xml_escape_text mode.
1168+
*
1169+
* \param[in] current_char Character to escape
1170+
* \param[in,out] buffer Buffer
1171+
*/
1172+
static void
1173+
append_xml_escaped_char_text(char current_char, GString *buffer)
1174+
{
1175+
switch (current_char) {
1176+
case '<':
1177+
g_string_append(buffer, PCMK__XML_ENTITY_LT);
1178+
return;
1179+
1180+
case '>':
1181+
g_string_append(buffer, PCMK__XML_ENTITY_GT);
1182+
return;
1183+
1184+
case '&':
1185+
g_string_append(buffer, PCMK__XML_ENTITY_AMP);
1186+
return;
1187+
1188+
case '\n':
1189+
case '\t':
1190+
g_string_append_c(buffer, current_char);
1191+
return;
1192+
1193+
default:
1194+
if (g_ascii_iscntrl(current_char)) {
1195+
g_string_append_printf(buffer, "&#x%.2X;", current_char);
1196+
} else {
1197+
g_string_append_c(buffer, current_char);
1198+
}
1199+
return;
1200+
}
1201+
}
1202+
1203+
/*!
1204+
* \internal
1205+
* \brief Append an XML-escaped character to a buffer (attribute escaping)
1206+
*
1207+
* This appends an escaped character in \c pcmk__xml_escape_attr mode.
1208+
*
1209+
* \param[in] current_char Character to escape
1210+
* \param[in,out] buffer Buffer
1211+
*/
1212+
static void
1213+
append_xml_escaped_char_attr(char current_char, GString *buffer)
1214+
{
1215+
switch (current_char) {
1216+
case '<':
1217+
g_string_append(buffer, PCMK__XML_ENTITY_LT);
1218+
return;
1219+
1220+
case '>':
1221+
g_string_append(buffer, PCMK__XML_ENTITY_GT);
1222+
return;
1223+
1224+
case '&':
1225+
g_string_append(buffer, PCMK__XML_ENTITY_AMP);
1226+
return;
1227+
1228+
case '"':
1229+
g_string_append(buffer, PCMK__XML_ENTITY_QUOT);
1230+
return;
1231+
1232+
default:
1233+
if (g_ascii_iscntrl(current_char)) {
1234+
g_string_append_printf(buffer, "&#x%.2X;", current_char);
1235+
} else {
1236+
g_string_append_c(buffer, current_char);
1237+
}
1238+
return;
1239+
}
1240+
}
1241+
1242+
/*!
1243+
* \internal
1244+
* \brief Append an XML-escaped character to a buffer (pretty escaping)
1245+
*
1246+
* This appends an escaped character in \c pcmk__xml_escape_attr_pretty mode.
1247+
*
1248+
* \param[in] current_char Character to escape
1249+
* \param[in,out] buffer Buffer
1250+
*/
1251+
static void
1252+
append_xml_escaped_char_pretty(char current_char, GString *buffer)
1253+
{
1254+
switch (current_char) {
1255+
case '"':
1256+
g_string_append(buffer, "\\\"");
1257+
return;
1258+
1259+
case '\n':
1260+
g_string_append(buffer, "\\n");
1261+
return;
1262+
1263+
case '\r':
1264+
g_string_append(buffer, "\\r");
1265+
return;
1266+
1267+
case '\t':
1268+
g_string_append(buffer, "\\t");
1269+
return;
1270+
1271+
default:
1272+
g_string_append_c(buffer, current_char);
1273+
return;
1274+
}
1275+
}
1276+
11631277
/*!
11641278
* \internal
11651279
* \brief Append an XML-escaped character to a buffer
@@ -1174,72 +1288,16 @@ append_xml_escaped_char(char current_char, enum pcmk__xml_escape_type type,
11741288
{
11751289
switch (type) {
11761290
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-
}
1291+
append_xml_escaped_char_text(current_char, buffer);
1292+
return;
12001293

12011294
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-
}
1295+
append_xml_escaped_char_attr(current_char, buffer);
1296+
return;
12241297

12251298
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-
}
1299+
append_xml_escaped_char_pretty(current_char, buffer);
1300+
return;
12431301

12441302
default: // Invalid enum value
12451303
pcmk__assert(false);

0 commit comments

Comments
 (0)