Trailing-Edge
-
PDP-10 Archives
-
decuslib20-04
-
decus/20-0135/comp/videdp.sim
There are 2 other files named videdp.sim in the archive. Click here to see a list.
00040 COMMENT First release of VIDEDP by B`rje Ohlman, FOA. 78 07 19 ;
00080
00120 COMMENT This is a program which makes it possible to output a text
00160 containing indices and a straight right margin on a Diablo
00200 1620 terminal. ;
00240
00280 COMMENT Those lines who are members of a section with indices and/or
00320 underlinings will be put into a que while handeled before
00360 output. ;
00400
00440 COMMENT Corrections by Jacob Palme 1978-07-28:
00480 1) Error message when outfile = infile
00520 2) Error message when outfile will overwrite an
00560 existing file
00600 3) Normal prompter if rescan finds no "-" in
00640 the command line;
00680
00720 COMMENT Corrections by Jacob Palme 1978-12-15:
00760 VIDEDP sets .TTY FORM and .TTY NO CRLF,
00800 and .TTY TAB and .TTY GAG, because
00840 otherwise strange things will happen!!!;
00880
00920 BEGIN
00960 EXTERNAL TEXT PROCEDURE inline, scanto, conc, upcase, compress, rest;
01000 EXTERNAL CHARACTER PROCEDURE fetchar, findtrigger;
01040 EXTERNAL BOOLEAN PROCEDURE rescan, numbered;
01080 EXTERNAL INTEGER PROCEDURE scan, scanint, search, trmop;
01120 EXTERNAL PROCEDURE outstring, exit, outchr, forceout;
01160 EXTERNAL REF (infile) PROCEDURE findinfile;
01200 EXTERNAL REF (outfile) PROCEDURE findoutfile;
01240 INTEGER arrayindex; ! This is the number of commands allowed;
01280 arrayindex:=10; ! in the commandline (switchline) ;
01320 simset BEGIN
01360
01400 COMMENT This procedure takes care of the error handeling.
01440 ;
01480
01520 PROCEDURE error(err);
01560 INTEGER err; ! err: The type of error that have occured. ;
01600 BEGIN
01640
01680 COMMENT pag, pagnum, err0, err1, err2a, err2b, err3, err4,
01720 err5: are dummyvariables as it's impossible to output
01760 a text constant with outstring. ;
01800
01840 TEXT pag, pagenum, err0, err1, err2a, err2b, err3, err4, err5;
01880 pag:-copy("Page");
01920 pagenum:-copy(blanks(4));
01960 err0:-copy("Please try again. ");
02000 err1:-copy(" %VIDEDP - Illegal command after '.'.");
02040 err2a:-copy("?VIDEDP - Command:");
02080 err2b:-copy(" used more than once");
02120 err3:-copy("?VIDEDP -Can't find infile.");
02160 err4:-copy("?VIDEDP - Cant create outfile.");
02200 err5:-copy(" %VIDEDP - .L command after .U command ?");
02240 outchr(sysout,char(13),1);
02280 outchr(sysout,char(10),1);
02320 IF err=1 OR err=5 THEN BEGIN
02360 outstring(sysout,pag);
02400 pagenum.putint(page);
02440 outstring(sysout,pagenum);
02480 END;
02520 IF err=1 THEN outstring(sysout,err1);
02560 IF err=2 THEN BEGIN
02600 outstring(sysout,err2a);
02640 outstring(sysout,key[index]);
02680 outstring(sysout,err2b);
02720 END;
02760 IF err=3 THEN outstring(sysout,err3);
02800 IF err=4 THEN outstring(sysout,err4);
02840 IF err=5 THEN outstring(sysout,err5);
02880 outchr(sysout,char(13),1);
02920 outchr(sysout,char(10),1);
02960 IF err=2 OR err=3 OR err=4 THEN outstring(sysout,err0);
03000 forceout(sysout);
03040 IF err=1 THEN BEGIN
03080 dot:=FALSE;
03120 GOTO no_command;
03160 END;
03200 IF err=3 OR err=4 THEN GOTO new_file;
03240 END error ;
03280
03320 COMMENT This procedure does two things:
03360
03400 1) It counts the numbers of characters in checkline
03440 and stores the result in the variable x, if it's
03480 greater than x's current value.
03520 When a group of quelines are ready for output x
03560 will hold the maximum linelength for this group
03600 of lines.
03640
03680 2) It will in the boolean array "blank" set every
03720 element, corresponding to a characterposition
03760 not containing a blank-character, to FALSE.
03800 When a group of quelines are ready for output
03840 the elements in "blank" which still are TRUE
03880 will indicate that the corresponding character-
03920 position is blank in all quelines. ;
03960
04000 PROCEDURE check (checkline);
04040 TEXT checkline; ! Line to be checked. ;
04080 BEGIN
04120 ! ***** 1 ***** ;
04160 IF checkline.sub(2,1)="%" THEN
04200 checkline:-checkline.sub(3,checkline.length-2);
04240 IF checkline.strip.length>x THEN x:=checkline.strip.length;
04280 ! ***** 2 ***** ;
04320 WHILE checkline.more DO
04360 IF checkline.getchar NE ' ' THEN blank[checkline.pos-1]:=FALSE;
04400 checkline.setpos(1);
04440 END check;
04480
04520 COMMENT This procedure dose the following things:
04560
04600 1) Reads commands acoording to the making of
04640 straight right margin and sets the left
04680 margin.
04720 Rubs out the command characters or the
04760 entier line if marked with '&'.
04800 Exeption if command is '_', then the dot
04840 is replaced with an '_'.
04880
04920 2) Performes the number of halfstep linefeeds
04960 stored in the variable "linefeed".
05000
05040 3) If a group of lines contains a section of
05080 blanks all but the first one is treated as
05120 ordinary characters.
05160 If automatic is TRUE and characterposition
05200 rightmarg not contains a blank and the rest
05240 of the line is blank then auto will be set
05280 to TRUE.
05320
05360 4) For lines not belonging to a que and before
05400 the first queline is put out the length (in
05440 1/120 inch parts) of the spaces, requested to
05480 achive a straight right margin is calculated.
05520 Note that if the number of characters in a line
05560 is graeater than the number of characterpositions
05600 the length of the spaces will be decreased.
05640 If auto is TRUE then "autochar" will indicate
05680 wich positons not containing dummyblanks.
05720
05760 5) The characters is put out and if it's a blank
05800 the unnormal length of it is achived by sending
05840 ESC-sequences to the Diablo terminal (see the
05880 Diablo 1620 manual). ;
05920
05960 PROCEDURE output(linefeed,outputline);
06000 TEXT outputline;
06040 INTEGER linefeed;
06080 BEGIN
06120 COMMENT slask4: Textdummy.
06160 autochar: see comment 4 above.
06200 skip: Is set to TRUE if the command '&' is given.
06240 slask1: Characterdummy.
06280 command: To store commands in.
06320 re: Realdummy.
06360 rubout: The number of commandcharacters to be rubed
06400 out in the begining of outputline.
06440 marg: Integerdummy.
06480 bla: Number of blanks in outputline.
06520 spac: Dummy for space.
06560 extr: Dummy for extra.
06600 tab: Number of blanks after each other in
06640 outputline.
06680 tabmax: Maximum value of tab during this line.
06720 tabnext: The second greatest value of tab during
06760 this line. Are used to detect if a line
06800 belongs to a table or simular when
06840 automatic is used.
06880 i: Loopinteger.
06920 chrlength: The length of a normal character, usually
06960 10, but there are typewheels for the Diablo
07000 with only 10 characters/inch, which means
07040 that the character length is 12. Don't
07080 forget to turn the switch on the Diablo. ;
07120
07160 TEXT slask4;
07200 BOOLEAN ARRAY autochar[1:140];
07240 BOOLEAN skip;
07280 CHARACTER slask1, command;
07320 REAL re;
07360 INTEGER rubout, marg, bla ,spac, extr, tab, tabnext, tabmax, i;
07400 INTEGER chrlength;
07440 slask4:-copy(blanks(140));
07480 chrlength:=10;
07520 IF fetchar(outputline,outputline.strip.length) EQ char(12) THEN
07560
07600 COMMENT When a formfeed character apears in the variable
07640 "page" is increased by one. And if the last
07680 character before it was one of ".:;!?" then it's
07720 also considered as endof this section of the text. ;
07760
07800 BEGIN
07840 page:=page+1;
07880 slask1:=fetchar(outputline,outputline.strip.length-1);
07920 IF slask1 EQ '.' OR slask1 EQ ':' OR slask1 EQ ';'
07960 OR slask1 EQ '!' OR slask1 EQ '?' THEN BEGIN
08000 IF justify OR automatic THEN resetj:=TRUE;
08040 j:=FALSE;
08080 END;
08120 END;
08160 ! ***** 1 ***** ;
08200 IF outputline.getchar EQ '.' THEN BEGIN
08240 command:=outputline.getchar;
08280 IF command EQ '%' THEN
08320 outputline:-outputline.sub(3,outputline.length-2)
08360 ELSE BEGIN
08400 multicommand:
08440 IF command EQ '&' THEN BEGIN
08480 skip:=TRUE;
08520 outputline.setpos(outputline.pos+2);
08560 command:=outputline.getchar;
08600 END;
08640 IF command EQ 'J' OR command EQ 'j' THEN BEGIN
08680 justify:=TRUE;
08720 j:=TRUE;
08740 automatic:=false;
08760 END;
08800 IF command EQ 'F' OR command EQ 'f' THEN j:=TRUE;
08840 IF command EQ 'A' OR command EQ 'a' THEN automatic:=TRUE;
08880 IF command EQ 'N' OR command EQ 'n' THEN BEGIN
08920 automatic:=FALSE;
08940 resetj:=false;
08960 j:=FALSE;
09000 justify:=FALSE;
09040 END;
09080 IF digit(command) THEN BEGIN
09120 outputline.setpos(outputline.pos-1);
09160 marg:=scanint(outputline);
09200 slask1:=outputline.getchar;
09240 IF slask1 EQ 'L' OR slask1 EQ 'l' THEN leftmarg:=marg
09280 ELSE IF slask1 EQ 'R' OR slask1 EQ 'r' THEN rightmarg:=marg;
09320 END;
09360 IF skip THEN BEGIN
09400 IF command EQ ' ' THEN GOTO out
09440 ELSE BEGIN
09480 outputline.setpos(outputline.pos+2);
09520 command:=outputline.getchar;
09560 GOTO multicommand;
09600 END;
09640 END
09680 ELSE BEGIN
09720 rubout:=outputline.pos-1;
09760 outputline.setpos(1);
09800 END;
09840 IF command EQ '_' THEN outputline.putchar('_')
09880 ELSE FOR i:=1 STEP 1 UNTIL rubout DO outputline.putchar(' ');
09920 END;
09960 END;
10000 ! ***** 2 ***** ;
10040 IF NOT other THEN BEGIN
10080 FOR i:=1 STEP 1 UNTIL linefeed DO BEGIN
10120 outchr(out_file,char(27),1);
10160 outchr(out_file,'U',1);
10200 END;
10240 END ELSE IF linefeed>0 THEN outchr(out_file,char(10),1);
10280 outputline.setpos(1);
10320 ! ***** 3 ***** ;
10360 IF automatic AND NOT quelines THEN BEGIN
10400 auto:=FALSE;
10440 j:=FALSE;
10480 i:=rightmarg+1;
10520 WHILE blank[i] AND i<140 DO i:=i+1;
10560 IF i=140 AND NOT blank[rightmarg] AND blank[140] THEN BEGIN
10600 auto:=TRUE;
10640 j:=TRUE;
10680 END;
10720 END;
10760 ! ***** 4 ***** ;
10800 IF j AND NOT other THEN BEGIN
10840 IF NOT quelines THEN BEGIN
10880 IF auto THEN BEGIN
10920 ai:=leftmarg;
10960 FOR i:=1 STEP 1 UNTIL leftmarg DO autochar[i]:=TRUE;
11000 FOR i:=leftmarg+1 STEP 1 UNTIL 140 DO autochar[i]:=FALSE;
11040 END;
11080 tab:=0;
11120 tabnext:=0;
11160 tabmax:=0;
11200 FOR i:=leftmarg+1 STEP 1 UNTIL x DO BEGIN
11240 IF blank[i] THEN tab:=tab+1 ELSE BEGIN
11280 IF tab>tabmax THEN BEGIN
11320 tabnext:=tabmax;
11360 tabmax:=tab;
11400 END
11440 ELSE IF tab>tabnext THEN tabnext:=tab;
11480 tab:=0;
11520 END;
11560 IF tab>1 THEN blank[i]:=FALSE ELSE
11600 IF auto THEN BEGIN
11640 autochar[i]:=TRUE;
11680 ai:=ai+1;
11720 blank[ai]:= IF tab=1 THEN TRUE ELSE FALSE;
11760 END;
11800 END;
11840 IF auto THEN BEGIN IF tabmax-tabnext>2 THEN auto:=FALSE; END;
11880 IF auto THEN BEGIN
11920 FOR i:=ai+1 STEP 1 UNTIL x DO blank[i]:=TRUE;
11960 x:=ai;
12000 END;
12040 FOR i:=leftmarg+1 STEP 1 UNTIL x DO IF blank[i] THEN
12080 bla:=bla+1;
12120 IF bla>0 THEN BEGIN
12160 re:=(rightmarg-x)*chrlength/bla;
12200 space:=chrlength+entier(re);
12240 extra:=(re-entier(re))*bla;
12280 END;
12320 END;
12360 IF auto THEN BEGIN
12400 FOR i:=1 STEP 1 UNTIL rightmarg DO
12440 IF autochar[i] THEN slask4.putchar(outputline.getchar)
12480 ELSE outputline.getchar;
12520 outputline:-slask4;
12560 outputline.setpos(1);
12600 END;
12640 ! ***** 5 ***** ;
12680 IF (space<126 OR (space<127 AND extra=0)) AND space>=0 THEN BEGIN
12720 FOR i:=1 STEP 1 UNTIL leftmarg DO
12760 outchr(out_file,outputline.getchar,1);
12800 extr:=extra;
12840 FOR i:=leftmarg+1 STEP 1 UNTIL x DO BEGIN
12880 IF blank[i] THEN BEGIN
12920 IF extr>0 THEN BEGIN
12960 spac:=space+1;
13000 extr:=extr-1;
13040 END ELSE
13080 spac:=space;
13120 IF spac=34 OR spac=35 OR spac=63 OR spac=90 OR spac=91 OR
13160 spac=92 OR spac=95 OR spac=123 OR spac=125 THEN BEGIN
13200 outchr(out_file,char(32),1);
13240 spac:=spac-chrlength;
13280 END;
13320 IF spac=8 THEN BEGIN
13360 outchr(out_file,char(8),1);
13400 spac:=18;
13440 END;
13480 outchr(out_file,char(27),1);
13520 outchr(out_file,char(31),1);
13560 outchr(out_file,char(spac+1),1);
13600 outchr(out_file,outputline.getchar,1);
13640 outchr(out_file,char(27),1);
13680 outchr(out_file,char(31),1);
13720 outchr(out_file,char(chrlength+1),1);
13760 END blank ELSE
13800 outchr(out_file,outputline.getchar,1);
13840 END;
13880 END ELSE outstring(out_file,outputline.strip);
13920 END ELSE outstring(out_file,outputline.strip);
13960 outchr(out_file,char(13),1);
14000 out:END output;
14040
14080 REF (infile) in_file;
14120 REF (outfile) out_file;
14160 REF (head) lineque;
14200 link CLASS line;
14240
14280 COMMENT The attributes of the "line" elements, which
14320 can be put into the lineque are:
14360
14400 1) contents: A textvariable containing the
14440 current textline.
14480
14520 2) kog: The number of halfstep linefeeds to be
14560 performed before the line is put out. ;
14600
14640 BEGIN
14680 INTEGER kog;
14720 TEXT contents;
14760 contents:-blanks(140);
14800 END;
14840 COMMENT line1: Contains current textline (contents)
14880 and the linefeedvalue (kog).
14920 queoutline: Dummyline.
14960 arg, key: see external procedure scan.
15000 line2: Stores preceding line if not stored in que.
15040 subcommands: Textconstant.
15080 switchcommands: Textconstant.
15120 switch: Contains commandstring.
15160 triggs: Textconstant.
15200 t: Textdummy (Rescan).
15240 slask2: Textdummy.
15280 newfile, started, end_videdp: Textconstants.
15320 overwriting, inoutequal, tocontinue: Textconstants.
15360 command:Contains current command.
15400 slask3: Characterdummy.
15440 blank: see comment 2, check.
15480 ready: Tells if there any lines in lineque.
15520 oldl: Tells if the number stored in "l" is from
15560 this time or the time before.
15600 automatic: If it's TRUE the inputlines are
15640 supposed to have a straight right margin
15680 made by entier blanks.
15720 auto: If TRUE the inputline had straight right
15760 margin.
15800 quelines: Tells if the lines to output comes from
15840 a que or not.
15880 dot: Tells i the first character in the current
15920 line is a '.'.
15960 b: Tells if there have been any dot-line without
16000 a command.
16040 j: Tells if the line should get a straight right
16080 margin.
16120 firstline: Tells if the current line is the first
16160 from a new file.
16200 sequence: TRUE if inputfile has linenumbers.
16240 resetj: Set to true after blankline if automatic or
16280 justify is true.
16320 justify: Are set TRUE when the j command is given.
16360 other: If TRUE text is to be put out on other term-
16400 inal than Diablo.
16440 cog: Line spacing.
16480 r: Number of normal lines in que.
16520 u: Number of u-lines in que.
16560 l: Number of l-lines in que.
16600 x: see comment 1, check.
16640 i: Loopinteger.
16680 space: length of the spaces (1/120 inch).
16720 extra: The extra first spaces should be one 1/120
16760 inch part longer than space tells.
16800 leftmarg: Leftmargin.
16840 rightmarg: Rightmargin.
16880 index: see external procedure scan.
16920 page: Number of pages.
16960 ai: Loopinteger. ;
17000 REF (line) line1,queoutline;
17040 TEXT ARRAY arg, key[1:arrayindex];
17080 TEXT line2, subcommands, switchcommands, switc, triggs, t, slask2;
17120 TEXT newfile, started, end_videdp, overwriting, inoutequal;
17160 TEXT tocontinue;
17200 CHARACTER command, slask3;
17240 BOOLEAN ARRAY blank[1:140];
17280 BOOLEAN ready, oldl, automatic, auto, quelines, dot, b, j;
17320 BOOLEAN firstline, sequense, resetj, justify, other;
17360 INTEGER cog,r,u,l,x,i,space,extra;
17400 INTEGER leftmarg, rightmarg, index, page, ai;
17440 key[1]:-copy("/DEFAULT:/D:/J/O/A/RL/COG:/L:/R:=");
17480 key[2]:-key[1].sub(10,3); ! /D ;
17520 key[3]:-key[1].sub(13,2); ! /J ;
17560 key[4]:-key[1].sub(15,2); ! /O ;
17600 key[5]:-key[1].sub(17,2); ! /A ;
17640 key[6]:-key[1].sub(19,3); ! /RL ;
17680 key[7]:-key[1].sub(22,5); ! /COG: ;
17720 key[8]:-key[1].sub(27,3); ! /L: ;
17760 key[9]:-key[1].sub(30,3); ! /R: ;
17800 key[10]:-key[1].sub(33,1); ! = ;
17840 key[1]:-key[1].sub(1,9); ! /DEAFAULT: ;
17880 newfile:-copy("Input new files and commands.");
17920 started:-copy("[VIDEDP started]");
17960 end_videdp:-copy("[End of VIDEDP execution]");
18000 overwriting:-copy("%VIDEDP - Overwriting existing file: ");
18040 inoutequal:- copy("?VIDEDP - Input file = output file.");
18080 tocontinue:- copy("To continue push RETURN. ");
18120 subcommands:-copy("UuLl+_ ");
18160 switchcommands:-copy("AaFfJjNn0123456789 ");
18200 triggs:-copy("AaFfJj ");
18240 ! OBS blank no swcomm. ;
18280 slask2:-blanks(140);
18320
18360 trmop(8R2006,sysout,1); ! .TTY FORM;
18400 trmop(8R2010,sysout,1); ! .TTY NO CRLF;
18440 trmop(8R2013,sysout,1); ! .TTY NO GAG;
18480 trmop(8R2005,sysout,1); ! .TTY TAB;
18520
18560 outtext("[VIDEDP Version 1 is here.]"); outimage;
18600
18640 COMMENT Rescan is used to read command-string given
18680 simultanious with the call of VIDEDP. ;
18720
18760 IF rescan THEN BEGIN
18800 inimage;
18840 t:-sysin.image.strip;
18880 IF t=/=NOTEXT THEN t:-copy(t);
18920 scanto(t,'-'); ! t.pos=1 or after '-' in switchline ;
18960 IF t.pos>1 THEN switc:-rest(t);
19000 IF switc == NOTEXT THEN GOTO prompter;
19040 END scanning switchline
19080 ELSE BEGIN
19120 prompter: IF FALSE THEN
19160 new_file:
19200 BEGIN
19240 outstring(sysout,newfile);
19280 outchr(sysout,char(13),1);
19320 outchr(sysout,char(10),1);
19360 forceout(sysout);
19400 END;
19440 switc:-NOTEXT;
19480 switc:-inline("*",sysin); ! To read new file and commandline.;
19520 IF switc==NOTEXT THEN GOTO out;
19560 END;
19600 index:=scan(switc,arrayindex,arg,key,1);
19640 WHILE index NE 0 DO BEGIN
19680 error(2);
19720 index:=scan(inline("*",sysin),arrayindex,arg,key,1);
19760 END;
19800 IF arg[arrayindex]==NOTEXT THEN BEGIN
19840 arg[arrayindex]:-arg[1]; ! If no outfile is given the infile;
19880 arg[1]:-copy("TTY:"); ! will be find in arg[1]. ;
19920 END
19960 ELSE BEGIN
20000 outstring(sysout,started);
20040 outchr(sysout,char(13),1); outchr(sysout,char(10),1);
20080 forceout(sysout);
20120 END;
20160 IF arg[1] = arg[arrayindex] THEN
20200 BEGIN outstring(sysout,inoutequal);
20240 outchr(sysout,char(13),1); outchr(sysout,char(10),1);
20280 GOTO new_file;
20320 END;
20360 in_file:-findinfile(arg[arrayindex]);
20400 IF in_file==NONE THEN error(3);
20440 in_file.open(blanks(140));
20480 IF arg[1]="TTY:" THEN out_file:-sysout
20520 ELSE BEGIN
20560 IF findinfile(arg[1]) =/= NONE THEN
20600 BEGIN outstring(sysout,overwriting); outstring(sysout,arg[1]);
20640 outchr(sysout,char(13),1); outchr(sysout,char(10),1);
20680 outstring(sysout,tocontinue);
20720 forceout(sysout); sysin.inimage;
20760 END;
20800 out_file:-findoutfile(arg[1]);
20840 IF out_file==NONE THEN error(4);
20880 out_file.open(blanks(140));
20920 END;
20960 IF arg[3]=/=NOTEXT THEN BEGIN
21000 justify:=TRUE;
21040 j:=TRUE;
21080 END ELSE justify:=FALSE;
21120 IF arg[4]=/=NOTEXT THEN other:=TRUE ELSE other:=FALSE;
21160 IF arg[5]=/=NOTEXT THEN automatic:=TRUE ELSE automatic:=FALSE;
21200 cog:= IF arg[7]=/=NOTEXT THEN arg[7].getint ELSE 2;
21240 leftmarg:= IF arg[8]=/=NOTEXT THEN arg[8].getint ELSE 5;
21280 rightmarg:= IF arg[9]=/=NOTEXT THEN arg[9].getint ELSE 72;
21320 lineque:- NEW head;
21360 queoutline:- NEW line;
21400 FOR i:=1 STEP 1 UNTIL 140 DO blank[i]:=TRUE;
21440 ready:=TRUE;
21480 oldl:=TRUE;
21520 firstline:=TRUE;
21560 line2:-NOTEXT;
21600
21640 new_line:
21680 IF in_file.endfile THEN BEGIN ! Checks if end of infile. ;
21720 in_file.close;
21760 outchr(out_file,char(12),1);
21800 IF out_file=/=sysout THEN out_file.close;
21840 GOTO new_file;
21880 END;
21920 line1:- NEW line;
21960 in_file.image:-line1.contents;
22000 in_file.inimage; ! Reads new line from infile. ;
22040 IF in_file.endfile THEN BEGIN
22080 in_file.image:-NOTEXT; ! To get rid of "/*". ;
22120 j:=FALSE;
22160 END;
22200 IF firstline THEN BEGIN
22240 page:=1;
22280 sequense:=numbered; ! Checks if infile is numbered. ;
22320 IF NOT fetchar(line1.contents,1) EQ char(12) THEN
22360 outchr(out_file,char(12),1);
22400 firstline:=FALSE;
22440 END;
22480 IF sequense THEN line1.contents:-line1.contents.sub(7,133);
22520 afterque:
22560 IF resetj THEN BEGIN ! To reset j after blankline. ;
22600 j:=TRUE;
22640 resetj:=FALSE;
22680 END;
22720 dot:=FALSE;
22760 IF line1.contents.sub(1,1) EQ "." THEN dot:=TRUE;
22800 IF line1.contents.strip==NOTEXT
22840 OR fetchar(line1.contents,1) EQ char(12)
22880
22920 COMMENT If a line only contains blanks or if the first
22960 character in a line is a formfeed then this is
23000 considered as end of the previous textpart. ;
23040
23080 THEN BEGIN
23120 IF fetchar(line1.contents,1) EQ char(12) THEN page:=page+1;
23160 IF justify OR automatic THEN resetj:=TRUE;
23200 j:=FALSE;
23240 dot:=FALSE;
23280 END;
23320 IF dot THEN BEGIN
23360 command:=fetchar(line1.contents,2);
23400 IF command EQ '%' THEN BEGIN
23440 dot:=FALSE;
23480 END;
23520
23560 COMMENT Cheks if the commands are supposed to be
23600 processed now or not until they reach the
23640 outputprocedure. ;
23680
23720 IF command EQ '&' THEN BEGIN
23760 slask2:=line1.contents;
23800 slask3:=char(0);
23840 slask3:=findtrigger(slask2,triggs);
23880 IF NOT slask3 EQ char(0) THEN j:=FALSE;
23920 dot:=FALSE;
23960 END;
24000 slask2:=scanto(switchcommands,command);
24040 IF switchcommands.pos<8 THEN j:=FALSE;
24080 IF switchcommands.pos<20 THEN dot:=FALSE;
24120 switchcommands.setpos(1);
24160 END;
24200 no_command:
24240 IF ready THEN
24280
24320 COMMENT This part of the program is only executed if
24360 lineque is empty. This to get a faster handeling
24400 of textparts not containing any indices or
24440 underlinings. ;
24480
24520 BEGIN
24560 IF NOT dot THEN BEGIN
24600 IF line2 NE NOTEXT THEN BEGIN
24640 check(line2);
24680 IF cog-l>2 THEN output(cog-l,line2) ELSE output(2,line2);
24720 l:=0;
24760 FOR i:=1 STEP 1 UNTIL x DO blank[i]:=TRUE;
24800 x:=0;
24840 END;
24880 line2:-line1.contents;
24920 GOTO new_line;
24960 END ELSE IF line2 NE NOTEXT THEN BEGIN
25000 queoutline.contents:-line2; !TO GET LINE2 INTO QUE;
25040 IF cog-l>2 THEN queoutline.kog:=cog-l ELSE queoutline.kog:=2;
25080 l:=0;
25120 queoutline.into(lineque);
25160 check(line2);
25200 line2:-NOTEXT;
25240 r:=1;
25280 END
25320 END;
25360
25400 COMMENT This part of the program reads the commands
25440 acoording to indices and underlinings and
25480 calculates the correct number of halfstep
25520 linefeeds to be performed before the output of
25560 the current line and stores theresult in "kog". ;
25600
25640 IF dot THEN BEGIN
25680 IF command EQ 'U' OR command EQ 'u' THEN BEGIN
25720 IF NOT oldl OR b OR r>0 THEN BEGIN
25760 ready:=TRUE;
25800 GOTO queoutput;
25840 END;
25880 IF l=0 AND u=1 AND cog=4 THEN lineque.first QUA line .kog:=2;
25920 IF u=0 THEN BEGIN
25960 IF l=0 AND cog=4 THEN line1.kog:=3 ELSE line1.kog:=2;
26000 END
26040 ELSE line1.kog:=1;
26080 u:=u+1;
26120 END U;
26160 IF command EQ 'L' OR command EQ 'l' THEN BEGIN
26200 IF u>0 AND r=0 AND NOT b THEN error(5);
26240 line1.kog:=1;
26280 IF oldl THEN l:=0;
26320 oldl:=FALSE;
26360 l:=l+1;
26400 END L;
26440 IF command EQ '+' OR command EQ '_' THEN BEGIN
26480 line1.kog:=0;
26520 END + _;
26560 IF command=' ' THEN BEGIN
26600 IF NOT oldl OR r>0 THEN BEGIN
26640 ready:=TRUE;
26680 GOTO queoutput;
26720 END;
26760 IF b THEN line1.kog:=2 ELSE
26800 IF u>0 THEN line1.kog:=1
26840 ELSE IF cog-l>2 THEN line1.kog:=cog-l
26880 ELSE line1.kog:=2;
26920 b:=TRUE;
26960 END;
27000 slask2:=scanto(subcommands,command);
27040 IF subcommands.pos>8 THEN error(1);
27080 subcommands.setpos(1);
27120 END ELSE BEGIN
27160 IF NOT oldl OR b OR r>0 THEN BEGIN
27200 ready:=TRUE;
27240 GOTO queoutput;
27280 END;
27320 r:=r+1;
27360 IF u>0 THEN line1.kog:=1
27400 ELSE IF cog-l>2 THEN line1.kog:=cog-l
27440 ELSE line1.kog:=2;
27480 END;
27520 ready:=FALSE;
27560 line1.into(lineque);
27600 check(line1.contents);
27640 GOTO new_line;
27680
27720 queoutput:
27760 WHILE NOT lineque.empty DO BEGIN
27800 queoutline:-lineque.first;
27840 lineque.first.out;
27880 output(queoutline.kog,queoutline.contents);
27920 quelines:=TRUE;
27960 END;
28000 FOR i:=1 STEP 1 UNTIL x DO blank[i]:=TRUE;
28040 x:=0;
28080 IF oldl THEN l:=0;
28120 oldl:=TRUE;
28160 u:=0;
28200 b:=FALSE;
28240 r:=0;
28280 quelines:=FALSE;
28320 GOTO afterque;
28360
28400 out:
28440 outstring(sysout,end_videdp);
28480 outchr(sysout,char(13),1);
28520 outchr(sysout,char(10),1);
28560 forceout(sysout);
28600 exit(0);
28640 END;
28680 END;