Trailing-Edge
-
PDP-10 Archives
-
bb-r775c-bm_tops20_ks_upd_3
-
sources/prgetkey.bli
There are 10 other files named prgetkey.bli in the archive. Click here to see a list.
%TITLE 'PRGETKEY - parse a key name'
MODULE PRGETKEY ( ! Parse a command
IDENT = '3-004' ! File: PRGETKEY.B36 Edit:CJG3004
) =
BEGIN
!
! COPYRIGHT (c) 1983, 1985 BY
! DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
! ALL RIGHTS RESERVED.
!
! THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
! ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE
! INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER
! COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
! OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY
! TRANSFERRED.
!
! THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE
! AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
! CORPORATION.
!
! DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
! SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
!
!++
! FACILITY: EDT -- The DEC Standard Editor
!
! ABSTRACT:
!
! Parse a key name.
!
! ENVIRONMENT: Runs on TOPS-20 only
!
! AUTHOR: Chris Gill, CREATION DATE: March 15, 1983
!
! MODIFIED BY:
!
! 3-001 - Original. CJG 15-Mar-1983
! 3-002 - Fix key numbering for latest version. CJG 17-Jun-1983
! 3-003 - Allow quoted string in GOLD X formats. CJG 8-Jul-1983
! 3-004 - Check for control-C being typed. CJG 5-Jan-1984
!--
%SBTTL 'DECLARATIONS'
!
! TABLE OF CONTENTS:
!
REQUIRE 'EDTSRC:TRAROUNAM';
FORWARD ROUTINE
EDT$$PA_GET_KEY, ! Parse a key name
EDT$$PA_GET_CHAR; ! Get a single character
!
! INCLUDE FILES:
!
REQUIRE 'EDTSRC:EDTREQ';
REQUIRE 'SYS:JSYS';
REQUIRE 'EDTSRC:PARLITS';
LIBRARY 'EDTSRC:KEYPADDEF';
!
! EXTERNAL REFERENCES:
!
! In the routines
!
!
! MACROS:
!
! NONE
!
!
! OWN STORAGE
!
! NONE
!
%SBTTL 'EDT$$PA_GET_KEY - Parse a key name'
GLOBAL ROUTINE EDT$$PA_GET_KEY = ! Parse a key name
BEGIN
!
!FUNCTIONAL DESCRIPTION
!
! This routine parses the key name in a SHOW KEY or DEFINE KEY command.
!
! Key values are defined as follows:
!
! 000 - 031 = CONTROL letter
! 032 - 255 = normal characters
! 300 - 399 = number
! 400 - 499 = FUNCTION number
! 500 - 531 = GOLD CONTROL letter
! 532 - 755 = GOLD character
! 800 - 899 = GOLD number
! 900 - 999 = GOLD FUNCTION number
! 127 = DELETE
! 627 = GOLD DELETE
!
!
!
!IMPLICIT INPUTS
!
! NONE
!
!ROUTINE VALUE
!
! 0 - Reparse required
! -1 - Error in parsing
! 1 - Good return
!
EXTERNAL
CSB : VECTOR [10], ! Command state block
PA_CURCMD : REF NODE_BLOCK,
PA_CURTOK, ! Pointer to atom
PA_CURTOKLEN, ! Length of atom
PA_ERRNO, ! Error number
FD_KYS,
FD_KYN,
FD_SKY,
FD_SKG,
FD_SKV,
CC; ! Control-C flag
EXTERNAL ROUTINE
EDT$$PA_SCANTOK; ! Find atom length and pointer
MESSAGES ((KEYNOTDEF));
LOCAL
C_FLAG, ! COMND flags
C_DATA, ! COMND data pointer
C_FDB, ! COMND actual FDB used
C1,
C2, ! Offset for GOLD keys
C3; ! Flag for quoted string
BEGIN
PA_ERRNO = EDT$_KEYNOTDEF;
C2 = 0;
C3 = 0;
!+
! Parse the next atom and set C1 (the atom identifier) accordingly
!-
IF (NOT COMMAND (FD_SKY)) THEN RETURN (-1);
IF (.CC NEQ 0) THEN RETURN (-1);
IF ((.C_FLAG AND CM_RPT) NEQ 0) THEN RETURN (0);
IF ((.C_FLAG AND CM_NOP) NEQ 0) THEN RETURN (-1);
IF ((.C_FDB<0,18> EQL FD_KYN) OR (.C_FDB<0,18> EQL FD_KYS)) THEN RETURN (-1);
IF (.C_FDB<0,18> EQL FD_SKV) THEN
C1 = KEY_NUM
ELSE
C1 = .(.C_DATA)<0,18>;
IF (.C1 EQL KEY_GOLD) THEN
BEGIN
C2 = K_GOLD_BASE;
!+
! The GOLD keyword may be followed by another keyword - parse it as well
!-
IF (NOT COMMAND (FD_SKG)) THEN RETURN (-1);
IF (.CC NEQ 0) THEN RETURN (-1);
IF ((.C_FLAG AND CM_RPT) NEQ 0) THEN RETURN (0);
IF ((.C_FLAG AND CM_NOP) NEQ 0) THEN RETURN (-1);
C1 = (SELECTONE .C_FDB<0,18> OF
SET
[ FD_SKV ] : KEY_NUM;
[ FD_SKG ] : .(.C_DATA)<0,18>;
[ FD_KYS ] : 0;
[ FD_KYN ] :
BEGIN
C3 = 1;
0
END;
TES );
END;
CASE .C1 FROM 0 TO KEY_FUNC OF
SET
[ 0 ] :
BEGIN
!+
! DEFINE GOLD x
!-
EDT$$PA_SCANTOK (.C3,1);
IF (.PA_CURTOKLEN EQL 0) THEN
BEGIN
C1 = CH$RCHAR_A (CSB [$CMPTR]);
CSB [$CMINC] = .CSB [$CMINC] - 1;
END
ELSE
BEGIN
IF (.PA_CURTOKLEN NEQ 1) THEN RETURN (-1);
C1 = CH$RCHAR_A (PA_CURTOK);
END;
IF ((.C1 LEQ ASC_K_SP) OR (.C1 GTR %C'^')) THEN RETURN (-1);
PA_CURCMD [KEY_VAL] = .C1 + .C2;
END;
[ KEY_NUM ] :
BEGIN
!+
! DEFINE (GOLD) nn
!-
IF (.C_DATA GTR 21) THEN RETURN (-1);
PA_CURCMD [KEY_VAL] = .C_DATA + .C2 + K_KPAD_BASE;
END;
[ KEY_DEL ] :
BEGIN
!+
! DEFINE (GOLD) DELETE
!-
PA_CURCMD [KEY_VAL] = 127 + .C2;
END;
[ KEY_CONT ] :
BEGIN
!+
! DEFINE (GOLD) CONTROL x
!-
C1 = EDT$$PA_GET_CHAR ();
IF (.C1 LEQ 0) THEN RETURN (.C1);
IF ((.C1 LEQ %C'@') OR (.C1 GTR %C'Z')) THEN RETURN (-1);
PA_CURCMD [KEY_VAL] = .C1 - %C'@' + .C2;
END;
[ KEY_FUNC ] :
BEGIN
!+
! (GOLD) FUNCTION nn
!-
IF (NOT COMMAND (FD_SKV)) THEN RETURN (-1);
IF (.CC NEQ 0) THEN RETURN (-1);
IF ((.C_FLAG AND CM_RPT) NEQ 0) THEN RETURN (0);
IF (.C_DATA GTR 99) THEN RETURN (-1);
PA_CURCMD [KEY_VAL] = .C_DATA + .C2 + K_FUN_BASE;
END;
TES;
RETURN (1);
END;
END;
%SBTTL 'EDT$$PA_GET_CHAR - Parse a single character'
GLOBAL ROUTINE EDT$$PA_GET_CHAR = ! Parse a character
BEGIN
!+
!FUNCTIONAL DESCRIPTION
!
! Since there is no COMND function to parse a single, arbitrary, character,
! this routine simulates it by parsing an alphanumeric field and returning
! either the first character or the break character if no field was parsed.
! If a COMND error occurs, the field was longer than one character, or a
! reparse is required, an error return is taken.
!-
!
!ROUTINE VALUE
!
! 0 - Reparse required
! -1 - Error or field too long
! 1 - Good return
!
EXTERNAL
FD_KYN,
FD_KYS,
PA_CURTOK,
PA_CURTOKLEN,
CC, ! Control-C flag
CSB : VECTOR [10];
EXTERNAL ROUTINE
EDT$$PA_SCANTOK; ! Get atom length and pointer
LOCAL
C_DATA,
C_FDB,
C_FLAG,
C1;
BEGIN
IF (NOT COMMAND (FD_KYN)) THEN RETURN (-1);
IF (.CC NEQ 0) THEN RETURN (-1);
IF ((.C_FLAG AND CM_RPT) NEQ 0) THEN RETURN (0);
IF (.C_FDB<0,18> EQL FD_KYN) THEN C1 = 1 ELSE C1 = 0;
EDT$$PA_SCANTOK (.C1,1);
IF (.PA_CURTOKLEN EQL 0) THEN
BEGIN
CSB [$CMINC] = .CSB [$CMINC] - 1;
C_DATA= CH$RCHAR_A (CSB [$CMPTR]);
END
ELSE
BEGIN
IF (.PA_CURTOKLEN NEQ 1) THEN RETURN (-1);
C_DATA= CH$RCHAR_A (PA_CURTOK);
END;
RETURN (.C_DATA);
END;
END;
END
ELUDOM