Trailing-Edge
-
PDP-10 Archives
-
bb-r775d-bm_tops20_ks_upd_4
-
sources/fchar.bli
There are 10 other files named fchar.bli in the archive. Click here to see a list.
%TITLE 'FCHAR - put a char in format buffer'
MODULE FCHAR ( ! Put a char in format buffer
IDENT = '3-003' ! File: FCHAR.BLI Edit: CJG3003
) =
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:
!
! Put a character in the option buffer, expanding control characters
! and watching for line overflow.
!
! ENVIRONMENT: Runs at any access mode - AST reentrant
!
! AUTHOR: Bob Kushlis, CREATION DATE: March 18, 1979
!
! MODIFIED BY:
!
! 1-001 - Original. DJS 19-FEB-1981. This module was created by
! extracting routine EDT$$FMT_CH from module FORMAT.
! 1-002 - Regularize headers. JBS 05-Mar-1981
! 1-003 - Change output of <FF> to user string. STS 07-Oct-1981
! 1-004 - Don't count <FF>'s width twice. JBS 05-May-1982
! 1-005 - Correct appearance of <CR>. JBS 07-May-1982
! 1-006 - Add supplemental set from DEC STD 169. JBS 11-Aug-1982
! 1-007 - Update EDT$$G_PRV_COL. JBS 30-Sep-1982
! 1-008 - Remove external declaration of EDT$$FMT_LIT, not used. JBS 05-Oct-1982
! 1-009 - Don't increment EDT$$G_PRV_COL beyond the size of the screen. JBS 16-Oct-1982
! 1-010 - Don't output the buffer based on the terminal's width. JBS 16-Oct-1982
! 1-011 - Remove optimization of simple characters, now done by caller. JBS 04-Jan-1983
! 1-012 - Add conditional for VT220 support. JBS 10-Feb-1983
! 1-013 - Take out unecessary declarations. SMB 23-Feb-1983
! 1-014 - Put character names in DATA and revise the format of the table. JBS 04-Mar-1983
! 1-015 - Correct display on 8-bit terminals. JBS 07-Mar-1983
! 3-002 - Remove VT220 conditional to speed up code. CJG 25-Nov-1983
! 3-003 - Fix problems with edge of screen. CJG 9-Jan-1984
!--
%SBTTL 'Declarations'
!
! TABLE OF CONTENTS:
!
REQUIRE 'EDTSRC:TRAROUNAM';
FORWARD ROUTINE
EDT$$FMT_CH : NOVALUE;
!
! INCLUDE FILES:
!
REQUIRE 'EDTSRC:EDTREQ';
LIBRARY 'EDTSRC:TRANSLATE';
!
! MACROS:
!
! NONE
!
! EQUATED SYMBOLS:
!
! NONE
!
! OWN STORAGE:
!
! NONE
!
! EXTERNAL REFERENCES:
!
! In the routine
%SBTTL 'EDT$$FMT_CH - put a char in format buffer'
GLOBAL ROUTINE EDT$$FMT_CH ( ! Put a char in the format buffer
FC ! Character to print
) : NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!
! Place a character in the format buffer. If the character would cause
! the buffer to overflow, or a line to be longer than the terminal width,
! then write the buffer first. Control chraracters are printed out either
! with a special mnemonic like <CR> or as ^letter. Tabs are expanded into
! the correct number of spaces. If this is not an eight-bit terminal,
! all characters above 127 are printed using a name in <>. If this is an
! eight-bit terminal controls above 127 are printed as <mnemonic>, reserved
! positions above 127 are printed as <Xnn>, where nn is the hex for the
! character.
!
! FORMAL PARAMETERS:
!
! FC The character to print
!
! IMPLICIT INPUTS:
!
! PRV_COL
! TI_WID
! EIGHT_BIT
! FMT_LNPOS
!
! IMPLICIT OUTPUTS:
!
! FMT_LNPOS
!
! ROUTINE VALUE:
!
! NONE
!
! SIDE EFFECTS:
!
! NONE
!
!--
BEGIN
EXTERNAL ROUTINE
EDT$$FMT_TEXT : NOVALUE, ! Output the text for form feed
EDT$$STORE_FMTCH : NOVALUE; ! Put a character in the format buffer
EXTERNAL
TI_WID, ! Terminal width
EIGHT_BIT, ! Is terminal in eight-bit mode?
FMT_LNPOS, ! The current column number
CHAR_INFO : BLOCKVECTOR [256, 1], ! Information about each character
CHAR_NAMES, ! Names of some characters
CHAR_NAMES_LEN, ! Length of the name table
PRV_COL; ! Cursor column
LOCAL
C;
C = .FC;
!+
! Watch for special cases.
!-
SELECTONE .C OF
SET
[ASC_K_TAB] :
BEGIN
DO
BEGIN
EDT$$FMT_CH (%C' ');
END
UNTIL ((.FMT_LNPOS AND 7) EQL 0)
END;
[ASC_K_FF] :
BEGIN
!+
! Handle form feed specially.
!-
EDT$$FMT_TEXT (1);
END;
[OTHERWISE] :
BEGIN
!+
! This is not a special case character, dispatch on its type.
!-
CASE .CHAR_INFO [.C, CI_DSP] FROM 0 TO 3 OF
SET
[0] :
BEGIN
!+
! This is a simple character; it can be printed on this terminal in one column.
! Bump the column number by the amount occupied by this character.
!-
FMT_LNPOS = .FMT_LNPOS + 1;
EDT$$STORE_FMTCH (.C);
PRV_COL = .PRV_COL + 1;
END;
[1] :
BEGIN
!+
! This character is to be output as ^ followed by the character code plus 64.
!-
EDT$$FMT_CH (%C'^');
EDT$$FMT_CH (.C + 64);
END;
[2] :
BEGIN
!+
! This character has a special text form. Find it in the table
! and output the special form surrounded by <>. However, characters above the C1 controls are
! output as themselves on 8-bit terminals.
!-
LOCAL
REP_PTR,
REP_CHAR;
IF (.EIGHT_BIT AND (.C GEQ %X'A0'))
THEN
BEGIN
!+
! This is a legitimate character in the DEC Multinational supplemental set, being displayed
! on an eight-bit terminal.
!-
FMT_LNPOS = .FMT_LNPOS + 1;
EDT$$STORE_FMTCH (.C);
PRV_COL = .PRV_COL + 1;
END
ELSE
BEGIN
REP_PTR = CH$PTR (CHAR_NAMES - 1 + .CHAR_INFO [.C, CI_PTR],, 9);
EDT$$FMT_CH (%C'<');
REP_CHAR = CH$RCHAR_A (REP_PTR);
WHILE (.REP_CHAR NEQ 0) DO
BEGIN
EDT$$FMT_CH (.REP_CHAR);
REP_CHAR = CH$RCHAR_A (REP_PTR);
END;
EDT$$FMT_CH (%C'>');
END;
END;
[3] :
BEGIN
!+
! This character is to be output as <Xnn>, where nn is the hex for the character.
!-
LOCAL
HEX_DIGIT_1,
HEX_DIGIT_2;
EDT$$FMT_CH (%C'<');
EDT$$FMT_CH (%C'X');
HEX_DIGIT_1 = (.C^-4) + %C'0';
IF (.HEX_DIGIT_1 GTR %C'9') THEN HEX_DIGIT_1 = .HEX_DIGIT_1 - %C'9' + %C'A' - 1;
EDT$$FMT_CH (.HEX_DIGIT_1);
HEX_DIGIT_2 = (.C AND %X'0F') + %C'0';
IF (.HEX_DIGIT_2 GTR %C'9') THEN HEX_DIGIT_2 = .HEX_DIGIT_2 - %C'9' + %C'A' - 1;
EDT$$FMT_CH (.HEX_DIGIT_2);
EDT$$FMT_CH (%C'>');
END;
TES;
END;
TES;
END; ! of routine EDT$$FMT_CH
!<BLF/PAGE>
END ! of module EDT$FCHAR
ELUDOM