tpschar@rodan.acs.syr.edu (Thomas Pschar) (02/22/90)
Hi. I need to write a kind of editor in C on the VAX. Since it is to be a fullscreen editor, I need to grab one character at a time as it is typed without waiting for a carriage return. Does anyone know of a (relatively) painless way to do this?
revans@voodoo.ucsb.edu (02/23/90)
-Message-Text-Follows- In article <2176@rodan.acs.syr.edu>, tpschar@rodan.acs.syr.edu (Thomas Pschar) writes... >Hi. I need to write a kind of editor in C on the VAX. Since it is to be >a fullscreen editor, I need to grab one character at a time as it is typed >without waiting for a carriage return. Does anyone know of a (relatively) >painless way to do this? Short answer : No Long answer : We met this problem a few months ago, whilst porting some RT-11 applications written in DECUS C to VMS. This was the best solution we came up with ... enjoy! Russ Evans e_gs18@va.nmh.ac.uk / j.r.evans@edinburgh.ac.uk British Geological Survey, West Mains Road, Edinburgh EH9 3LA UK /***************************************************************************/ /* * Author Phil Wild * Date 24 July 1989 * Function macro definitions etc. particularly overridding those * DECUS_C ones that are not VAX C * Modified Russ Evans 6 Nov 1989 * EOS & min definitions moved to vt.c * becomes vtvms.c as independent module * Did not appear to work .. added SYS$ASSIGN code ! * Fixed kbinr to work as in RT-11 implementation * Copyright Edinburgh Anisotropy Project, * British Geological Survey, Edinburgh, UK */ /***************************************************************************/ #include <iodef> #include <ssdef> #include <descrip> static int qioch_in = 0; $DESCRIPTOR (input_stream, "SYS$INPUT"); typedef struct { short cond_code; short count; int info; } io_status_block; typedef struct { int type; int mask; } io_mask; /***************************************************************************/ int kbin( ) /* * Returns code for next character struck at keyboard .. WITHOUT * waiting for a <return>. */ { char c; int stat_in; io_mask mask = {0, 0}; io_status_block iosb; if (qioch_in == 0) { if ((stat_in = SYS$ASSIGN(&input_stream, &qioch_in, 0, 0)) != SS$_NORMAL) { printf("Can't open connection\n"); LIB$STOP(stat_in); } } if ((stat_in = SYS$QIOW(0, qioch_in, IO$_READVBLK | IO$M_NOECHO | IO$M_TRMNOECHO | IO$M_NOFILTR, &iosb, 0, 0, &c, 1, 0, &mask, 0, 0)) != SS$_NORMAL) { LIB$SIGNAL(stat_in); } return ((int)c); } /***************************************************************************/ int kbinr( ) /* * Returns code for next character struck at keyboard .. WITHOUT * waiting for a <return>. Returns (-1) if no character is available. */ { char c; int stat_in; io_status_block iosb; io_mask mask = {0, 0}; if (qioch_in == 0) { if ((stat_in = SYS$ASSIGN(&input_stream, &qioch_in, 0, 0)) != SS$_NORMAL) { printf("Can't open connection\n"); LIB$STOP(stat_in); } } if ((stat_in = SYS$QIOW(0, qioch_in, IO$_READVBLK | IO$M_NOECHO | IO$M_TRMNOECHO | IO$M_NOFILTR | IO$M_TIMED, &iosb, 0, 0, &c, 1, 1, &mask, 0, 0)) != SS$_NORMAL) { LIB$SIGNAL(stat_in); } return ((iosb.count == 0) ? -1 : (int)c); } /***************************************************************************/ End of vtvms.c