Trailing-Edge
-
PDP-10 Archives
-
bb-r775c-bm_tops20_ks_upd_3
-
sources/fixnotrun.bli
There are 10 other files named fixnotrun.bli in the archive. Click here to see a list.
%TITLE 'FIXNOTRUN - Fix screen data base in NOTRUNCATE mode'
MODULE FIXNOTRUN ( ! Fix screen data base in NOTRUNCATE mode
IDENT = '3-001' ! File: FIXNOTRUN.BLI Edit: CJG3001
) =
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 fixes up the screen data base if we are in NOTRUNCATE mode.
!
! ENVIRONMENT: Runs at any access mode - AST reentrant
!
! AUTHOR: John Sauter, CREATION DATE: November 1, 1983
!
! MODIFIED BY:
!
! 1-001 - Original. This is a stub which always forces the data base to be rebuilt.
! JBS 01-Nov-1982
! 1-002 - Enable this routine. JBS 02-Nov-1982
! 1-003 - Fix a problem in counting records. JBS 09-Nov-1982
! 1-004 - Fix backwards search bug. SMB 23-Nov-1982
! 1-005 - Worry about deleted lines when scanning backwards. JBS 25-Nov-1982
! 1-006 - Revise handling of EDT$$G_SHF. JBS 14-Dec-1982
! 1-007 - Fix tabbing at the end of a line. JBS 15-Dec-1982
! 1-008 - Remove the edit buffer. JBS 27-Dec-1982
! 1-009 - Fix a bug in finding the current screen pointer which caused excessive rebuilding. JBS 30-Dec-1982
! 3-001 - Modify ASSERT macro to include error code. CJG 30-Jan-1984
!--
%SBTTL 'Declarations'
!
! TABLE OF CONTENTS:
!
REQUIRE 'EDTSRC:TRAROUNAM';
FORWARD ROUTINE
EDT$$FIX_NOTRUNC : NOVALUE;
!
! INCLUDE FILES:
!
REQUIRE 'EDTSRC:EDTREQ';
!
! MACROS:
!
! NONE
!
! EQUATED SYMBOLS:
!
! NONE
!
! OWN STORAGE:
!
! NONE
!
! EXTERNAL REFERENCES:
!
! In the routine
%SBTTL 'EDT$$FIX_NOTRUNC - fix screen data base in NOTRUNCATE mode'
GLOBAL ROUTINE EDT$$FIX_NOTRUNC ! Fix screen data base in NOTRUNCATE mode
: NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!
! Fix the screen data base if we are in NOTRUNCATE mode. If a character is
! inserted on a line, or deleted from a line, or even replaced (since characters
! have different widths), the limits of this line must be recomputed. If this line's
! limits change the limits of the next line may also change.
!
! FORMAL PARAMETERS:
!
! NONE
!
! IMPLICIT INPUTS:
!
! LN_PTR
! LN_BUF
! CUR_SCRPTR
! FST_SCRPTR
! FST_AVLN
! CUR_SCRLN
! SCR_BUF
! CUR_BUF
! CS_LN
! CUR_SCRLN
! CSR_SCRPTR
! WK_LN
! MEM_CNT
! SHF
! TI_WID
!
! IMPLICIT OUTPUTS:
!
! SCR_REBUILD
! FST_AVLN
!
! ROUTINE VALUE:
!
! NONE
!
! SIDE EFFECTS:
!
! MANY
!
!--
BEGIN
EXTERNAL ROUTINE
EDT$$CMP_LNO, ! compare line numbers
EDT$$SC_MOVTOLN, ! Move to a record in the work file relative to the current record
EDT$$FMT_CHWID, ! Compute the width of a character
EDT$$SC_FNDREC; ! Find the screen pointer for the current record
EXTERNAL
LN_PTR, ! Current line character position
LN_BUF, ! Current line buffer
SCR_REBUILD, ! Rebuild the screen data base
FST_SCRPTR : REF SCREEN_LINE, ! First screen line info address
FST_AVLN : REF SCREEN_LINE, ! List of available lines
LNO_EMPTY : REF LN_BLOCK,
CUR_SCRLN : REF LN_BLOCK,
SCR_BUF : REF TBCB_BLOCK,
CUR_BUF : REF TBCB_BLOCK,
CS_LN : REF LN_BLOCK,
CSR_SCRPTR : REF SCREEN_LINE,
WK_LN : REF LIN_BLOCK,
MEM_CNT,
SHF, ! Number of columns shifted
TI_WID;
LOCAL
SCRPTR : REF SCREEN_LINE, ! Address of a current screen line buffer
NXT_SCRPTR : REF SCREEN_LINE, ! Address of next screen line buffer
REC_NO, ! Current relative reocrd number
FST_RECNO, ! Relative record number of first line in the screen data base
UPDATE_DONE,
ANOTHER_PASS,
WIDTH,
DISP,
COL,
LEFT,
RIGHT,
DIR,
TXT,
CHAR,
LEN;
!+
! If we are already going to rebuild the screen data base, just return.
!-
IF .SCR_REBUILD THEN RETURN;
!+
! Compute the direction of motion.
!-
IF (EDT$$CMP_LNO (LNO_EMPTY, CUR_SCRLN) EQL 0) OR (.SCR_BUF NEQA .CUR_BUF)
THEN
DIR = 1
ELSE
DIR = EDT$$CMP_LNO (CS_LN, CUR_SCRLN);
!+
! Find the relative record number of the old cursor line.
! We must be careful of deleted lines. The convention is that a deleted line
! has the record number of the next lower line. This prevents deleted
! lines before record zero from having negative absolute record numbers.
!-
SCRPTR = EDT$$SC_FNDREC (CH$DIFF (.LN_PTR, CH$PTR (LN_BUF,, BYTE_SIZE)), DISP);
IF (.SCRPTR EQLA 0)
THEN
BEGIN
SCR_REBUILD = 1;
RETURN;
END;
REC_NO = 0;
CASE .DIR FROM -1 TO 1 OF
SET
[1] :
BEGIN
!+
! The new line is after the old. We must move back in the work file.
!-
DO
BEGIN
IF ((.SCRPTR [SCR_LINE_IDX] EQL 0) OR ((.SCRPTR [SCR_EDIT_FLAGS] AND SCR_EDIT_DELLN) NEQ 0))
THEN
BEGIN
LOCAL
PREV_SCRPTR : REF SCREEN_LINE;
PREV_SCRPTR = .SCRPTR [SCR_PRV_LINE];
IF (.PREV_SCRPTR NEQA 0)
THEN
BEGIN
IF ((.PREV_SCRPTR [SCR_EDIT_FLAGS] AND SCR_EDIT_DELLN) EQL 0)
THEN
REC_NO = .REC_NO - 1;
END;
END;
SCRPTR = .SCRPTR [SCR_PRV_LINE];
END
UNTIL ((.SCRPTR EQLA .CSR_SCRPTR) OR (.SCRPTR EQLA 0));
END;
[0] :
BEGIN
!+
! We are positioned correctly in the work file.
!-
SCRPTR = .CSR_SCRPTR;
END;
[-1] :
BEGIN
!+
! The new line is before the old. We must move forward in the work file.
!-
DO
BEGIN
LOCAL
NEXT_SCRPTR : REF SCREEN_LINE;
NEXT_SCRPTR = .SCRPTR [SCR_NXT_LINE];
IF (.NEXT_SCRPTR NEQA 0)
THEN
BEGIN
IF (((.SCRPTR [SCR_EDIT_FLAGS] AND SCR_EDIT_DELLN) EQL 0) AND !
((.NEXT_SCRPTR [SCR_LINE_IDX] EQL 0) OR !
((.NEXT_SCRPTR [SCR_EDIT_FLAGS] AND SCR_EDIT_DELLN) NEQ 0)))
THEN
REC_NO = .REC_NO + 1;
END;
SCRPTR = .SCRPTR [SCR_NXT_LINE];
END
UNTIL ((.SCRPTR EQLA .CSR_SCRPTR) OR (.SCRPTR EQLA 0));
END;
[OUTRANGE] :
ASSERT (11, 0);
TES;
!+
! If we couldn't find it, rebuild the screen data base.
!-
IF (.SCRPTR NEQA .CSR_SCRPTR)
THEN
BEGIN
SCR_REBUILD = 1;
RETURN;
END;
!+
! Now work backwards to the first line.
!-
WHILE ((.SCRPTR NEQA .FST_SCRPTR) AND (.SCRPTR NEQA 0)) DO
BEGIN
IF ((.SCRPTR [SCR_LINE_IDX] EQL 0) OR ((.SCRPTR [SCR_EDIT_FLAGS] AND SCR_EDIT_DELLN) NEQ 0))
THEN
BEGIN
LOCAL
PREV_SCRPTR : REF SCREEN_LINE;
PREV_SCRPTR = .SCRPTR [SCR_PRV_LINE];
IF (.PREV_SCRPTR NEQA 0)
THEN
BEGIN
IF ((.PREV_SCRPTR [SCR_EDIT_FLAGS] AND SCR_EDIT_DELLN) EQL 0) THEN REC_NO = .REC_NO - 1;
END;
END;
SCRPTR = .SCRPTR [SCR_PRV_LINE];
END;
FST_RECNO = .REC_NO;
!+
! If we didn't find it, rebuild the screen data base.
!-
IF (.SCRPTR NEQA .FST_SCRPTR)
THEN
BEGIN
SCR_REBUILD = 1;
RETURN;
END;
!+
! Recompute the end points of any lines which have changed.
!-
DO
BEGIN
ANOTHER_PASS = 0;
REC_NO = .FST_RECNO;
SCRPTR = .FST_SCRPTR;
DO
BEGIN
UPDATE_DONE = 0;
IF ((.SCRPTR [SCR_EDIT_FLAGS] AND (SCR_EDIT_MODIFY OR SCR_EDIT_INSLN)) NEQ 0)
THEN
BEGIN
!+
! Compute the width of the current line.
!-
LEFT = .SCRPTR [SCR_CHR_FROM];
IF (.LEFT EQL 0)
THEN
BEGIN
WIDTH = .TI_WID + .SHF;
COL = 0;
END
ELSE
BEGIN
WIDTH = .TI_WID + .SHF;
COL = .SHF + 2;
END;
!+
! We must compute the width of each character to see how many will fit.
!-
ASSERT (12, EDT$$SC_MOVTOLN (.REC_NO));
LEN = .WK_LN [LIN_LENGTH] - .LEFT;
TXT = CH$PTR (WK_LN [LIN_TEXT], .LEFT, BYTE_SIZE);
RIGHT = .LEFT - 1;
CHAR = CH$RCHAR_A (TXT);
WHILE ((.LEN GTR 0) AND ((.COL + EDT$$FMT_CHWID (.CHAR, .COL)) LEQ .WIDTH)) DO
BEGIN
LEN = .LEN - 1;
RIGHT = .RIGHT + 1;
COL = .COL + EDT$$FMT_CHWID (.CHAR, .COL);
CHAR = CH$RCHAR_A (TXT);
END;
IF (.LEN EQL 0) THEN RIGHT = 255;
IF (.SCRPTR [SCR_CHR_TO] NEQ .RIGHT)
THEN
BEGIN
!+
! This line's width has changed. Store the new width and
! arrange to recompute the width of the next line.
!-
SCRPTR [SCR_CHR_TO] = .RIGHT;
NXT_SCRPTR = .SCRPTR [SCR_NXT_LINE];
!+
! If there is no next line in the screen data base and we need one, do it the hard way.
!-
IF (.RIGHT NEQ 255)
THEN
BEGIN
IF (.NXT_SCRPTR EQLA 0)
THEN
BEGIN
EDT$$SC_MOVTOLN (0);
SCR_REBUILD = 1;
RETURN;
END;
!+
! If there isn't another line already for this record, and we need one,
! do it the hard way.
! Perhaps someday we'll allocate another screen line block here.
!-
IF (.NXT_SCRPTR [SCR_CHR_FROM] EQL 0)
THEN
BEGIN
EDT$$SC_MOVTOLN (0);
SCR_REBUILD = 1;
RETURN;
END;
NXT_SCRPTR [SCR_CHR_FROM] = .RIGHT + 1;
NXT_SCRPTR [SCR_EDIT_MINPOS] = 0;
NXT_SCRPTR [SCR_EDIT_MAXPOS] = 255;
NXT_SCRPTR [SCR_EDIT_FLAGS] = .NXT_SCRPTR [SCR_EDIT_FLAGS] OR SCR_EDIT_MODIFY;
END
ELSE
BEGIN
!+
! We have reached the end of the record, make sure there isn't
! another line allocated for it.
!-
NXT_SCRPTR = .SCRPTR [SCR_NXT_LINE];
IF (.NXT_SCRPTR NEQA 0)
THEN
BEGIN
IF (.NXT_SCRPTR [SCR_CHR_FROM] NEQ 0)
THEN
BEGIN
EDT$$SC_MOVTOLN (0);
SCR_REBUILD = 1;
RETURN;
END;
END;
END;
END;
END;
IF ( NOT .UPDATE_DONE)
THEN
BEGIN
IF (.SCRPTR [SCR_NXT_LINE] EQLA 0)
THEN
UPDATE_DONE = 1
ELSE
BEGIN
LOCAL
NEXT_SCRPTR : REF SCREEN_LINE;
NEXT_SCRPTR = .SCRPTR [SCR_NXT_LINE];
IF (.NEXT_SCRPTR NEQA 0)
THEN
BEGIN
IF (((.SCRPTR [SCR_EDIT_FLAGS] AND SCR_EDIT_DELLN) EQL 0) AND !
((.NEXT_SCRPTR [SCR_LINE_IDX] EQL 0) OR !
((.NEXT_SCRPTR [SCR_EDIT_FLAGS] AND SCR_EDIT_DELLN) NEQ 0)))
THEN
REC_NO = .REC_NO + 1;
END;
SCRPTR = .SCRPTR [SCR_NXT_LINE];
END;
END;
END
UNTIL .UPDATE_DONE;
END
UNTIL ( NOT .ANOTHER_PASS);
EDT$$SC_MOVTOLN (0);
END; ! of routine EDT$$SC_UPD
!<BLF/PAGE>
END ! of module EDT$SCRUPDATE
ELUDOM