cvs commit: fptools/libraries/base/GHC
ConsoleHandler.hsfptools/libraries/base/cbits
consUtils.cfptools/libraries/base/include
consUtils.hfptools/ghc/compiler/ghci InteractiveUI.hs
Sigbjorn Finne
sof at galois.com
Fri May 13 14:34:31 EDT 2005
Thanks, believe it is a bit better behaved now in
that usage mode.
--sigbjorn
----- Original Message -----
From: "Krasimir Angelov" <kr.angelov at gmail.com>
To: "Sigbjorn Finne" <sof at haskell.org>
Cc: <cvs-libraries at haskell.org>; <cvs-ghc at haskell.org>
Sent: Thursday, May 12, 2005 03:40
Subject: Re: cvs commit: fptools/libraries/base/GHC
ConsoleHandler.hsfptools/libraries/base/cbits
consUtils.cfptools/libraries/base/include
consUtils.hfptools/ghc/compiler/ghci InteractiveUI.hs
> Hi Sigbjorn,
>
> The workaround breaks another useful feature of GHC. You can't spawn
> GHCi through runInteractiveProcess anymore. You should use
> flushConsole only if the stdin is console handle.
>
> Cheers,
> Krasimir
>
> On 5/6/05, Sigbjorn Finne <sof at haskell.org> wrote:
>> sof 2005/05/05 17:30:58 PDT
>>
>> Modified files:
>> libraries/base/GHC ConsoleHandler.hs
>> libraries/base/cbits consUtils.c
>> libraries/base/include consUtils.h
>> ghc/compiler/ghci InteractiveUI.hs
>> Log:
>> [mingw only]
>> Work around bug in win32 Console API which showed up in the GHCi UI:
>> if the user typed in characters prior to the appearance of the prompt,
>> the first of these characters always came out as a 'g'. The GHCi UI does
>> for good reasons one-character reads from 'stdin', which causes the
>> underlying APIs to become confused. A simple repro case is the following
>> piece of C code:
>>
>> /*----------------------*/
>> #include <stdio.h>
>> #include <windows.h>
>> int main()
>> {
>> char ch1,ch2;
>> HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);
>> DWORD dw;
>>
>> /* Type in some characters before the prompt appears and be amused..
>> */
>> sleep(1000); printf("? ");
>> ReadConsoleA(hStdIn,&ch1,1,&dw,NULL);
>> ReadConsoleA(hStdIn,&ch2,1,&dw,NULL);
>> /* or, if you want to use libc:
>> read(0,&ch1,1); read(0,&ch2,1); */
>>
>> printf("%c%c\n", ch1,ch2);
>> return 0;
>> }
>> /*----------------------*/
>>
>> This happens across win32 OSes, and I can't see anything untoward as far
>> as API usage goes (the GHC IO implementation uses read(), but that
>> reduces to ReadConsoleA() calls.) People inside the Behemoth might want
>> to have a closer look at this..
>>
>> Not much we can do about this except work around the problem by flushing
>> the input buffer prior to reading from stdin. Not ideal, as type-ahead
>> is a useful feature. Flushing is handled by
>> GHC.ConsoleHandler.flushConsole
>>
>> Merge to STABLE.
>>
>> Revision Changes Path
>> 1.8 +13 -0 fptools/libraries/base/GHC/ConsoleHandler.hs
>> 1.5 +13 -0 fptools/libraries/base/cbits/consUtils.c
>> 1.2 +1 -0 fptools/libraries/base/include/consUtils.h
>> 1.203 +9 -0 fptools/ghc/compiler/ghci/InteractiveUI.hs
>> _______________________________________________
>> Cvs-ghc mailing list
>> Cvs-ghc at haskell.org
>> http://www.haskell.org/mailman/listinfo/cvs-ghc
>>
> _______________________________________________
> Cvs-libraries mailing list
> Cvs-libraries at haskell.org
> http://www.haskell.org/mailman/listinfo/cvs-libraries
More information about the Cvs-libraries
mailing list