+static bool
+chars_equal_ignore_case(char x, char y)
+{
+ /* app should have called setlocale() if its wants this comparison to be
+ locale sensitive.
+ */
+ return toupper (x) == toupper (y);
+}
+
+bool
+strings_equal_ignore_case (const string& a, const string& b)
+{
+ if (a.length() == b.length()) {
+ return std::equal (a.begin(), a.end(), b.begin(), chars_equal_ignore_case);
+ }
+ return false;
+}
+
+bool
+string_is_affirmative (const std::string& str)
+{
+ /* to be used only with XML data - not intended to handle user input */
+
+ if (str.empty ()) {
+ return false;
+ }
+
+ /* the use of g_ascii_strncasecmp() is solely to get around issues with
+ * charsets posed by trying to use C++ for the same
+ * comparison. switching a std::string to its lower- or upper-case
+ * version has several issues, but handled by default
+ * in the way we desire when doing it in C.
+ */
+
+ return str == "1" || str == "y" || str == "Y" || (!g_ascii_strncasecmp(str.c_str(), "yes", str.length())) ||
+ (!g_ascii_strncasecmp(str.c_str(), "true", str.length()));
+}
+
+/** A wrapper for dgettext that takes a msgid of the form Context|Text.
+ * If Context|Text is translated, the translation is returned, otherwise
+ * just Text is returned. Useful for getting translations of words or phrases
+ * that have different meanings in different contexts.
+ */
+const char *
+sgettext (const char* domain_name, const char* msgid)
+{
+ const char * msgval = dgettext (domain_name, msgid);
+ if (msgval == msgid) {
+ const char * p = strrchr (msgid, '|');
+ if (p) {
+ msgval = p + 1;
+ }
+ }
+ return msgval;
+}
+