Trailing-Edge
-
PDP-10 Archives
-
decuslib10-05
-
43,50337/22/simed.sim
There are 2 other files named simed.sim in the archive. Click here to see a list.
OPTIONS(/C/-Q/-A/-I/-D); OPTIONS(/-W);
!-- SIMED SIMULA Editor and Indentation program Version 2(5) ---
----------------------------------------------------------------
Author: Mats Ohlin, Swedish Research Institute of National Defence
FOA 1, Fack, S-104 50 STOCKHOLM 80, SWEDEN
The SIMED program converts SIMULA source program files.
The program is able to indent the program (for better readability) and
convert reserved words, user and standard indentifiers to
1) UPPER CASE 2) lower case 3) Edit Case (1st char. upper case).
Lines which become too long at indentation are split up at an appropriate
position.
Split lines will not be indented properly if they contain
BEGIN or END. Also, numerical constants containing blanks,
may occasionally be improperly split.
The programmer is recommended to start source code lines
with BEGIN and END resp.
New command format for SIMED version 2:
outfile=infile/i:4/r:80/e:13200
Default switches:
/I:4 Indent step 4
/E:13200 Edit Reserved words, standard ids, own ids,
/E:UEL00 Comments and Options, Text and Character
constants resp. 1 (U) = Upper CASE,
2 (L) = Lower Case, 3 (E) = Edit case, 0 = no change.
/R:80 Outfile record length 80.
Other switches:
/SIMSET Recognize SIMSET identifiers
(default for SIMSET and SIMULATION blocks)
/-SIMSET Do not recognize SIMSET ids
/SIMULATION Recognize SIMULATION identifiers
(default for SIMULATION blocks)
/-SIMULATION Do not recognize SIMULATION ids
/TABS Use tabs in indentation (default)
/-TABS Do not use tabs
/NUMBERED:xx Produce line numbered output (incr xx, def 100)
Default for numbered input.
/-NUMBERED Suppress line number output.
/Z:n Suppress indentation for n block levels (default 0)
/G Perform last COMPIL command after processing
!xxx Run program XXX after processing
Your own default switches can also be given in a file SWITCH.INI on your
area. You need only have one or more lines of the form:
SIMED /switch/switch...
Example: If you want files to be edited with reserved words in lower case,
your own identifiers in upper case, and standard identifiers with upper case
initial letter, standard indentation=2, record length=100, put the following
line in SWITCH.INI:
SIMED /E:LEU/I:2/R:100
Trailing zeros in the E switch may be omitted - the system default will be
used in those positions.
You can always override the default values in the command to SIMED.
Default extension is SIM. Default outfile name is infile name.
If you want only default values, the command string to edit the file X.SIM
with the same output file name is simply X.
The shortest possible command to apply SIMED to a file X.SIM is -
.R SIMED-X
SIMED will take what follows after a minus sign as the first command and
exit after editing. CONTINUE will put SIMED in command mode, expecting
further commands. START or START-<command-string> can also be used in that
situation.
Exit from SIMED by entering ^Z or ^C.
;
BEGIN
EXTERNAL TEXT PROCEDURE rest,skip,upcase,from,checkextension,
conc,scanto,inline,compress,tagord;
EXTERNAL PROCEDURE exit,run,depchar;
EXTERNAL CHARACTER PROCEDURE findtrigger,fetchar;
EXTERNAL REF (Outfile) PROCEDURE findoutfile;
EXTERNAL REF (Infile) PROCEDURE findinfile;
EXTERNAL BOOLEAN PROCEDURE numbered,rescan,iashift,bokstav;
EXTERNAL INTEGER PROCEDURE scanint,search,scan;
EXTERNAL REAL PROCEDURE cptime;
TEXT initcommand,t;
INTEGER nkeys,lines,linesout; REAL cputime,newtime;
nkeys:= 20;
IF rescan THEN
BEGIN
Inimage; t:-Sysin.Image.Strip;
scanto(t,'-');
initcommand:- Copy(rest(t));
END;
Linesperpage(-1);
Outtext("SIMED - Version 2(5)"); Outimage;
BEGIN
TEXT ARRAY key,arg,argdef[1:nkeys]; TEXT command,numfield,tbuf;
INTEGER defkey,i,j,lineno,oldline,incr;
REF (tree) reswdtree,standid,simsettree,simulationtree;
REF (tree) ARRAY treearr[0:2];
CHARACTER ctab,c;
REF (Infile) prog; REF (Outfile) outf;
TEXT progname,outname,runprog; BOOLEAN leftskip,num;
INTEGER proglength,indent,ma,margin,
ind,inde,outlength,maxindent,
begincount,endcount,zuppress;
INTEGER ARRAY convert[2:8];
BOOLEAN debug,tabs;
CHARACTER ARRAY uppercase,lowercase[0:127];
PROCEDURE inituppercase(ca); CHARACTER ARRAY ca;
BEGIN INTEGER i;
FOR i:= 1 STEP 1 UNTIL 95 DO ca[i]:= Char(i);
FOR i:= 96 STEP 1 UNTIL 122 DO ca[i]:= ca[i-32];
ca[123]:= ca[35]; ca[124]:= Char(124); ca[125]:= ca[36]
END OF INIT UPPERCASE;
PROCEDURE initlowercase(ca); CHARACTER ARRAY ca;
BEGIN INTEGER i;
FOR i:= 1 STEP 1 UNTIL 63 DO ca[i]:= Char(i);
FOR i:= 96 STEP 1 UNTIL 122 DO ca[i]:= ca[i-32]:= Char(i);
FOR i:= 91 STEP 1 UNTIL 95 DO ca[i]:= Char(i);
ca[123]:= ca[35]:= Char(123);
ca[124]:= Char(124);
ca[125]:= ca[36]:= Char(125)
END OF INIT LOWERCASE;
PROCEDURE warning(message,t);
VALUE message,t; TEXT message,t;
BEGIN
IF Pos > 1 THEN Outimage;
Outtext("%SIMED - ");
IF message.Length > Length THEN
BEGIN WHILE message.More DO Outchar(message.Getchar);
END ELSE Outtext(message);
t:- t.Strip;
IF t.Length > Length THEN
BEGIN
WHILE t.More DO Outchar(t.Getchar);
Outtext(" -")
END ELSE Outtext(t);
Outimage
END OF WARNING;
CLASS tree(case); INTEGER case;
BEGIN TEXT tmain; INTEGER h;
! With current set of reserved words
! and stand.id:s there will be max. 3 hits in
! the same cell;
TEXT ARRAY word[0:94, 1:IF case = 0 OR case = 4 THEN 1 ELSE
!; IF case = 3 THEN 2 ELSE 3];
INTEGER maxhits;
BOOLEAN PROCEDURE found(t); TEXT t;
BEGIN
h:= Rank(fetchar(t,1));
IF t.Length > 3 THEN
h:= h + 8*Rank(fetchar(t,2)) + 64*Rank(fetchar(t,3));
h:= h + 512*Rank(fetchar(t,t.Length)) + t.Length;
h:= Mod(h,95);
IF word[h,1] =/= NOTEXT THEN
BEGIN
found:=
IF maxhits = 1 THEN word[h,1] = t ELSE
IF maxhits = 2 THEN
(IF word[h,1] = t THEN TRUE ELSE word[h,2] = t) ELSE
! Maxhits = 3;
(IF word[h,1] = t THEN TRUE ELSE
IF word[h,2] = t THEN TRUE ELSE word[h,3] = t);
END not empty cell;
END OF FOUND;
IF case = 0 THEN
BEGIN
tmain:- Copy(
"COMMENT"
"END"
"OTHERWISE"
"OPTIONS"
"BEGIN"
"WHEN"
"ELSE");
word[2,1]:- tmain.Sub(1,7);
word[23,1]:- tmain.Sub(8,3);
word[36,1]:- tmain.Sub(11,9);
word[53,1]:- tmain.Sub(20,7);
word[73,1]:- tmain.Sub(27,5);
word[84,1]:- tmain.Sub(32,4);
word[91,1]:- tmain.Sub(36,4);
END ELSE
IF case = 1 THEN
BEGIN
tmain:- Copy(
"COMMENT"
"INSPECT"
"IF"
"NAME"
"REAL"
"IS"
"REF"
"IN"
"AND"
"END"
"EQV"
"CLASS"
"EQ"
"FALSE"
"OTHERWISE"
"LABEL"
"EXTERNAL"
"AT"
"DELAY"
"GT"
"THIS"
"DO"
"GO"
"ARRAY"
"OPTIONS"
"NOT"
"CHARACTER"
"BEFORE"
"STEP"
"GE"
"TO"
"LE"
"FOR"
"NE"
"NEW"
"BEGIN"
"OR"
"GOTO"
"NOTEXT"
"THEN"
"ACTIVATE"
"WHEN"
"PRIOR"
"SHORT"
"INTEGER"
"ELSE"
"TRUE"
"BOOLEAN"
"WHILE"
"AFTER"
"QUA"
"REACTIVATE"
"SWITCH"
"VALUE"
"LT"
"PROTECTED"
"LONG"
"UNTIL"
"TEXT"
"INNER"
"NONE"
"IMP"
"VIRTUAL"
"HIDDEN"
"PROCEDURE");
word[2,1]:- tmain.Sub(1,7);
word[4,1]:- tmain.Sub(8,7);
word[5,1]:- tmain.Sub(15,2);
word[8,1]:- tmain.Sub(17,4);
word[10,1]:- tmain.Sub(21,4);
word[11,1]:- tmain.Sub(25,2);
word[15,1]:- tmain.Sub(27,3);
word[16,1]:- tmain.Sub(30,2);
word[19,1]:- tmain.Sub(32,3);
word[23,1]:- tmain.Sub(35,3);
word[24,1]:- tmain.Sub(38,3);
word[26,1]:- tmain.Sub(41,5);
word[28,1]:- tmain.Sub(46,2);
word[32,1]:- tmain.Sub(48,5);
word[36,1]:- tmain.Sub(53,9);
word[37,1]:- tmain.Sub(62,5);
word[39,1]:- tmain.Sub(67,8);
word[40,1]:- tmain.Sub(75,2);
word[42,1]:- tmain.Sub(77,5);
word[46,1]:- tmain.Sub(82,2);
word[47,1]:- tmain.Sub(84,4);
word[48,1]:- tmain.Sub(88,2);
word[51,1]:- tmain.Sub(90,2);
word[52,1]:- tmain.Sub(92,5);
word[53,1]:- tmain.Sub(97,7);
word[54,1]:- tmain.Sub(104,3);
word[56,1]:- tmain.Sub(107,9);
word[57,1]:- tmain.Sub(116,6);
word[60,1]:- tmain.Sub(122,4);
word[61,1]:- tmain.Sub(126,2);
word[64,1]:- tmain.Sub(128,2);
word[66,1]:- tmain.Sub(130,2);
word[67,1]:- tmain.Sub(132,3);
word[68,1]:- tmain.Sub(135,2);
word[70,1]:- tmain.Sub(137,3);
word[73,1]:- tmain.Sub(140,5);
word[75,1]:- tmain.Sub(145,2);
word[76,1]:- tmain.Sub(147,4);
word[80,1]:- tmain.Sub(151,6);
word[81,1]:- tmain.Sub(157,4);
word[83,1]:- tmain.Sub(161,8);
word[84,1]:- tmain.Sub(169,4);
word[87,1]:- tmain.Sub(173,5);
word[88,1]:- tmain.Sub(178,5);
word[89,1]:- tmain.Sub(183,7);
word[91,1]:- tmain.Sub(190,4);
word[92,1]:- tmain.Sub(194,4);
word[2,2]:- tmain.Sub(198,7);
word[8,2]:- tmain.Sub(205,5);
word[15,2]:- tmain.Sub(210,5);
word[19,2]:- tmain.Sub(215,3);
word[42,2]:- tmain.Sub(218,10);
word[46,2]:- tmain.Sub(228,6);
word[48,2]:- tmain.Sub(234,5);
word[51,2]:- tmain.Sub(239,2);
word[52,2]:- tmain.Sub(241,9);
word[66,2]:- tmain.Sub(250,4);
word[67,2]:- tmain.Sub(254,5);
word[70,2]:- tmain.Sub(259,4);
word[83,2]:- tmain.Sub(263,5);
word[89,2]:- tmain.Sub(268,4);
word[91,2]:- tmain.Sub(272,3);
word[92,2]:- tmain.Sub(275,7);
word[15,3]:- tmain.Sub(282,6);
word[89,3]:- tmain.Sub(288,9);
END ELSE
IF case = 2 THEN
BEGIN
tmain:- Copy(
"CALL"
"ABS"
"ENDFILE"
"SYSOUT"
"DIRECTFILE"
"BREAKOUTIMAGE"
"ARCCOS"
"POISSON"
"RANK"
"GETCHAR"
"ARCSIN"
"POS"
"EJECT"
"DETACH"
"INREAL"
"OUTREAL"
"LENGTH"
"BLANKS"
"ININT"
"TAN"
"GETFRAC"
"MOD"
"DRAW"
"OUTINT"
"OUTTEXT"
"NORMAL"
"STRIP"
"LINE"
"INFILE"
"INIMAGE"
"INCHAR"
"LINESPERPAGE"
"LOWTEN"
"OUTFILE"
"OUTIMAGE"
"ERLANG"
"OUTCHAR"
"PUTCHAR"
"SUB"
"MORE"
"HISTO"
"INFRAC"
"SETPOS"
"RANDINT"
"NEGEXP"
"SQRT"
"INTEXT"
"SYSIN"
"DISCRETE"
"OUTFRAC"
"PUTFRAC"
"GETREAL"
"MAIN"
"PRINTFILE"
"OUTFIX"
"GETINT"
"COPY"
"IMAGE"
"TANH"
"LOCATION"
"COS"
"SPACING"
"ARCTAN"
"LETTER"
"CLOSE"
"LASTITEM"
"SIGN"
"SIN"
"COSH"
"PUTINT"
"SIMULATION"
"DIGIT"
"OPEN"
"LINEAR"
"LOCATE"
"CHAR"
"SINH"
"SIMSET"
"UNIFORM"
"ENTIER"
"EXP"
"PUTFIX"
"PUTREAL"
"HISTD"
"RESUME");
word[2,1]:- tmain.Sub(1,4);
word[4,1]:- tmain.Sub(5,3);
word[5,1]:- tmain.Sub(8,7);
word[6,1]:- tmain.Sub(15,6);
word[8,1]:- tmain.Sub(21,10);
word[9,1]:- tmain.Sub(31,13);
word[11,1]:- tmain.Sub(44,6);
word[12,1]:- tmain.Sub(50,7);
word[13,1]:- tmain.Sub(57,4);
word[15,1]:- tmain.Sub(61,7);
word[16,1]:- tmain.Sub(68,6);
word[19,1]:- tmain.Sub(74,3);
word[20,1]:- tmain.Sub(77,5);
word[21,1]:- tmain.Sub(82,6);
word[23,1]:- tmain.Sub(88,6);
word[24,1]:- tmain.Sub(94,7);
word[25,1]:- tmain.Sub(101,6);
word[26,1]:- tmain.Sub(107,6);
word[27,1]:- tmain.Sub(113,5);
word[28,1]:- tmain.Sub(118,3);
word[30,1]:- tmain.Sub(121,7);
word[31,1]:- tmain.Sub(128,3);
word[32,1]:- tmain.Sub(131,4);
word[34,1]:- tmain.Sub(135,6);
word[35,1]:- tmain.Sub(141,7);
word[36,1]:- tmain.Sub(148,6);
word[38,1]:- tmain.Sub(154,5);
word[39,1]:- tmain.Sub(159,4);
word[41,1]:- tmain.Sub(163,6);
word[44,1]:- tmain.Sub(169,7);
word[45,1]:- tmain.Sub(176,6);
word[47,1]:- tmain.Sub(182,12);
word[48,1]:- tmain.Sub(194,6);
word[50,1]:- tmain.Sub(200,7);
word[51,1]:- tmain.Sub(207,8);
word[52,1]:- tmain.Sub(215,6);
word[56,1]:- tmain.Sub(221,7);
word[57,1]:- tmain.Sub(228,7);
word[58,1]:- tmain.Sub(235,3);
word[59,1]:- tmain.Sub(238,4);
word[61,1]:- tmain.Sub(242,5);
word[62,1]:- tmain.Sub(247,6);
word[63,1]:- tmain.Sub(253,6);
word[64,1]:- tmain.Sub(259,7);
word[65,1]:- tmain.Sub(266,6);
word[66,1]:- tmain.Sub(272,4);
word[67,1]:- tmain.Sub(276,6);
word[68,1]:- tmain.Sub(282,5);
word[70,1]:- tmain.Sub(287,8);
word[71,1]:- tmain.Sub(295,7);
word[72,1]:- tmain.Sub(302,7);
word[78,1]:- tmain.Sub(309,7);
word[84,1]:- tmain.Sub(316,4);
word[85,1]:- tmain.Sub(320,9);
word[87,1]:- tmain.Sub(329,6);
word[88,1]:- tmain.Sub(335,6);
word[91,1]:- tmain.Sub(341,4);
word[92,1]:- tmain.Sub(345,5);
word[94,1]:- tmain.Sub(350,4);
word[5,2]:- tmain.Sub(354,8);
word[6,2]:- tmain.Sub(362,3);
word[12,2]:- tmain.Sub(365,7);
word[16,2]:- tmain.Sub(372,6);
word[19,2]:- tmain.Sub(378,6);
word[24,2]:- tmain.Sub(384,5);
word[25,2]:- tmain.Sub(389,8);
word[26,2]:- tmain.Sub(397,4);
word[27,2]:- tmain.Sub(401,3);
word[34,2]:- tmain.Sub(404,4);
word[35,2]:- tmain.Sub(408,6);
word[36,2]:- tmain.Sub(414,10);
word[44,2]:- tmain.Sub(424,5);
word[45,2]:- tmain.Sub(429,4);
word[47,2]:- tmain.Sub(433,6);
word[50,2]:- tmain.Sub(439,6);
word[51,2]:- tmain.Sub(445,4);
word[62,2]:- tmain.Sub(449,4);
word[64,2]:- tmain.Sub(453,6);
word[67,2]:- tmain.Sub(459,7);
word[84,2]:- tmain.Sub(466,6);
word[87,2]:- tmain.Sub(472,3);
word[88,2]:- tmain.Sub(475,6);
word[25,3]:- tmain.Sub(481,7);
word[34,3]:- tmain.Sub(488,5);
word[50,3]:- tmain.Sub(493,6);
END ELSE
IF case = 3 THEN
BEGIN
tmain:- Copy(
"SUC"
"CARDINAL"
"PRECEDE"
"FOLLOW"
"OUT"
"INTO"
"LINK"
"PRED"
"PREV"
"EMPTY"
"HEAD"
"FIRST"
"LAST"
"CLEAR");
word[0,1]:- tmain.Sub(1,3);
word[10,1]:- tmain.Sub(4,8);
word[17,1]:- tmain.Sub(12,7);
word[51,1]:- tmain.Sub(19,6);
word[55,1]:- tmain.Sub(25,3);
word[70,1]:- tmain.Sub(28,4);
word[71,1]:- tmain.Sub(32,4);
word[72,1]:- tmain.Sub(36,4);
word[73,1]:- tmain.Sub(40,4);
word[78,1]:- tmain.Sub(44,5);
word[84,1]:- tmain.Sub(49,4);
word[85,1]:- tmain.Sub(53,5);
word[90,1]:- tmain.Sub(58,4);
word[55,2]:- tmain.Sub(62,5);
END ELSE
BEGIN
! Case 4;
tmain:- Copy(
"HOLD"
"PASSIVATE"
"WAIT"
"PROCESS"
"CANCEL"
"NEXTEV"
"EVTIME"
"ACCUM"
"TERMINATED"
"IDLE"
"TIME"
"CURRENT");
word[13,1]:- tmain.Sub(1,4);
word[19,1]:- tmain.Sub(5,9);
word[31,1]:- tmain.Sub(14,4);
word[35,1]:- tmain.Sub(18,7);
word[37,1]:- tmain.Sub(25,6);
word[45,1]:- tmain.Sub(31,6);
word[47,1]:- tmain.Sub(37,6);
word[48,1]:- tmain.Sub(43,5);
word[50,1]:- tmain.Sub(48,10);
word[58,1]:- tmain.Sub(58,4);
word[78,1]:- tmain.Sub(62,4);
word[85,1]:- tmain.Sub(66,7);
END case 4;
maxhits:=
IF case = 0 OR case = 4 THEN 1 ELSE
IF case = 3 THEN 2 ELSE 3;
END OF TREE;
TEXT PROCEDURE inl(t); NAME t; TEXT t;
BEGIN inl:- inline(t,Sysin);
IF Sysin.Endfile THEN
BEGIN TEXT s; s:- Sysin.Image;
Sysin.Close; Sysin.Open(s);
s:- Sysout.Image;
Sysout.Close; Sysout.Open(s); inl:- NOTEXT;
Sysout.Linesperpage(-1);
IF t = "*" THEN
BEGIN Outtext("Thank you!"); Outimage; exit(0) END;
END
END of inl;
!***** Initial setup, continued ******;
tbuf:- Blanks(60);
FOR i:= 0,1,2 DO treearr[i]:- NEW tree(i);
key[1]:- Copy("/SIMS");
key[2]:- Copy("/SIMU");
key[3]:- Copy("/E:");
key[4]:- Copy("/E");
key[5]:- Copy("=");
key[6]:- Copy("/R:");
key[7]:- Copy("/N:");
key[8]:- Copy("/-T");
key[9]:- Copy("/N");
! Avoiding explicit use of outfile definition switch[10]:;
key[10]:- Blanks(1); key[10].Putchar(Char(26));
key[11]:- Copy("/I:");
key[12]:- Copy("/I");
key[13]:- Copy("/H");
key[14]:- Copy("/T");
key[15]:- Copy("/G");
key[16]:- Copy("!");
key[17]:- Copy("/-SIMS");
key[18]:- Copy("/-SIMU");
key[19]:- Copy("/Z:");
key[20]:- Copy("/-N");
defkey:= 10;
t:- Copy("13200 80 4");
argdef[4]:- t.Sub(1,5);
argdef[6]:- t.Sub(7,2);
argdef[12]:- t.Sub(10,1);
INSPECT findinfile("SWITCH.INI") DO
BEGIN Open(Blanks(132));
Inimage;
WHILE NOT Endfile DO
BEGIN t:- upcase(Image.Sub(IF numbered THEN 7 ELSE 1,5));
IF t = "SIMED" THEN
BEGIN
t:- from(Image,6);
scanto(t,'/');
IF t.More THEN
BEGIN t.Setpos(t.Pos-1);
t:- rest(t);
IF scan(t,nkeys,arg,key,defkey) = 0 THEN
BEGIN !Change defaults (not all switches possible);
arg[5]:-arg[10]:-arg[13]:-NOTEXT;
FOR i:= 1 STEP 1 UNTIL nkeys DO
BEGIN IF arg[i]=/=NOTEXT THEN
BEGIN
argdef[i]:- arg[i];
arg[i]:- NOTEXT;
END END END END END;
Inimage
END WHILE NOT ENDFILE;
Close
END SWITCH.INI;
IF argdef[3] =/= NOTEXT THEN
BEGIN argdef[4]:- argdef[3]; argdef[3]:- NOTEXT END;
IF argdef[4].Length<5 THEN
BEGIN t:-Blanks(5); t:=argdef[4];
argdef[4]:-t;
END;
IF argdef[11] =/= NOTEXT THEN
BEGIN argdef[12]:- argdef[11]; argdef[11]:- NOTEXT END;
IF initcommand =/= NOTEXT THEN
command:- initcommand ELSE
start: command:- NOTEXT;
FOR i:= 1 STEP 1 UNTIL nkeys DO arg[i]:- argdef[i];
begincount:= endcount:= i:= lineno:= oldline:= linesout:=
lines:= indent:= ma:= margin:= ind:= inde:= 0;
ctab:= Char(9); proglength:= 150;
IF uppercase[Rank('a')] NE 'A' THEN
BEGIN
inituppercase(uppercase); initlowercase(lowercase);
END;
margin:= 0;
WHILE command == NOTEXT DO command:- inl("*");
IF command = "?" THEN
BEGIN
help: Outtext("Command format: [outfile=]infile[/switches]");
Outimage;
command:- inl("For more help type ?:");
IF command == NOTEXT THEN GOTO start;
IF command.Getchar NE '?' THEN GOTO start;
IF Sysout.Length < 80 THEN Sysout.Image:- Blanks(80);
INSPECT findinfile("HLP:SIMED.HLP") DO
BEGIN
Open(Sysout.Image);
Inimage;
WHILE NOT Endfile DO
BEGIN Outimage; Inimage END;
Image:= NOTEXT; Close; GO TO start;
END OTHERWISE
BEGIN
INSPECT findinfile("SYS:SIMED.HLP") DO
BEGIN
Open(Sysout.Image);
Inimage;
WHILE NOT Endfile DO
BEGIN Outimage; Inimage END;
Image:= NOTEXT; Close; GO TO start;
END;
END;
Outtext("? Cannot find SIMED.HLP"); Outimage;
GO TO start;
END ? OR /HELP ;
FOR i:= scan(command,nkeys,arg,key,defkey) WHILE i NE 0 DO
BEGIN Outtext("? Multiple switch:");
Outtext(key[i]);
Outtext(" Please try again.");
Outimage; GO TO start;
END loop;
FOR i:= 1 STEP 1 UNTIL nkeys DO
IF arg[i] == NOTEXT THEN arg[i]:- argdef[i];
IF arg[13] =/= NOTEXT THEN
BEGIN !/HELP switch;
GOTO help
END;
arg[10]:- arg[10].Strip;
IF arg[10] == NOTEXT THEN
BEGIN Outtext("? No file name entered. Please try again.");
Outimage; GO TO start
END error;
arg[10]:- checkextension(arg[10],".SIM");
arg[5]:- arg[5].Strip;
progname:-
IF arg[5] == NOTEXT THEN arg[10] ELSE
checkextension(arg[5],".SIM");
outname:- arg[10];
simsettree:-
IF arg[1] == NOTEXT AND arg[2] == NOTEXT THEN NONE
ELSE NEW tree(3);
simulationtree:-
IF arg[2] =/= NOTEXT THEN NEW tree(4) ELSE NONE;
IF arg[3] == NOTEXT THEN
arg[3]:- arg[4];
IF arg[3] =/= NOTEXT THEN
BEGIN
t:- arg[3];
IF t.Length < 5 THEN t:- conc(t,from(argdef[4],t.Length+1));
upcase(t);
i:= 0; j:= 1;
FOR j:= j + 1 WHILE t.Pos NE i AND j <= 6 DO
BEGIN
i:= t.Pos;
c:=t.Getchar;
convert[j]:= IF Digit(c) THEN Rank(c)-Rank('0') ELSE
IF c='U' THEN 1 ELSE IF c='L' THEN 2 ELSE IF c='E' THEN 3
ELSE 0;
END loop;
FOR j:= 2,3,4,5,6 DO
! Check that convert[2:4] are in [0:3] and [5:6] in [0:2];
IF convert[j] < 0 OR convert[j] > (13-j)//3 THEN
BEGIN convert[j]:= 0;
Outtext("%SIMED - Edit code pos:");
Outint(j-1,1); Outtext(" not correct. 0 assumed.");
Outimage;
END illegal;
END arg 3 = edit modes;
IF arg[6] == NOTEXT THEN outlength:= 80 ELSE
outlength:= scanint(arg[6]);
IF outlength < 13 OR outlength > 135 THEN
BEGIN Outtext("%SIMED - Illegal Record length:");
Outtext(arg[6]); Outtext(" - 80 assumed.");
Outimage;
outlength:= 80;
END;
tabs:= arg[8] == NOTEXT;
IF arg[11] == NOTEXT THEN arg[11]:- arg[12];
IF arg[11] == NOTEXT THEN
indent:= 4 ELSE
BEGIN
indent:= scanint(arg[11]);
IF indent < -10000000000 THEN indent:= - 10000000000;
IF Sign(indent)*indent > outlength//2 THEN
BEGIN Outtext("%SIMED - Illegal Indent value:");
Outtext(arg[11]); Outtext(" - 4 assumed."); Outimage;
indent:= 4;
END error;
END indent;
leftskip:= indent > 0; indent:= Sign(indent)*indent;
maxindent:= outlength - 20;
IF maxindent < indent THEN maxindent:= indent;
IF arg[14] =/= NOTEXT THEN tabs:= TRUE;
runprog:- arg[16];
IF runprog =/= NOTEXT AND arg[15] =/= NOTEXT THEN
BEGIN Outtext("%SIMED - /G superseded by /RUN");
Outimage
END;
IF arg[17] =/= NOTEXT THEN simsettree:- NONE;
IF arg[18] =/= NOTEXT THEN simulationtree:- NONE;
IF arg[19] =/= NOTEXT THEN
BEGIN
zuppress:= scanint(arg[19]);
IF zuppress < -10 THEN
BEGIN Outtext("%SIMED - Illegal /Z value:");
Outtext(arg[19]); Outtext(". 0 assumed.");
Outimage; zuppress:= 0
END ELSE
ma:= margin:= - indent*Sign(indent)*zuppress;
END 19;
IF progname NE "TTY:" THEN BEGIN
FOR prog:- findinfile(progname) WHILE prog == NONE DO
BEGIN Outtext("%SIMED - Cannot find Infile: ");
Outtext(progname); Outimage;
progname:- inl("Enter name of infile: ");
progname:- checkextension(progname,".SIM");
IF arg[5] == NOTEXT THEN outname:- progname;
END loop;
prog.Open(Blanks(proglength)); prog.Inimage;
num:= numbered;
END not TTY ELSE
BEGIN prog:- Sysin; Sysin.Image:- Blanks(proglength); END;
IF arg[9] =/= NOTEXT AND arg[7] == NOTEXT THEN
BEGIN t:- arg[9]; scanto(t,':');
arg[7]:- IF t.More THEN rest(t) ELSE Copy("100");
END;
IF arg[20] =/= NOTEXT THEN arg[7]:- NOTEXT;
IF arg[7] =/= NOTEXT THEN
BEGIN incr:= scanint(arg[7]);
IF incr <= 0 THEN
BEGIN Outtext("%SIMED - Illegal /N Increment:");
Outtext(arg[7]); Outtext(" - 100 assumed.");
Outimage; incr:= 100;
END;
END incr;
IF outname NE "TTY:" THEN
BEGIN
IF num OR arg[7] =/= NOTEXT THEN
outname:- conc(outname,"/NUMBERED");
FOR outf:-
findoutfile(outname) WHILE outf == NONE DO
BEGIN Outtext("%SIMED - Cannot create Outfile: ");
Outtext(outname); Outimage;
outname:- inl("Enter name of outfile: ");
outname:- checkextension(outname,".SIM");
IF num OR arg[7] =/= NOTEXT THEN
outname:- conc(outname,"/NUMBERED");
END loop
END ELSE outf:- Sysout;
INSPECT outf DO
BEGIN
INSPECT prog DO
BEGIN
PROCEDURE outim;
IF (IF arg[20] == NOTEXT THEN
num OR arg[7] =/= NOTEXT ELSE FALSE) THEN
BEGIN
IF fetchar(outf.Image,
(IF tabs THEN ind//8+Mod(ind,8) ELSE ind)+1) = Char(12) THEN
BEGIN
outf.Image:=
from(outf.Image,(IF tabs THEN ind//8+Mod(ind,8) ELSE ind)+1);
outf.Image:- outf.Image.Main;
outf.Setpos(6); outf.Image.Putchar(Char(13));
Breakoutimage;
depchar(outf.Image,6,Char(9));
outf.Image:- from(outf.Image,7);
END ELSE
BEGIN
linesout:= linesout + 1;
IF lineno < oldline OR contflag OR cutflag THEN
lineno:= oldline +
(IF arg[7] =/= NOTEXT THEN incr ELSE 1) ELSE
IF lineno = oldline THEN
lineno:= lineno +
(IF lineno < 50000 THEN incr ELSE
IF lineno < 60000 THEN 10 ELSE 2);
numfield.Putint(lineno);
numfield.Setpos(1);
WHILE numfield.Getchar = ' ' DO
depchar(numfield,numfield.Pos-1,'0');
outf.Image:- outf.Image.Main;
IF lineno > 65534 AND NOT warned THEN
BEGIN warned:= TRUE;
warning("Line number overflow at:",outf.Image);
END warning;
oldline:= lineno;
Outimage;
depchar(outf.Image,6,Char(9));
outf.Image:- from(outf.Image,7);
END
END ELSE
BEGIN
IF fetchar(outf.Image,1) = Char(12) THEN
BEGIN lines:= lines - 1; Breakoutimage END ELSE
BEGIN linesout:= linesout + 1; Outimage END;
END outim;
PROCEDURE printline(t); TEXT t;
BEGIN INTEGER i,j,k,olddisplay,displayi,tl; CHARACTER c;
tl:= IF oldtext THEN 0 ELSE 1;
IF (cutflag AND textflag) OR cut_text THEN tl:= tl - 1;
IF t.Length > outlength - outf.Pos + tl THEN
BEGIN !NECESSARY TO CUT LINE;
FOR c:= csemicolon,cblank,ctab,ccomma DO
BEGIN
j:= outlength - outf.Pos + cutpos;
FOR i:= outlength-outf.Pos+tl STEP -1 UNTIL 2 DO
BEGIN
IF (IF display[j] = 0 OR display[j] = 5
THEN
fetchar(t,i) = c ELSE FALSE) THEN GO TO cut;
j:= j - 1
END I LOOP
END C LOOP;
!FAILED:; j:= outlength - outf.Pos + cutpos;
olddisplay:= display[j];
FOR i:= outlength-outf.Pos+tl STEP -1 UNTIL 2 DO
BEGIN
IF display[j] = 5 THEN GO TO cut ELSE
IF display[j] NE olddisplay THEN GO TO cut;
olddisplay:= display[j]; j:= j - 1
END;
!FAILED AGAIN:;
i:= outlength - outf.Pos + 1;
k:= cutpos+i-1;
cut_text:= display[k] = 6;
IF outf.Pos > 1 AND NOT cut_text THEN
BEGIN outf.Setpos(1); printline(t); GO TO done END;
IF NOT cut_text THEN
warning("Forced Cut at Line:",t);
cut:
IF oldtext THEN i:= i - 1;
IF (textflag AND cutflag) OR cut_text THEN i:= i - 1;
printline(t.Sub(1,i)); cutpos:= Pos;
inde:= ind;
IF NOT commentflag AND NOT oldcommentflag THEN
BEGIN
IF tabs THEN
WHILE inde >= 8 DO
BEGIN Outchar(ctab); inde:= inde - 8 END;
outf.Setpos(outf.Pos+inde);
END indenting;
contflag:= TRUE;
oldtext:= oldtext OR cut_text;
printline(t.Sub(i+1,t.Length-i));
cut_text:= FALSE;
END ELSE
BEGIN
IF debug THEN
BEGIN j:= cutpos; Setpos(cutpos);
FOR i:= 1 STEP 1 UNTIL t.Length DO
BEGIN Outint(display[j],1); j:= j + 1 END;
outim;
inde:= ind;
IF tabs THEN WHILE inde >= 8 DO
BEGIN Outchar(ctab); inde:= inde - 8 END;
outf.Setpos(outf.Pos+inde);
END Debug Output;
j:= cutpos + t.Length - 1;
IF \ cutflag AND contflag AND NOT oldtext THEN
BEGIN WHILE More DO
BEGIN c:= Inchar;
IF c NE ' ' AND c NE ctab THEN GO TO skipped;
cutpos:= cutpos + 1
END LOOP;
outim; GO TO done; !EMPTY LINE;
skipped:
END ELIMINATING BLANKS AND TABS AT CUT;
Setpos(cutpos);
IF oldtext THEN Outchar('"');
FOR i:= cutpos STEP 1 UNTIL j DO
BEGIN displayi:= display[i];
IF displayi <= 1 THEN Outchar(Inchar) ELSE
BEGIN
IF convert[displayi] = 0 THEN Outchar(Inchar) ELSE
IF convert[displayi] = 1 THEN
Outchar(uppercase[Rank(Inchar)]) ELSE
IF convert[displayi] = 2 THEN
Outchar(lowercase[Rank(Inchar)]) ELSE
COMMENT CONVERT[DISPLAYI] = 3;
Outchar(IF displayi = olddisplay THEN
lowercase[Rank(Inchar)] ELSE
uppercase[Rank(Inchar)]);
END CONVERSION;
olddisplay:= displayi
END I LOOP;
IF (textflag AND cutflag) OR
(cut_text AND display[j] = 6) THEN
BEGIN
IF fetchar(Image,j) = '"' THEN
BEGIN
IF fetchar(Image,j+1) = '"' THEN
BEGIN
warning("Lost "" at end of line:",outf.Image);
Outchar('"');
END ELSE oldtext:= cut_text:= FALSE;
END ELSE Outchar('"');
END extra " ;
IF fetchar(outf.Image,outf.Pos-1) = Char(12) THEN
BEGIN
IF arg[20] == NOTEXT AND
(num OR arg[7] =/= NOTEXT) THEN outim ELSE
BEGIN outf.Image:- outf.Image.Sub(1,outf.Pos-1);
FOR c:= outf.Image.Getchar WHILE
c = ' ' OR c = Char(9) DO;
outf.Image:- outf.Image.Sub
(outf.Pos-1,outf.Length-outf.Pos+2);
Breakoutimage; lines:= lines - 1;
outf.Image:- outf.Image.Main;
END FF no line number in output;
END ELSE outim;
END SHORT TEXT;
done:
END OF PRINTLINE;
CHARACTER window,cblank,csemicolon,ccomma; TEXT t,mainimage;
BOOLEAN endcommentflag,commentflag,cut_text,contflag,
oldcommentflag,textflag,cutflag,numericflag,
hit,warned,endwarn,oldtext;
INTEGER ARRAY display[0:proglength];
INTEGER i,p,markreswd,markstandid,markchar,marktext,markcomment,
marknumeric,markuserid,marksingle,cutpos,levelcount,level;
marknumeric:= 1; markreswd:= 2;
markstandid:= 3; markuserid:= 4;
markcomment:= 5; marktext:= 6;
markchar:= 7; marksingle:= 8;
IF outf =/= Sysout THEN outf.Open(Blanks(outlength)) ELSE
Sysout.Image:- Blanks(outlength);
numfield:- outf.Image.Sub(1,5);
reswdtree:- NONE;
IF convert[2] = convert[4] THEN
reswdtree:- treearr[0] ELSE
reswdtree:- treearr[1];
IF convert[3] NE convert[4] THEN
BEGIN IF standid == NONE THEN standid:- treearr[2];
END ELSE standid:- NONE;
cblank:= ' '; csemicolon:= ';'; ccomma:= ',';
level:= -1000;
IF incr <= 0 THEN incr:= 100;
mainimage:- Image;
Lastitem; Image:- Image.Strip;
IF num THEN
BEGIN lineno:= scanint(Image);
IF lineno < 0 OR arg[7] =/= NOTEXT THEN
lineno:= incr;
Image:- from(Image,7);
END;
IF num OR arg[7] =/= NOTEXT THEN
BEGIN
IF lineno = 0 THEN lineno:= incr;
outlength:= outlength - 6;
depchar(outf.Image,6,Char(9));
outf.Image:- from(outf.Image.Main,7);
END;
WHILE \ Endfile DO
BEGIN next:
IF \ More THEN
BEGIN
IF NOT oldtext AND leftskip AND Length > 1
AND NOT commentflag AND NOT oldcommentflag THEN
BEGIN Setpos(1); skip(Image,' ');
WHILE More DO
BEGIN window:= Inchar;
IF window NE ' ' AND window NE ctab THEN GO TO
leftskipped
END LOOP;
leftskipped: p:= Pos - 2;
Image:- Image.Sub(Pos-1,Length-p);
iashift(display,1,p+1,Length,TRUE);
END SKIPPING LEADING BLANKS AND TABS;
ind:= IF ind > 0 THEN ma ELSE margin;
ind:= inde:= Mod(ind,maxindent);
IF NOT commentflag AND NOT oldcommentflag THEN
BEGIN
IF tabs THEN WHILE inde >= 8 DO
BEGIN Outchar(ctab); inde:= inde - 8 END;
outf.Setpos(outf.Pos+inde);
END not comment;
cutflag:= textflag; contflag:= FALSE;
cutpos:= 1;
printline(Image);
oldcommentflag:= commentflag;
ma:= margin; ind:= 0; oldtext:= textflag;
restore: Image:- mainimage; Inimage;
lines:= lines + 1;
IF Endfile THEN GO TO stop;
num:= numbered;
IF num THEN
BEGIN
IF arg[7] =/= NOTEXT THEN
lineno:= oldline + incr ELSE
lineno:= scanint(Image);
IF lineno < 0 THEN lineno:= oldline +
(IF arg[7] =/= NOTEXT THEN incr ELSE 1);
Image:- from(Image,7);
END;
Image:- Image.Strip;
IF Image == NOTEXT THEN
BEGIN
IF (IF num THEN fetchar(mainimage,6)
= Char(12) ELSE FALSE) THEN
BEGIN lines:= lines - 1; Outchar(Char(12)) END;
outim; GO TO restore
END;
IF levelcount = 0 AND begincount > 0 THEN
BEGIN TEXT t; levelcount:= -1000;
t:- Blanks(5); t.Putint(IF num THEN lineno ELSE lines+1);
t.Setpos(1);
WHILE t.Getchar = ' ' DO depchar(t,t.Pos-1,'0');
t:- conc(t," ",Image);
warning("Line(s) after last END:",t);
END;
iashift(display,1,1,0,TRUE);
END NO MORE;
IF endcommentflag THEN GO TO scanendcomment;
IF textflag THEN GO TO scantext;
IF commentflag THEN GO TO scancomment;
skip(Image,' ');
window:= Inchar;
IF FALSE THEN
scan:
BEGIN IF window = ' ' THEN
BEGIN skip(Image,' ');
IF More THEN window:= Inchar ELSE GO TO next
END
END;
IF window = ctab THEN !SKIP; ELSE
IF window = csemicolon THEN !SKIP; ELSE
IF bokstav(window) THEN
BEGIN Setpos(Pos-1); p:= Pos;
t:- tagord(Image).Strip;
window:= ' ';
IF t.Length > 1 AND t.Length < 11 THEN
BEGIN
INSPECT reswdtree DO
BEGIN tbuf:- tbuf.Main.Sub(1,t.Length); tbuf:= t;
upcase(tbuf);
window:= tbuf.Getchar;
hit:= found(tbuf)
END
END ELSE
hit:= FALSE;
IF hit THEN
BEGIN
FOR i:= Pos-1 STEP -1 UNTIL p DO display[i]:= 2;
IF tbuf = "COMMENT" THEN GO TO scancomment;
IF tbuf = "OPTIONS" THEN GO TO scancomment2;
IF tbuf = "END" THEN
BEGIN
moreends:
endcount:= endcount + 1;
levelcount:= levelcount - 1;
IF levelcount = level THEN
BEGIN level:= - 1000;
simulationtree:- simsettree:- NONE
END;
IF endcount > begincount AND NOT endwarn THEN
BEGIN TEXT t;
t:- Blanks(5);
t.Putint(IF num THEN lineno ELSE lines+1);
t.Setpos(1);
WHILE t.Getchar = ' ' DO depchar(t,t.Pos-1,'0');
t:- conc(t," ",Image);
warning("More ENDs than BEGINs at line:",t);
endwarn:= TRUE
END ELSE
BEGIN endwarn:= FALSE;
margin:= margin - indent; ind:= ind - 1;
END;
scanendcomment:
WHILE More DO
BEGIN display[Pos]:= 5;
window:= uppercase[Rank(Inchar)];
IF window = ';' THEN
BEGIN endcommentflag:= FALSE;
GO TO next END ELSE
IF window = 'E' THEN
BEGIN p:= Pos - 1; t:- tagord(Image);
tbuf:- tbuf.Main.Sub(1,t.Length);
tbuf:= t;
upcase(tbuf);
IF tbuf = "ND" THEN
BEGIN
display[Pos-3]:= display[Pos-2]:=
display[Pos-1]:= 2;
GO TO moreends
END;
IF tbuf = "LSE" THEN
BEGIN l4:
display[Pos-4]:= display[Pos-3]:= 2;
display[Pos-2]:= display[Pos-1]:= 2;
endcommentflag:= FALSE; GO TO next
END;
FOR i:= Pos-1 STEP -1 UNTIL p DO
display[i]:= 5;
END ELSE
IF window = 'O' THEN
BEGIN p:= Pos - 1; t:- tagord(Image);
tbuf:- tbuf.Main.Sub(1,t.Length);
tbuf:= t;
upcase(tbuf);
IF tbuf = "THERWISE" THEN
BEGIN
FOR i:= -9 STEP 1 UNTIL -1 DO
display[Pos+i]:= 2;
endcommentflag:= FALSE; GO TO next
END;
FOR i:= Pos-1 STEP -1 UNTIL p DO
display[i]:= 5;
END ELSE
IF window = 'W' THEN
BEGIN p:= Pos - 1; t:- tagord(Image);
tbuf:- tbuf.Main.Sub(1,t.Length);
tbuf:= t;
upcase(tbuf);
IF tbuf = "HEN" THEN GO TO l4;
FOR i:= Pos-1 STEP -1 UNTIL p DO
display[i]:= 5;
END ELSE
IF Letter(window) THEN
BEGIN p:= Pos - 1; Setpos(p); tagord(Image);
FOR i:= Pos-1 STEP -1 UNTIL p DO
display[i]:= 5;
END OTHER WORD IN *ND-COMMENT
END MORE LOOP;
endcommentflag:= TRUE;
END *ND=T ELSE
IF (IF window = 'B' THEN tbuf = "BEGIN" ELSE FALSE) THEN
BEGIN margin:= margin + indent;
begincount:= begincount + 1;
levelcount:= levelcount + 1;
IF ind < 0 THEN
BEGIN ind:= 10000;
ma:= ma - indent END ELSE ind:= ind+1;
END
END RESWD ELSE
BEGIN
IF t.Length > 2 AND t.Length < 14 THEN
BEGIN
INSPECT standid DO
BEGIN
IF window = ' ' THEN
BEGIN
tbuf:- tbuf.Main.Sub(1,t.Length); tbuf:= t;
upcase(tbuf);
window:= tbuf.Getchar;
END;
hit:= found(tbuf);
END inspect;
IF hit THEN
BEGIN
IF window = 'S' AND convert[3] NE
convert[4] THEN
BEGIN
IF tbuf = "SIMSET" AND arg[17] == NOTEXT THEN
BEGIN IF level = -1000 THEN level:=
levelcount;
simsettree:- NEW tree(3);
END tbuf = SIMSET ELSE
IF tbuf = "SIMULATION" AND arg[18] == NOTEXT THEN
BEGIN IF level = -1000 THEN level:=
levelcount;
simulationtree:- NEW tree(4);
IF simsettree == NONE THEN
simsettree:- NEW tree(3)
END tbuf = SIMULATION
END W = 'S'
END STANDID ELSE
BEGIN
INSPECT simsettree DO hit:= found(tbuf);
IF \ hit THEN
INSPECT simulationtree DO hit:= found(tbuf);
END TESTING SYSTEM CLASS ID
END REASONABLE TBUF.LENGTH ELSE
BEGIN
IF window = ' ' THEN
BEGIN
tbuf:- tbuf.Main.Sub(1,t.Length);
tbuf:= t; upcase(tbuf);
END;
hit:= tbuf = "LN";
END;
IF hit THEN BEGIN
FOR i:= Pos-1 STEP -1 UNTIL p DO display[i]:=
markstandid END ELSE
BEGIN
FOR i:= Pos-1 STEP -1 UNTIL p DO display[i]:=
markuserid
END
END NOT RESWD
END SOME LETTER(S) ELSE
IF Digit(window) OR window = '&' THEN
BEGIN morenum: display[Pos-1]:= 1;
numericflag:= window = '&';
IF More THEN
BEGIN window:= Inchar;
IF window = 'R' OR window = 'r' THEN window:= '0';
WHILE (IF More THEN Digit(window) ELSE FALSE) DO
BEGIN display[Pos-1]:= 1;
numericflag:= FALSE; window:= Inchar
END;
IF window = '.' THEN GO TO morenum;
IF window = '&' THEN BEGIN numericflag:= TRUE;
GO TO morenum END;
GO TO
IF (window = '+' OR window = '-') AND numericflag THEN
morenum ELSE scan;
END MORE LOOP
END DIGIT(S) ELSE
IF window = ':' THEN
BEGIN display[Pos-1]:= 8;
IF More THEN
BEGIN window:= Inchar;
IF (IF window = '-' THEN TRUE ELSE window = '=') THEN
BEGIN display[Pos-1]:= 8; GO TO next END ELSE
GO TO scan;
END more;
END ELSE
IF window = '*' THEN display[Pos-1]:= 8 ELSE
IF window = '/' THEN display[Pos-1]:= 8 ELSE
IF window = '=' THEN display[Pos-1]:= 8 ELSE
IF window = '<' THEN display[Pos-1]:= 8 ELSE
IF window = '>' THEN display[Pos-1]:= 8 ELSE
IF window = '"' THEN
BEGIN scantext:
window:= ' '; display[Pos-1]:= 6;
WHILE (IF More THEN window NE '"' ELSE FALSE) DO
BEGIN display[Pos]:= 6; window:= Inchar END;
IF window NE '"' THEN
BEGIN
warning("<CR><LF> in text constant:",Image);
warning("Type CONTINUE if OK,"
" else correct before SIMED processing.",NOTEXT);
exit(0);
cutflag:= textflag:= TRUE
END
ELSE textflag:= FALSE;
END ELSE
IF window = ''' THEN
BEGIN display[Pos-1]:= display[Pos]:= 7;
IF \ More THEN
w0: warning("Illegal character constant:",Image) ELSE
BEGIN Setpos(Pos+1);
IF \ More THEN GO TO w0;
display[Pos]:= 7;
window:= Inchar;
IF window NE ''' THEN GO TO w0
END
END ELSE
IF window = '!' THEN
BEGIN scancomment: p:= Pos;
Setpos(p); scanto(Image,';');
FOR i:= Pos - 1 STEP -1 UNTIL p DO
display[i]:= 5;
commentflag:= fetchar(Image,Pos-1) NE ';';
IF FALSE THEN
scancomment2:
BEGIN
textflag:= FALSE; Setpos(Pos+1);
WHILE (IF More THEN window NE ';' OR
textflag ELSE FALSE) DO
BEGIN IF window = '"' THEN
BEGIN textflag:= NOT textflag;
display[Pos-1]:= 6
END ELSE display[Pos-1]:= IF textflag THEN 6 ELSE 5;
window:= Inchar
END;
commentflag:= window NE ';';
display[Pos-1]:= IF textflag THEN 6 ELSE 5;
END scancomment2
END ELSE
IF window = '\' THEN display[Pos-1]:= 8;
END BIG LOOP;
stop:
t:- prog.Image.Main;
Close;
IF prog == Sysin THEN
BEGIN prog.Open(t);
t:- Sysout.Image; Sysout.Close; Sysout.Open(t);
Sysout.Linesperpage(-1);
END;
END INSPECTING INPUT;
IF outf =/= Sysout THEN Close
END INSPECTING OUTPUT;
Outchar('[');
outname.Setpos(1); outname:- scanto(outname,'/');
Outtext(outname);
IF outname NE progname THEN
BEGIN Outtext(" <-- "); Outtext(progname); END;
Outtext(": ");
Outint(begincount,IF begincount < 100 THEN 2 ELSE 4); Outtext(" BEGIN");
IF begincount NE 1 THEN Outtext("s ") ELSE Outchar(' ');
IF begincount NE endcount THEN
BEGIN Outtext(" ?"); Outint(endcount,4); Outtext(" END");
IF endcount NE 1 THEN Outtext("s! ") ELSE Outtext("! ");
END;
newtime:= cptime;
Outfix(newtime-cputime,2,6); Outtext(" Sec.");
Outint(lines,5);
IF lines NE linesout THEN
BEGIN Outtext(" In"); Outint(linesout,5);
Outtext(" Out]");
END ELSE Outtext(" Lines]");
Outimage;
cputime:= newtime;
IF runprog =/= NOTEXT THEN
run(runprog,1);
IF arg[15] =/= NOTEXT THEN run("SYS:COMPIL",2);
IF initcommand =/= NOTEXT THEN
BEGIN exit(0); initcommand:- NOTEXT END;
GO TO start;
END
END OF PROGRAM