tReplaced calls to strerror() with a function that automatically converts from … | |
git clone git://src.adamsgaard.dk/vaccinewars | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 3b5c2ce242bbfb0726bf0fffe006e5e5f607eec1 | |
parent d16c72301fc42e813bc8500815d96ec6f4f23a48 | |
Author: Ben Webb <[email protected]> | |
Date: Mon, 29 Apr 2002 10:33:53 +0000 | |
Replaced calls to strerror() with a function that automatically converts | |
from the locale's charset to UTF-8 where necessary. | |
Diffstat: | |
M src/error.c | 42 +++++++++++++++++++++++++++++… | |
M src/error.h | 2 ++ | |
M src/gui_client/gtk_client.c | 1 + | |
M src/gui_client/optdialog.c | 4 +++- | |
4 files changed, 47 insertions(+), 2 deletions(-) | |
--- | |
diff --git a/src/error.c b/src/error.c | |
t@@ -37,6 +37,44 @@ | |
#include "error.h" | |
#include "nls.h" | |
+static gboolean err_utf8_encoding = FALSE; | |
+ | |
+/* | |
+ * If "want" is TRUE, we want all error texts (via. strerror) in UTF8, | |
+ * even if the locale's charset is not UTF8. | |
+ */ | |
+void WantUTF8Errors(gboolean want) | |
+{ | |
+ err_utf8_encoding = want; | |
+} | |
+ | |
+/* | |
+ * Returns the strerror() error string for the given error code, | |
+ * possibly translated to UTF8. N.B. Unlike strerror(), this string | |
+ * must be g_free'd by the caller when no longer needed. | |
+ */ | |
+gchar *ErrStrFromErrno(int errcode) | |
+{ | |
+ gchar *untran = strerror(errcode); | |
+ | |
+#ifdef HAVE_GLIB2 | |
+ if (err_utf8_encoding) { | |
+ gchar *utf8str; | |
+ | |
+ utf8str = g_locale_to_utf8(untran, strlen(untran), NULL, NULL, NULL); | |
+ if (utf8str) { | |
+ return utf8str; | |
+ } else { | |
+ g_strdup(_("(Error cannot be displayed in UTF-8)")); | |
+ } | |
+ } else { | |
+ return g_strdup(untran); | |
+ } | |
+#else | |
+ return g_strdup(untran); | |
+#endif | |
+} | |
+ | |
void FreeError(LastError *error) | |
{ | |
if (!error) | |
t@@ -103,7 +141,9 @@ ErrorType *ET_CUSTOM = &ETCustom; | |
*/ | |
void ErrnoAppendError(GString *str, LastError *error) | |
{ | |
- g_string_append(str, strerror(error->code)); | |
+ gchar *errstr = ErrStrFromErrno(error->code); | |
+ g_string_append(str, errstr); | |
+ g_free(errstr); | |
} | |
static ErrorType ETErrno = { ErrnoAppendError, NULL }; | |
diff --git a/src/error.h b/src/error.h | |
t@@ -58,6 +58,8 @@ typedef struct _ErrTable { | |
gchar *string; | |
} ErrTable; | |
+void WantUTF8Errors(gboolean want); | |
+gchar *ErrStrFromErrno(int errcode); | |
void FreeError(LastError *error); | |
LastError *NewError(ErrorType *type, gint code, gpointer data); | |
void SetError(LastError **error, ErrorType *type, gint code, | |
diff --git a/src/gui_client/gtk_client.c b/src/gui_client/gtk_client.c | |
t@@ -2205,6 +2205,7 @@ gboolean GtkLoop(int *argc, char **argv[], gboolean Retu… | |
bind_textdomain_codeset(PACKAGE, "UTF-8"); | |
ConvertToUTF8(); | |
+ WantUTF8Errors(TRUE); | |
#endif | |
/* Set up message handlers */ | |
diff --git a/src/gui_client/optdialog.c b/src/gui_client/optdialog.c | |
t@@ -552,7 +552,9 @@ static void UpdateLocalConfig(void) | |
} | |
if (!fp) { | |
- g_warning(_("Could not open file %s: %s"), cfgfile, strerror(errno)); | |
+ gchar *errstr = ErrStrFromErrno(errno); | |
+ g_warning(_("Could not open file %s: %s"), cfgfile, errstr); | |
+ g_free(errstr); | |
g_free(cfgfile); | |
return; | |
} |