Jens Schmidt on Fri, 21 Apr 2017 19:43:33 +0200


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: PARI/GP for Windows doesn't support umlauts and diacritical signs but it's possible


Bill Allombert schrieb:
> On Fri, Apr 21, 2017 at 11:39:00AM +0200, Jens Schmidt wrote:
>> There is another related? effect with readline and colors in Windows
>> (not only in Wine).
>>
>> To test this start clean PARI/GP without any preloaded defaults in a
>> windows console:
>>
>>   gp -f
>>   default(prompt, "gp >")
>>   default(colors, brightfg)
>>   default(readline, 0)
>>
>> The white prompt switches to yellow color and brightness on. Now type:
>>
>>   default(readline, 4)
>>
>> The prompt switches back to white color and brightness off. This
>> should'nt happen.
> 
> This is a know issue. The default Windows terminal does not handle
> ANSI color sequences, so we use a function win32_ansi_fputs()
> in src/systems/mingw/mingw.c that parses the color code and sets the
> terminal color using SetConsoleTextAttribute.
> 
> Unfortunately the prompt is printed directly by readline and we did
> not find a way to have readline use win32_ansi_fputs() or set the
> color correctly.
> 
> If you have a solution for this, please tell us.
> 
> Cheers,
> Bill.
> 

There is another problem that prevents PARI/GP from initializing
properly. libreadline uses setlocale from MinGW which is forwarded to
msvcrt.dll in Windows. msvcrt's setlocale doesn't support real locale -
it reports only "C" or NULL. C is 7-bit ASCII.

I have appended a patch (as a suggestion) that solves both problems.
  1. setlocale() is replaced by an own functioning version.
  2. init_readline() gets an additional call to rl_initialize().

The patch makes PARI/GP 2.9.2 working on my testing systems (Windows 7
and Wine).

LG - Jens

*** gp_rl.c	2017-01-14 13:26:42.000000000 +0100
--- gp_rl.c.new	2017-04-21 19:09:02.182999912 +0200
*************** gp_completion(char *text, int START, int
*** 361,366 ****
--- 361,383 ----
    return pari_completion(&pari_rl, text, START, END);
  }
  
+ #ifdef __MINGW32__
+ /*
+  * Replacement setlocale() to enable special chars in libreadline.
+  *
+  * Get environment info from LC_CTYPE, LC_ALL or LANG in this order.
+  */
+ char *setlocale(int category, const char *locale)
+ {
+   static char loc[64];
+   char *e = getenv("LC_CTYPE")?: getenv("LC_ALL")?: getenv("LANG");
+ 
+   strncpy(loc, (e && *e)? e: "C", sizeof(loc) - 1);
+ 
+   return loc;
+ }
+ #endif
+ 
  void
  init_readline(void)
  {
*************** init_readline(void)
*** 376,381 ****
--- 393,403 ----
    cb_pari_init_histfile = init_histfile;
    cb_pari_get_line_interactive = get_line_from_readline;
  
+ #ifdef __MINGW32__
+   /* Initialize readline */
+   rl_initialize();
+ #endif
+ 
    /* Allow conditional parsing of the ~/.inputrc file. */
    rl_readline_name = "Pari-GP";