From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=BAYES_00,INVALID_DATE autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,343551ac8a3d0216 X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 1993-03-05 14:47:22 PST Newsgroups: comp.lang.ada Path: sparky!uunet!gumby!wupost!cs.utexas.edu!convex!sercely From: sercely@convex.com (Ron Sercely) Subject: Re: How do I "Get" just 4 characters? Message-ID: <1993Mar4.232013.6988@convex.com> Sender: usenet@convex.com (news access account) Nntp-Posting-Host: cvxcs.convex.com Organization: CONVEX Computer Corporation, Richardson, Tx., USA References: <9303041121.aa12530@Paris.ics.uci.edu> Date: Thu, 4 Mar 1993 23:20:13 GMT X-Disclaimer: This message was written by a user at CONVEX Computer Corp. The opinions expressed are those of the user and not necessarily those of CONVEX. Date: 1993-03-04T23:20:13+00:00 List-Id: In article dl10696@ehsn4.cen.uiuc.edu (Dat Trieu Le) writes: >kanderso@mabillon.ICS.UCI.EDU (Kenneth Anderson) writes: > >>I had a question posed to me by one of my students, that asked : How >>do I get just 4 characters of input? > >>Using the following program as an example: > >>with Text_IO; > >>procedure test is > >> subtype pin_type is string(1..4); > >> A : pin_type; >> Num : INTEGER; > >>begin >> Text_IO.Get(A); >> Text_IO.PUT_LINE(A); >>end test; > >>Now then, if I run the program and type "1234567890", > >>what I see is > >>1234567890 >>1234 > >>What I would like to see is this: > >>1234 >>1234 > >>I.E. I don't want to see 567890, I want the program to kick in right away >>after the fourth character is typed, not wait for the user to type Return. > >>I tried changing the program to this: > >>with Text_IO; > >>procedure test is > >> subtype pin_type is string(1..4); > >> A : pin_type; >> B : CHARACTER; > >>begin >> Get(B); >> A(1) := B; >> Get(B); >> A(2) := B; >> Get(B); >> A(3) := B; >> Get(B); >> A(4) := B; >> Text_IO.PUT_LINE(A); >>end test; > >>But the same behavior results... > >>Any suggestions? > >>Thanks in advance, > >Hi Ken, > >I believe TEXT_IO works much like buffered input io. That is, >it will read from the input buffer. the Get message reads from >that buffer. If there is not enough characters in the buffer, >then the program will wait until the user has completed its >input to the buffer. Text_IO doesn't consider inputs to be complete >until it is followed by a carriage-return. If you want Ada to >interpret characters one-at-a-time, then a routine to interface >to the hardware may have to be written. > >hope this helps. package SET_TTY_MODES is procedure SET_CBREAK; procedure UNSET_CBREAK; end SET_TTY_MODES; with TTY; with OS_FILES; with V_I_BITS; with IOCTL; package body SET_TTY_MODES is STTY_STATE : TTY.TOTAL_STATE; procedure SET_CBREAK is begin TTY.GET_TTY_STATE(FD => OS_FILES.STDIN_FD, STATE => STTY_STATE); STTY_STATE.U_TTY_STATE.SG_FLAGS := SHORT_INTEGER( V_I_BITS.BIT_OR( INTEGER(STTY_STATE.U_TTY_STATE.SG_FLAGS), IOCTL.CBREAK)); TTY.SET_TTY_STATE(FD => OS_FILES.STDIN_FD, STATE => STTY_STATE); end SET_CBREAK; procedure UNSET_CBREAK is begin TTY.GET_TTY_STATE(FD => OS_FILES.STDIN_FD, STATE => STTY_STATE); STTY_STATE.U_TTY_STATE.SG_FLAGS := SHORT_INTEGER( V_I_BITS.BIT_AND( INTEGER(STTY_STATE.U_TTY_STATE.SG_FLAGS), V_I_BITS.BIT_NEG(IOCTL.CBREAK))); TTY.SET_TTY_STATE(FD => OS_FILES.STDIN_FD, STATE => STTY_STATE); end UNSET_CBREAK; end SET_TTY_MODES;