%TITLE 'CHMKEYWRD - look for a keyword' MODULE CHMKEYWRD ( ! Look for a keyword IDENT = '3-002' ! File: CHMKEYWRD.BLI Edit: GB3002 ) = BEGIN !COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1981, 1988. 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 THAT IS NOT SUPPLIED BY DIGITAL. ! ! !++ ! FACILITY: EDT -- The DEC Standard Editor ! ! ABSTRACT: ! ! This module compares the command buffer contents to a table ! of keywords. ! ! ENVIRONMENT: Runs at any access mode - AST reentrant ! ! AUTHOR: Bob Kushlis, CREATION DATE: Unknown ! ! MODIFIED BY: ! ! 1-001 - Original. DJS 04-Feb-1981. This module was created by ! extracting the routine EDT$$KWORD from module CHANGE.BLI. ! 1-002 - Regularize headers. JBS 03-Mar-1981 ! 1-004 - Change to a table arranged alphabetically. STS 21-Sep-1982 ! 1-005 - Move the keywords here from EDT$CHMPARSE, to reduce the program ! size on the PDP-11. Also, put an underscore in the entry point name. JBS 29-Sep-1982 ! 1-006 - Accept lower case letters as equivalent to upper case, and improve error ! checking. JBS 01-Oct-1982 ! 1-007 - Make this routine position-independent. JBS 01-Oct-1982 ! 1-008 - Add conditionals for WPS and VT220. JBS 10-Feb-1983 ! 1-009 - Don't forget the SUPPORTS library. JBS 11-Feb-1983 ! 3-002 - Remove VT220 conditional to speed up code. CJG 25-Nov-1983 !-- %SBTTL 'Declarations' ! ! TABLE OF CONTENTS: ! REQUIRE 'EDTSRC:TRAROUNAM'; FORWARD ROUTINE EDT$$KEY_WORD : NOVALUE; ! Compare the command buffer contents to a table of keywords ! ! INCLUDE FILES: ! REQUIRE 'EDTSRC:EDTREQ'; LIBRARY 'EDTSRC:TRANSLATE'; ! ! MACROS: ! ! NONE ! ! EQUATED SYMBOLS: ! FIELD KEY_WORD_FIELD = SET KEY_WORD_NEXT = [0, 0, 18, 0], KEY_WORD_NUM = [0, 18, 9, 0], KEY_WORD_LEN = [0, 27, 9, 0], KEY_WORD_POINTER = [1, 0, 36, 0] TES; LITERAL V_FIELD = %O'1000000', L_FIELD = %O'1000000000'; ! ! OWN STORAGE: ! !+ ! Define the keywords used to make up change mode sub-commands. ! ! Each record in this table contains a address pointer to the next keyword ! with this alphabetic character the value of the keyword, its length, ! and the ASCII characters which comprise it. ! ! The table is a concatenation of keyword entries. Each ! consists of a pointer to the next keyword to examine if ! this one should fail, a keyword number byte, length byte, ! and the ASCII text for the keyword. A 0 length byte ! marks the end of the table. Letters in keywords are ! all upper case. !- BIND ADDR_BASE = UPLIT (0), END_VERBS = UPLIT (0, 0), ASC_VERB = UPLIT ( END_VERBS - ADDR_BASE + V_FIELD * (VERB_K_ASC) + L_FIELD * (3), CH$PTR (UPLIT ('ASC'))), ADV_VERB = UPLIT ( ASC_VERB - ADDR_BASE + V_FIELD * (VERB_K_ADV) + L_FIELD * (3), CH$PTR (UPLIT ('ADV'))), A_VERBS = UPLIT ( ADV_VERB - ADDR_BASE + V_FIELD * (VERB_K_APPEND) + L_FIELD * (6), CH$PTR (UPLIT ('APPEND'))), BELL_VERB = UPLIT ( END_VERBS - ADDR_BASE + V_FIELD * (VERB_K_BELL) + L_FIELD * (4), CH$PTR (UPLIT ('BELL'))), B_VERBS = UPLIT ( BELL_VERB - ADDR_BASE + V_FIELD * (VERB_K_BACK) + L_FIELD * (4), CH$PTR (UPLIT ('BACK'))), CUT_VERB = UPLIT ( END_VERBS - ADDR_BASE + V_FIELD * (VERB_K_CUT) + L_FIELD * (3), CH$PTR (UPLIT ('CUT'))), CLSS_VERB = UPLIT ( CUT_VERB - ADDR_BASE + V_FIELD * (VERB_K_CLSS) + L_FIELD * (4), CH$PTR (UPLIT ('CLSS'))), CHGL_VERB = UPLIT ( CLSS_VERB - ADDR_BASE + V_FIELD * (VERB_K_CHGL) + L_FIELD * (4), CH$PTR (UPLIT ('CHGL'))), CHGU_VERB = UPLIT ( CHGL_VERB - ADDR_BASE + V_FIELD * (VERB_K_CHGU) + L_FIELD * (4), CH$PTR (UPLIT ('CHGU'))), C_VERBS = UPLIT ( CHGU_VERB - ADDR_BASE + V_FIELD * (VERB_K_CHGC) + L_FIELD * (4), CH$PTR (UPLIT ('CHGC'))), D_VERB = UPLIT ( END_VERBS - ADDR_BASE + V_FIELD * (VERB_K_DELETE) + L_FIELD * (1), CH$PTR (UPLIT ('D'))), DUPC_VERB = UPLIT ( D_VERB - ADDR_BASE + V_FIELD * (VERB_K_DUPC) + L_FIELD * (4), CH$PTR (UPLIT ('DUPC'))), DMOV_VERB = UPLIT ( DUPC_VERB - ADDR_BASE + V_FIELD * (VERB_K_DMOV) + L_FIELD * (4), CH$PTR (UPLIT ('DMOV'))), DLWC_VERB = UPLIT ( DMOV_VERB - ADDR_BASE + V_FIELD * (VERB_K_DLWC) + L_FIELD * (4), CH$PTR (UPLIT ('DLWC'))), DEFK_VERB = UPLIT ( DLWC_VERB - ADDR_BASE + V_FIELD * (VERB_K_DEFK) + L_FIELD * (4), CH$PTR (UPLIT ('DEFK'))), DATE_VERB = UPLIT ( DEFK_VERB - ADDR_BASE + V_FIELD * (VERB_K_DATE) + L_FIELD * (4), CH$PTR (UPLIT ('DATE'))), D_VERBS = UPLIT ( DATE_VERB - ADDR_BASE + V_FIELD * (VERB_K_DESEL) + L_FIELD * (5), CH$PTR (UPLIT ('DESEL'))), EX_VERB = UPLIT ( END_VERBS - ADDR_BASE + V_FIELD * (VERB_K_EXIT) + L_FIELD * (2), CH$PTR (UPLIT ('EX'))), E_VERBS = UPLIT ( EX_VERB - ADDR_BASE + V_FIELD * (VERB_K_EXT) + L_FIELD * (3), CH$PTR (UPLIT ('EXT'))), F_VERBS = UPLIT ( END_VERBS - ADDR_BASE + V_FIELD * (VERB_K_FILL) + L_FIELD * (4), CH$PTR (UPLIT ('FILL'))), H_VERBS = UPLIT ( END_VERBS - ADDR_BASE + V_FIELD * (VERB_K_HELP) + L_FIELD * (4), CH$PTR (UPLIT ('HELP'))), I_VERBS = UPLIT ( END_VERBS - ADDR_BASE + V_FIELD * (VERB_K_INSERT) + L_FIELD * (1), CH$PTR (UPLIT ('I'))), K_VERBS = UPLIT ( END_VERBS - ADDR_BASE + V_FIELD * (VERB_K_KS) + L_FIELD * (2), CH$PTR (UPLIT ('KS'))), P_VERBS = UPLIT ( END_VERBS - ADDR_BASE + V_FIELD * (VERB_K_PASTE) + L_FIELD * (5), CH$PTR (UPLIT ('PASTE'))), Q_VERBS = UPLIT ( END_VERBS - ADDR_BASE + V_FIELD * (VERB_K_QUIT) + L_FIELD * (4), CH$PTR (UPLIT ('QUIT'))), R_VERB = UPLIT ( END_VERBS - ADDR_BASE + V_FIELD * (VERB_K_REPLACE) + L_FIELD * (1), CH$PTR (UPLIT ('R'))), R_VERBS = UPLIT ( R_VERB - ADDR_BASE + V_FIELD * (VERB_K_REF) + L_FIELD * (3), CH$PTR (UPLIT ('REF'))), S_VERB = UPLIT ( END_VERBS - ADDR_BASE + V_FIELD * (VERB_K_SUBS) + L_FIELD * (1), CH$PTR (UPLIT ('S'))), SN_VERB = UPLIT ( S_VERB - ADDR_BASE + V_FIELD * (VERB_K_SN) + L_FIELD * (2), CH$PTR (UPLIT ('SN'))), SHR_VERB = UPLIT ( SN_VERB - ADDR_BASE + V_FIELD * (VERB_K_SHR) + L_FIELD * (3), CH$PTR (UPLIT ('SHR'))), SHL_VERB = UPLIT ( SHR_VERB - ADDR_BASE + V_FIELD * (VERB_K_SHL) + L_FIELD * (3), CH$PTR (UPLIT ('SHL'))), SEL_VERB = UPLIT ( SHL_VERB - ADDR_BASE + V_FIELD * (VERB_K_SEL) + L_FIELD * (3), CH$PTR (UPLIT ('SEL'))), S_VERBS = UPLIT ( SEL_VERB - ADDR_BASE + V_FIELD * (VERB_K_SSEL) + L_FIELD * (4), CH$PTR (UPLIT ('SSEL'))), TI_VERB = UPLIT ( END_VERBS - ADDR_BASE + V_FIELD * (VERB_K_TI) + L_FIELD * (2), CH$PTR (UPLIT ('TI'))), TD_VERB = UPLIT ( TI_VERB - ADDR_BASE + V_FIELD * (VERB_K_TD) + L_FIELD * (2), CH$PTR (UPLIT ('TD'))), TC_VERB = UPLIT ( TD_VERB - ADDR_BASE + V_FIELD * (VERB_K_TC) + L_FIELD * (2), CH$PTR (UPLIT ('TC'))), TOP_VERB = UPLIT ( TC_VERB - ADDR_BASE + V_FIELD * (VERB_K_TOP) + L_FIELD * (3), CH$PTR (UPLIT ('TOP'))), TAB_VERB = UPLIT ( TOP_VERB - ADDR_BASE + V_FIELD * (VERB_K_TAB) + L_FIELD * (3), CH$PTR (UPLIT ('TAB'))), TADJ_VERB = UPLIT ( TAB_VERB - ADDR_BASE + V_FIELD * (VERB_K_TADJ) + L_FIELD * (4), CH$PTR (UPLIT ('TADJ'))), T_VERBS = UPLIT ( TADJ_VERB - ADDR_BASE + V_FIELD * (VERB_K_TGSEL) + L_FIELD * (5), CH$PTR (UPLIT ('TGSEL'))), UNDW_VERB = UPLIT ( END_VERBS - ADDR_BASE + V_FIELD * (VERB_K_UNDW) + L_FIELD * (4), CH$PTR (UPLIT ('UNDW'))), UNDL_VERB = UPLIT ( UNDW_VERB - ADDR_BASE + V_FIELD * (VERB_K_UNDL) + L_FIELD * (4), CH$PTR (UPLIT ('UNDL'))), U_VERBS = UPLIT ( UNDL_VERB - ADDR_BASE + V_FIELD * (VERB_K_UNDC) + L_FIELD * (4), CH$PTR (UPLIT ('UNDC'))), X_VERBS = UPLIT ( END_VERBS - ADDR_BASE + V_FIELD * (VERB_K_XLATE) + L_FIELD * (5), CH$PTR (UPLIT ('XLATE'))), CARET_VERB = UPLIT ( END_VERBS - ADDR_BASE + V_FIELD * (VERB_K_CC) + L_FIELD * (1), CH$PTR (UPLIT ('^'))); BIND VERB_TABLE = UPLIT ( A_VERBS - ADDR_BASE, B_VERBS - ADDR_BASE, C_VERBS - ADDR_BASE, D_VERBS - ADDR_BASE, E_VERBS - ADDR_BASE, F_VERBS - ADDR_BASE, END_VERBS - ADDR_BASE, H_VERBS - ADDR_BASE, I_VERBS - ADDR_BASE, END_VERBS - ADDR_BASE, K_VERBS - ADDR_BASE, END_VERBS - ADDR_BASE, END_VERBS - ADDR_BASE, END_VERBS - ADDR_BASE, END_VERBS - ADDR_BASE, P_VERBS - ADDR_BASE, Q_VERBS - ADDR_BASE, R_VERBS - ADDR_BASE, S_VERBS - ADDR_BASE, T_VERBS - ADDR_BASE, U_VERBS - ADDR_BASE, END_VERBS - ADDR_BASE, END_VERBS - ADDR_BASE, X_VERBS - ADDR_BASE, END_VERBS - ADDR_BASE, END_VERBS - ADDR_BASE, END_VERBS - ADDR_BASE, END_VERBS - ADDR_BASE, END_VERBS - ADDR_BASE, CARET_VERB - ADDR_BASE); !+ ! The following are keywords which are entities. ! ! The values must be separated by two so we can add the direction to ! the entity for use as a case index. !- BIND END_ENTITY = UPLIT (0, 0), BW_ENT = UPLIT ( END_ENTITY - ADDR_BASE + V_FIELD * (ENT_K_BW) + L_FIELD * (2), CH$PTR (UPLIT ('BW'))), BR_ENT = UPLIT ( BW_ENT - ADDR_BASE + V_FIELD * (ENT_K_BR) + L_FIELD * (2), CH$PTR (UPLIT ('BR'))), BL_ENT = UPLIT ( BR_ENT - ADDR_BASE + V_FIELD * (ENT_K_BL) + L_FIELD * (2), CH$PTR (UPLIT ('BL'))), BPAR_ENT = UPLIT ( BL_ENT - ADDR_BASE + V_FIELD * (ENT_K_BPAR) + L_FIELD * (4), CH$PTR (UPLIT ('BPAR'))), BSEN_ENT = UPLIT ( BPAR_ENT - ADDR_BASE + V_FIELD * (ENT_K_BSEN) + L_FIELD * (4), CH$PTR (UPLIT ('BSEN'))), B_ENTS = UPLIT ( BSEN_ENT - ADDR_BASE + V_FIELD * (ENT_K_BPAGE) + L_FIELD * (5), CH$PTR (UPLIT ('BPAGE'))), C_ENTS = UPLIT ( END_ENTITY - ADDR_BASE + V_FIELD * (ENT_K_CHAR) + L_FIELD * (1), CH$PTR (UPLIT ('C'))), EW_ENT = UPLIT ( END_ENTITY - ADDR_BASE + V_FIELD * (ENT_K_EW) + L_FIELD * (2), CH$PTR (UPLIT ('EW'))), EL_ENT = UPLIT ( EW_ENT - ADDR_BASE + V_FIELD * (ENT_K_EL) + L_FIELD * (2), CH$PTR (UPLIT ('EL'))), ER_ENT = UPLIT ( EL_ENT - ADDR_BASE + V_FIELD * (ENT_K_ER) + L_FIELD * (2), CH$PTR (UPLIT ('ER'))), EPAR_ENT = UPLIT ( ER_ENT - ADDR_BASE + V_FIELD * (ENT_K_EPAR) + L_FIELD * (4), CH$PTR (UPLIT ('EPAR'))), ESEN_ENT = UPLIT ( EPAR_ENT - ADDR_BASE + V_FIELD * (ENT_K_ESEN) + L_FIELD * (4), CH$PTR (UPLIT ('ESEN'))), E_ENTS = UPLIT ( ESEN_ENT - ADDR_BASE + V_FIELD * (ENT_K_EPAGE) + L_FIELD * (5), CH$PTR (UPLIT ('EPAGE'))), L_ENTS = UPLIT ( END_ENTITY - ADDR_BASE + V_FIELD * (ENT_K_LINE) + L_FIELD * (1), CH$PTR (UPLIT ('L'))), N_ENTS = UPLIT ( END_ENTITY - ADDR_BASE + V_FIELD * (ENT_K_NL) + L_FIELD * (2), CH$PTR (UPLIT ('NL'))), PAR_ENT = UPLIT ( END_ENTITY - ADDR_BASE + V_FIELD * (ENT_K_PAR) + L_FIELD * (3), CH$PTR (UPLIT ('PAR'))), P_ENTS = UPLIT ( PAR_ENT - ADDR_BASE + V_FIELD * (ENT_K_PAGE) + L_FIELD * (4), CH$PTR (UPLIT ('PAGE'))), SR_ENT = UPLIT ( END_ENTITY - ADDR_BASE + V_FIELD * (ENT_K_SR) + L_FIELD * (2), CH$PTR (UPLIT ('SR'))), S_ENTS = UPLIT ( SR_ENT - ADDR_BASE + V_FIELD * (ENT_K_SEN) + L_FIELD * (3), CH$PTR (UPLIT ('SEN'))), V_ENTS = UPLIT ( END_ENTITY - ADDR_BASE + V_FIELD * (ENT_K_VERT) + L_FIELD * (1), CH$PTR (UPLIT ('V'))), W_ENTS = UPLIT ( END_ENTITY - ADDR_BASE + V_FIELD * (ENT_K_WORD) + L_FIELD * (1), CH$PTR (UPLIT ('W'))); BIND ENTITY_TABLE = UPLIT ( B_ENTS - ADDR_BASE, C_ENTS - ADDR_BASE, END_ENTITY - ADDR_BASE, E_ENTS - ADDR_BASE, END_ENTITY - ADDR_BASE, END_ENTITY - ADDR_BASE, END_ENTITY - ADDR_BASE, END_ENTITY - ADDR_BASE, END_ENTITY - ADDR_BASE, END_ENTITY - ADDR_BASE, L_ENTS - ADDR_BASE, END_ENTITY - ADDR_BASE, N_ENTS - ADDR_BASE, END_ENTITY - ADDR_BASE, P_ENTS - ADDR_BASE, END_ENTITY - ADDR_BASE, END_ENTITY - ADDR_BASE, S_ENTS - ADDR_BASE, END_ENTITY - ADDR_BASE, END_ENTITY - ADDR_BASE, V_ENTS - ADDR_BASE, W_ENTS - ADDR_BASE); ! ! EXTERNAL REFERENCES: ! ! In the routine %SBTTL 'EDT$$KEY_WORD - look for a key word' GLOBAL ROUTINE EDT$$KEY_WORD ( ! Look for a key word TABLE_NO, ! 1 = verb table, 2 = entity table KEY_NUM ! Key number ) : NOVALUE = !++ ! FUNCTIONAL DESCRIPTION: ! ! This routine scans a table of keywords, attempting to find a match ! in the current command buffer pointed to by CMD_PTR . ! The comparison is case blind. ! ! FORMAL PARAMETERS: ! ! TABLE_NO The number of the keyword table to use. 1 = use the ! verb table, 2 = use the entity table. ! ! KEY_NUM The returned value for the number of the entity or ! verb which matched from the table. Zero indicates ! no match. ! ! ! IMPLICIT INPUTS: ! ! CMD_END ! CMD_PTR ! ! IMPLICIT OUTPUTS: ! ! CMD_PTR ! ! ROUTINE VALUE: ! ! NONE ! ! SIDE EFFECTS: ! ! NONE ! !-- BEGIN EXTERNAL CHAR_INFO : BLOCKVECTOR [256, 1], !Information about each character CMD_END, ! End of command pointer CMD_PTR; ! Command string pointer LOCAL KW_POINTER, FIRST_CHAR, TABLE_OFFSET, FOUND, TABLE, TABLE_PTR : REF BLOCK [ ] FIELD (KEY_WORD_FIELD), C_POINTER; .KEY_NUM = 0; C_POINTER = .CMD_PTR; FIRST_CHAR = CH$RCHAR_A (C_POINTER); IF .CHAR_INFO [.FIRST_CHAR, CI_LC] THEN FIRST_CHAR = .FIRST_CHAR - %C'a' + %C'A'; CASE .TABLE_NO FROM 1 TO 2 OF SET [1] : BEGIN IF ((.FIRST_CHAR LSS %C'A') OR (.FIRST_CHAR GTR %C'^')) THEN RETURN; TABLE = VERB_TABLE; TABLE_OFFSET = (.FIRST_CHAR - %C'A'); TABLE_PTR = .(.TABLE + .TABLE_OFFSET) + ADDR_BASE; END; [2] : BEGIN IF ((.FIRST_CHAR LSS %C'B') OR (.FIRST_CHAR GTR %C'W')) THEN RETURN; TABLE = ENTITY_TABLE; TABLE_OFFSET = (.FIRST_CHAR - %C'B'); TABLE_PTR = .(.TABLE + .TABLE_OFFSET) + ADDR_BASE; END; [OUTRANGE] : ASSERT (0,0); TES; WHILE (.TABLE_PTR [KEY_WORD_LEN] NEQ 0) DO BEGIN KW_POINTER = .TABLE_PTR [KEY_WORD_POINTER]; C_POINTER = .CMD_PTR; FOUND = 1; IF CH$PTR_LEQ (CH$PLUS (.C_POINTER, .TABLE_PTR [KEY_WORD_LEN]), .CMD_END) THEN BEGIN INCR I FROM 1 TO .TABLE_PTR [KEY_WORD_LEN] DO BEGIN LOCAL CHAR; CHAR = CH$RCHAR_A (C_POINTER); IF .CHAR_INFO [.CHAR, CI_LC] THEN CHAR = .CHAR - %C'a' + %C'A'; IF (.CHAR NEQ CH$RCHAR_A (KW_POINTER)) THEN FOUND = 0; END; IF .FOUND THEN BEGIN .KEY_NUM = .TABLE_PTR [KEY_WORD_NUM]; !+ ! Skip over the keyword. !- CMD_PTR = CH$PLUS (.CMD_PTR, .TABLE_PTR [KEY_WORD_LEN]); RETURN; END; END; TABLE_PTR = .TABLE_PTR [KEY_WORD_NEXT] + ADDR_BASE; END; RETURN; END; END ELUDOM