Trailing-Edge
-
PDP-10 Archives
-
bb-r775e-bm_tops20_ks_upd_5
-
sources/edt/chmspllin.bli
There are 11 other files named chmspllin.bli in the archive. Click here to see a list.
%TITLE 'CHMSPLLIN - split line'
MODULE CHMSPLLIN ( ! Split line
IDENT = '3-001' ! File: CHMSPLLIN.BLI Edit: GB3001
) =
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 splits a line of text at the current cursor position.
!
! 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 routines EDT$$SPLT_LN and SPLIT_LINE from
! module CHANGE.BLI.
! 1-002 - Regularize headers. JBS 03-Mar-1981
! 1-003 - Change SPLIT_LINE to EDT$$SPLT_LNINS . JBS 27-Mar-1981
! 1-004 - Use the ASSERT macro. JBS 01-Jun-1981
! 1-005 - EDT$$SEL_RNGPOS has 3 values. JBS 02-Jun-1981
! 1-006 - New screen update logic. JBS 13-Sep-1982
! 1-007 - Remove EDT$$G_LN_NO for new screen update logic. JBS 29-Sep-1982
! 1-008 - Make code dependent on length of inserted line. SMB 16-Nov-1982
! 1-009 - Reorganize to fix bugs in line numbering. SMB 17-Nov-1982
! 1-010 - Save the end of the old line in heap storage rather than
! on the stack. Saving it on the stack uses too much
! stack on the PDP-11. JBS 18-Nov-1982
! 1-011 - Change the call to EDT$$MRK_LNCHG. JBS 27-Dec-1982
! 1-012 - Do things the stupid way if there is a select active, so tha.
! the select range will be updated properly. JBS 22-Feb-1983
! 3-001 - Add updates from V3 sources. GB 27-Apr-1983
!--
%SBTTL 'Declarations'
!
! TABLE OF CONTENTS:
!
REQUIRE 'EDTSRC:TRAROUNAM';
FORWARD ROUTINE
EDT$$SPLT_LN : NOVALUE, ! Split a line of text at the current cursor position
EDT$$SPLT_LNINS : NOVALUE; ! Split a line of text at the current cursor position
!
! INCLUDE FILES:
!
REQUIRE 'EDTSRC:EDTREQ';
!
! MACROS:
!
! NONE
!
! EQUATED SYMBOLS:
!
! NONE
!
! OWN STORAGE:
!
! NONE
!
! EXTERNAL REFERENCES:
!
! In the routines
%SBTTL 'EDT$$SPLT_LN - split line'
GLOBAL ROUTINE EDT$$SPLT_LN ! Split line
: NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!
! Split a line of text at the current cursor position.
!
! The characters in front of the cursor become a new line, inserted
! in front of the current one. The cursor is left on the original
! line.
!
! FORMAL PARAMETERS:
!
! NONE
!
! IMPLICIT INPUTS:
!
! LN_BUF
! LN_END
! LN_PTR
!
! IMPLICIT OUTPUTS:
!
! LN_PTR
!
! ROUTINE VALUE:
!
! NONE
!
! SIDE EFFECTS:
!
! NONE
!
!--
BEGIN
EXTERNAL ROUTINE
EDT$$MRK_LNCHG : NOVALUE, ! Track line update bounds
EDT$$UPD_LNLEN : NOVALUE, ! Update the length of the current line
EDT$$INS_LN; ! Insert a line into buffer
EXTERNAL
LN_BUF, ! Current line buffer
LN_END, ! End of current line pointer
LN_PTR; ! Current character pointer
LOCAL
LEN;
!+
! Get length of the new line.
!-
LEN = CH$DIFF (.LN_PTR, CH$PTR (LN_BUF, 0, BYTE_SIZE));
!+
! Insert the new line.
!-
EDT$$INS_LN (CH$PTR (LN_BUF, 0, BYTE_SIZE), .LEN);
IF (.LEN NEQ 0)
THEN
BEGIN
EDT$$CPY_STR (CH$DIFF (.LN_END, .LN_PTR), .LN_PTR, CH$PTR (LN_BUF, 0, BYTE_SIZE));
EDT$$MRK_LNCHG (SCR_EDIT_MODIFY, 0);
EDT$$UPD_LNLEN (-.LEN);
END;
LN_PTR = CH$PTR (LN_BUF, 0, BYTE_SIZE);
END;
%SBTTL 'EDT$$SPLT_LNINS - split a line'
GLOBAL ROUTINE EDT$$SPLT_LNINS ( ! Split a line
LENGTH_OPT ! 1 = use length optimizer
) : NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!
! Split a line of text at the current cursor position.
!
! FORMAL PARAMETERS:
!
! LENGTH_OPT ! 1 = length is greater than zero so insert
! ! after current line
!
!
! IMPLICIT INPUTS:
!
! LN_LEN
! LN_BUF
! LN_END
! LN_PTR
! WK_LN
! EOB_LN
!
! IMPLICIT OUTPUTS:
!
! LN_LEN
! LN_BUF
! LN_END
! LN_PTR
!
! ROUTINE VALUE:
!
! NONE
!
! SIDE EFFECTS:
!
! Calls EDT$$SPLT_LN
!
!--
BEGIN
EXTERNAL ROUTINE
EDT$$MRK_LNCHG : NOVALUE, ! Track line updates
EDT$$UPD_LNLEN : NOVALUE, ! Update the length of the current line
EDT$$INS_LN : NOVALUE, ! Insert a line into buffer
EDT$$RPL_CHGDLN : NOVALUE, ! Replace a changed workfile line
EDT$$RD_NXTLN, ! Read next work file record
EDT$$RD_PRVLN, ! Read previous record
EDT$$START_INS : NOVALUE, ! Start an insert sequence
EDT$$END_INS : NOVALUE, ! End an insert sequence
EDT$$ALO_HEAP, ! Allocate heap storage
EDT$$DEA_HEAP : NOVALUE; ! Deallocate heap storage
EXTERNAL
LN_LEN, ! Length of the current line
LN_BUF, ! Current line buffer
LN_END, ! End of current line pointer
LN_PTR, ! Current character pointer
WK_LN, ! Current work line
EOB_LN, ! EOB line
SEL_BUF : REF TBCB_BLOCK; ! Select buffer, 0 = none
LOCAL
LEN, ! New length of old line
ENDLEN, ! Ending line length
INSERT_AFTER, ! Insert after current record
INSERT_DONE; ! 1 = the insert has been done
INSERT_DONE = 0;
!+
! Don't do the length optinization if we are at [EOB] or if there is an active select.
!-
IF ((.WK_LN EQLA EOB_LN) OR (.SEL_BUF NEQA 0))
THEN
INSERT_AFTER = 0
ELSE
INSERT_AFTER = .LENGTH_OPT;
IF (.INSERT_AFTER NEQ 0)
THEN
BEGIN
LEN = CH$DIFF (.LN_PTR, CH$PTR (LN_BUF, 0, BYTE_SIZE));
ENDLEN = CH$DIFF (.LN_END, .LN_PTR);
!+
! Use the length optimizer, which says insert below the current line
! if we're positioned anywhere except at the beginning of a line.
!-
IF (.LEN EQL 0)
THEN
BEGIN
!+
! We are at the beginning of the line. Just insert a 0-length line before this one.
!-
EDT$$START_INS (); ! Perform initialization for text insertion
EDT$$INS_LN (CH$PTR (LN_BUF, 0, BYTE_SIZE), 0);
EDT$$END_INS (); ! End the insertion sequence
LN_PTR = CH$PTR (LN_BUF, 0, BYTE_SIZE);
INSERT_DONE = 1;
END
ELSE
BEGIN
!+
! Adjust the old line and mark for repaint.
!-
LOCAL
SAV_LN_BUF, ! Place to save the end of the old line
GOT_HEAP; ! 1 = we got (or don't need) heap storage
!+
! Copy the end of the old line into heap storage, so we can insert it later.
!-
IF (.ENDLEN NEQ 0) THEN GOT_HEAP = EDT$$ALO_HEAP (ENDLEN, SAV_LN_BUF) ELSE GOT_HEAP = 1;
IF .GOT_HEAP
THEN
BEGIN
IF (.ENDLEN NEQ 0)
THEN
BEGIN
EDT$$CPY_STR (.ENDLEN, .LN_PTR, CH$PTR (.SAV_LN_BUF, 0, BYTE_SIZE));
!+
! Shorten the current line
!-
EDT$$UPD_LNLEN (-.ENDLEN);
EDT$$MRK_LNCHG (SCR_EDIT_MODIFY, .LEN);
END;
EDT$$RPL_CHGDLN ();
!+
! Insert the tail as the new line.
!-
IF (.ENDLEN NEQ 0)
THEN
BEGIN
EDT$$CPY_STR (.ENDLEN, CH$PTR (.SAV_LN_BUF, 0, BYTE_SIZE),
CH$PTR (LN_BUF, 0, BYTE_SIZE));
EDT$$DEA_HEAP (ENDLEN, SAV_LN_BUF);
END;
EDT$$RD_NXTLN ();
EDT$$START_INS (); ! Perform initialization for text insertion
!+
! Adjust the line pointer to the new line.
!-
EDT$$INS_LN (CH$PTR (LN_BUF, 0, BYTE_SIZE), .ENDLEN);
LN_LEN = .ENDLEN + .LEN;
EDT$$UPD_LNLEN (-.LEN);
EDT$$END_INS (); ! End the insertion sequence
EDT$$RD_PRVLN ();
LN_PTR = CH$PTR (LN_BUF, 0, BYTE_SIZE);
INSERT_DONE = 1;
END;
END;
END;
!+
! If we haven't done the insert, perhaps because we have run out of heap storage,
! do it the stupid way.
!-
IF ( NOT .INSERT_DONE)
THEN
BEGIN
EDT$$START_INS (); ! Perform initialization for text insertion
EDT$$SPLT_LN (); ! Split the line
EDT$$END_INS (); ! End the insertion sequence
END;
END; ! of routine EDT$$SPLT_LNINS
!<BLF/PAGE>
END ! of module EDT$CHMSPLLIN
ELUDOM