Google
 

Trailing-Edge - PDP-10 Archives - bb-r775d-bm_tops20_ks_upd_4 - sources/fill.bli
There are 10 other files named fill.bli in the archive. Click here to see a list.
 %TITLE 'FILL - fill command'
MODULE FILL (				! Fill command
		IDENT = '2-002'			! File: FILL.BLI, Edit: GB2002
		) =
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 implements the fill command for line mode
!	or change mode.
!
! ENVIRONMENT: user mode.
!
! AUTHOR: Bob Kushlis, CREATION DATE: 11-OCT-1979
!
! MODIFIED BY:
!
! 2-001	- Regularize headers.  JBS 05-Mar-1981
! 2-002 - Fix lots of string ptrs and bad code, add BYTE_SIZE for bigger bytes.  GB 1-Mar-1983
!
!--

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

REQUIRE 'EDTSRC:TRAROUNAM';

FORWARD ROUTINE
    EDT$$FILL_TXT;

!
! INCLUDE FILES:
!

REQUIRE 'EDTSRC:EDTREQ';

!
! MACROS:
!
!	NONE
!
! EQUATED SYMBOLS:
!
!	NONE
!
! OWN STORAGE:
!
!	NONE
!
! EXTERNAL REFERENCES:
!
!	In the routine
%SBTTL 'EDT$$FILL_TXT  - fill command'

GLOBAL ROUTINE EDT$$FILL_TXT (			! Fill command
	NLINES					! Number of lines to process
    ) =

!++
! FUNCTIONAL DESCRIPTION:
!
!	Do filling, in both line and change mode.
!
! FORMAL PARAMETERS:
!
!  NLINES		The number of lines to fill
!
! IMPLICIT INPUTS:
!
!	WD_WRAP
!	TI_WID
!	LN_BUF
!	LN_LEN
!	WK_LN
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	The number of lines filled.
!
! SIDE EFFECTS:
!
!	NONE
!
!--

    BEGIN

    EXTERNAL ROUTINE
	EDT$$FMT_CHWID,
	EDT$$DEL_CURLN,
	EDT$$INS_LN,
	EDT$$START_INS,
	EDT$$END_INS,
	EDT$$RD_NXTLN;

    EXTERNAL
	WD_WRAP,
	TI_WID,
	LN_BUF,
	LN_LEN,
	WK_LN : REF LIN_BLOCK;

    LABEL
	PUTLINE;

    LOCAL
	MARGIN,					! The column number of the right margin.
	COL,					! Current column of filled line buffer.
	I,					! Index into the input line.
	LC,					! Count of lines processed.
	LP,					! Pointer into filled line buffer.
	SLP,					! Start of filled line buffer
	SP,					! Pointer used when scanning back for spaces.
	REM,					! No of characters remaining after fill line.
	LEN,					! Length of input line.
	NL;					! No of new lines created.

!+
! Determine the margin.
!-

    IF (.WD_WRAP NEQ 256) THEN MARGIN = .WD_WRAP ELSE MARGIN = .TI_WID - 1;

!+
! Set the filled line buffer to empty,
! The column number to 0,
! And the count of lines processed to 0.
!-
    SLP = CH$PTR (LN_BUF, 0, BYTE_SIZE);
    LP = .SLP;
    LC = 0;
    COL = 0;
    I = .WK_LN [LIN_LENGTH];
    NL = 0;
!+
! Loop until NLINES have been processed.
!-

    INCR J FROM 1 TO .NLINES DO
	BEGIN
!+
! Strip trailing blanks and tabs
!-
	LEN = .WK_LN [LIN_LENGTH];
	SP = CH$PTR (WK_LN [LIN_TEXT], .LEN, BYTE_SIZE);

	WHILE CH$PTR_GTR (.SP, CH$PTR (WK_LN [LIN_TEXT], 0, BYTE_SIZE)) DO
	    BEGIN
	    SP = CH$PLUS (.SP, -1);

	    IF ((CH$RCHAR (.SP) NEQ %C' ') AND (CH$RCHAR (.SP) NEQ ASC_K_TAB)) THEN EXITLOOP;

	    LEN = .LEN - 1;
	    END;

	IF (.LEN NEQ 0)
	THEN
	    BEGIN

	    INCR I FROM 0 TO .LEN DO
		BEGIN

		IF (.I EQL .LEN)
		THEN
		    CH$WCHAR (%C' ', .LP)
		ELSE
		    CH$WCHAR (CH$RCHAR (CH$PTR (WK_LN [LIN_TEXT], .I, BYTE_SIZE)), .LP);

		COL = .COL + EDT$$FMT_CHWID (CH$RCHAR_A (LP), .COL);

		IF (.COL GTR .MARGIN)
		THEN
PUTLINE :
		    BEGIN
!+
! Back up to a space.
!-
		    SP = CH$PLUS (.LP, -1);

		    WHILE (CH$RCHAR (.SP) NEQ %C' ') DO

			IF CH$PTR_EQL (.SP, .SLP)
			THEN
			    LEAVE PUTLINE
			ELSE
			    SP = CH$PLUS (.SP, -1);

!+
! Insert the new line.
!-
		    EDT$$START_INS ();
		    EDT$$INS_LN (CH$PTR (LN_BUF, 0, BYTE_SIZE), CH$DIFF (.SP, .SLP));
		    EDT$$END_INS ();
		    NL = .NL + 1;
!+
! And move the remaining characters to the beginning
! of the buffer.
!-
		    SP = CH$PLUS (.SP, 1);
		    CH$MOVE (CH$DIFF (.LP, .SP), .SP, .SLP);
		    COL = 0;
		    REM = CH$DIFF (.LP, .SP);
		    LP = .SLP;

		    DECR I FROM .REM - 1 TO 0 DO
			COL = .COL + EDT$$FMT_CHWID (CH$RCHAR_A (LP), .COL);

		    END;

		END;

	    EDT$$DEL_CURLN ();
	    END
	ELSE
!+
! Line was blank, break the fill at this point by inserting
! whatever remains from the previous line.
!-
	    BEGIN
!+
! Insert the remainder of new line.
!-

	    IF CH$PTR_NEQ (.LP, .SLP)
	    THEN
		BEGIN
		EDT$$START_INS ();
		EDT$$INS_LN (CH$PTR (LN_BUF, 0, BYTE_SIZE), CH$DIFF (.LP, .SLP));
		EDT$$END_INS ();
		NL = .NL + 1;
		LP = .SLP;
		COL = 0;
		END;

	    EDT$$RD_NXTLN ();
	    NL = .NL + 1;
	    END

	END;

    IF CH$PTR_NEQ (.LP, .SLP)
    THEN
	BEGIN
	EDT$$START_INS ();
	EDT$$INS_LN (CH$PTR (LN_BUF, 0, BYTE_SIZE), CH$DIFF (.LP, .SLP));
	EDT$$END_INS ();
	NL = .NL + 1;
	END;

    RETURN (.NL);
    END;


END
ELUDOM