10 ! ----- READ_WITH_TERMINATOR.FUN ----- ! ! ----- FUNCTION TO READ AND RETURN A STRING OF CHARS ENTERED ----- ! ----- BY THE USER. INPUT IS TERMINATED BY OR ----- ! ----- (OR, OPTIONALLY, BY A TIMEOUT EXPIRING AT 5 MINUTES) ----- ! ! ----- THE ASCII VALUE OF THE TERMINATOR IS RETURNED IN ----- ! ----- THE_TERMINATOR. ----- ! ! ----- PASSED: ----- ! ! ----- TIMEOUT = TRUE TO ENABLE THE OPTIONAL TIMEOUT ----- ! ----- FEATURE, FALSE TO DISABLE IT ----- ! ----- (IF ENABLED, THE TIMEOUT FEATURE WILL ----- ! ----- RETURN A VALUE OF TRUE IN THIS FIELD IF ----- ! ----- THE USER HAS MADE NO INPUT WITHIN A 5 ----- ! ----- MINUTE PERIOD OF TIME) ----- ! ! ----- RETURNED: ----- ! ! ----- READ_WITH_TERMINATOR = SS$_NORMAL IF ----- ! ----- SUCCESSFUL (USER_DATA CONTAINS THE DATA ----- ! ----- INPUT BY THE USER), OR VMS EXIT STATUS ----- ! ----- IF ANY ERROR HAS OCCURRED ----- ! ! ----- USER_DATA = CHARACTERS THAT WERE ENTERED BY USER ----- ! ! ----- THE_TERMINATOR = ASCII VALUE OF THE TERMINATOR ----- ! ----- ENTERED BY THE USER (I.E. 9% OR 13%) ----- ! ! ----- TIMEOUT = TRUE IF A USER TIMEOUT HAS OCCURRED, ----- ! ----- FALSE IF NO TIMEOUT HAS OCCURRED ----- ! ----- (SEE DESCRIPTION OF THIS PASSED FIELD) ----- ! ! ----- THIS FUNCTION USES THE QIO SYSTEM SERVICE TO READ DATA ----- ! ----- FROM THE TERMINAL DRIVER. ----- ! ! ----- Last Change 05/01/89 by Brian Lomasky ----- ! ! ----- Teradyne, Inc., 179 Lincoln Street, Boston, MA 02111 ----- ! ----- (617) 482-2706, x3259 ----- ! ! ----- Neither Brian Lomasky nor Teradyne, Inc. implicitly or ----- ! ----- explicitly implies this program is usable in any way. ----- ! ----- This program is released to the public domain in an ----- ! ----- "AS-IS" condition. ----- ! ! ----- Restrictions: ----- ! ----- 1) Requires VAX BASIC V2.4 or later. ----- ! FUNCTION LONG READ_WITH_TERMINATOR(STRING USER_DATA, & WORD THE_TERMINATOR, LONG TIMEOUT) OPTION TYPE = EXPLICIT %LET %DEBUG = 0% ! 1 IF DEBUG, 0 IF NOT EXTERNAL LONG CONSTANT IO$M_NOFILTR ! QIO IGNORE ^U/^R/DEL MODIFIER EXTERNAL LONG CONSTANT IO$M_TIMED ! QIO ENABLE TIMEOUT MODIFIER EXTERNAL LONG CONSTANT IO$_READVBLK ! QIO READ VIRT BLOCK FUNC CODE EXTERNAL LONG CONSTANT SS$_NORMAL ! VMS SUCCESS STATUS CODE EXTERNAL LONG CONSTANT SS$_TIMEOUT ! QIO TIMEOUT STATUS CODE DECLARE LONG CONSTANT TRUE = (1% = 1%) DECLARE LONG CONSTANT FALSE = NOT TRUE DECLARE WORD CHAN ! I/O CHANNEL NUMBER DECLARE STRING CHARACTERS_ENTERED ! DATA CHARS THAT WERE ENTERED DECLARE LONG DATA_BUFF_SIZE ! SIZE OF DATA_BUFF DECLARE LONG ENABLE_TIMEOUT ! TRUE IF ENABLING USER TIMEOUT DIM WORD IOSB(3%) ! I/O STATUS BLOCK DECLARE LONG SYS_STATUS ! FUNCTION STATUS DECLARE WORD TEMP ! TEMPORARY WORD EXTERNAL LONG FUNCTION SYS$ASSIGN ! ASSIGN I/O CHANNEL EXTERNAL LONG FUNCTION SYS$DASSGN ! DEASSIGN I/O CHANNEL EXTERNAL LONG FUNCTION SYS$QIOW ! QUEUE I/O REQUEST AND WAIT ! ----- MAP THE RETURNED DATA BUFFER ----- MAP (DATA_BUFFER) STRING DATA_BUFF = 1% ! USED IN $QIOW CALL ENABLE_TIMEOUT = TIMEOUT ! SET FLAG IF ENABLING TIMEOUT TIMEOUT = FALSE ! DEFAULT OF NO TIMEOUT ! ----- ASSIGN A CHANNEL TO THE DISK FOR THE $QIOW CALL ----- SYS_STATUS = SYS$ASSIGN("TT", CHAN, , ) IF (SYS_STATUS AND 1%) = 0% THEN ! ----- RETURN VMS ERROR STATUS ----- READ_WITH_TERMINATOR = SYS_STATUS EXIT FUNCTION END IF CHARACTERS_ENTERED = "" ! INIT RETURNED CHARACTER STRING ! ----- PERFORM QIO UNTIL USER ENTERS OR OR TIMEOUT ----- DATA_BUFF = " " ! SO LOOP WILL WORK ONCE UNTIL DATA_BUFF = HT OR DATA_BUFF = CR IF ENABLE_TIMEOUT THEN ! IF ENABLING TIMEOUT: ! ----- TO INITIATE A READ VIRTUAL BLOCK ----- ! ----- OPERATION WITH TIMEOUT, CALL THE QIOW ----- ! ----- SERVICE WITH A FUNCTION CODE OF ----- ! ----- IO$_READVBLK AND A FUNCTION MODIFIER OF ----- ! ----- IO$M_TIMED AND PASS THE TIMEOUT VALUE ----- ! ----- (IN SECONDS) AS THE P3 PARAMATER ----- SYS_STATUS = SYS$QIOW( ,! EVENT FLAG & CHAN BY VALUE, ! DEVICE I/O CHANNEL & (IO$_READVBLK OR IO$M_NOFILTR OR & IO$M_TIMED) BY & VALUE, ! DEVICE FUNCTION CODE & IOSB() BY REF, ! I/O STATUS BLOCK & , ! AST ADDRESS & , ! AST PARAMETER & DATA_BUFF BY REF, ! ADDRESS OF BUFFER & 1% BY VALUE, ! SIZE OF BUFFER & 301% BY VALUE, ! TIMEOUT COUNT & , ! READ TERM DESC BLK ADR& , ! PROMPT BUFFER VALUE & ) ! SIZE OF PROMPT BUFFER ELSE ! ----- TO INITIATE A READ VIRTUAL BLOCK ----- ! ----- OPERATION, CALL THE QIOW SERVICE WITH A ----- ! ----- FUNCTION CODE OF IO$_READVBLK ----- SYS_STATUS = SYS$QIOW( ,! EVENT FLAG & CHAN BY VALUE, ! DEVICE I/O CHANNEL & (IO$_READVBLK OR IO$M_NOFILTR) BY & VALUE, ! DEVICE FUNCTION CODE & IOSB() BY REF, ! I/O STATUS BLOCK & , ! AST ADDRESS & , ! AST PARAMETER & DATA_BUFF BY REF, ! ADDRESS OF BUFFER & 1% BY VALUE, ! SIZE OF BUFFER & , ! TIMEOUT COUNT & , ! READ TERM DESC BLK ADR& , ! PROMPT BUFFER VALUE & ) ! SIZE OF PROMPT BUFFER END IF IF (SYS_STATUS AND 1%) = 0% THEN ! ----- RETURN VMS ERROR STATUS ----- READ_WITH_TERMINATOR = SYS_STATUS EXIT FUNCTION END IF IF ENABLE_TIMEOUT THEN ! IF ENABLING TIMEOUT: ! ----- SEE IF QIO TIMEOUT HAS OCCURRED ----- IF IOSB(0%) = SS$_TIMEOUT THEN TIMEOUT = TRUE ! RETURN TIMEOUT STATUS USER_DATA = "" ! RETURN NO ENTERED DATA ! ----- RETURN CARRIAGE RETURN TERMINATOR ----- THE_TERMINATOR = ASCII(CR) ! ----- DEASSIGN THE I/O CHANNEL ----- SYS_STATUS = SYS$DASSGN(CHAN BY VALUE) IF (SYS_STATUS AND 1%) = 0% THEN ! ----- RETURN VMS ERROR STATUS ----- READ_WITH_TERMINATOR = SYS_STATUS ELSE ! ----- RETURN SUCCESS STATUS ----- READ_WITH_TERMINATOR = SS$_NORMAL END IF EXIT FUNCTION END IF END IF IF (IOSB(0%) AND 1%) = 0% THEN ! ----- RETURN VMS ERROR STATUS ----- READ_WITH_TERMINATOR = IOSB(0%) EXIT FUNCTION END IF ! ----- IF USER ENTERED ONE OF THE TERMINATORS: ----- SELECT DATA_BUFF CASE HT, CR ! OR THE_TERMINATOR = ASCII(DATA_BUFF) CASE DEL ! %IF %DEBUG = 1% %THEN PRINT "READ_WITH_TERM DEBUG>DEL" %END %IF ! ----- ERASE THE LAST CHARACTER FROM THE BUFFER ----- SELECT LEN(CHARACTERS_ENTERED) CASE 0% CASE 1% CHARACTERS_ENTERED = "" ! ----- DELETE CHAR FROM SCREEN ----- PRINT BS; " "; BS; CASE ELSE CHARACTERS_ENTERED = & LEFT(CHARACTERS_ENTERED, & LEN(CHARACTERS_ENTERED) - 1%) ! ----- DELETE CHAR FROM SCREEN ----- PRINT BS; " "; BS; END SELECT CASE CHR$(25%) ! CONTROL/Y ! ----- RETURN KEY TERMINATOR ----- DATA_BUFF = HT THE_TERMINATOR = ASCII(HT) CASE CHR$(21%), CHR$(24%) ! CONTROL/U, CONTROL/X %IF %DEBUG = 1% %THEN PRINT "READ_WITH_TERM DEBUG>CTRL/U" %END %IF ! ----- ERASE ALL CHARACTERS FROM THE BUFFER ----- TEMP = LEN(CHARACTERS_ENTERED) WHILE TEMP > 0% ! FOR EACH CHARACTER IN BUFFER: PRINT BS; " "; BS; TEMP = TEMP - 1% NEXT CHARACTERS_ENTERED = "" CASE CHR$(1%) TO CHR$(2%), CHR$(4%) TO CHR$(7%), & CHR$(10%) TO CHR$(12%), CHR$(14%) TO CHR$(17%), & CHR$(19%) TO CHR$(20%), CHR$(22%) TO CHR$(23%), & CHR$(26%) ! ----- IGNORE UNDESIRED CONTROL CHARACTERS: ----- ! ----- CTRL/A THROUGH CTRL/B ----- ! ----- CTRL/D THROUGH CTRL/G ----- ! ----- CTRL/J THROUGH CTRL/L ----- ! ----- CTRL/N THROUGH CTRL/Q ----- ! ----- CTRL/S THROUGH CTRL/T ----- ! ----- CTRL/V THROUGH CTRL/W ----- ! ----- CTRL/Z ----- CASE ELSE %IF %DEBUG = 1% %THEN PRINT "READ_WITH_TERM DEBUG>"; ASCII(DATA_BUFF) %END %IF ! ----- APPEND CHARACTER TO BUFFER ----- CHARACTERS_ENTERED = CHARACTERS_ENTERED + DATA_BUFF END SELECT NEXT ! ----- DEASSIGN THE I/O CHANNEL ----- SYS_STATUS = SYS$DASSGN(CHAN BY VALUE) IF (SYS_STATUS AND 1%) = 0% THEN ! ----- RETURN VMS ERROR STATUS ----- READ_WITH_TERMINATOR = SYS_STATUS EXIT FUNCTION END IF USER_DATA = CHARACTERS_ENTERED ! RETURN DATA ENTERED BY USER READ_WITH_TERMINATOR = SS$_NORMAL ! RETURN SUCCESS STATUS END FUNCTION