|
|
DataMuseum.dkPresents historical artifacts from the history of: DANOSI |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DANOSI Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 45913 (0xb359)
Types: TextFile
Names: »INDENT.PAS«
└─⟦e2123b2a1⟧ Bits:30010498 DVBS1.SW2103.src.1.8-1 Pascal TOOLS JTAS 1989-04-26 LEIF NIELSEN E.d.
└─⟦this⟧ »INDENT.PAS«
{[A=20,I=2,L=4,E=3,W=1-100] PASCFORM directive }\r
PROGRAM indent;\r
(* Indent Pascal programs, and also optionaly change keywords and variables to\r
common case ( upper-case or lower-case ).\r
\r
Was originaly a RC8000 Pascal program. Changed to RTP86 Pascal by RC *)\r
(*----------------------------------------------------------------------------\r
Date. Init. Vers. Explanation.\r
\r
1989-01-19 LEI 1.1 Changed to Turbo Pascal 5.0 by Leif Nielsen JTAS\r
1989-03-22 LEI 1.2 New languages inserted.\r
-----------------------------------------------------------------------------*)\r
\r
{$R+,S+ }\r
\r
USES\r
Dos,\r
DosUtil,\r
Help,\r
Param;\r
\r
CONST\r
version: STRING = ('1.2');\r
\r
MaxParam = 2;\r
MaxOption = 8;\r
\r
ParamList : ARRAY[1..MaxParam] OF ParamRec =\r
((Kind:KnownFile; Defined:FALSE; KeyWord:'I'; NumVal:0; TextVal:'.RTP'),\r
(Kind:FileType; Defined:FALSE; KeyWord:'O'; NumVal:0; TextVal:''));\r
\r
OptionList : ARRAY[1..MaxOption] OF ParamRec =\r
((Kind:OnOff; Defined:FALSE ;KeyWord:'NUMBERS'; NumVal:0; TextVal:'OFF'), (*line numbers*)\r
(Kind:OnOff; Defined:FALSE ;KeyWord:'MARK'; NumVal:0; TextVal:'OFF'), (*mark*)\r
(Kind:OnOff; Defined:FALSE ;KeyWord:'LIST'; NumVal:0; TextVal:'OFF'), (*list*)\r
(Kind:TextType; Defined:FALSE ;KeyWord:'INDENT'; NumVal:0; TextVal:'ON' ), (*indent*)\r
(Kind:TextType; Defined:FALSE ;KeyWord:'KEYWORDS'; NumVal:0; TextVal:'OWN'), (*keywords*)\r
(Kind:TextType; Defined:FALSE ;KeyWord:'VARIABLE'; NumVal:0; TextVal:'OWN'), (*variables*)\r
(Kind:TextType; Defined:FALSE ;KeyWord:'PASCAL'; NumVal:0; TextVal:'TURBO'), (*Pascal ver.*)\r
(Kind:OnOff; Defined:FALSE ;KeyWord:'XRAY'; NumVal:0; TextVal:'OFF') ); (*test*)\r
\r
\r
CONST\r
blank = ' ';\r
lsize = 240; (* LONGEST LINE*)\r
ssize = 90; (* DEEPEST STACK LOAD*)\r
tsize = 77; (* NO OF INTERESTING KEYWORDS *)\r
toplength = 14; (* longest identifier *)\r
\r
alfalength = 14;\r
File_buff_size = 2048;\r
key_ptrsize = 27 (* A..Z + 1 *);\r
space = 32;\r
ordoftab = 9;\r
\r
LF = 10;\r
FF = 12;\r
CR = 13;\r
\r
\r
TYPE\r
alfa = STRING[alfalength];\r
\r
options = (ind_, noind_, ownind_, lcid_, ucid_, ownid_,\r
lckeyw_, uckeyw_, ownkeyw_ );\r
\r
language_type = ( Not_implemented, Turbo_pascal, Pascal_86,\r
Common_RTP, RTP_8000, RTP_286 );\r
\r
stackelement = RECORD\r
prior, indent: integer\r
END;\r
\r
tablelement = RECORD\r
txt_str: alfa;\r
p1, p2, spacing: integer\r
END;\r
\r
\r
VAR\r
outpfile, inpfile: STRING;\r
inp, outp: text;\r
I_buff, O_buff: ARRAY[1..File_buff_size] OF byte;\r
\r
\r
eol: boolean; (** false until END-OF-LINE is met **)\r
\r
alfanum: SET OF char; (*HOLDS SET OF ALPHANUMERIC SYMBOLS *)\r
dummy_line: STRING;\r
line: STRING[lsize]; (* LINE LEFT JUSTIFIED*)\r
line_after_ff: STRING[lsize]; (* Store rest of line read *)\r
line_too_long: integer; (* count number of too long lines *)\r
c_pos: integer; (* POINTER TO CURRENT CHARACTER*)\r
lastpos: integer; (* LAST POSITION ON CURRENT LINE*)\r
linepos: integer; (* POINTER TO LAST USED PRINTPOS*)\r
lineno: integer; (* LINE NUMBER OF CURRENT LINE *)\r
current, ch: char; (* CH IS FIRST CHAR ON NEXT LINE*)\r
fresh: boolean; (* LINE READ, NOT YET PRINTED*)\r
margin: integer; (* HANDLES INDENTION*)\r
oldpos: integer; (* USED TO HOLD POSITIONS IN RECORDS*)\r
max_keyw_index,\r
keyw_index: integer;\r
state, old_state: (spublic, declare, statement);\r
skiperror, formfeed, myind,\r
noind, fewends: boolean;\r
linesmode, markmode: boolean;\r
\r
idmode,\r
varmode,\r
reskeymode: byte;\r
\r
language: language_type;\r
\r
test_requested, (* governed by parameter option *)\r
\r
skiptekst: boolean; (*USED IN SHIFTCASE*)\r
skipchar: char; (*USED IN SHIFTCASE *)\r
\r
markstack: ARRAY[-10..lsize] OF integer;\r
markpointer, nextmark: integer;\r
\r
\r
\r
stack: ARRAY[0..ssize] OF stackelement;\r
top: integer; (* STACK POINTER *)\r
stacktop: stackelement; (* HOLDS STACK[TOP]*)\r
PascalTable: ARRAY[1..TSize] OF tablelement;\r
key_ptr: ARRAY[ 65..91 { 'A'..'Z'+1 }] OF integer;\r
\r
\r
NoRecord: integer; (* gives the number of records.\r
inc. by 1 on keyword 'Record'. Dec by one on\r
end record *)\r
\r
\r
InWith: boolean; (* true if passing With ... do *)\r
\r
\r
\r
PROCEDURE printline; FORWARD;\r
\r
PROCEDURE semicolon; FORWARD;\r
\r
PROCEDURE skip(skipend: char); FORWARD;\r
\r
\r
FUNCTION eof_inp: boolean;\r
BEGIN (* Cheat, because of problem with FF. See Readline procedure\r
for more information *)\r
IF NOT formfeed THEN\r
eof_inp := eof(inp)\r
ELSE\r
eof_inp := false;\r
END (* Special EOF(INP) made for Turbo Pascal edition *);\r
\r
\r
PROCEDURE error(e_txt1: STRING);\r
BEGIN\r
writeln(Output);\r
writeln(Output, '*** INDENT ERROR ***', e_txt1);\r
\r
halt; (** i.e.: EXIT program **)\r
END (*error*);\r
\r
\r
PROCEDURE initialize_1;\r
VAR\r
i, j: integer;\r
prev_keylgth,\r
k_ix,\r
index: integer;\r
\r
PROCEDURE init_P_table(a: alfa; a1, a2, a3: integer);\r
BEGIN\r
WITH pascaltable[index] DO\r
BEGIN\r
txt_str := a;\r
p1 := a1;\r
p2 := a2;\r
spacing := a3;\r
END;\r
max_keyw_index := index;\r
index := index+1;\r
END;\r
\r
BEGIN\r
\r
eol := false;\r
alfanum := ['0'..'9', 'A'..'Z', '_'];\r
linepos := 0;\r
lineno := 1;\r
line_too_long := 0;\r
fewends := false;\r
skiptekst := false;\r
skiperror := false;\r
markpointer := 0;\r
\r
Margin := 3;\r
\r
stack[0].prior := 10; (* bottom never unstack *)\r
stack[0].indent := 0;\r
stack[1].indent := 2;\r
stack[1].prior := 2;\r
stacktop := stack[1];\r
top := 1;\r
state := declare;\r
old_state := statement;\r
NoRecord := 0;\r
InWith := false;\r
\r
formfeed := false;\r
\r
\r
(** Searching in this table is done by means of "binary search" on\r
the keywords. For this reason the keywords has to be put into the table\r
in alphabetical order!!! **)\r
\r
index := 1;\r
\r
init_P_table('ABSOLUTE ', -1, 0, 0);\r
init_P_table('AND ', -1, 0, 0);\r
init_P_table('ARRAY ', -1, 0, 0);\r
init_P_table('AS ', -1, 0, 0);\r
init_P_table('BEGIN ', 4, 4, 2);\r
init_P_table('BEGINBODY ', 4, 4, 2);\r
init_P_table('CASE ', 0, 4, 2);\r
init_P_table('CHANNEL ', -1, 0, 0);\r
init_P_table('CONST ', 3, 2, 2);\r
init_P_table('CONTINUELOOP ', -1, 0, 0);\r
init_P_table('DIV ', -1, 0, 0);\r
init_P_table('DO ', -1, 0, 0);\r
init_P_table('DOWNTO ', -1, 0, 0);\r
init_P_table('ELSE ', 6, 5, 2);\r
init_P_table('END ', 5, 0, 0);\r
init_P_table('ENDLOOP ', 5, 0, 0);\r
init_P_table('EXIT ', -1, 0, 0);\r
init_P_table('EXITLOOP ', -1, 0, 0);\r
init_P_table('EXPORT ', -1, 0, 0);\r
init_P_table('EXTERNAL ', 4, 0, 0);\r
init_P_table('FILE ', -1, 0, 0);\r
init_P_table('FOR ', 0, 5, 2);\r
init_P_table('FORWARD ', 4, 0, 0);\r
init_P_table('FUNCTION ', 0, 2, 2);\r
init_P_table('GETSWITCH ', -1, 0, 0);\r
init_P_table('GOTO ', -1, 0, 0);\r
init_P_table('IF ', 0, 5, 2);\r
init_P_table('IMPLEMENTATION', 3, 2, 2);\r
init_P_table('IN ', -1, 0, 0);\r
init_P_table('INCLUDE ', -1, 0, 0);\r
init_P_table('INLINE ', -1, 0, 0);\r
init_P_table('INSPECT ', -1, 0, 0);\r
init_P_table('INTERFACE ', -1, 0, 0);\r
init_P_table('INTERRUPT ', -1, 0, 0);\r
init_P_table('LABEL ', 3, 2, 2);\r
init_P_table('LOCK ', 0, 5, 2);\r
init_P_table('LOCKBUF ', 0, 5, 2);\r
init_P_table('LOCKDATA ', 0, 5, 2);\r
init_P_table('LOCKMES ', 0, 5, 2);\r
init_P_table('LOOP ', 0, 4, 2);\r
init_P_table('MOD ', -1, 0, 0);\r
init_P_table('MODULE ', 3, 2, 2);\r
init_P_table('NIL ', -1, 0, 0);\r
init_P_table('NOT ', -1, 0, 0);\r
init_P_table('OF ', -1, 0, 0);\r
init_P_table('OPENROUTINE ', 4, 0, 0);\r
init_P_table('OR ', -1, 0, 0);\r
init_P_table('OTHERWISE ', 0, 5, 2);\r
init_P_table('PACKED ', -1, 0, 0);\r
init_P_table('POOL ', -1, 0, 0);\r
init_P_table('PREFIX ', -1, 0, 0);\r
init_P_table('PRIVATE ', 3, 2, 2);\r
init_P_table('PROCEDURE ', 0, 2, 2);\r
init_P_table('PROCESS ', 3, 2, 2);\r
init_P_table('PROGRAM ', 3, 2, 2);\r
init_P_table('PUBLIC ', 3, 2, 2);\r
init_P_table('RECORD ', 0, 2, 3);\r
init_P_table('REGION ', 0, 5, 2);\r
init_P_table('REPEAT ', 0, 4, 2);\r
init_P_table('SET ', -1, 0, 0);\r
init_P_table('SHARED ', 3, 2, 2);\r
init_P_table('SHIFT ', -1, 0, 0);\r
init_P_table('SHL ', -1, 0, 0);\r
init_P_table('SHR ', -1, 0, 0);\r
init_P_table('STRING ', -1, 0, 0);\r
init_P_table('THEN ', -1, 0, 0);\r
init_P_table('TO ', -1, 0, 0);\r
init_P_table('TYPE ', 3, 2, 2);\r
init_P_table('TYPESIZE ', -1, 0, 0);\r
init_P_table('UNIT ', 3, 2, 2);\r
init_P_table('UNTIL ', 5, 0, 0);\r
init_P_table('USES ', 3, 2, 2);\r
init_P_table('VAR ', 3, 2, 2);\r
init_P_table('VARSIZE ', -1, 0, 0);\r
init_P_table('WHILE ', 0, 5, 2);\r
init_P_table('WITH ', 0, 5, 2);\r
init_P_table('XOR ', -1, 0, 0);\r
\r
END; (** initialize_1 **)\r
\r
PROCEDURE initialize_2;\r
VAR\r
i, last_i, j: integer;\r
index: integer;\r
\r
BEGIN\r
\r
{ Compress key table, to remove unused entries }\r
index := 0;\r
FOR i := 1 TO max_keyw_index DO\r
BEGIN\r
IF PascalTable[i].txt_str[1] <> ' ' THEN\r
BEGIN\r
index := index + 1;\r
PascalTable[index] := PascalTable[i];\r
IF test_requested THEN\r
writeln(' Key-word ', index:4, ' ', PascalTable[index].txt_str );\r
END;\r
END;\r
max_keyw_index := index;\r
PascalTable[index+1].txt_str := 'zzz' { terminator for seach };\r
\r
\r
{ initialize KEY_PTR array, used to speed search }\r
\r
last_i := ord('A') -1;\r
\r
FOR index := 1 TO max_keyw_index DO\r
BEGIN\r
IF ord( pascalTable[index].txt_str[1] ) > last_i THEN\r
BEGIN\r
i := ord( pascalTable[index].txt_str[1] ) ;\r
FOR j := last_i + 1 TO i DO\r
key_ptr[j] := index;\r
\r
last_i := i;\r
END;\r
\r
END;\r
\r
FOR j := last_i+1 TO ord('Z')+1 DO\r
key_ptr[j] := max_keyw_index+1;\r
\r
IF test_requested THEN\r
FOR i := ord('A') TO ord('Z')+1 DO\r
BEGIN\r
write(Output, 'k_ix', i: 3, ' ', chr(i), ' ');\r
write(Output, 'contents: ', key_ptr[i]: 3);\r
writeln(Output);\r
END;\r
\r
END {initialize_2};\r
\r
PROCEDURE remove_key_word( key : alfa);\r
VAR\r
hi, lo, try: integer;\r
\r
BEGIN\r
lo := 1;\r
hi := max_keyw_index;\r
REPEAT\r
try := (lo+hi)DIV 2;\r
WITH PascalTable[try] DO\r
BEGIN\r
IF key >= txt_str THEN lo := try+1;\r
IF key <= txt_str THEN hi := try-1;\r
END;\r
UNTIL lo > hi;\r
\r
WITH PascalTable[try] DO\r
BEGIN\r
IF txt_str <> key THEN\r
error('Internal table error ');\r
txt_str := ' ';\r
END;\r
\r
END {remove_key_word};\r
\r
\r
PROCEDURE Turbo_pascal_indent;\r
VAR\r
step: integer;\r
\r
BEGIN\r
\r
language := Turbo_pascal;\r
\r
(* remove non Turbo Pascal 4.0 or 5.0 key words from table *)\r
\r
\r
remove_key_word('AS ');\r
remove_key_word('BEGINBODY ');\r
remove_key_word('CHANNEL ');\r
remove_key_word('CONTINUELOOP ');\r
remove_key_word('ENDLOOP ');\r
remove_key_word('EXIT ');\r
remove_key_word('EXITLOOP ');\r
remove_key_word('EXPORT ');\r
remove_key_word('GETSWITCH ');\r
remove_key_word('INCLUDE ');\r
remove_key_word('INSPECT ');\r
remove_key_word('LOCK ');\r
remove_key_word('LOCKBUF ');\r
remove_key_word('LOCKDATA ');\r
remove_key_word('LOCKMES ');\r
remove_key_word('LOOP ');\r
remove_key_word('MODULE ');\r
remove_key_word('OPENROUTINE ');\r
remove_key_word('OTHERWISE ');\r
remove_key_word('POOL ');\r
remove_key_word('PREFIX ');\r
remove_key_word('PRIVATE ');\r
remove_key_word('PROCESS ');\r
remove_key_word('PUBLIC ');\r
remove_key_word('REGION ');\r
remove_key_word('SHARED ');\r
remove_key_word('SHIFT ');\r
remove_key_word('TYPESIZE ');\r
remove_key_word('VARSIZE ');\r
\r
END; (* Turbo_pascal_indent *)\r
\r
\r
\r
PROCEDURE Pascal_86_indent;\r
VAR\r
step: integer;\r
\r
BEGIN\r
\r
language := Pascal_86;\r
\r
(* remove non PASCAL86 key words from table *)\r
\r
remove_key_word('ABSOLUTE ');\r
remove_key_word('AS ');\r
remove_key_word('BEGINBODY ');\r
remove_key_word('CHANNEL ');\r
remove_key_word('CONTINUELOOP ');\r
remove_key_word('ENDLOOP ');\r
remove_key_word('EXIT ');\r
remove_key_word('EXITLOOP ');\r
remove_key_word('EXPORT ');\r
remove_key_word('GETSWITCH ');\r
remove_key_word('IMPLEMENTATION');\r
remove_key_word('INCLUDE ');\r
remove_key_word('INLINE ');\r
remove_key_word('INSPECT ');\r
remove_key_word('INTERFACE ');\r
remove_key_word('INTERRUPT ');\r
remove_key_word('LOCK ');\r
remove_key_word('LOCKBUF ');\r
remove_key_word('LOCKDATA ');\r
remove_key_word('LOCKMES ');\r
remove_key_word('LOOP ');\r
remove_key_word('MODULE ');\r
remove_key_word('OPENROUTINE ');\r
remove_key_word('POOL ');\r
remove_key_word('PREFIX ');\r
remove_key_word('PROCESS ');\r
remove_key_word('REGION ');\r
remove_key_word('SHARED ');\r
remove_key_word('SHIFT ');\r
remove_key_word('SHL ');\r
remove_key_word('SHR ');\r
remove_key_word('STRING ');\r
remove_key_word('TYPESIZE ');\r
remove_key_word('UNIT ');\r
remove_key_word('USES ');\r
remove_key_word('VARSIZE ');\r
remove_key_word('XOR ');\r
\r
END; (* Pascal_86_indent *)\r
\r
\r
\r
PROCEDURE Common_RTP_indent;\r
VAR\r
step: integer;\r
\r
BEGIN\r
\r
language := Common_RTP;\r
\r
(* remove non Common_RTP key words from table *)\r
\r
remove_key_word('ABSOLUTE ');\r
remove_key_word('BEGINBODY ');\r
remove_key_word('CHANNEL ');\r
remove_key_word('EXPORT ');\r
remove_key_word('FILE ');\r
remove_key_word('IMPLEMENTATION');\r
remove_key_word('INCLUDE ');\r
remove_key_word('INLINE ');\r
remove_key_word('INTERFACE ');\r
remove_key_word('INTERRUPT ');\r
remove_key_word('LABEL ');\r
remove_key_word('LOCK ');\r
remove_key_word('LOCKMES ');\r
remove_key_word('MODULE ');\r
remove_key_word('NIL ');\r
remove_key_word('OPENROUTINE ');\r
remove_key_word('POOL ');\r
remove_key_word('PREFIX ');\r
remove_key_word('PRIVATE ');\r
remove_key_word('PROCESS ');\r
remove_key_word('PUBLIC ');\r
remove_key_word('SHL ');\r
remove_key_word('SHR ');\r
remove_key_word('STRING ');\r
remove_key_word('UNIT ');\r
remove_key_word('USES ');\r
\r
END; (* Common_RTP_indent *)\r
\r
\r
\r
PROCEDURE RTP_8000_indent;\r
VAR\r
step: integer;\r
\r
BEGIN\r
\r
language := RTP_8000;\r
\r
(* remove non RTP-8000 key words from table *)\r
\r
remove_key_word('ABSOLUTE ');\r
remove_key_word('FILE ');\r
remove_key_word('GETSWITCH ');\r
remove_key_word('IMPLEMENTATION');\r
remove_key_word('INLINE ');\r
remove_key_word('INSPECT ');\r
remove_key_word('INTERFACE ');\r
remove_key_word('INTERRUPT ');\r
remove_key_word('LOCKBUF ');\r
remove_key_word('LOCKDATA ');\r
remove_key_word('MODULE ');\r
remove_key_word('NIL ');\r
remove_key_word('OPENROUTINE ');\r
remove_key_word('PRIVATE ');\r
remove_key_word('PROGRAM ');\r
remove_key_word('PUBLIC ');\r
remove_key_word('REGION ');\r
remove_key_word('SHARED ');\r
remove_key_word('SHIFT ');\r
remove_key_word('SHL ');\r
remove_key_word('SHR ');\r
remove_key_word('STRING ');\r
remove_key_word('TYPESIZE ');\r
remove_key_word('UNIT ');\r
remove_key_word('USES ');\r
remove_key_word('VARSIZE ');\r
remove_key_word('XOR ');\r
\r
END; (* RTP_8000_indent *)\r
\r
\r
PROCEDURE RTP_86_indent;\r
VAR\r
step: integer;\r
\r
BEGIN\r
\r
language := RTP_286;\r
\r
(* remove non RTP-86 key words from table *)\r
\r
remove_key_word('ABSOLUTE ');\r
remove_key_word('BEGINBODY ');\r
remove_key_word('CHANNEL ');\r
remove_key_word('EXPORT ');\r
remove_key_word('FILE ');\r
remove_key_word('GETSWITCH ');\r
remove_key_word('IMPLEMENTATION');\r
remove_key_word('INCLUDE ');\r
remove_key_word('INLINE ');\r
remove_key_word('INTERFACE ');\r
remove_key_word('INTERRUPT ');\r
remove_key_word('LABEL ');\r
remove_key_word('MODULE ');\r
remove_key_word('NIL ');\r
remove_key_word('OPENROUTINE ');\r
remove_key_word('POOL ');\r
remove_key_word('PREFIX ');\r
remove_key_word('PRIVATE ');\r
remove_key_word('PROCESS ');\r
remove_key_word('PUBLIC ');\r
remove_key_word('SHL ');\r
remove_key_word('SHR ');\r
remove_key_word('STRING ');\r
remove_key_word('TYPESIZE ');\r
remove_key_word('UNIT ');\r
remove_key_word('USES ');\r
remove_key_word('VARSIZE ');\r
\r
END; (* RTP_86_indent *)\r
\r
\r
PROCEDURE read_callparameters;\r
VAR\r
i, k: integer;\r
key_text: STRING;\r
dir_st: DirStr;\r
name_st: NameStr;\r
ext_st: ExtStr;\r
\r
BEGIN\r
\r
\r
IF ( ParamCount = 0 ) OR\r
( ParamCount >= 1) AND ( ParamStr(1 ) = '?') THEN\r
BEGIN { The user must give at least the input file as parameter }\r
Showhelp;\r
Halt;\r
END;\r
\r
assign(Output, '');\r
rewrite(Output);\r
Writeln(' INDENT (v.', version, ')' );\r
\r
\r
GetParams( Paramlist, MaxParam, OptionList, MaxOption);\r
\r
linesmode := OptionList[1].TextVal = 'ON';\r
\r
markmode := OptionList[2].TextVal = 'ON';\r
\r
IF OptionList[3].TextVal = 'ON' THEN\r
BEGIN\r
linesmode := true;\r
markmode := true;\r
END;\r
\r
CASE\r
MatchOptionStr( OptionList[4].TextVal, 4, 'ON OFF OWN ') OF\r
\r
-1: Error(' Option not unique ');\r
\r
0: Error(' Option not valid ');\r
\r
1: BEGIN\r
myind := false;\r
noind := false;\r
END;\r
\r
2: BEGIN\r
myind := false;\r
noind := true;\r
END;\r
\r
3: BEGIN\r
myind := true;\r
noind := true;\r
END;\r
END (*case *);\r
\r
CASE\r
MatchOptionStr( OptionList[5].TextVal, 4, 'LC UC OWN ') OF\r
\r
-1: Error(' Option not unique ');\r
\r
0: Error(' Option not valid ');\r
\r
1: reskeymode := ord(lckeyw_);\r
\r
2: reskeymode := ord(uckeyw_);\r
\r
3: reskeymode := ord(ownkeyw_);\r
\r
END (*case *);\r
\r
CASE\r
MatchOptionStr( OptionList[6].TextVal, 4, 'LC UC OWN ') OF\r
\r
-1: Error(' Option not unique ');\r
\r
0: Error(' Option not valid ');\r
\r
1: idmode := ord(lcid_);\r
\r
2: idmode := ord(ucid_);\r
\r
3: idmode := ord(ownid_);\r
\r
END (*case *);\r
\r
\r
CASE MatchOptionStr( OptionList[7].TextVal, 9,\r
'TURBO PASCAL86 C-RTP RTP8000 RTP286 ') OF\r
\r
-1: Error(' Option not unique ');\r
\r
0: Error(' Option not valid ');\r
\r
1: Turbo_pascal_indent;\r
\r
2: Pascal_86_indent;\r
\r
3: Common_RTP_indent;\r
\r
4: RTP_8000_indent;\r
\r
5: RTP_86_indent;\r
\r
END (*case *);\r
\r
\r
test_requested := OptionList[8].TextVal = 'ON';\r
\r
\r
inpfile := ParamList[1].TextVal;\r
\r
IF ParamList[2].Defined THEN\r
outpfile := ParamList[2].TextVal\r
ELSE\r
BEGIN\r
FSplit(inpfile, dir_st, name_st, ext_st);\r
IF UpperStr(ext_st) = 'IND' THEN\r
Error(' FileName Clash');\r
outpfile := dir_st + name_st + '.IND';\r
END;\r
\r
IF FileExist(outpfile) THEN\r
BEGIN\r
(* query to user*)\r
write(Output, outpfile:1);\r
write(Output, ', already exists, OVERWRITE (Y/N)?');\r
assign(Input, '');\r
reset(Input);\r
read(Input, ch);\r
IF NOT ((ch = 'y') OR (ch = 'Y')) THEN\r
halt; (*i.e.: exit program*)\r
END;\r
\r
assign(inp, inpfile);\r
SetTextBuf(inp, I_buff);\r
reset(inp);\r
assign(outp, outpfile);\r
SetTextBuf(outp, O_buff);\r
rewrite(outp);\r
\r
END (* READ_CALLPARAMS *);\r
\r
\r
PROCEDURE writeeol;\r
BEGIN\r
linepos := 0;\r
IF formfeed THEN\r
BEGIN\r
write(outp, chr(FF));\r
END\r
ELSE\r
writeln(outp);\r
END;\r
\r
\r
\r
PROCEDURE pushmark(c_pos: integer);\r
BEGIN\r
IF markpointer<lsize THEN\r
markpointer := markpointer+1;\r
markstack[markpointer] := c_pos;\r
IF test_requested THEN\r
Writeln(outp, 'M+',markpointer:3, c_pos:3, ' ');\r
END;\r
\r
\r
\r
PROCEDURE popmark;\r
BEGIN\r
markstack[markpointer] := 0;\r
IF markpointer>0 THEN\r
markpointer := markpointer-1;\r
IF test_requested THEN\r
Writeln(outp, 'M-',markpointer:3, ' ');\r
END;\r
\r
\r
\r
FUNCTION resword( name: alfa; VAR index: integer): boolean;\r
VAR\r
hi, lo, i: integer;\r
\r
BEGIN\r
\r
i := ord(name[1]);\r
lo := key_ptr[i];\r
hi := key_ptr[i+1];\r
IF hi = lo THEN\r
resword := false\r
ELSE\r
BEGIN\r
REPEAT\r
index := (lo+hi) DIV 2;\r
WITH PascalTable[index] DO\r
BEGIN\r
IF name >= txt_str THEN lo := index+1;\r
IF name <= txt_str THEN hi := index-1;\r
END;\r
UNTIL lo > hi;\r
\r
resword := PascalTable[index].txt_str = name;\r
END;\r
\r
END {resword};\r
\r
\r
PROCEDURE changeletters(lowercase: boolean;c_pos: integer);\r
VAR\r
i, add: integer;\r
ch, a, z: char;\r
\r
BEGIN\r
IF lowercase THEN\r
BEGIN\r
add := 32;\r
a := 'A';\r
z := 'Z';\r
END\r
ELSE\r
BEGIN\r
add := -32;\r
a := 'a';\r
z := 'z';\r
END;\r
i := c_pos;\r
REPEAT\r
ch := line[i];\r
IF (ch >= a) AND (ch <= z) THEN line[i] := chr(ord(ch)+add);\r
i := i-1;\r
UNTIL NOT((ch IN alfanum) OR ((ch >= 'a') AND (ch <= 'z'))) OR (i = 0);\r
END;\r
\r
\r
PROCEDURE shiftcase;\r
(*CHANGE IDENTIFIERS TO LC OR UC AND KEYWORDS TO LC OR UC *)\r
VAR\r
k, c_pos: integer;\r
key: alfa;\r
current: char;\r
\r
BEGIN\r
c_pos := 1;\r
current := line[c_pos];\r
WHILE c_pos <= lastpos DO\r
BEGIN\r
IF skiptekst THEN\r
BEGIN\r
IF current = skipchar THEN\r
BEGIN\r
IF ((skipchar = '*') AND (line[c_pos+1] = ')')) OR (skipchar <> '*') THEN\r
skiptekst := false;\r
END;\r
END\r
ELSE\r
BEGIN\r
IF (current >= 'a') AND (current <= 'z') THEN current := chr(ord(current)-32);\r
CASE current OF\r
\r
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',\r
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',\r
'U', 'V', 'W', 'X', 'Y', 'Z':\r
BEGIN\r
k := 1;\r
key := ' ';\r
REPEAT (*PICK UP IDENTIFIER *)\r
IF k <= alfalength THEN\r
BEGIN\r
key[k] := current;\r
k := k+1;\r
END;\r
c_pos := c_pos+1;\r
current := line[c_pos];\r
IF (current >= 'a') AND (current <= 'z') THEN\r
current := chr(ord(current)-32);\r
UNTIL NOT (current IN alfanum);\r
c_pos := c_pos-1;\r
IF resword( key, keyw_index) THEN\r
BEGIN\r
IF reskeymode <> ord(ownkeyw_) THEN\r
changeletters(reskeymode = ord(lckeyw_) , c_pos)\r
END\r
ELSE\r
IF idmode <> ord(ownid_) THEN\r
changeletters(idmode = ord(lcid_), c_pos);\r
\r
END;\r
\r
'0', '1', '2', '3', '4',\r
'5', '6', '7', '8', '9':\r
BEGIN\r
REPEAT c_pos := c_pos+1 UNTIL NOT (line[c_pos] IN ['0'..'9']);\r
IF line[c_pos] = '(' THEN\r
c_pos := c_pos-1; (*MIGHT BE START OF COMMENT *)\r
END;\r
\r
'(':\r
IF line[c_pos+1] = '*' THEN\r
BEGIN\r
skiptekst := true;\r
skipchar := '*';\r
c_pos := c_pos+1;\r
END;\r
\r
'<':\r
IF (language <> Turbo_pascal )\r
AND ( line[c_pos+1] = '*') THEN\r
BEGIN\r
skiptekst := true;\r
skipchar := '*';\r
c_pos := c_pos+1;\r
END;\r
\r
'''', '"':\r
BEGIN\r
skiptekst := true;\r
skipchar := current;\r
END;\r
\r
'-':\r
IF (language <> Turbo_pascal )\r
AND ( line[ c_pos + 1 ] = '-') THEN (* RTP86-comment *)\r
BEGIN\r
\r
c_pos := lastpos; (*i.e.: skipp rest of line *)\r
END;\r
\r
'{': (* TurboPascal comment string *)\r
IF language = turbo_pascal THEN\r
BEGIN\r
skiptekst := true;\r
skipchar := '}';\r
END;\r
\r
ELSE ;\r
END;\r
END;\r
c_pos := c_pos+1;\r
current := line[c_pos];\r
END;\r
END;\r
\r
\r
PROCEDURE pushindent(prioritet, indention: integer);\r
(*STACK ONE LEVEL OF INDENTION *)\r
BEGIN\r
WITH stacktop DO\r
BEGIN\r
IF top < ssize THEN top := top+1;\r
prior := prioritet;\r
indent := indention-oldpos;\r
oldpos := c_pos;\r
margin := margin+indent;\r
stack[top] := stacktop;\r
END;\r
END;\r
\r
\r
PROCEDURE popindent;\r
(*REMOVE ONE LEVEL OF INDENTION FROM STACK*)\r
BEGIN\r
IF top > 0 THEN top := top-1;\r
margin := margin-stacktop.indent;\r
IF oldpos > 0 THEN oldpos := oldpos-stacktop.indent;\r
stacktop := stack[top];\r
END;\r
\r
\r
PROCEDURE pasidentifier;\r
(* CHECKS IF IDENTIFIER IS A KEYWORD WITH EFFECT\r
ON INDENTION. IF SO, INDENTION IS ADJUSTED*)\r
(* AS ONLY ONE KEYWORD MAY AFFECT INDENTION -\r
CURRENT LINE MUST BE PRINTED OUT AS SOON AS THE\r
FIRST KEYWORD WITH EFFECT ON INDENTION IS FOUND. *)\r
VAR a: ARRAY[0..alfalength] OF char; key: alfa;\r
k, hi, lo, try: integer;\r
\r
BEGIN\r
IF key_ptr[ord(current)] <> key_ptr[ord(current)+1] THEN\r
k := 0\r
ELSE k := toplength + 1;\r
\r
REPEAT\r
IF k < toplength THEN\r
a[ k ] := current;\r
k := k + 1;\r
c_pos := c_pos+1; current := line[c_pos];\r
IF (current >= 'a') AND (current <= 'z') THEN\r
current := chr(ord(current)-32);\r
UNTIL NOT(current IN alfanum) ;\r
\r
IF (k <= toplength) AND (k > 1) THEN\r
BEGIN (* MIGHT BE INTERESTING KEYWORD*)\r
FOR hi := k TO alfalength DO a[ hi ] := blank;\r
key := copy(a, 1, alfalength);\r
IF resword( key, keyw_index ) THEN\r
WITH PascalTable[keyw_index] DO\r
BEGIN\r
IF test_requested THEN\r
Writeln(outp, 'ResW ', p1:4, p2:4 , ' ', Key);\r
IF Key = 'DO ' THEN InWith := false;\r
IF p1 <> -1 THEN\r
WITH stacktop DO\r
BEGIN (* KEYWORD AFFECTING MARGIN IS FOUND *)\r
old_state := state;\r
\r
IF (txt_str = 'END ') OR (txt_str = 'UNTIL ')\r
OR (txt_str = 'OTHERWISE ') OR (txt_str = 'ENDLOOP ') THEN semicolon\r
ELSE\r
IF (txt_str = 'PUBLIC ') OR\r
(txt_str = 'UNIT ') THEN state := spublic\r
ELSE IF (txt_str = 'PROGRAM ') OR (txt_str = 'PROCESS ')\r
OR (txt_str = 'PRIVATE ') OR (txt_str = 'IMPLEMENTATION') THEN\r
state := declare\r
ELSE IF (txt_str = 'TYPE ') OR (txt_str = 'CONST ') OR\r
(txt_str = 'VAR ') OR (txt_str = 'SHARED ')\r
THEN\r
BEGIN\r
IF state <> spublic THEN state := declare;\r
END\r
ELSE IF txt_str = 'BEGIN ' THEN state := statement;\r
\r
IF test_requested AND ( state <> old_state ) THEN\r
Writeln(outp, ' New State = ', ord(state), ' old = ', ord(old_state) );\r
\r
(* SEE IF UNSTACKING*)\r
IF prior < p1 THEN\r
BEGIN\r
IF (txt_str = 'END ') AND (Norecord > 0) THEN\r
BEGIN (*SPECIAL HANDLING OF RECORD *)\r
margin := margin-3;\r
IF fresh THEN printline;\r
margin := margin+3;\r
IF oldpos > 0 THEN oldpos := oldpos-indent;\r
Norecord := NoRecord - 1;\r
END;\r
margin := margin-indent;\r
top := top-1; stacktop := stack[top];\r
END\r
\r
ELSE\r
IF ((State = sPublic) AND ((txt_str = 'PROCEDURE ') OR\r
(txt_str = 'FUNCTION '))) THEN\r
BEGIN\r
(* unstack *)\r
margin := margin - indent;\r
top := top - 1; stacktop := stack[top];\r
END;\r
IF fresh THEN printline; (** SEE COMMENT IN BEGINNING OF PROCEDURE!! **)\r
\r
(* SEE IF STACKING*)\r
(** IF p2 = 0 THEN ACTUAL KEYWORD DOES NOT CAUSE\r
FURTHER INDENTION IN THE FOLLOWING LINES **)\r
IF p2>0 THEN\r
IF (txt_str = 'CASE ') AND (state <> statement) THEN\r
BEGIN margin := margin+spacing; indent := indent+spacing;\r
stack[top] := stacktop;\r
END\r
ELSE\r
BEGIN\r
IF top < ssize THEN top := top+1;\r
prior := p2;\r
IF txt_str = 'RECORD ' THEN\r
BEGIN\r
indent := spacing+c_pos-7-oldpos;\r
oldpos := spacing+c_pos-7;\r
NoRecord := NoRecord + 1;\r
END\r
ELSE indent := spacing;\r
margin := margin+indent;\r
stack[top] := stacktop\r
END;\r
IF ( txt_str = 'FUNCTION ') OR (txt_str = 'PROGRAM ')\r
OR (txt_str = 'PROCEDURE ') OR (txt_str = 'PROCESS ')\r
THEN skip(';')\r
ELSE\r
IF( txt_str = 'WITH ') THEN\r
BEGIN\r
InWith := true;\r
OldPos := Spacing;\r
END\r
ELSE\r
IF ( txt_str = 'END ' ) AND\r
( current = '.' ) THEN\r
BEGIN\r
IF fresh THEN Printline;\r
WHILE NOT eof(inp) DO\r
(** Copy from input to output-file **)\r
BEGIN\r
readln(inp, dummy_line);\r
writeln(outp, dummy_line);\r
END;\r
END;\r
\r
IF markmode THEN\r
BEGIN\r
IF (key = 'BEGIN ') OR (key = 'REPEAT ') OR\r
( key = 'LOOP ') OR\r
((key = 'CASE ') AND (state = statement))\r
OR (key = 'RECORD ')\r
THEN pushmark(margin+1 - spacing)\r
ELSE\r
IF (key = 'END ') OR (key = 'UNTIL ')\r
OR (key = 'ENDLOOP ')\r
THEN popmark;\r
END;\r
END; (* taking care of interesting keywords *)\r
END; (* if resword ... *)\r
END (* K IN [2..alfalength] *)\r
END (* IDENTIFIER*);\r
\r
\r
PROCEDURE semicolon;\r
(* UNSTACK UNTIL STACKTOP DOES NOT CONTAIN IF OR ELSE*)\r
BEGIN\r
\r
WITH stacktop DO\r
WHILE prior = 5 DO\r
BEGIN\r
margin := margin-indent;\r
top := top-1;\r
stacktop := stack[top];\r
IF test_requested THEN\r
writeln(outp, '; ->', top:4,\r
stacktop.indent:4, stacktop.prior:4 );\r
END\r
END (* SEMICOLON*);\r
\r
\r
\r
PROCEDURE printline;\r
VAR c_pos: integer;\r
BEGIN\r
\r
fresh := false (* Flag that LINE is PRINTED*);\r
\r
IF test_requested THEN\r
BEGIN\r
Write(outp, margin:4,\r
top:4, stack[top].indent:4, stack[top].prior:4);\r
Write(outp, ' ');\r
END;\r
IF linesmode THEN\r
BEGIN (* PRINT LINE NUMBER *)\r
write(outp, lineno: 5, ': ');\r
lineno := lineno+1;\r
END;\r
IF NOT noind THEN write(outp, blank);\r
(*** ***) IF (noind <> true) THEN\r
IF NOT (lastpos = 0) OR markmode THEN\r
(*AN EMPTY LINE IS NOT SPACED*)\r
BEGIN nextmark := 1;\r
FOR c_pos := 1 TO margin DO\r
(** "margin" number of blanks are printed out. -\r
Perhabs including a "mark". **)\r
BEGIN\r
IF markmode THEN\r
BEGIN IF c_pos = markstack[nextmark] THEN\r
BEGIN write(outp, '!');\r
nextmark := nextmark+1;\r
END\r
ELSE\r
write(outp, blank);\r
END\r
ELSE write(outp, blank);\r
END; (* markmode *)\r
\r
END; (* for *)\r
IF lastpos <> 0 THEN\r
write(outp, copy(line, 1, lastpos) );\r
writeeol;\r
END; (*PRINTLINE*)\r
\r
\r
\r
PROCEDURE readline;\r
VAR c_pos: integer;\r
\r
BEGIN\r
lastpos := 0; oldpos := 0;\r
fresh := true (* New LINE is READ, NOT printed Yet*);\r
ch := blank;\r
\r
IF formfeed THEN\r
BEGIN (* Move the rest of line kept in line_after_ff *)\r
line := copy(line_after_ff, 1, length(line_after_ff) );\r
formfeed := false;\r
END\r
ELSE\r
BEGIN\r
readln(inp, line);\r
IF length(line) = lsize THEN\r
BEGIN\r
line_too_long := line_too_long + 1;\r
line := copy(line, 1, lsize-1); (* neaded for terminating space *)\r
END;\r
END;\r
\r
c_pos := Pos(chr(FF), line) (* Test whether FF in line *);\r
IF c_pos > 0 THEN\r
BEGIN\r
(* Save the line part before FF in line. Save the line part after\r
the last ff ( if more than one ) in line_after_ff, and remember\r
the fact that something is keept by setting formfeed = true *)\r
\r
formfeed := true;\r
lastpos := c_pos - 1;\r
\r
WHILE ( line[c_pos] = chr(FF) ) AND ( c_pos <= length(line) ) DO\r
c_pos := c_pos + 1;\r
\r
line_after_ff := copy(line, c_pos, 255);\r
line := copy(line, 1, lastpos);\r
END; (* if FF *)\r
\r
c_pos := 1;\r
\r
IF myind = false THEN\r
(* Preceeding blanks and tabs in line are skipped - if wanted. *)\r
WHILE ((line[c_pos] = blank) OR (line[c_pos] = chr(ordoftab)))\r
AND (c_pos <= length(line) ) AND (line[c_pos] <> chr(FF))\r
DO c_pos := c_pos + 1;\r
\r
lastpos := length(line);\r
WHILE ( line[lastpos] = blank ) AND ( lastpos >= 1 ) DO\r
lastpos := lastpos - 1;\r
(* Now "lastpos" points at the last character <> blank in the line *)\r
\r
line := copy( line, c_pos, lastpos) + ' ' (*ensure blank in line*);\r
lastpos := length(line) - 1;\r
\r
IF (idmode <> ord(ownid_)) OR (reskeymode <> ord(ownkeyw_)) THEN shiftcase;\r
\r
END (* READLINE*);\r
\r
PROCEDURE skip;\r
LABEL 11; (* exit in case of eof *)\r
BEGIN\r
IF fresh THEN printline;\r
\r
REPEAT\r
IF c_pos >= lastpos THEN\r
IF eof_inp THEN\r
BEGIN\r
skiperror := true;\r
GOTO 11;\r
END\r
ELSE\r
BEGIN\r
readline;\r
printline;\r
c_pos := 0;\r
END;\r
c_pos := c_pos+1; current := line[c_pos];\r
IF ((skipend = ';') OR (skipend = ')')) AND\r
(current = '(') AND (line[c_pos+1] <> '*') THEN\r
REPEAT (*SKIP PARAMETERLIST *)\r
skip(')');\r
c_pos := c_pos + 1; current := line[c_pos];\r
UNTIL line[c_pos-2] <> '*';\r
UNTIL current = skipend;\r
IF skipend = ':' THEN\r
BEGIN\r
c_pos := c_pos + 1; current := line[c_pos];\r
END;\r
11:\r
END;\r
\r
(***** ---------- *****)\r
\r
\r
(* MAIN PROGRAM*)\r
BEGIN\r
\r
initialize_1;\r
\r
read_callparameters;\r
\r
initialize_2;\r
\r
IF markmode THEN\r
BEGIN\r
FOR c_pos := -1 TO lsize DO\r
markstack[c_pos] := 0;\r
END;\r
\r
\r
WHILE NOT eof_inp DO\r
BEGIN\r
readline;\r
c_pos := 1; current := line[c_pos];\r
\r
WHILE c_pos <= lastpos DO\r
BEGIN\r
IF (current >= 'a') AND (current <= 'z') THEN\r
current := chr(ord(current)-32);\r
IF (current IN ['A'..'Z']) THEN\r
pasidentifier\r
ELSE\r
BEGIN\r
CASE current OF\r
\r
';': semicolon;\r
\r
'(':\r
BEGIN\r
IF line[c_pos+1] = '*' THEN\r
BEGIN\r
IF c_pos = 1 (* i.e. in front of the line *) THEN\r
pushindent(4, 2) (* indent 2 more positions *)\r
ELSE\r
pushindent(4, c_pos - 1); (* no further indention caused by comment *)\r
REPEAT skip('*') UNTIL line[c_pos+1] = ')';\r
c_pos := c_pos+1;\r
popindent;\r
END\r
ELSE\r
IF state <> statement THEN\r
pushindent(4, c_pos); (* INDENTION OF SCALAR TYPES AND VARIANT FIELDS IN RECORDS *)\r
END;\r
\r
'<':\r
BEGIN\r
IF (language <> turbo_pascal )\r
AND ( line[c_pos+1] = '*') THEN\r
BEGIN\r
IF c_pos = 1 (* i.e. in front of the line *) THEN\r
pushindent(4, 2) (* indent 2 more positions *)\r
ELSE\r
pushindent(4, c_pos - 1); (* no further indention caused by comment *)\r
REPEAT skip('*') UNTIL line[c_pos+1] = '>';\r
c_pos := c_pos+1;\r
popindent;\r
END\r
ELSE\r
IF state <> statement THEN\r
skip('>') (* value initialization of array *)\r
END;\r
\r
')':\r
BEGIN\r
IF state <> statement THEN\r
BEGIN(*UNSTACK INDENTION OF SCALAR TYPES AND VARIANT PARTS IN RECORDS*)\r
popindent;\r
END;\r
END;\r
\r
':':\r
IF InWith = false THEN\r
IF line[c_pos+1] <> ' = ' THEN\r
IF state = statement THEN\r
BEGIN (*INDENTION OF CASELABELS *)\r
semicolon; (*POP PREVIOUS STACKED CASELABELS AND IFSTATEMENTS *)\r
pushindent(5, oldpos + 2);\r
END;\r
\r
'-':\r
IF (language <> turbo_pascal )\r
AND ( line[ c_pos + 1 ] = '-') THEN (* RTP86 comment - skip to eol *)\r
IF c_pos = 1 (* i.e. in front of the line *) THEN\r
BEGIN\r
pushindent(4, 2); (* indent 2 more positions *)\r
printline;\r
popindent;\r
c_pos := lastpos;\r
END\r
ELSE\r
c_pos := lastpos; (** i.e.: skip rest of line **)\r
(*** end RTP86 comment ***)\r
\r
\r
'''': skip(''''); (* text string *)\r
\r
'"': skip('"'); (* text string *)\r
\r
'{': (* Turbo Pascal Text string *)\r
IF language = turbo_pascal THEN\r
BEGIN\r
IF c_pos = 1 (* i.e. in front of the line *) THEN\r
pushindent(4, 2) (* indent 2 more positions *)\r
ELSE\r
pushindent(4, c_pos - 1); (* no further indention caused by comment *)\r
skip('}');\r
popindent;\r
END;\r
\r
'$': BEGIN\r
oldpos := margin;\r
margin := 1;\r
IF fresh THEN printline;\r
margin := oldpos;\r
c_pos := lastpos;\r
END;\r
\r
ELSE\r
BEGIN (* ALL OTHER ARE BLIND*)\r
END;\r
\r
END;\r
c_pos := c_pos+1; current := line[c_pos];\r
END;\r
IF fresh THEN printline\r
END (* SCAN OF LINE*);\r
IF fresh THEN printline;\r
END (* SCAN OF INPUT FILE *);\r
IF fewends THEN writeln(Output, ' ** WARNING, END(S) MISSING.');\r
IF skiperror THEN\r
writeln(Output, ' ** premature end of file ');\r
IF line_too_long > 0 THEN\r
writeln(Output, line_too_long:1, ' lines truncated after ',\r
lsize:1,' characters.');\r
\r
Close(inp);\r
Close(outp);\r
END.\r