void str_repr_encode_append(GString *escaped_string, const gchar *str, gssize str_len, const gchar *forbidden_chars) { const gchar *apostrophe, *quote; if (str_len < 0) str_len = strlen(str); if (str_len == 0) { g_string_append_len(escaped_string, "\"\"", 2); return; } apostrophe = memchr(str, '\'', str_len); quote = memchr(str, '"', str_len); if (!apostrophe && !quote) { gboolean quoting_needed = FALSE; if ((strcspn(str, "\b\f\n\r\t\\ ")) != str_len || (forbidden_chars && strcspn(str, forbidden_chars) != str_len)) quoting_needed = TRUE; if (!quoting_needed) { g_string_append_len(escaped_string, str, str_len); return; } } if (!apostrophe && quote) { g_string_append_c(escaped_string, '\''); append_unsafe_utf8_as_escaped_binary(escaped_string, str, str_len, NULL); g_string_append_c(escaped_string, '\''); } else if (!quote && apostrophe) { g_string_append_c(escaped_string, '"'); append_unsafe_utf8_as_escaped_binary(escaped_string, str, str_len, NULL); g_string_append_c(escaped_string, '"'); } else { g_string_append_c(escaped_string, '"'); append_unsafe_utf8_as_escaped_binary(escaped_string, str, str_len, "\""); g_string_append_c(escaped_string, '"'); } }
gchar * convert_unsafe_utf8_to_escaped_binary(const gchar *str, gssize str_len, const gchar *unsafe_chars) { if (str_len < 0) str_len = strlen(str); GString *escaped_string = g_string_sized_new(str_len); append_unsafe_utf8_as_escaped_binary(escaped_string, str, str_len, unsafe_chars); return g_string_free(escaped_string, FALSE); }