Google
 

Trailing-Edge - PDP-10 Archives - BB-H138E-BM - 6-1-sources/chmcmblin.bli
There are 11 other files named chmcmblin.bli in the archive. Click here to see a list.
 %TITLE 'CHMCMBLIN - combine lines'
MODULE CHMCMBLIN (				! Combine lines
		IDENT = '3-002'			! File: CHMCMBLIN.BLI Edit: GB3002
		) =
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 combines the current line with the one
!	immediately above it.
!
! 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$$COMB_LN  from module CHANGE.BLI.
! 1-002	- Regularize headers.  JBS 25-Feb-1981
! 1-003	- Fix module name.  JBS 02-Mar-1981
! 1-004	- Use the ASSERT macro.  JBS 01-Jun-1981
! 1-005	- EDT$$SEL_RNGPOS  can have values -1, 0 and 1.  JBS 02-Jun-1981
! 1-006	- Use new message codes.  JBS 04-Aug-1981
! 1-007 - Fix bug where you cannot combine lines because length >255.
!	  STS 23-Oct-1981
! 1-008	- New screen update logic.  JBS 13-Sep-1982
! 1-009 - Make call to edt$$tst_eob in line. STS 22-Sep-1982
! 1-010	- Remove EDT$$G_LN_NO for new screen update logic.  JBS 29-Sep-1982
! 1-011	- Move call to EDT$$MRK_LNCHG.  JBS 27-Oct-1982
! 1-012	- Change order of operations to improve screen updating.  JBS 01-Dec-1982
! 1-013	- Change call to EDT$$MRK_LNCHG.  JBS 27-Dec-1982
! 1-014	- Add special cases for empty lines, to improve screen updating.  JBS 28-Dec-1982
! 1-015	- Add parameter to suppress special cases.  JBS 28-Dec-1982
! 1-016	- Don't delete the current line if it is of zero length.  JBS 29-Dec-1982
! 3-001 - Replace CPY_MEM with CPY_STR and allow big bytes.  GB 3-Mar-1983
! 3-002 - Add updates from V3 sources.  GB 04-May-1983
!--

%SBTTL 'Declarations'
!
! TABLE OF CONTENTS:
!

REQUIRE 'EDTSRC:TRAROUNAM';

FORWARD ROUTINE
    EDT$$COMB_LN : NOVALUE;		! Combine the current line with the one immediately above it

!
! INCLUDE FILES:
!

REQUIRE 'EDTSRC:EDTREQ';

!
! MACROS:
!
!	NONE
!
! EQUATED SYMBOLS:
!
!	NONE
!
! OWN STORAGE:
!
!	NONE
!
! EXTERNAL REFERENCES:
!
!	In the routine
%SBTTL 'EDT$$COMB_LN  - combine lines'

GLOBAL ROUTINE EDT$$COMB_LN (			! Combine lines
    LEN_OPT) : NOVALUE =

!++
! FUNCTIONAL DESCRIPTION:
!
!	This routine combines the current line with the one immediately
!	above it.
!
! FORMAL PARAMETERS:
!
!  LEN_OPT			1 = do optimizations based on line lengths
!
! IMPLICIT INPUTS:
!
!	LNO0
!	LN_BUF
!	LN_END
!	LN_LEN
!	WK_LN
!
! IMPLICIT OUTPUTS:
!
!	LN_PTR
!	SEL_POS
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS:
!
!	NONE
!
!--

    BEGIN

    EXTERNAL ROUTINE
	EDT$$MSG_BELL : NOVALUE,		! Output a message to the terminal with a warning bell
	EDT$$MRK_LNCHG : NOVALUE,		! Record line updates
	EDT$$UPD_LNLEN : NOVALUE,		! Update the length of the current line
	EDT$$DEL_CURLN,				! Delete a line from buffer
	EDT$$RD_PRVLN,				! Move backward a line
	EDT$$RD_NXTLN,				! Move forward a line
	EDT$$RPL_CHGDLN : NOVALUE;		! Replace a changed line

    EXTERNAL
	LN_BUF,				! Current line buffer
	LN_PTR,				! Current character pointer
	LN_END,				! End of current line pointer
	LN_LEN,				! Length of current line
	EOB_LN,
	WK_LN : REF LIN_BLOCK;		! Current line pointer

!+
! Declare the message codes to be used.
!-
    MESSAGES ((LINEXC255));

    LOCAL
	EOB,
	LEN;

!+
! Remember if we are at the end of the buffer.
!-
    EOB = (.WK_LN EQLA EOB_LN);

!+
! Move back a line, give up if it fails.
!-

    IF ( NOT EDT$$RD_PRVLN ()) THEN RETURN;

!+
! Get length of add on line.
!-
    LEN = .WK_LN [LIN_LENGTH];
!+
! Make sure the two do not exceed 255 characters.
!-

    IF ((.LN_LEN + .LEN) GTR 255)
    THEN
	BEGIN
	EDT$$MSG_BELL (EDT$_LINEXC255);
	EDT$$RD_NXTLN ();
	RETURN;
	END;

!+
! If the add-on line is empty, just delete it.
!-

    IF ((.LEN EQL 0) AND .LEN_OPT)
    THEN
	BEGIN
	EDT$$DEL_CURLN ();
	RETURN;
	END;

!+
! The add-on line is not empty, or length optimization is not permitted.  Move the current line over.
!-
    LN_PTR = CH$PTR (LN_BUF, .LEN, BYTE_SIZE);
    EDT$$CPY_STR (.LN_LEN, CH$PTR (LN_BUF, 0, BYTE_SIZE), .LN_PTR);
!+
!+
! Move in the text from the previous line.
!-
    EDT$$CPY_STR (.LEN, CH$PTR (WK_LN [LIN_TEXT], 0, BYTE_SIZE), CH$PTR (LN_BUF, 0, BYTE_SIZE));
    EDT$$MRK_LNCHG (SCR_EDIT_MODIFY, .LEN);
!+
! Update the length field.
!-
    EDT$$UPD_LNLEN (.LEN);
    EDT$$RPL_CHGDLN ();
!+
! Delete the first line unless it is just before EOB.
!-

    IF (( NOT .EOB) OR (.LN_LEN EQL 0))
    THEN
	BEGIN

	IF ( NOT .EOB) THEN EDT$$RD_NXTLN ();

	EDT$$DEL_CURLN ();

	IF ( NOT .EOB) THEN EDT$$RD_PRVLN ();

	END;

    END;					! of routine EDT$$COMB_LN

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

ELUDOM