@@ -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