Trailing-Edge
-
PDP-10 Archives
-
BB-AE97C-BM
-
sources/lquery.bli
There are 10 other files named lquery.bli in the archive. Click here to see a list.
%TITLE 'LQUERY - do /QUERY processing'
MODULE LQUERY ( ! Do /QUERY processing
IDENT = '3-002' ! File: LQUERY.BLI Edit: CJG3002
) =
BEGIN
!
! COPYRIGHT (c) 1981, 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:
!
! This module handles the user interface of the /QUERY
! option on various line mode commands, such as SUBSTITUTE.
!
! ENVIRONMENT: Runs at any access mode - AST reentrant
!
! AUTHOR: Bob Kushlis, CREATION DATE: February 3, 1978
!
! MODIFIED BY:
!
! 1-001 - Original. DJS 02-FEB-1981. This module was created by
! extracting the routine EDT$$PROC_QRYQAL from the module EXEC.BLI.
! 1-002 - Regularize headers. JBS 20-Mar-1981
! 1-003 - Use the ASSERT macro and fix up some comments mangled by converting QUERY
! to EDT$$PROC_QRYQAL . JBS 01-Jun-1981
! 1-004 - Revise journaling. JBS 22-Jun-1981
! 1-005 - Use new message codes. JBS 04-Aug-1981
! 1-006 - Make empty responses illegal. JBS 16-Aug-1981
! 1-007 - Prompt from a global. JBS 23-Oct-1981
! 1-008 - Use heap storage instead of the stack to hold the constructed
! line. JBS 27-Jan-1982
! 1-009 - Add a missing dot. JBS 28-Jan-1982
! 1-010 - Add JOU_VALID. JBS 09-Apr-1982
! 1-011 - Refresh the screen after a query. JBS 05-Jul-1982
! 1-012 - If the journal file ends at a query response, treat the response
! as "Q", to return to command level. Note that the "Q" must
! be journaled. JBS 10-Jul-1982
! 3-001 - Fix various string pointers and add BYTE_SIZE for larger than
! 7 bit bytes. GB 1-Mar-1983
! 3-002 - Clear CC in case the user tried to ^C out. CJG 5-Jan-1984
!--
%SBTTL 'Declarations'
!
! TABLE OF CONTENTS:
!
REQUIRE 'EDTSRC:TRAROUNAM';
FORWARD ROUTINE
EDT$$PROC_QRYQAL; ! Process the EDT$$PROC_QRYQAL qualifier
!
! INCLUDE FILES:
!
REQUIRE 'EDTSRC:EDTREQ';
!
! MACROS:
!
! NONE
!
! EQUATED SYMBOLS:
!
LITERAL
QUERY_LEN = 80,
LINE_LEN = LIN_FIXED_SIZE*BYTES_PER_WORD + 255;
!
! OWN STORAGE:
!
! NONE
!
! EXTERNAL REFERENCES:
!
! In the routine
%SBTTL 'EDT$$PROC_QRYQAL - do /QUERY processing'
GLOBAL ROUTINE EDT$$PROC_QRYQAL ( ! Do /QUERY processing
WPTR, ! Used to reconstruct line for SUBSTITUTE
WEND ! Used to reconstruct line for SUBSTITUTE
) =
!++
! FUNCTIONAL DESCRIPTION:
!
! EDT$$PROC_QRYQAL processing routine. This routine is called before operating on
! each line by those commands which can take a /QUERY qualifier.
!
! The options bits are checked to see if the /QUERY qualifier was used.
! If not the routine returns success immediately. If it was specified,
! then the user is prompted for verification. The actions for each
! possible answer are:
!
! Y - Return a 1 to indcate operation should be performed.
! N - Return a 0 to indicate operation should not be performed.
! Q - The global flag EXE_QRYQUIT is set to stop further processing.
! A - The /QUERY option bit is cleared so no more queries are done.
!
! If the answer is not one of the above, then a message is displayed and the
! user is prompted again.
!
! FORMAL PARAMETERS:
!
! WPTR Used to reconstruct line for SUBSTITUTE, 0 otherwise
!
! WEND Used to reconstruct line for SUBSTITUTE, 0 otherwise
!
! IMPLICIT INPUTS:
!
! RCOV_MOD
! LN_BUF
! LN_LEN
! WK_LN
! EXE_QRYQUIT
! EXE_SBITS
! PMT_QUERY
!
! IMPLICIT OUTPUTS:
!
! JOU_VALID
!
! ROUTINE VALUE:
!
! 1 = do the operation
! 0 = don't do the operation
!
! SIDE EFFECTS:
!
! NONE
!
!--
BEGIN
EXTERNAL ROUTINE
EDT$$FMT_MSG, ! Place the text of a message in the format buffer
EDT$$RD_CMDLN, ! Read a command line
EDT$$RD_JOUTXT, ! Read a text record from the journal file
EDT$$TI_FLUSHJOUFI : NOVALUE, ! Write current journal buffer on journal file
EDT$$TI_BUFCH : NOVALUE, ! Store a character in the journal buffer
EDT$$CNV_UPC, ! Convert to upper case
EDT$$TY_CURLN, ! Display the current line
EDT$$ALO_HEAP, ! Allocate heap storage
EDT$$DEA_HEAP : NOVALUE, ! Deallocate heap storage
EDT$$FMT_CRLF; ! Terminate a formatted line
EXTERNAL
RCOV_MOD,
LN_BUF : VECTOR [CH$ALLOCATION (255, BYTE_SIZE)],
LN_LEN,
WK_LN : REF LIN_BLOCK,
CC, ! Control-C flag
EXE_QRYQUIT, ! Quit flag for /QUERY operations.
EXE_SBITS, ! The options switches.
PMT_QUERY : VECTOR, ! Counted ASCII string for /QUERY prompt
JOU_VALID, ! 1 = journal record is valid
FMT_BOT; ! We are printing at the bottom of the screen
MESSAGES ((PLSANSYNQ, INSMEM));
LOCAL
QUERY_RESP : REF BLOCK [CH$ALLOCATION (QUERY_LEN)],
QUERY_RESP_PTR, ! String ptr to response
QUERY_RESP_COMPLETE, ! 1 = response is complete
RET_VAL, ! Return value
LEN,
SW_LINE, ! Save WK_LN
IN, ! Input char ptr
OUT, ! Output char ptr
WLEN, ! Length of rest of line
L_WPTR, ! Local copy of WPTR
T_LINE : REF LIN_BLOCK; ! Current line with substitutions
!+
! Check for the /QUERY bit. If it is clear then return 1.
!-
IF .EXE_SBITS<OPB_QUERY>
THEN
BEGIN
!+
! Display the line so the user can see what he is verifying.
!-
IF (.WPTR EQL 0)
THEN
EDT$$TY_CURLN ()
ELSE
!+
! During a SUBSTITUTE command, the current line is in various
! pieces which are here reconstructed so that any substitution
! already made on the line are shown.
!-
BEGIN
!+
! Allocate enough space for a maximum-length line.
!-
IF EDT$$ALO_HEAP (%REF (LINE_LEN), T_LINE)
THEN
BEGIN
!+
! Initialize the description for the line to be constructed.
!-
EDT$$CPY_MEM (LIN_FIXED_SIZE, .WK_LN, .T_LINE);
!+
! Copy the line up to the last substitution.
!-
IN = CH$PTR (LN_BUF, 0, BYTE_SIZE);
OUT = CH$PTR (T_LINE [LIN_TEXT], 0, BYTE_SIZE);
DECR I FROM .LN_LEN - 1 TO 0 DO
CH$WCHAR_A (CH$RCHAR_A (IN), OUT);
!+
! Copy the current line from the last match to the end.
!-
WLEN = CH$DIFF (.WEND, .WPTR);
IF ((.LN_LEN + .WLEN) GTR 255) THEN WLEN = MAX (0, 255 - .LN_LEN);
L_WPTR = .WPTR;
DECR I FROM .WLEN - 1 TO 0 DO
CH$WCHAR_A (CH$RCHAR_A (L_WPTR), OUT);
!+
! Fixup the description of the fake current line.
!-
T_LINE [LIN_LENGTH] = .LN_LEN + .WLEN;
!+
! Type the line.
!-
SW_LINE = .WK_LN; ! Save the current line description
WK_LN = .T_LINE; ! Make the constructed line the current one
EDT$$TY_CURLN (); ! Format and output this line
WK_LN = .SW_LINE; ! Restore the current line description
!+
! Deallocate the heap storage used to hold the line.
!-
EDT$$DEA_HEAP (%REF (LINE_LEN), T_LINE);
END
ELSE
BEGIN
!+
! There is not enough heap storage to print the line. Don't do this operation
! and stop the whole command. Also, give an appropriate error message.
!-
EDT$$FMT_MSG (EDT$_INSMEM); ! Give an appropriate error message
EXE_QRYQUIT = 1; ! Stop the command
RETURN (0); ! Don't do this substitution
END;
END;
!+
! Allocate space to hold the response to the query.
!-
IF ( NOT EDT$$ALO_HEAP (%REF (QUERY_LEN), QUERY_RESP))
THEN
BEGIN
!+
! There is not enough storage to accept the response. Don't do this
! operation and stop the whole command. Also, give an appropriate error message.
!-
EDT$$FMT_MSG (EDT$_INSMEM); ! Give an appropriate message
EXE_QRYQUIT = 1; ! Stop the command
RETURN (0); ! Don't do this substitution
END;
QUERY_RESP_COMPLETE = 0;
QUERY_RESP_PTR = CH$PTR (.QUERY_RESP,, BYTE_SIZE);
WHILE ( NOT .QUERY_RESP_COMPLETE) DO
BEGIN
!+
! Get the line from either the terminal or the journal file.
!-
IF .RCOV_MOD
THEN
BEGIN
IF ( NOT EDT$$RD_JOUTXT (.QUERY_RESP, LEN))
THEN
BEGIN
!+
! We have reached the end of the journal file. Fake a "Q" response so that
! we will terminate this command without making any more changes to the buffer.
!-
LEN = 1;
CH$WCHAR (%C'Q', .QUERY_RESP_PTR);
!+
! We must journal the fake response, in case we do another /RECOVER during this session.
!-
EDT$$TI_BUFCH (CH$RCHAR (.QUERY_RESP_PTR));
JOU_VALID = 1;
END;
END
ELSE
BEGIN
!+
! Make sure the journal buffer has been written to the journal file,
! since we are about to wait for terminal input.
!-
EDT$$TI_FLUSHJOUFI (%C'T');
!+
! If all the text is being concentrated at the bottom of the screen, then be sure we are prompting
! on a blank line.
!-
IF .FMT_BOT THEN EDT$$FMT_CRLF ();
EDT$$RD_CMDLN (PMT_QUERY [1], .PMT_QUERY [0], .QUERY_RESP, LEN, QUERY_LEN);
!+
! Make sure the response is journaled. Only the first character of the response is journaled
! because only the first character is important.
!-
IF (.LEN GEQ 1) THEN EDT$$TI_BUFCH (CH$RCHAR (.QUERY_RESP_PTR));
JOU_VALID = 1;
END;
!+
! Check out the answer.
!-
IF (.LEN LSS 1)
THEN
BEGIN
CC = 0;
EDT$$FMT_MSG (EDT$_PLSANSYNQ);
END
ELSE
BEGIN
EDT$$CNV_UPC (.QUERY_RESP_PTR, 1);
SELECTONE CH$RCHAR (.QUERY_RESP_PTR) OF
SET
[%C'Y'] :
BEGIN
RET_VAL = 1;
QUERY_RESP_COMPLETE = 1;
END;
[%C'N'] :
BEGIN
RET_VAL = 0;
QUERY_RESP_COMPLETE = 1;
END;
[%C'A'] :
BEGIN
EXE_SBITS<OPB_QUERY> = 0;
RET_VAL = 1;
QUERY_RESP_COMPLETE = 1;
END;
[%C'Q'] :
BEGIN
EXE_QRYQUIT = 1;
RET_VAL = 0;
QUERY_RESP_COMPLETE = 1;
END;
[OTHERWISE] :
EDT$$FMT_MSG (EDT$_PLSANSYNQ);
TES;
END;
END;
!+
! Come here when the query response is complete. RET_VAL contains the
! value to return. Deallocate the heap storage used to hold the responses
! to the query.
!-
EDT$$DEA_HEAP (%REF (QUERY_LEN), QUERY_RESP);
END
ELSE
RET_VAL = 1;
RETURN (.RET_VAL);
END; ! of routine EDT$$PROC_QRYQAL
END
ELUDOM