Is this necessary to avoid LC_CTYPE="C"? If so, I stopped that at C level
yesterday (it was already disallowed when starting R).
On Tue, 23 May 2006, Ei-ji Nakama wrote:
It clash similarly in the Japanese locale.
localeCP!= GetACP() .
It dies from msvcrt (mb*) the case where NULL is specified.
diff -ruN R-2.3.0.orig/src/gnuwin32/graphapp/buttons.c
R-2.3.0/src/gnuwin32/graphapp/buttons.c
--- R-2.3.0.orig/src/gnuwin32/graphapp/buttons.c Mon Apr 10 07:20:00 2006
+++ R-2.3.0/src/gnuwin32/graphapp/buttons.c Tue May 23 16:26:51 2006
@@ -132,9 +132,16 @@
if(is_NT && (localeCP != GetACP())) {
wchar_t wkind[100], wc[1000];
- mbstowcs(wkind, kind, 100);
- mbstowcs(wc, text, 1000);
- hwnd = CreateWindowW(wkind, wc,
+ wchar_t *wkindp=wkind, *wcp=wc;
+ if(kind)
+ mbstowcs(wkindp, kind, 100);
+ else
+ wkindp=NULL;
+ if(text)
+ mbstowcs(wcp, text, 1000);
+ else
+ wcp=NULL;
+ hwnd = CreateWindowW(wkindp, wcp,
(WS_CHILD | WS_VISIBLE) | style,
r.x, r.y, r.width, r.height,
current_window->handle,
diff -ruN R-2.3.0.orig/src/gnuwin32/graphapp/menus.c
R-2.3.0/src/gnuwin32/graphapp/menus.c
--- R-2.3.0.orig/src/gnuwin32/graphapp/menus.c Mon Apr 10 07:20:00 2006
+++ R-2.3.0/src/gnuwin32/graphapp/menus.c Tue May 23 15:36:14 2006
@@ -302,9 +302,12 @@
BOOL myAppendMenu(HMENU h, UINT flags, UINT id, LPCTSTR name)
{
if(is_NT && (localeCP != GetACP())) {
- wchar_t wc[100];
- mbstowcs(wc, name, 100);
- return AppendMenuW(h, flags, id, wc);
+ wchar_t wc[100], *wcp=wc;
+ if (name)
+ mbstowcs(wcp, name, 100);
+ else
+ wcp=NULL;
+ return AppendMenuW(h, flags, id, wcp);
} else
return AppendMenuA(h, flags, id, name);
}
diff -ruN R-2.3.0.orig/src/gnuwin32/graphapp/windows.c
R-2.3.0/src/gnuwin32/graphapp/windows.c
--- R-2.3.0.orig/src/gnuwin32/graphapp/windows.c Mon Apr 10 07:20:00 2006
+++ R-2.3.0/src/gnuwin32/graphapp/windows.c Tue May 23 16:39:23 2006
@@ -455,13 +455,21 @@
if(is_NT && (localeCP != GetACP())) {
wchar_t wkind[100], wc[1000];
- mbstowcs(wkind, (flags & Workspace) ? work_class_name
- : win_class_name, 100);
- mbstowcs(wc, name, 1000);
+ wchar_t *wkindp=wkind, *wcp=wc;
+ if((flags & Workspace) ? work_class_name
+ : win_class_name)
+ mbstowcs(wkindp, (flags & Workspace) ? work_class_name
+ : win_class_name, 100);
+ else
+ wkindp=NULL;
+ if(name)
+ mbstowcs(wcp, name, 1000);
+ else
+ wcp=NULL;
hwnd = CreateWindowExW(
ex_style,
- wkind,
- wc, win_style,
+ wkindp,
+ wcp, win_style,
r.x, r.y, r.width, r.height,
(HWND) ((flags & ChildWindow) ?
current_window->handle : 0),
2006/5/23, Prof Brian Ripley <ripley at stats.ox.ac.uk>:
On Mon, 22 May 2006, Ei-ji Nakama wrote:
If a return value of locale does not have a period, a function of libmingwex
gives back NULL in strchr and refers to NULL pointer in atoi.
But it will be right to fix mingw...
--- locales.R.orig Mon Apr 10 07:19:19 2006
+++ locales.R Mon May 22 22:55:21 2006
@@ -10,6 +10,7 @@
{
category <- match(category, c("LC_ALL", "LC_COLLATE", "LC_CTYPE",
"LC_MONETARY", "LC_NUMERIC", "LC_TIME"))
+ if(locale == "C") locale = "English_United States.1252");
if(is.na(category)) stop("invalid 'category' argument")
.Internal(setlocale(category, locale))
}
Unfortunately that does not affect e.g. 'Rgui LC_ALL=C' so a more
comprehensive C-level fix would be needed.
I did wonder if mingwex was the problem, but in theory at least it knows
about the C locale (cp = 0), and the crash was coming from MSVCRT.dll, in
the conversion of an ASCII string to wchar. Since it works in other
Windows base locales it did seem specific to Thai (which is still a
single-byte locale).
2006/5/22, ripley at stats.ox.ac.uk <ripley at stats.ox.ac.uk>:
On Mon, 22 May 2006, Edward wrote:
Hi,
We tried it on 3 separate windows XP computers using version 2.3.0.
The original locale is set for Thailand on all 3.
So how do we fix it? Is there another patch?
Don't try to do graphics in the C locale on your computer?
I suspect this is a font problem in Windows, in that your fonts may be
specific to the Thai localization. But without a means of reproducing
this, I can only guess.
If you can set up a debugger (see the rw-FAQ), you may be able to give us
some additional clues as the where the crash is occuring.
And why does the crash not happen with earlier R versions (eg. 2.2.1) on the
same computer?
Because of the issue mentioned in the CHANGES file, the change to the C
locale was reverted by opening a graphics window.
[1]
"LC_COLLATE=Thai_Thailand.874;LC_CTYPE=Thai_Thailand.874;LC_MONETARY=Thai_Thailand.874;LC_NUMERIC=C;LC_TIME=Thai_Thailand.874"
---
Thanks
Edward
----- Original Message ----- From: "Prof Brian Ripley"
<ripley at stats.ox.ac.uk>
To: <edward.m at psu.ac.th>
Cc: <R-bugs at biostat.ku.dk>
Sent: Monday, May 22, 2006 2:32 PM
Subject: Re: [Rd] Sys.setlocale upsets windows graphics device (PR#8887)
Works perfectly for me. There was a bug in 2.2.1, but it was fixed in
2.2.1 patched (see CHANGES).
What locale were you changing from? (This might be a Windows problem
specific to your locale.)
On Mon, 22 May 2006, edward.m at psu.ac.th wrote:
Full_Name: Edward McNeil
Version: 2.3.0
OS: Widows XP
Submission from: (NULL) (203.170.234.5)
Type the following:
Sys.setlocale("LC_ALL","C")
hist(1:10)