Trailing-Edge
-
PDP-10 Archives
-
bb-r775e-bm_tops20_ks_upd_5
-
sources/edt/scrcomcur.bli
There are 10 other files named scrcomcur.bli in the archive. Click here to see a list.
%TITLE 'SCRCOMCUR - compute cursor position'
MODULE SCRCOMCUR ( ! Compute cursor position
IDENT = '3-001' ! File: SCRCOMCUR.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 computes the current cursor position.
!
! ENVIRONMENT: Runs at any access mode - AST reentrant
!
! AUTHOR: Bob Kushlis, CREATION DATE: September 8, 1979
!
! MODIFIED BY:
!
! 1-001 - Original. DJS 12-Feb-1981. This module was created by
! extracting the routine EDT$$SC_CPUCSPOS from module SCREEN.
! 1-002 - Regularize headers. JBS 13-Mar-1981
! 1-003 - Rewrite for new screen logic. JBS 12-Oct-1982
! 1-004 - Fix a couple of minor bugs. JBS 13-Oct-1982
! 1-005 - Fix call to EDT$$FMT_CHWID. JBS 13-Oct-1982
! 1-006 - Fix problem with SHL. JBS 27-Oct-1982
! 1-007 - Fix the cursor position in NOTRUNCATE mode. JBS 09-Nov-1982
! 1-008 - Fix the cursor positioning again. JBS 10-Nov-1982
! 1-009 - Change the handling of SHF. JBS 14-Dec-1982
! 1-010 - Correct tab at front of continued line. JBS 15-Dec-1982
!--
%SBTTL 'Declarations'
!
! TABLE OF CONTENTS:
!
REQUIRE 'EDTSRC:TRAROUNAM';
FORWARD ROUTINE
EDT$$SC_CPUCSPOS : NOVALUE;
!
! INCLUDE FILES:
!
REQUIRE 'EDTSRC:EDTREQ';
!
! MACROS:
!
! NONE
!
! EQUATED SYMBOLS:
!
! NONE
!
! OWN STORAGE:
!
! NONE
!
! EXTERNAL REFERENCES:
!
! In the routine
%SBTTL 'EDT$$SC_CPUCSPOS - compute cursor position'
GLOBAL ROUTINE EDT$$SC_CPUCSPOS ( ! Compute cursor position
LINE, ! Where to return line number
COLUMN ! Where to return column number
) : NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine computes the current cursor position returning the line
! and column numbers in the ref parameters LINE and COLUMN.
!
! FORMAL PARAMETERS:
!
! LINE Cursor's relative line number
!
! COLUMN Cursor's column number
!
! IMPLICIT INPUTS:
!
! SHF
! TI_WID
! TRUN
! LN_BUF
! LN_PTR
! LN_END
!
! IMPLICIT OUTPUTS:
!
! NONE
!
! ROUTINE VALUE:
!
! NONE
!
! SIDE EFFECTS:
!
! NONE
!
!--
BEGIN
EXTERNAL ROUTINE
EDT$$FMT_CHWID; ! Compute the width of a character
EXTERNAL
SHF, ! The number of columns shifted.
TI_WID, ! Width of terminal line.
TRUN, ! Truncate or wrap long lines.
LN_BUF, ! Current line buffer.
LN_PTR, ! Current character pointer.
LN_END; ! End of line
LOCAL
CP, ! Character pointer into the current record
LIN, ! Relative line number (first line = 0)
COL, ! Column number (first column = 0), unshifted
CHAR, ! Current character
CHAR_WID, ! Width of the current character
LINE_DONE; ! 1 = we are done with this line
LIN = 0;
COL = 0;
CP = CH$PTR (LN_BUF, 0, BYTE_SIZE);
LINE_DONE = 0;
DECR I FROM CH$DIFF (.LN_PTR, .CP) - 1 TO 0 DO
BEGIN
IF ( NOT .LINE_DONE)
THEN
BEGIN
CHAR = CH$RCHAR_A (CP);
CHAR_WID = EDT$$FMT_CHWID (.CHAR, .COL);
IF ((.COL + .CHAR_WID) LEQ (.TI_WID + .SHF))
THEN
!+
! The character fits on this line, count it and go on to the next.
!-
COL = .COL + .CHAR_WID
ELSE
!+
! The character does not fit on this line.
!-
IF .TRUN
THEN
BEGIN
!+
! In TRUNCATE mode, just position to the last column and terminate.
!-
COL = .TI_WID + .SHF - 1;
LINE_DONE = 1;
END
ELSE
BEGIN
!+
! In NOTRUNCATE mode, try fitting it on the next line. Don't produce too many lines.
!-
LIN = .LIN + 1;
COL = .SHF + 2;
!+
! We can't use .CHAR_WID in the next statement because the width of a tab may be
! different on the new line since it is in a new position.
!-
IF (.LIN GEQ 255) THEN LINE_DONE = 1 ELSE COL = .COL + EDT$$FMT_CHWID (.CHAR, .COL);
END;
END
ELSE
EXITLOOP;
END;
!+
! In NOTRUNCATE mode, make sure the current character will fit on this line. If it will not,
! move the cursor to the beginning of the next line.
!-
IF (( NOT .TRUN) AND ( NOT .LINE_DONE) AND (CH$PTR_NEQ (.LN_PTR, .LN_END)))
THEN
BEGIN
CHAR = CH$RCHAR_A (CP);
CHAR_WID = EDT$$FMT_CHWID (.CHAR, .COL);
IF ((.COL + .CHAR_WID) GTR (.TI_WID + .SHF))
THEN
BEGIN
LIN = .LIN + 1;
COL = .SHF + 2;
END;
END;
.LINE = .LIN;
.COLUMN = MAX (0, MIN (.COL - .SHF, .TI_WID - 1));
END; ! of routine EDT$$SC_CPUCSPOS
!<BLF/PAGE>
END ! of module SCRCOMCUR
ELUDOM