summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.sources2
-rw-r--r--css/ruleset.c1
-rw-r--r--desktop/browser.c1
-rw-r--r--desktop/frames.c1
-rw-r--r--desktop/netsurf.c2
-rw-r--r--render/box_construct.c11
-rw-r--r--render/layout.c1
-rw-r--r--riscos/401login.c1
-rw-r--r--riscos/download.c1
-rw-r--r--riscos/plugin.c1
-rw-r--r--riscos/wimp.c20
-rw-r--r--utils/locale.c53
-rw-r--r--utils/locale.h42
13 files changed, 120 insertions, 17 deletions
diff --git a/Makefile.sources b/Makefile.sources
index 340070670..adb73167e 100644
--- a/Makefile.sources
+++ b/Makefile.sources
@@ -11,7 +11,7 @@ S_CSS := css.c css_enum.c parser.c ruleset.c scanner.c
S_RENDER := box.c box_construct.c box_normalise.c \
directory.c form.c html.c html_redraw.c \
imagemap.c layout.c list.c table.c textplain.c
-S_UTILS := base64.c filename.c hashtable.c messages.c talloc.c \
+S_UTILS := base64.c filename.c hashtable.c locale.c messages.c talloc.c \
url.c utf8.c utils.c useragent.c
S_DESKTOP := knockout.c options.c tree.c version.c
diff --git a/css/ruleset.c b/css/ruleset.c
index 325f43ddd..ae1d097fa 100644
--- a/css/ruleset.c
+++ b/css/ruleset.c
@@ -31,7 +31,6 @@
#define _GNU_SOURCE /* for strndup */
#include <assert.h>
-#include <ctype.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
diff --git a/desktop/browser.c b/desktop/browser.c
index 741dba811..55e3f793e 100644
--- a/desktop/browser.c
+++ b/desktop/browser.c
@@ -26,7 +26,6 @@
*/
#include <assert.h>
-#include <ctype.h>
#include <limits.h>
#include <stdbool.h>
#include <stdint.h>
diff --git a/desktop/frames.c b/desktop/frames.c
index e7c95e766..1d9e2c2fc 100644
--- a/desktop/frames.c
+++ b/desktop/frames.c
@@ -21,7 +21,6 @@
*/
#include <assert.h>
-#include <ctype.h>
#include <limits.h>
#include <stdbool.h>
#include <stdint.h>
diff --git a/desktop/netsurf.c b/desktop/netsurf.c
index 1a2eb5f64..cc823d4e9 100644
--- a/desktop/netsurf.c
+++ b/desktop/netsurf.c
@@ -18,7 +18,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <locale.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
@@ -111,7 +110,6 @@ void netsurf_init(int argc, char** argv)
lib_init();
url_init();
gui_init(argc, argv);
- setlocale(LC_ALL, "");
fetch_init();
fetchcache_init();
gui_init2(argc, argv);
diff --git a/render/box_construct.c b/render/box_construct.c
index b05dcc019..9c001cb0d 100644
--- a/render/box_construct.c
+++ b/render/box_construct.c
@@ -43,6 +43,7 @@
#include "render/form.h"
#include "render/html.h"
#include "desktop/gui.h"
+#include "utils/locale.h"
//#define NDEBUG
#include "utils/log.h"
#include "utils/messages.h"
@@ -1362,20 +1363,20 @@ void box_text_transform(char *s, unsigned int len,
case CSS_TEXT_TRANSFORM_UPPERCASE:
for (i = 0; i < len; ++i)
if ((unsigned char) s[i] < 0x80)
- s[i] = toupper(s[i]);
+ s[i] = ls_toupper(s[i]);
break;
case CSS_TEXT_TRANSFORM_LOWERCASE:
for (i = 0; i < len; ++i)
if ((unsigned char) s[i] < 0x80)
- s[i] = tolower(s[i]);
+ s[i] = ls_tolower(s[i]);
break;
case CSS_TEXT_TRANSFORM_CAPITALIZE:
if ((unsigned char) s[0] < 0x80)
- s[0] = toupper(s[0]);
+ s[0] = ls_toupper(s[0]);
for (i = 1; i < len; ++i)
if ((unsigned char) s[i] < 0x80 &&
- isspace(s[i - 1]))
- s[i] = toupper(s[i]);
+ ls_isspace(s[i - 1]))
+ s[i] = ls_toupper(s[i]);
break;
default:
break;
diff --git a/render/layout.c b/render/layout.c
index e93c41a5d..7a8dbd53a 100644
--- a/render/layout.c
+++ b/render/layout.c
@@ -33,7 +33,6 @@
#define _GNU_SOURCE /* for strndup */
#include <assert.h>
-#include <ctype.h>
#include <limits.h>
#include <stdbool.h>
#include <stdio.h>
diff --git a/riscos/401login.c b/riscos/401login.c
index e65c0097b..cfc256ad8 100644
--- a/riscos/401login.c
+++ b/riscos/401login.c
@@ -17,7 +17,6 @@
*/
#include <assert.h>
-#include <ctype.h>
#include <stdbool.h>
#include <string.h>
#include "oslib/wimp.h"
diff --git a/riscos/download.c b/riscos/download.c
index 4affe26dd..9d0625f4a 100644
--- a/riscos/download.c
+++ b/riscos/download.c
@@ -29,7 +29,6 @@
*/
#include <assert.h>
-#include <ctype.h>
#include <string.h>
#include <sys/time.h>
#include <time.h>
diff --git a/riscos/plugin.c b/riscos/plugin.c
index c08397de4..dd10b3a2d 100644
--- a/riscos/plugin.c
+++ b/riscos/plugin.c
@@ -38,7 +38,6 @@
*/
#include <assert.h>
-#include <ctype.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
diff --git a/riscos/wimp.c b/riscos/wimp.c
index cc22c1091..9463df56b 100644
--- a/riscos/wimp.c
+++ b/riscos/wimp.c
@@ -21,7 +21,7 @@
*/
#include <assert.h>
-#include <ctype.h>
+#include <locale.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
@@ -51,7 +51,7 @@ static wimp_w furniture_window = NULL;
unsigned char last_sprite_found[16];
/**
- * Gets the horzontal scrollbar height
+ * Gets the horizontal scrollbar height
*
* \param w the window to read (or NULL to read a cached value)
*/
@@ -398,7 +398,13 @@ void ro_gui_set_icon_string_le(wimp_w w, wimp_i i, const char *text) {
*/
void ro_gui_set_icon_integer(wimp_w w, wimp_i i, int value) {
char buffer[20]; // Big enough for 64-bit int
+
+ setlocale(LC_NUMERIC, "");
+
sprintf(buffer, "%d", value);
+
+ setlocale(LC_NUMERIC, "C");
+
ro_gui_set_icon_string(w, i, buffer);
}
@@ -413,6 +419,8 @@ void ro_gui_set_icon_integer(wimp_w w, wimp_i i, int value) {
void ro_gui_set_icon_decimal(wimp_w w, wimp_i i, int value, int decimal_places) {
char buffer[20]; // Big enough for 64-bit int
+ setlocale(LC_NUMERIC, "");
+
switch (decimal_places) {
case 0:
sprintf(buffer, "%d", value);
@@ -427,6 +435,9 @@ void ro_gui_set_icon_decimal(wimp_w w, wimp_i i, int value, int decimal_places)
assert(!"Unsupported decimal format");
break;
}
+
+ setlocale(LC_NUMERIC, "C");
+
ro_gui_set_icon_string(w, i, buffer);
}
@@ -445,7 +456,12 @@ int ro_gui_get_icon_decimal(wimp_w w, wimp_i i, int decimal_places) {
for (; decimal_places > 0; decimal_places--)
multiple *= 10;
+ setlocale(LC_NUMERIC, "");
+
value = atof(ro_gui_get_icon_string(w, i)) * multiple;
+
+ setlocale(LC_NUMERIC, "C");
+
return (int)value;
}
diff --git a/utils/locale.c b/utils/locale.c
new file mode 100644
index 000000000..88509e4d5
--- /dev/null
+++ b/utils/locale.c
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2008 John-Mark Bell <jmb@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * Locale-specific variants of various routines (implementation)
+ */
+
+#include <ctype.h>
+#include <locale.h>
+
+#include "utils/locale.h"
+
+/* <ctype.h> functions */
+#define MAKELSCTYPE(x) int ls_##x(int c) \
+{ \
+ int ret; \
+ setlocale(LC_ALL, ""); \
+ ret = x(c); \
+ setlocale(LC_ALL, "C"); \
+ return ret; \
+}
+
+MAKELSCTYPE(isalpha)
+MAKELSCTYPE(isalnum)
+MAKELSCTYPE(iscntrl)
+MAKELSCTYPE(isdigit)
+MAKELSCTYPE(isgraph)
+MAKELSCTYPE(islower)
+MAKELSCTYPE(isprint)
+MAKELSCTYPE(ispunct)
+MAKELSCTYPE(isspace)
+MAKELSCTYPE(isupper)
+MAKELSCTYPE(isxdigit)
+MAKELSCTYPE(tolower)
+MAKELSCTYPE(toupper)
+
+#undef MAKELSCTYPE
+
diff --git a/utils/locale.h b/utils/locale.h
new file mode 100644
index 000000000..ebe9a9063
--- /dev/null
+++ b/utils/locale.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2008 John-Mark Bell <jmb@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * Locale-specific variants of various routines (interface)
+ */
+
+#ifndef _NETSURF_UTILS_LOCALE_H_
+#define _NETSURF_UTILS_LOCALE_H_
+
+/* <ctype.h> functions */
+int ls_isalpha(int c);
+int ls_isalnum(int c);
+int ls_iscntrl(int c);
+int ls_isdigit(int c);
+int ls_isgraph(int c);
+int ls_islower(int c);
+int ls_isprint(int c);
+int ls_ispunct(int c);
+int ls_isspace(int c);
+int ls_isupper(int c);
+int ls_isxdigit(int c);
+int ls_tolower(int c);
+int ls_toupper(int c);
+
+#endif
+