Google
 

Trailing-Edge - PDP-10 Archives - bb-h138f-bm - 7-sources/chmmrkchg.bli
There are 11 other files named chmmrkchg.bli in the archive. Click here to see a list.
 %TITLE 'CHMMRKCHG - track changes in current line'
MODULE CHMMRKCHG (				! Track changes in current line
		IDENT = '3-001'			! File: CHMMRKCHG.BLI Edit: CJG3001
		) =
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 keeps track of the bounds between which the
!	current line must be updated.
!
! ENVIRONMENT:	Runs at any access mode - AST reentrant
!
! AUTHOR: Bob Kushlis, CREATION DATE: Unknown
!
! MODIFIED BY:
!
! 2-001	- Recode to interface to the new screen updater.  JBS 13-Sep-1982
! 2-002	- Version 2-001 was just a stub.  This version is little better:
!	   it always marks the line for reapinting.  JBS 17-Sep-1982
! 2-003	- Add logic for deleting lines and for skipping over deleted lines.
!	   JBS 20-Sep-1982
! 2-004	- Worry about the target line having a deleted neighbor.  JBS 20-Sep-1982
! 2-005	- Call EDT$$SC_FNDREC, which contains the table searching code.  JBS 24-Sep-1982
! 2-006	- Record the actual edits to a line, instead of just marking it for repaint.  JBS 28-Sep-1982
! 2-007 - Change the parameters to SC_FNDREC.  SMB 28-Sep-1982
! 2-008 - Put in temporary zeroing of screen buffer pointer.  SMB 30-Sep-1982
! 2-009 - Remove yesterday's temporary change.  SMB 01-Oct-1982
! 2-010 - Change the way SC_FNDREC is used.  SMB 08-Oct-1982
! 2-011	- Don't run off the end of the edit buffer, and maintain SCR_EDIT_POS.  JBS 18-Oct-1982
! 2-012	- Turn insert followed by delete into a null operation.  JBS 24-Oct-1982
! 2-013	- Fix problems involving marking deleted characters.  JBS 24-Oct-1982
! 2-014	- If we free the first screen pointer, update EDT$$A_FST_SCRPTR.
! 2-015	- Maintain SCR_EDIT_MINPOS.  JBS 28-Oct-1982
! 2-016	- Use EDT$$SC_LNDEL to free line blocks.  JBS 29-Oct-1982
! 2-017 - Fix a bad LOCAL declaration.  SMB 31-Oct-1982
! 2-018	- Maintain MINPOS, even if we must repaint, to avoid extra repainting
!	   if we overflow the edit buffer, which is likely on the PDP-11.  JBS 01-Dec-1982
! 2-019	- Maintain MINPOS even if the previous edit is a repaint.  JBS 04-Dec-1982
! 2-020	- If we are editing the first character of a continuation line, mark the
!	   previous line as needing repainting at its end, in case we are inserting
!	   a character before a wide character that should really be painted at the
!	   end of the previous line.  JBS 20-Dec-1982
! 2-021	- Remove the edit buffer.  JBS 27-Dec-1982
! 2-022	- If we delete an inserted continuation or continued line,
!	   rebuild the screen data structure.  JBS 05-Jan-1983
! 2-023	- If we are going to rebuild the screen data structure,
!	   don't update anything.  JBS 17-Feb-1983
! 3-001 - Modify ASSERT macro to include error code. CJG 30-Jan-1984
!--
%SBTTL 'Declarations'
!
! TABLE OF CONTENTS:
!

REQUIRE 'EDTSRC:TRAROUNAM';

FORWARD ROUTINE
    EDT$$MRK_LNCHG : NOVALUE;			! Mark changes in the current line

!
! INCLUDE FILES:
!

REQUIRE 'EDTSRC:EDTREQ';

!
! MACROS:
!
!	NONE
!
! EQUATED SYMBOLS:
!
!	NONE
!
! OWN STORAGE:
!
!	NONE
!
! EXTERNAL REFERENCES:
!
!	In the routine
%SBTTL 'EDT$$MRK_LNCHG  - mark changes in the current line'

GLOBAL ROUTINE EDT$$MRK_LNCHG (			! Mark changes in the current line
    CODE, 					! Change code
    POSITION					! Position in the record
    ) : NOVALUE =

!++
! FUNCTIONAL DESCRIPTION:
!
!	Keep track of edits done to lines on the screen, so the screen
!	updater can repaint them.
!
! FORMAL PARAMETERS:
!
!  CODE			The type of edit: delete line or modify
!  POSITION		The position in the record at which the operation takes place
!
! IMPLICIT INPUTS:
!
!	SCR_BUF
!	CUR_BUF
!	SCR_REBUILD
!
! IMPLICIT OUTPUTS:
!
!	LN_CHGD
!	SCR_REBUILD
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS:
!
!	NONE
!
!--

    BEGIN

    EXTERNAL ROUTINE
	EDT$$SC_FNDREC,				! Find a record in the screen data base
	EDT$$SC_LNDEL : NOVALUE;		! Free a record from the screen data base

    EXTERNAL
	SCR_BUF,
	CUR_BUF : REF TBCB_BLOCK,	! Pointer to the current text buffer control block
	LN_CHGD,				! The current record has been changed
	SCR_REBUILD;			! 1 = the screen data base has to be rebuilt

    LOCAL
	DISP,					! Displacement from cursor screen pointer
	SCRPTR : REF SCREEN_LINE,		! Pointer to our screen line
	RECORD_NO : LN_BLOCK,			! Record number of our screen line
	EDIT_CODE,				! Do this to this record
	REL_POS,				! Position in this line
	MIN_RELPOS;				! Minimum edit position on this line

!+
! Make sure the work file system knows that the current record has been
! changed, so it will write the record back to the work file system.
!-
    LN_CHGD = 1;
!+
! If we are going to rebuild the screen data base anyway, don't bother to update it.
!-
    IF .SCR_REBUILD THEN RETURN;

!+
! Point to the current line in the screen data base.
!-
    ASSERT (7, .POSITION LEQ 255);
    SCRPTR = EDT$$SC_FNDREC (.POSITION, DISP);
!+
! If the line is not in the screen data base, just return.
!-

    IF (.SCRPTR EQLA 0) THEN RETURN;

!+
! Check for delete of an inserted line.  It is very special.
!-
    EDIT_CODE = .CODE;

    IF ((.EDIT_CODE EQL SCR_EDIT_DELLN) AND ((.SCRPTR [SCR_EDIT_FLAGS] AND SCR_EDIT_INSLN) NEQ 0))
    THEN
	BEGIN
!+
! We are deleting an inserted line.  Back out the insert so that
! the screen updater will see nothing.
!-

	LOCAL
	    NEXT_SCRPTR : REF SCREEN_LINE;

!+
! If this is a continued or continuation line, rebuild the screen data base.
!-

	IF (.SCRPTR [SCR_LINE_IDX] NEQ 0)
	THEN
	    BEGIN
	    SCR_REBUILD = 1;
	    RETURN;
	    END;

	NEXT_SCRPTR = .SCRPTR [SCR_NXT_LINE];

	IF (.NEXT_SCRPTR NEQA 0)
	THEN
	    BEGIN

	    IF (.NEXT_SCRPTR [SCR_LINE_IDX] NEQ 0)
	    THEN
		BEGIN
		SCR_REBUILD = 1;
		RETURN;
		END;

	    END;

	EDT$$SC_LNDEL (.SCRPTR);
	RETURN;
	END;

!+
! Maintain the record of the minimum edit position.
!-
    REL_POS = .POSITION - .SCRPTR [SCR_CHR_FROM];
    MIN_RELPOS = MINU (.REL_POS, .SCRPTR [SCR_EDIT_MINPOS]);
    SCRPTR [SCR_EDIT_MINPOS] = .MIN_RELPOS;
    SCRPTR [SCR_EDIT_MAXPOS] = 255;
!+
! If we are editing at the front of a continuation line, mark the previous line as needing
! an edit at its end.  This is in case we are inserting a narrow character in front of a
! wide character; the narrow character may want to be displayed at the end of the previous line.
!-

    IF ((.REL_POS EQL 0) AND (.SCRPTR [SCR_CHR_FROM] NEQ 0))	!
    THEN
	EDT$$MRK_LNCHG (SCR_EDIT_MODIFY, .POSITION - 1);

!+
! Mark the edit for this line.
!-
    SCRPTR [SCR_EDIT_FLAGS] = .SCRPTR [SCR_EDIT_FLAGS] OR .EDIT_CODE;
!+
! After any edit to a line, mark all subsequent lines for the
! same record for repainting.  This means that in NOTRUNCATE mode,
! if you edit a line all later lines for that record are repainted.
! This is important even for replaces, since the width of a character
! may change.  Note that deleting a line causes the subsequent
! records to be marked as deleted.
!-

    WHILE ((.SCRPTR [SCR_CHR_TO] NEQ 255) AND (.SCRPTR [SCR_NXT_LINE] NEQA 0)) DO
	BEGIN
	SCRPTR = .SCRPTR [SCR_NXT_LINE];
	SCRPTR [SCR_EDIT_MINPOS] = 0;
	SCRPTR [SCR_EDIT_MAXPOS] = 255;
	SCRPTR [SCR_EDIT_FLAGS] = .SCRPTR [SCR_EDIT_FLAGS] OR .EDIT_CODE;
	END;					! Repaint later lines for this record

    END;					! of routine EDT$$MRK_LNCNG

!<BLF/PAGE>
END						! of module EDT$CHMMRKCHG

ELUDOM