Trailing-Edge
-
PDP-10 Archives
-
bb-h138f-bm
-
7-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) 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 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