Skip to content

Sys.setlocale upsets windows graphics device (PR#8887)

6 messages · Brian Ripley, Ei-ji Nakama

#
On Mon, 22 May 2006, Edward wrote:

            
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.
Because of the issue mentioned in the CHANGES file, the change to the C 
locale was reverted by opening a graphics window.

  
    
#
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))
 }


2006/5/22, ripley at stats.ox.ac.uk <ripley at stats.ox.ac.uk>:

  
    
#
On Mon, 22 May 2006, Ei-ji Nakama wrote:

            
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).

  
    
#
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>:

  
    
#
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:

            

  
    
#
Yes, if this processing does not exist on japanese locale
will fall.

2006/5/23, Prof Brian Ripley <ripley at stats.ox.ac.uk>: