Trailing-Edge
-
PDP-10 Archives
-
decuslib20-07
-
decus/20-0172/contrl.bli
There is 1 other file named contrl.bli in the archive. Click here to see a list.
!<BLF/lowercase_user>
!<BLF/uppercase_key>
MODULE contrl ( !
IDENT = '8.2'
) =
BEGIN
!++
! Facility:
!
! BLISS Language Formatter.
! Abstract:
!
! This module contains routines which provide for optional control
! of PRETTY, by means of full-line comments of the form
! !<Blf/...>.
!
! REVISION HISTORY
!
! 12-Feb-82 TT This reinstated Xport version had spelling
! mistakes in the macros for Noformat, Error,
! and Noerror in CTL$COMMAND. Noformat was not
! being recognized. Error seemed to work okay
! but it was fixed as well.
!
! 12-Feb-82 TT Set up to handle the new /LOG /NOLOG switch.
!
! END OF REVISION HISTORY
!--
!<blf/page>
!
! Table of contents:
!--
FORWARD ROUTINE
ctl$command : NOVALUE,
ctl$init : NOVALUE,
ctl$switch,
get_dec;
!
! Include files:
!--
REQUIRE 'BLFCSW'; ! Defines control switches, i.e. 'sw_...'
REQUIRE 'BLFIOB'; ! XPORT i-o blocks
REQUIRE 'BLFMAC'; ! Defines macros 'lex', 'msg', 'write'
REQUIRE 'TOKTYP'; ! Defines 'token' and the token type values 's_...'
REQUIRE 'UTLCOD'; ! Defines error codes, i.e. 'er_...'
!
! Macros:
!--
!
! Equated symbols:
!--
LITERAL
true = 1 EQL 1,
false = 1 NEQ 1;
!
! Global storage
!--
EXTERNAL
log_flag;
!
! Own storage:
!--
OWN
!+
! All the items here are initialized in ctl$init.
!-
debug_flag :, !
error, ! Flag for messages.
macro_flag, ! Flag for macro-formatting
page_width, ! Width of printed page
plit_flag, ! Flag for PLIT-formatting
rem_tabs, ! Number of tabs to remark column
!+
! The following two switches can take on the values
! 0 = No converison, 1 = Force lower case, 2 = Force upper case.
! 0 is the default value.
!-
user_case, ! Case switch for user names
key_case; ! Case switch for keywords
!
! External references:
!--
EXTERNAL ROUTINE
lex$def_synonym,
out$eject,
out$ntbreak,
out$set_tab,
scn$fin_verb,
scn$init,
scn$set_in_unit,
scn$strt_verb,
utl$error;
GLOBAL ROUTINE ctl$command (cp) : NOVALUE = !
!++
! Functional description:
!
! This routine analyses input comments of the form
! !<Blf/...>
! which are used to provide controls to the Formatter.
!
! Formal parameters:
!
! None
!
! Implicit inputs:
!
! None
!
! Implicit outputs:
!
! None
!
! Routine value:
!
! None
!
! Side effects:
!
! None
!
!--
!<Blf/page>
BEGIN
LOCAL
ccp; ! Char pointer
MACRO
blf_text =
'!<BLF/'%,
blf_text_len = %CHARCOUNT (blf_text)%,
debug_text = 'DEBUG'%,
debug_text_len = %CHARCOUNT (debug_text)%,
nodbg_text = 'NODEBUG'%,
nodbg_text_len = %CHARCOUNT (nodbg_text)%,
req_text = 'REQUIRE'%,
req_text_len = %CHARCOUNT (req_text)%,
fmt_text = 'FORMAT'%,
fmt_text_len = %CHARCOUNT (fmt_text)%,
nofmt_text = 'NOFORMAT'%,
nofmt_text_len = %CHARCOUNT (nofmt_text)%,
PAGE_text = 'PAGE'%,
PAGE_text_len = %CHARCOUNT (PAGE_text)%,
rem_text = 'REMARK:'%,
rem_text_len = %CHARCOUNT (rem_text)%,
error_text = 'ERROR'%,
error_text_len = %CHARCOUNT (error_text)%,
noerr_text = 'NOERROR'%,
noerr_text_len = %CHARCOUNT (noerr_text)%,
MACRO_text = 'MACRO'%,
MACRO_text_len = %CHARCOUNT (MACRO_text)%,
nomac_text = 'NOMACRO'%,
nomac_text_len = %CHARCOUNT (nomac_text)%,
PLIT_text = 'PLIT'%,
PLIT_text_len = %CHARCOUNT (PLIT_text)%,
NOPLIT_text = 'NOPLIT'%,
NOPLIT_text_len = %CHARCOUNT (NOPLIT_text)%,
syn_text = 'SYNONYM'%,
syn_text_len = %CHARCOUNT (syn_text)%,
WIDTH_text = 'WIDTH:'%,
WIDTH_text_len = %CHARCOUNT (WIDTH_text)%,
UC_text = 'UPPERCASE'%,
UC_text_len = %CHARCOUNT (UC_text)%,
LC_text = 'LOWERCASE'%,
LC_text_len = %CHARCOUNT (LC_text)%,
NOC_text = 'NOCASE'%,
NOC_text_len = %CHARCOUNT (NOC_text)%,
KEY_text = '_KEY'%,
KEY_text_len = %CHARCOUNT (KEY_text)%,
USER_text = '_USER'%,
USER_text_len = %CHARCOUNT (USER_text)%;
!+
! A comment line of appropriate form has been found by
! lex$getsym. CP is a char pointer which points to a command
! line (full-line comment) whose first 6 chars are assured to be
! "!<BLF/".
!-
ccp = CH$PLUS (.cp, BLF_TEXT_LEN); ! Skip over "!<BLF/"
IF CH$EQL (debug_text_len, .ccp, !
debug_text_len, CH$PTR (UPLIT(debug_text))) ! 'DEBUG'
THEN
debug_flag = true;
IF CH$EQL (nodbg_text_len, .ccp, !
nodbg_text_len, CH$PTR (UPLIT(nodbg_text))) ! 'NODEBUG'
THEN
debug_flag = false;
!------------
IF CH$EQL (req_text_len, .ccp, !
req_text_len, CH$PTR (UPLIT(req_text))) ! 'REQUIRE'
THEN
BEGIN
LOCAL
ch,
cccp,
len;
ccp = CH$PLUS (.ccp, req_text_len);
ch = 0;
UNTIL .ch EQL %C'''' DO
ch = CH$RCHAR_A (ccp); ! Find the first quote
cccp = .ccp; ! Mark start of file name
ch = len = 0;
UNTIL .ch EQL %C'''' DO
(ch = CH$RCHAR_A (cccp); len = .len + 1; );
$xpo_iob_init ( !
default = (4, CH$PTR (UPLIT ('.REQ'))), !
iob = req_iob);
IF XPO$_normal NEQ $xpo_open ( !
file_spec = (.len - 1, .ccp), !
options = input,
iob = req_iob)
THEN
utl$error (er_file_spec)
ELSE
BEGIN
scn$set_in_unit (req_iob);
scn$init ();
END;
END;
!------------
IF CH$EQL (page_text_len, .ccp, !
page_text_len, CH$PTR (UPLIT(page_text))) ! 'PAGE'
THEN
BEGIN
scn$fin_verb (); ! Resume automatic formatting
out$ntbreak ();
out$eject (0); ! New page starts
out$set_tab (true);
END;
!------------
IF CH$EQL (nofmt_text_len, .ccp, ! Check for beginning
nofmt_text_len,
CH$PTR (UPLIT(nofmt_text))) ! 'NOFORMAT'
THEN
scn$strt_verb ();
IF CH$EQL (fmt_text_len, .ccp, ! and end of
fmt_text_len,
CH$PTR (UPLIT(fmt_text))) ! 'FORMAT'
THEN
scn$fin_verb ();
!------------
IF CH$EQL (rem_text_len, .ccp, ! Check for remark tabs
rem_text_len, CH$PTR (UPLIT(rem_text))) ! 'REMARK:'
THEN
BEGIN
ccp = CH$PLUS (.ccp, rem_text_len);
rem_tabs = get_dec (ccp);
IF .rem_tabs LSS 3 OR .rem_tabs GTR 15 THEN rem_tabs = 6;
END;
!------------
IF CH$EQL (error_text_len, .ccp, !
error_text_len, CH$PTR (UPLIT(error_text))) ! 'ERROR'
THEN
error = true;
IF CH$EQL (noerr_text_len, .ccp, !
noerr_text_len, CH$PTR (UPLIT(noerr_text))) ! 'NOERROR'
THEN
error = false;
!------------
IF CH$EQL (macro_text_len, .ccp, !
macro_text_len, CH$PTR (UPLIT(macro_text))) ! 'MACRO'
THEN
macro_flag = true;
IF CH$EQL (nomac_text_len, .ccp, !
nomac_text_len, CH$PTR (UPLIT(nomac_text))) ! 'NOMACRO'
THEN
macro_flag = false;
!------------
IF CH$EQL (plit_text_len, .ccp, !
plit_text_len, CH$PTR (UPLIT(plit_text))) ! 'PLIT'
THEN
PLIT_flag = true;
IF CH$EQL (noplit_text_len, .ccp, !
noplit_text_len, CH$PTR (UPLIT(noplit_text))) ! 'NOPLIT'
THEN
PLIT_flag = false;
!------------
IF CH$EQL (syn_text_len, .ccp, !
syn_text_len, CH$PTR (UPLIT(syn_text))) ! 'SYNONYM'
THEN
lex$def_synonym (CH$PLUS (.ccp, syn_text_len));
!------------
IF CH$EQL (width_text_len, .ccp, ! Check for page width
width_text_len, CH$PTR (UPLIT(width_text))) ! 'WIDTH:'
THEN
BEGIN
ccp = CH$PLUS (.ccp, width_text_len);
page_width = get_dec (ccp);
IF .page_width LSS 40 OR .page_width GTR 140 THEN page_width = 110;
END;
!------------
IF CH$EQL (lc_text_len, .ccp, !
lc_text_len, CH$PTR (UPLIT(lc_text))) ! 'LOWERCASE'
THEN
BEGIN
ccp = CH$PLUS (.ccp, lc_text_len);
IF CH$EQL (key_text_len, .ccp, key_text_len, !
CH$PTR (UPLIT(key_text))) ! '_KEY'
THEN
key_case = sw_locase;
IF CH$EQL (user_text_len, .ccp, !
user_text_len, CH$PTR (UPLIT(user_text))) ! '_USER'
THEN
user_case = sw_locase;
IF CH$EQL (1, .ccp, 1, CH$PTR (UPLIT('>'))) THEN user_case = key_case = sw_locase;
END;
!------------
IF CH$EQL (uc_text_len, .ccp, !
uc_text_len, CH$PTR (UPLIT(uc_text))) ! 'UPPERCASE'
THEN
BEGIN
ccp = CH$PLUS (.ccp, uc_text_len);
IF CH$EQL (key_text_len, .ccp, !
key_text_len, CH$PTR (UPLIT(key_text))) ! '_KEY'
THEN
key_case = sw_upcase;
IF CH$EQL (user_text_len, .ccp, !
user_text_len, CH$PTR (UPLIT(user_text))) ! '_USER'
THEN
user_case = sw_upcase;
IF CH$EQL (1, .ccp, 1, CH$PTR (UPLIT('>'))) THEN user_case = key_case = sw_upcase;
END;
!------------
IF CH$EQL (noc_text_len, .ccp, !
noc_text_len, CH$PTR (UPLIT(noc_text))) ! 'NOCASE'
THEN
BEGIN
ccp = CH$PLUS (.ccp, noc_text_len);
IF CH$EQL (key_text_len, .ccp, !
key_text_len, CH$PTR (UPLIT(key_text))) ! '_KEY'
THEN key_case = sw_nocase;
IF CH$EQL (user_text_len, .ccp, !
user_text_len, CH$PTR (UPLIT(user_text))) ! '_USER'
THEN user_case = sw_nocase;
IF CH$EQL (1, .ccp, 1, CH$PTR (UPLIT('>'))) THEN user_case = key_case = sw_nocase;
END;
END; ! End of routine 'ctl$command'
GLOBAL ROUTINE ctl$init : NOVALUE = !
!++
! Functional description:
!
! This routine initializes the default values of the control
! variables.
! Formal parameters:
!
! None
!
! Implicit inputs:
!
! None
!
! Implicit outputs:
!
! None
!
! Routine value:
!
! None
!
! Side effects:
!
! None
!
!--
BEGIN
debug_flag = false;
error = true;
rem_tabs = 6;
page_width = 110;
key_case = user_case = sw_nocase;
macro_flag = false;
plit_flag = false;
END; ! End of routine 'ctl$init'
GLOBAL ROUTINE ctl$switch (switch) = !
!++
! Functional description:
!
! This routine returns the current value of the control
! switch specified in the argument.
!
! Formal parameters:
!
! Switch is the name of a control switch.
! Available options for switch are:
! sw_debug
! sw_error
! sw_key_case
! sw_user_case
! sw_rem_tabs
! sw_page_width
! sw_macro
! sw_log
!
! Implicit inputs:
!
! None
!
! Implicit outputs:
!
! None
!
! Routine value:
!
! None
!
! Side effects:
!
! None
!
!--
BEGIN
SELECTONE .switch OF
SET
[sw_debug] :
RETURN .debug_flag;
[sw_macro] :
RETURN .macro_flag;
[sw_error] :
RETURN .error;
[sw_key_case] :
RETURN .key_case;
[sw_user_case] :
RETURN .user_case;
[sw_plit] :
RETURN .plit_flag;
[sw_rem_tabs] :
RETURN .rem_tabs;
[sw_page_width] :
RETURN .page_width;
[sw_log] :
RETURN .log_flag;
TES;
RETURN 0; ! Default
END; ! End of routine 'ctl$switch'
ROUTINE get_dec (cpin) = !
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine converts a digit string into a number.
! It is used in the interpretation of control commands
! for PRETTY.
!
! FORMAL PARAMETERS:
!
! cpin = the character pointer to the first (expected) digit.
!
! IMPLICIT INPUTS:
!
! NONE
!
! IMPLICIT OUTPUTS:
!
! NONE
!
! ROUTINE VALUE:
!
! The value in decimal of the digit string.
!
! SIDE EFFECTS:
!
! The character pointer is advanced beyond the first nondigit
! character encountered.
!
!--
BEGIN
LOCAL
ch,
num;
num = 0;
ch = CH$RCHAR_A (.cpin);
WHILE .ch GEQ %C'0' AND !
.ch LEQ %C'9' DO
BEGIN
num = .num*10 + (.ch - %C'0');
ch = CH$RCHAR_A (.cpin);
END;
RETURN .num;
END; ! End of routine 'get_dec'
%TITLE 'Last page of CONTRL.BLI'
END ! End of module 'contrl'
ELUDOM