DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 1 DSK:MIDED1.SIM 23-MAR-1979 11:22 00040 OPTIONS(/l/e); COMMENT DISPLAY EDITOR. SIM013 W LINE 40 EXTERNAL SWITCH ALREADY SPECIFIED, IGNORED 00080 See VISTA.MAN for explanations on the routines called by this program, 00120 taken from the class mvista; 00160 COMMENT Copyright (c) Swedish National Defense Research Institute; 00200 COMMENT%IF CALLMAC; 00240 EXTERNAL PROCEDURE vtmcur, vtsynk, vtisng; 00280 COMMENT%IFEND CALLMAC; 00320 EXTERNAL PROCEDURE outche, tshift, pgcopy; 00360 EXTERNAL INTEGER PROCEDURE iondx, vdlno; 00400 EXTERNAL TEXT PROCEDURE conc, front, storbokstav, litenbokstav, 00440 compress, rest, inline, frontstrip, scanto, from, upto, maketext; 00480 EXTERNAL CHARACTER PROCEDURE findtrigger, fetchar, getch; 00520 EXTERNAL INTEGER PROCEDURE search, scanint, sscan, checkint; 00560 EXTERNAL REF (infile) PROCEDURE findinfile; 00600 EXTERNAL REF (outfile) PROCEDURE findoutfile; 00640 EXTERNAL INTEGER PROCEDURE trmop, gettab; 00680 EXTERNAL BOOLEAN PROCEDURE puttext, numbered, dotypeout; 00720 EXTERNAL PROCEDURE depchar, outstring, forceout, echo; 00760 EXTERNAL PROCEDURE outchr, abort, exit; 00800 EXTERNAL BOOLEAN PROCEDURE meny; 00840 EXTERNAL CLASS termty; 00880 00920 COMMENT%IF CALLMAC; 00960 EXTERNAL CLASS mmista; 01000 mmista CLASS mided1; SIM052 W LINE 1000 ILLEGAL SWITCH SETTING 01040 COMMENT%IFNOT CALLMAC 01080 EXTERNAL CLASS mvista; 01120 COMMENT%IFNOT CALLMAC 01160 mvista CLASS vided1; 01200 COMMENT%IFEND CALLMAC; 1201 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 2 DSK:MIDED1.SIM 23-MAR-1979 11:22 B1 01240 BEGIN 01280 01320 CLASS qregister(qwidth, qheight, qname); 01360 INTEGER qwidth, qheight; TEXT qname; B2 01400 BEGIN 01440 COMMENT qregister is a class containing segments 01480 of text which the user has stored away for 01520 insertion in other places in his text. A qregister 01560 is a square of text, with a width 01600 (characters/line) and height (number of lines). 01640 01680 Qregister is a separately compiled class, since 01720 the class should be available outside the body of 01760 VIDED1 and VIDED2 in the preamble of the VIDED 01800 program, so that a user can retain qregister 01840 contents between successive editings of different 01880 or the same text; 01920 01960 TEXT ARRAY lines[0:qheight-1]; 02000 REF (qregister) next_qregister; E2 02040 END; 02080 02120 INTEGER last_line_number; ! When creating line-numbered files, 02160 number of last line which has been output to the output file; 02200 INTEGER line_number; ! temporary line number value; 02240 INTEGER largest_line_number; ! Largest line number yet created; 02280 INTEGER increment; ! between new line-numbered lines; 02300 BOOLEAN videdp; ! count lines in VIDEDP fashion; 02320 BOOLEAN numbered_infile; ! input file had line numbers; 02360 BOOLEAN backuping; ! Auto-backup in progress; 02400 BOOLEAN merrygoround; ! Either auto-backup or moving to earlier page; 02440 BOOLEAN swedish, tmpoutfile; 02480 REF (infile) editin; ! Input file to be edited; 02520 REF (outfile) editout; ! Output file from editing; 02560 INTEGER showdefault; ! how many lines to show on screen; 02600 INTEGER pageheight; ! plus height = number of lines kept in core; 02660 INTEGER warningheight; ! before page-end-warning; 02680 INTEGER leftmargin, rightmargin; ! used when justifying 02720 paragraphs; 02760 BOOLEAN pageheader; ! Put header and number on new pages; 02800 TEXT command; ! Text of user &command during editing; 02840 TEXT belowcommand; ! Screen text below user &command; 02880 INTEGER keys; ! Max dimension of the arrays below; 02920 COMMENT the arrays below contain handling of switches in 02960 the initial command to VIDED giving file names etc: 03000 For a description of these arrays, see the large comment 03040 in the beginning of the file SCAN.SIM; 03080 TEXT ARRAY arg, key, ini(1:27); ! User switch.ini and file creation 03120 commands; 03160 CHARACTER dot; ! this character in pos 1 of line stops &JU, &FI; 03200 03240 mvistax CLASS vided1x; DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 2-1 DSK:MIDED1.SIM 23-MAR-1979 11:22 B3 03280 BEGIN 03320 INTEGER sub_page_number; ! too large pages divided into; 03360 INTEGER ARRAY screen_length[0:height-1]; ! when overwriting 03400 part of the screen with corrected text, this array keeps the old 03440 line lengthes to know how much has to be overwritten; 03480 TEXT ARRAY top_of_page[0:pageheight]; ! lines which have rolled 03520 out on top of the screen but have not yet been output; 03560 INTEGER top_size; ! Number of lines in "top_of_page"; 03600 INTEGER top_fill; ! Number of lines currently in "top_of_page"; 03640 INTEGER ttytab; ! Value of monitor TRMOP .TTY TAB settings, 03680 governs the handling of characters at terminal output; 03720 INTEGER pagenumber; ! Count of input page number; 03760 INTEGER debugslow; ! When this variable is nonzero, the program can 03800 be artificially slowed down to create the kind of bugs which only 03840 occur with a heavily loaded computer; 03880 INTEGER out_pagenumber; ! Count of output page number; 03920 INTEGER first_text_pos;! 8 for numbered, 0 for other files; 03960 INTEGER pbottom; ! Unwanted size of blank area in &nPS command; 04000 CHARACTER control_f, control_d, control_v, control_u, control_w; 04040 ! What is input when the terminal user pushes CONTROL plus 04080 one of the letters f, d, v, u or w; 04120 BOOLEAN ARRAY tab_position[0:width]; ! tabs set by user; 04160 INTEGER margin_width; ! rightmargin-leftmargin; 04200 INTEGER cover_length; ! cover old text at end of line; 04240 BOOLEAN first_input_line; ! true when only one line has been input 04280 from the input text file; 04320 BOOLEAN nooutput; ! During &_ monitor command; 04360 BOOLEAN long_line_warned; ! user has been warned about too long 04400 input lines; 04440 BOOLEAN addff; ! Add
before next output line; 04480 BOOLEAN inhibit_ff; ! form feed has been copied; 04520 BOOLEAN after_addff; ! Outputting second line of a page; 04560 BOOLEAN endpage; ! Last line of a page has been read from file; 04600 BOOLEAN verybadscreen; ! Terminal screen must be restored from the 04640 computer; 04680 BOOLEAN printing; ! New input lines to be printed on terminal; 04720 BOOLEAN emptyscroll; ! Scroll in blank lines at bottom of screen; 04760 BOOLEAN psearch; ! TRUE during &nPS command execution; 04800 BOOLEAN pfound; ! TRUE when large blank bottom found during &nPS; 04840 BOOLEAN command_done; ! VIDED command correctly done; 04880 REF (qregister) qregisters; ! See description of &Q editor 04920 command; 04960 TEXT editin_image_strip; ! Stripped text of last line from the input 05000 text file; 05040 TEXT other_editin_image; ! Extra image to be used sometimes; 05080 TEXT line_model; ! Extra line, often blank, for use sometimes; 05120 TEXT editout_image; ! Image of output text file; 05160 TEXT header; ! Header at top of each page; 05200 TEXT sub_header; ! Subheader = line below header; 05240 TEXT page_word; ! Contains the word "PAGE"; 05280 TEXT sid_word; ! Contains the word "SID", swedish for "PAGE"; 05320 TEXT sixdigits; ! Used to produce line number text segments; DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 2-2 DSK:MIDED1.SIM 23-MAR-1979 11:22 05360 TEXT page_end_marker; ! Funny text warning user of end-of-page; 05400 TEXT output_line; ! Line to be output to output text file; 05440 TEXT first_scroll_line; ! Top-of-page-line to be scrolled out; 05480 COMMENT REF-variables below used to get faster execution by using 05520 the CALL procedure instead of ordinary PROCEDURE invokings; 05560 REF (one_more_line_please) p_one_more_line_please; 05600 REF (scroll) p_scroll; 05640 REF (editin_true_inimage) p_editin_true_inimage; 05680 REF (true_write) p_true_write; 05720 REF (write) p_write; 05760 REF (editin_inimage) p_editin_inimage; 05800 REF (lower_line) lower_lines; 5801 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 3 DSK:MIDED1.SIM 23-MAR-1979 11:22 05840 PROCEDURE blankterminal; B4 05880 BEGIN IF addaltmode AND NOT homesingle 05920 THEN outchr(terminalout,altmode,1); 05960 outchr(terminalout,home,1); 06000 IF addaltmode AND NOT clearsingle 06040 THEN outchr(terminalout,altmode,1); 06080 outchr(terminalout,erasescreen,1); 06120 outchr(terminalout,delayer,10); E4 06160 END; 06200 06240 TEXT PROCEDURE make_five_digits(i); 06280 INTEGER i; B5 06320 BEGIN COMMENT prepars text in line-number-field of output line; 06360 sixdigits.putint(i+100000); 06400 make_five_digits:- sixdigits.sub(2,5); 06440 IF i > largest_line_number THEN largest_line_number:= i; E5 06480 END; 06520 06560 INTEGER PROCEDURE checksum; B6 06600 BEGIN COMMENT makes a checksum of what is shown on the screen; 06640 INTEGER i, sum; 06680 FOR i:=1 STEP 1 UNTIL height DO B7 06720 BEGIN 06760 sum:= sum + i * rank(fetchar(screen[i-1],i+13)); E7 06800 END; 06840 checksum:= sum; E6 06880 END; 6881 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 4 DSK:MIDED1.SIM 23-MAR-1979 11:22 06920 TEXT PROCEDURE warning(message, line2); 06960 VALUE message, line2; TEXT message, line2; B8 07000 BEGIN INTEGER hpos, vpos, sl0; 07040 hpos:= q_horizontalpos; vpos:= q_verticalpos; 07080 dotypeout(terminalout); home_the_cursor; specialtext; 07120 INSPECT terminalin DO INSPECT terminalout DO B9 07160 BEGIN command_done:= TRUE; ! since one warning is enough; 07200 IF message.length >= widthm1-14 THEN message:- 07240 message.sub(1,widthm1-15); IF line2.length >= widthm1 THEN 07280 line2:- line2.sub(1,widthm1); 07320 outtext("?VIDED - "); 07360 outtext(message); outtext(" "); 07400 sl0:= image.pos-1; breakoutimage; outimage; 07440 outtext(IF line2 == NOTEXT THEN 07480 "To continue push RETURN. " ELSE line2); breakoutimage; 07520 inimage; storbokstav(terminalin.image.sub(1,10)); 07560 warning:- terminalin.image; E9 07600 END; 07640 normaltext; 07680 IF q_display_output THEN B10 07720 BEGIN 07760 home_the_cursor; outtext(screen[0].sub(1,sl0)); 07800 move_the_cursor_to(0,1); outtext(screen[1].sub(1, 07840 IF line2 == NOTEXT THEN 39 ELSE line2.length)); E10 07880 END; 07920 move_the_cursor_to(hpos,vpos); E8 07960 END; 7961 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 5 DSK:MIDED1.SIM 23-MAR-1979 11:22 08000 REF (qregister) PROCEDURE find_qregister(qname); 08040 TEXT qname; B11 08080 BEGIN COMMENT find the latest qregister with a given name; 08120 COMMENT See description of the "Q" VIDED command; 08160 REF (qregister) scanner; 08200 storbokstav(qname); 08240 scanner:- qregisters; 08280 WHILE scanner =/= NONE DO B12 08320 BEGIN IF scanner.qname EQ qname THEN GOTO out; 08360 scanner:- scanner.next_qregister; E12 08400 END; 08440 out: find_qregister:- scanner; E11 08480 END; 08520 08560 TEXT PROCEDURE pop_line; 08600 COMMENT get a line from stack of lines pushed below screen; 08640 INSPECT lower_lines WHEN lower_line DO B13 08680 BEGIN pop_line:- linetext; lower_lines:- next_lower_line; E13 08720 END; 8721 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 6 DSK:MIDED1.SIM 23-MAR-1979 11:22 08722 INTEGER PROCEDURE videdpcount; B14 08724 BEGIN INTEGER line, count; CHARACTER two; TEXT t; 08726 FOR line:= -heightm1 step 1 until top_fill DO B15 08727 BEGIN 08728 t:- IF line <= 0 THEN screen(-line) ELSE top_of_page(line); 08731 IF fetchar(t,1) NE '.' THEN count:= count+2 B16 08732 ELSE BEGIN 08734 two:= fetchar(t,2); 08736 IF two NE '&' AND two NE '_' AND two NE '+' THEN B17 08737 BEGIN 08738 count:= count + 08741 (IF two = 'u' OR two = 'U' OR two = 'L' or two = 'l' THEN 08742 1 ELSE 2); E17 08744 END; E16 08746 END; E15 08748 END; 08750 videdpcount:= count//2+1; E14 08752 END; 8753 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 7 DSK:MIDED1.SIM 23-MAR-1979 11:22 08760 CLASS lower_line(linetext); 08800 TEXT linetext; B18 08840 BEGIN COMMENT Text of line which has been pushed below the screen; 08880 REF (lower_line) next_lower_line; 08920 next_lower_line:- lower_lines; 08960 lower_lines:- THIS lower_line; E18 09000 END; 09040 09080 PROCEDURE push_line(l); NAME l; TEXT l; B19 09120 BEGIN COMMENT push a line to stack of lines below screen; 09160 IF upto(l,46) = page_end_marker THEN GOTO out; 09200 IF lower_lines =/= NONE THEN NEW lower_line(l) ELSE 09240 IF NOT (editin.endfile OR endpage) 09280 THEN NEW lower_line(l) ELSE B20 09320 BEGIN 09360 IF increment <= 0 THEN B21 09400 BEGIN 09440 IF l.strip =/= NOTEXT THEN NEW lower_line(l); E21 09480 END ELSE IF from(l,6).strip =/= NOTEXT 09520 THEN NEW lower_line(l); E20 09560 END; 09600 out: l:- blanks(width); E19 09640 END; 9641 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 8 DSK:MIDED1.SIM 23-MAR-1979 11:22 09680 PROCEDURE get_register(reg); REF (qregister) reg; 09720 COMMENT action of the &G VIDED command. Find a qregister, puts its 09760 contents on top of square on screen equal to the qregister size; 09800 INSPECT reg DO B22 09840 BEGIN 09880 INTEGER i, orghpos, hpos, vpos, coverlength, putlength; 09920 INTEGER maxwidth, maxheight, boxwidth, boxheight; 09960 TEXT coverpart; 10000 orghpos:= q_horizontalpos; 10040 IF increment > 0 THEN B23 10080 BEGIN COMMENT do not restore line numbers; 10120 IF qwidth = width-8 AND q_horizontalpos = 0 THEN 10160 move_the_cursor_to(8,q_verticalpos); E23 10200 END; 10240 hpos:= q_horizontalpos; vpos:= q_verticalpos; 10280 maxwidth:= width-hpos; 10320 maxheight:= height-vpos; 10360 boxwidth:= IF maxwidth < qwidth THEN maxwidth ELSE qwidth; 10400 boxheight:= (IF maxheight < qheight THEN maxheight ELSE 10440 qheight)-1; 10480 FOR i:= 0 STEP 1 UNTIL boxheight DO B24 10520 BEGIN 10560 move_the_cursor_to(hpos,vpos+i); 10600 coverpart:- lines(i).sub(1,boxwidth); 10640 putlength:= coverpart.strip.length; 10680 coverlength:= screen(q_verticalpos).sub(hpos+1,boxwidth) 10720 .strip.length; 10760 IF line_erasable AND (terminaltype NE i200 OR hpos = 0) 10800 AND boxwidth + hpos >= width THEN B25 10840 BEGIN outstring(terminalout,eraseeol); 10880 IF putlength < coverlength THEN screen(q_verticalpos). 10920 sub(hpos+1+putlength,coverlength-putlength):= NOTEXT; E25 10960 END ELSE IF putlength < coverlength 11000 THEN putlength:= coverlength; 11040 outtext(coverpart.sub(1,putlength)); E24 11080 END; 11120 move_the_cursor_to(orghpos,vpos); 11160 command_done:= TRUE; E22 11200 END; 11201 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 9 DSK:MIDED1.SIM 23-MAR-1979 11:22 11240 PROCEDURE put_register(qname,box_width, box_height); 11280 TEXT qname; INTEGER box_width, box_height; B26 11320 BEGIN COMMENT action of the &Q VIDED command; 11360 INTEGER hpos, vpos, maxwidth, maxheight, i; 11400 IF box_width= 0 THEN B27 11440 BEGIN 11480 hpos:= IF q_horizontalpos=0 AND increment > 0 11520 THEN 8 ELSE q_horizontalpos; 11560 box_width:= width; E27 11600 END ELSE hpos:= q_horizontalpos; 11640 IF box_height = 0 THEN box_height:= height; 11680 storbokstav(qname); 11720 vpos:= q_verticalpos; 11760 maxheight:= height-vpos; maxwidth:= width-hpos; 11800 IF box_width > maxwidth THEN box_width:= maxwidth; 11840 IF box_height > maxheight THEN box_height:= maxheight; 11880 INSPECT NEW qregister(box_width, box_height, qname) DO B28 11920 BEGIN 11960 next_qregister:- qregisters; qregisters:- THIS qregister; 12000 FOR i:= 1 STEP 1 UNTIL box_height DO 12040 lines(i-1):- copy(screen[vpos+i-1].sub(hpos+1,box_width)); 12080 command_done:= TRUE; E28 12120 END; E26 12160 END; 12161 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 10 DSK:MIDED1.SIM 23-MAR-1979 11:22 12200 PROCEDURE restore_the_whole_screen; 12240 restore_screen(q_verticalpos, 998); 12280 12320 PROCEDURE restore_screen(startline, showlines); 12360 INTEGER startline, showlines; 12400 COMMENT: If the picture of the screen has been destroyed, then a 12440 call to this procedure will make the picture on the screen equal to 12480 the internal picture in the program. Used by the &R VIDED command; 12520 COMMENT negative showlines gives no initial blanking; 12560 IF q_display_output THEN B29 12600 BEGIN TEXT strippedline; INTEGER first, last; 12640 BOOLEAN donotblank; 12680 IF showlines < 0 THEN B30 12720 BEGIN showlines:= -showlines; donotblank:= TRUE; E30 12760 END; 12800 IF showlines >= height THEN showlines:= showlines*3; 12840 last:= showlines//3; first:= startline-showlines+last+1; 12880 last:= last+startline; 12920 IF last > heightm1 THEN last:= heightm1; 12960 IF first < 0 THEN first:= 0; 13000 IF last-first+1 < showlines THEN B31 13040 BEGIN 13080 last:= first+showlines-1; 13120 IF last > heightm1 THEN last:= heightm1; E31 13160 END; 13200 INSPECT terminalout DO B32 13240 BEGIN 13280 INTEGER h, v, hold, vold, vp; 13320 badscreen:= verybadscreen:= FALSE; ! We are making it good again; 13360 hold:= q_horizontalpos; vold:= q_verticalpos; 13400 home_the_cursor; B33 13440 BEGIN ! Blank the screen; 13480 IF NOT donotblank THEN blankterminal; E33 13520 END; 13560 IF terminaltype = cdc71310s THEN home_the_cursor; 13600 q_horizontalpos:= q_verticalpos:= 0; 13640 FOR vp:= 0 STEP 1 UNTIL heightm1 DO 13680 FOR v:= startline+vp,startline-vp-1 DO B34 13720 BEGIN 13760 IF v >= first THEN B35 13800 BEGIN 13840 IF v <= last THEN B36 13880 BEGIN 13920 strippedline:- screen[v]; 13960 IF NOT donotblank OR line_erasable THEN 14000 strippedline:- strippedline.strip; 14040 IF donotblank OR strippedline =/= NOTEXT THEN B37 14080 BEGIN 14120 move_the_cursor_to(0,v); 14160 IF line_erasable THEN outstring(terminalout,eraseeol); 14200 outstring(terminalout,strippedline); 14240 outchr(terminalout,carriagereturn,1); DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 10-1 DSK:MIDED1.SIM 23-MAR-1979 11:22 E37 14280 END; E36 14320 END; E35 14360 END; E34 14400 END; 14440 forceout(terminalout); dotypeout(terminalout); 14480 synchronize(hold,vold); E32 14520 END; E29 14560 END; 14561 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 11 DSK:MIDED1.SIM 23-MAR-1979 11:22 14600 PROCEDURE save_lengthes; 14640 COMMENT Save the lengthes of non-blank lines on the screen to know 14680 how much must later be restored; B38 14720 BEGIN INTEGER i; 14760 FOR i:= 0 STEP 1 UNTIL heightm1 DO 14800 screen_length[i]:= screen[i].strip.length; E38 14840 END; 14841 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 12 DSK:MIDED1.SIM 23-MAR-1979 11:22 14880 PROCEDURE exchange_lines(l1,l2); 14920 INTEGER l1, l2; B39 14960 BEGIN TEXT firstline; 15000 firstline:- screen(l1); 15040 screen(l1):- screen(l2); 15080 screen(l2):- firstline; E39 15120 END; 15121 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 13 DSK:MIDED1.SIM 23-MAR-1979 11:22 15160 CLASS one_more_line_please; 15200 COMMENT Get a line from the input file; B40 15240 BEGIN INTEGER new_length; 15280 detachloop: detach; 15320 !z_t(8); call(p_editin_inimage); 15360 IF printing THEN B41 15400 BEGIN 15440 new_length:= editin_image_strip.length; 15480 IF line_erasable THEN 15520 outstring(terminalout,eraseeol) 15560 ELSE IF new_length < cover_length 15600 THEN new_length:= cover_length; 15640 outtext(editin.image.sub(1,new_length)); 15680 move_the_cursor_to(0,q_verticalpos); E41 15720 END ELSE screen(q_verticalpos):= editin_image_strip; 15760 !z_t(-8); 15800 GOTO detachloop; E40 15840 END; 15841 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 14 DSK:MIDED1.SIM 23-MAR-1979 11:22 15880 PROCEDURE shift(frompos, topos, steps); 15920 INTEGER frompos, topos, steps; 15960 COMMENT shift part of the screen downwards, e.g. to get space for 16000 new lines created by &L or &J VIDED commands; B42 16040 BEGIN INTEGER i; 16080 steps:= steps-1; 16120 IF frompos > topos THEN B43 16160 BEGIN 16200 FOR i:= 0 STEP 1 UNTIL steps DO 16240 exchange_lines(topos+i,frompos+i); E43 16280 END ELSE B44 16320 BEGIN 16360 FOR i:= steps STEP -1 UNTIL 0 DO 16400 exchange_lines(topos+i,frompos+i); E44 16440 END; E42 16480 END of shift; 16481 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 15 DSK:MIDED1.SIM 23-MAR-1979 11:22 16520 PROCEDURE restore_lines(first,last); 16560 INTEGER first, last; 16600 COMMENT make the terminal screen contents equal to the internal 16640 screen contents for lines [first,last] of the screen; 16680 IF q_display_output THEN B45 16720 BEGIN 16760 INTEGER i, maxlength; 16800 maxlength:= 1000; 16840 FOR i:= first STEP 1 UNTIL last DO B46 16880 BEGIN 16920 IF maxlength < width THEN outchr(terminalout,linefeed,1) 16960 ELSE synchronize(0,i); 17000 maxlength:= screen(i).strip.length; 17040 IF line_erasable THEN 17080 outstring(terminalout,eraseeol) 17120 ELSE IF maxlength < screen_length(i) THEN 17160 maxlength:= screen_length(i); 17200 outstring(terminalout,screen(i).sub(1,maxlength)); 17240 outchr(terminalout,carriagereturn,1); E46 17280 END; 17320 home_the_cursor; E45 17360 END; 17361 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 16 DSK:MIDED1.SIM 23-MAR-1979 11:22 17400 CLASS editin_true_inimage; 17440 COMMENT input a line from the input text file; B47 17480 BEGIN TEXT part; INTEGER current_line_number; 17520 detachloop: detach; 17560 INSPECT editin DO B48 17600 BEGIN 17640 IF first_input_line THEN first_input_line:= FALSE 17680 ELSE inimage; 17720 IF endfile THEN image.sub(1,2):= NOTEXT; 17760 part:- scanto(image,tab); 17800 IF image.more THEN B49 17840 BEGIN COMMENT there was a tab; 17880 IF other_editin_image == NOTEXT THEN 17920 other_editin_image:- blanks(image.length) ELSE B50 17960 BEGIN other_editin_image:= NOTEXT; 18000 other_editin_image.setpos(1); E50 18040 END; 18080 IF numbered_infile THEN B51 18120 BEGIN IF increment = 0 THEN B52 18160 BEGIN IF part.length = 5 THEN B53 18200 BEGIN COMMENT remove line number; COMMENT Code only 18240 executed when removing line numbers from a file; 18280 IF vdlno(part) >= 0 THEN GOTO after_put; E53 18320 END of part.length = 5; E52 18360 END of increment = 0; E51 18400 END; 18440 loop: 18480 puttext(other_editin_image,part); 18520 other_editin_image.setpos 18560 (other_editin_image.pos+8 18600 -mod(other_editin_image.pos-1,8)); 18640 after_put: 18680 IF image.more THEN B54 18720 BEGIN 18760 part:- scanto(image,tab); 18800 IF NOT image.more THEN part:- part.strip; 18840 GOTO loop; E54 18880 END; 18920 part:- image; image:- other_editin_image; 18960 other_editin_image:- part; E49 19000 END; 19040 image.setpos(1); E48 19080 END; 19120 GOTO detachloop; E47 19160 END; 19161 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 17 DSK:MIDED1.SIM 23-MAR-1979 11:22 19200 CLASS true_write; B55 19240 BEGIN COMMENT Output of a line to the output text file; 19280 detachloop: detach; 19320 IF NOT backuping AND upto(output_line,46) = page_end_marker THEN B56 19360 BEGIN output_line:= NOTEXT; GOTO fastout; E56 19400 END; 19440 output_line:- output_line.strip; 19480 IF after_addff THEN B57 19520 BEGIN after_addff:= FALSE; 19560 IF pageheader THEN 19600 sub_header:- IF addff THEN NOTEXT ELSE 19640 copy(IF increment <= 0 THEN output_line ELSE 19680 from(output_line,9)); E57 19720 END; 19760 IF increment NE 0 THEN B58 19800 BEGIN 19840 IF addff THEN B59 19880 BEGIN 19920 IF pageheader THEN header:= from(output_line,9); 19960 after_addff:= TRUE; B60 20000 IF inhibit_ff THEN inhibit_ff:= FALSE ELSE BEGIN 20040 editout.image.setpos(6); editout.outchar(carriagereturn); 20080 editout.outchar(formfeed); 20120 editout.breakoutimage; E60 20160 END; 20200 addff:= FALSE; 20240 out_pagenumber:= out_pagenumber+1; E59 20280 END; 20320 line_number:= vdlno(output_line); 20360 IF line_number >= 0 THEN B61 20400 BEGIN 20440 last_line_number:= line_number; 20480 IF output_line.length = 5 THEN GOTO goodnumbered; 20520 IF output_line.length >= 8 THEN B62 20560 BEGIN IF output_line.sub(6,3) = " " THEN 20600 GOTO goodnumbered; E62 20640 END; E61 20680 END; 20720 IF output_line.length > 8 THEN B63 20760 BEGIN 20800 IF output_line.sub(1,8) = " " THEN 20840 output_line:- output_line.sub(9,output_line.length-8); E63 20880 END; 20920 COMMENT the line had no correct line number; 20960 last_line_number:= last_line_number+increment; 21000 editout.outtext(make_five_digits(last_line_number)); 21040 editout.outchar(tab); editout.outtext(output_line); 21080 IF FALSE THEN goodnumbered: B64 21120 BEGIN 21160 editout.outtext(output_line.sub(1,5)); 21200 editout.outchar(tab); 21240 IF output_line.length >= 8 THEN DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 17-1 DSK:MIDED1.SIM 23-MAR-1979 11:22 21280 editout.outtext(from(output_line,9)); E64 21320 END; 21360 editout.outimage; output_line:= NOTEXT; E58 21400 END ELSE B65 21440 BEGIN COMMENT the output file should NOT 21480 be line numbered; B66 21520 IF addff THEN BEGIN 21560 IF inhibit_ff THEN editout.image:- output_line B67 21600 ELSE BEGIN 21640 editout.outchar(formfeed); editout.outtext(output_line); E67 21680 END; 21720 IF pageheader THEN header:= output_line; after_addff:= TRUE; 21760 editout.outimage; output_line:= NOTEXT; 21800 out_pagenumber:= out_pagenumber+1; addff:= FALSE; B68 21840 IF inhibit_ff THEN BEGIN 21880 inhibit_ff:= FALSE; editout.image:- editout_image; E68 21920 END; E66 21960 END ELSE B69 22000 BEGIN 22040 editout.image:- output_line; 22080 editout.outimage; 22120 editout.image:- editout_image; E69 22160 END; E65 22200 END; 22240 fastout: 22280 GOTO detachloop; E55 22320 END; 22321 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 18 DSK:MIDED1.SIM 23-MAR-1979 11:22 22360 CLASS write; B70 22400 BEGIN 22440 TEXT exchanger; 22480 detachloop: detach; 22520 IF upto(first_scroll_line,46) = page_end_marker THEN B71 22560 BEGIN first_scroll_line:= NOTEXT; 22600 GOTO detachloop; E71 22640 END; 22680 IF top_fill = top_size THEN empty_top_of_page; 22720 IF NOT nooutput THEN B72 22760 BEGIN 22800 top_fill:= top_fill+1; 22840 exchanger:- top_of_page[top_fill]; 22880 top_of_page[top_fill]:- first_scroll_line; 22920 first_scroll_line:- exchanger; E72 22960 END ELSE first_scroll_line:= NOTEXT; 23000 GOTO detachloop; E70 23040 END of CLASS write; 23041 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 19 DSK:MIDED1.SIM 23-MAR-1979 11:22 23080 PROCEDURE empty_top_of_page; 23120 COMMENT move lines which previously have been scrolled out 23160 above the top of the screen from an internal buffer 23200 "top_of_page" to the output text file; B73 23240 BEGIN 23280 INTEGER top_bottom; 23320 sub_page_number:= sub_page_number+1; 23360 FOR top_bottom:= 0 STEP 1 UNTIL top_fill DO B74 23400 BEGIN 23440 output_line:- top_of_page[top_bottom]; call(p_true_write); E74 23480 END; 23520 top_fill:= -1; E73 23560 END; 23561 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 20 DSK:MIDED1.SIM 23-MAR-1979 11:22 23600 CLASS scroll; B75 23640 BEGIN COMMENT scroll screen, top line out, new bottom line in; 23680 INTEGER i; 23720 detachloop: detach; 23760 !z_t(9); first_scroll_line:- screen(0); call(p_write); 23800 FOR i:= 1 STEP 1 UNTIL heightm1 DO 23840 screen(i-1):- screen(i); 23880 screen(heightm1):- first_scroll_line; 23920 IF NOT pageheader OR backuping THEN GOTO nomark; B76 23939 IF NOT videdp THEN BEGIN 23949 IF top_fill+height+1 = warningheight 23962 THEN GOTO mark ELSE GOTO nomark; E76 23972 END; 23979 IF top_fill+height+1 < warningheight THEN GOTO nomark; 23986 IF videdpcount = warningheight THEN B77 24000 BEGIN 24040 mark: IF printing THEN B78 24080 BEGIN synchronize(0,q_verticalpos); 24120 outtext(page_end_marker); 24160 synchronize(0,q_verticalpos); E78 24200 END ELSE screen[heightm1]:= page_end_marker; E77 24240 END ELSE 24280 nomark: IF NOT emptyscroll THEN B79 24320 BEGIN cover_length:= 0; 24360 call(p_one_more_line_please); E79 24400 END; 24440 !z_t(-9); 24480 GOTO detachloop; E75 24520 END; 24521 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 21 DSK:MIDED1.SIM 23-MAR-1979 11:22 24560 PROCEDURE addline; 24600 COMMENT User has pushed the INSERT LINE key; B80 24640 BEGIN 24680 push_line(screen[heightm1]); 24720 shift(q_verticalpos,q_verticalpos+1,heightm1-q_verticalpos); 24760 q_horizontalpos:= 0; E80 24800 END; 24840 24880 PROCEDURE addlines(number, printing, leftjustify, restorebelow); 24920 COMMENT Action of &L VIDED command, new lines are inserted 24960 and existing lines pushed downwards; 25000 INTEGER number; BOOLEAN printing, leftjustify, restorebelow; B81 25040 BEGIN INTEGER sink, vpos, hpos, emptysink, leftm, vpos_number; 25080 INTEGER i, addpos; TEXT firstpart, high_line, strip_model; 25120 INTEGER high_number, low_bord_number, add_increment; 25160 BOOLEAN badnumber; 25200 !z_t(10); vpos:= q_verticalpos; hpos:= q_horizontalpos; 25240 firstpart:- screen(vpos).sub(1,hpos); 25280 IF increment > 0 THEN B82 25320 BEGIN 25360 leftm:= leftmargin-8; 25400 IF vpos > 0 THEN high_line:- screen[vpos-1] 25440 ELSE IF top_fill >= 0 25480 THEN high_line:- top_of_page[top_fill]; 25520 low_bord_number:= vdlno(high_line); 25560 IF low_bord_number < 0 THEN low_bord_number:= last_line_number; 25600 high_number:= vdlno(screen[vpos]); B83 25640 IF high_number < 0 THEN BEGIN 25680 badnumber:= TRUE; 25720 high_number:= low_bord_number+(number+1)*increment; E83 25760 END; 25800 add_increment:= 25840 entier((high_number-low_bord_number)/(number+1)); 25880 IF add_increment < 1 THEN add_increment:= 1; E82 25920 END ELSE leftm:= leftmargin; 25960 IF NOT line_erasable THEN B84 26000 BEGIN IF printing THEN save_lengthes; E84 26040 END; 26080 sink:= number; emptysink:= sink+vpos-height; 26120 IF emptysink < 0 THEN emptysink:= 0; 26160 sink:= sink-emptysink; 26200 FOR i:= 1 STEP 1 UNTIL sink DO 26240 push_line(screen(height-i)); 26280 FOR i:= 1 STEP 1 UNTIL emptysink DO B85 26320 BEGIN 26360 IF increment > 0 THEN B86 26400 BEGIN 26440 high_number:= high_number-add_increment; B87 26480 IF high_number < 1 THEN BEGIN 26520 high_number:= 1; badnumber:= TRUE; E87 26560 END; 26600 line_model.sub(1,5):= make_five_digits(high_number); DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 21-1 DSK:MIDED1.SIM 23-MAR-1979 11:22 E86 26640 END; 26680 push_line(line_model); E85 26720 END; 26760 line_model.sub(1,5):= NOTEXT; 26800 shift(vpos,vpos+sink,height-vpos-sink); 26840 IF increment > 0 THEN B88 26880 BEGIN 26920 FOR i:= 1 STEP 1 UNTIL sink DO B89 26960 BEGIN 27000 high_number:= high_number-add_increment; B90 27040 IF high_number < 1 THEN BEGIN 27080 high_number:= 1; badnumber:= TRUE; E90 27120 END; 27160 screen(vpos+sink-i).sub(1,5):= 27200 make_five_digits(high_number); E89 27240 END; E88 27280 END; 27320 screen(vpos).sub(1,firstpart.length):= firstpart; 27360 IF increment <= 0 THEN firstpart:= NOTEXT ELSE B91 27400 BEGIN 27440 vpos_number:= high_number-1; 27480 IF vpos_number < 1 THEN vpos_number:= 1; 27520 IF firstpart =/= NOTEXT THEN B92 27560 BEGIN 27600 screen(vpos).sub(1,5):= make_five_digits(vpos_number); E92 27640 END; 27680 high_number:= vdlno(firstpart); 27720 IF high_number < 0 THEN high_number:= largest_line_number; 27760 firstpart:= NOTEXT; 27800 IF firstpart.length >= 5 THEN firstpart.sub(1,5):= 27840 make_five_digits(high_number+1); E91 27880 END; 27920 IF leftjustify AND firstpart =/= NOTEXT THEN B93 27960 BEGIN firstpart:- firstpart.main; 28000 IF increment > 0 THEN 28040 firstpart:- from(firstpart,9); 28080 line_model:= frontstrip(firstpart); 28120 strip_model:- line_model.strip; 28160 IF strip_model.length <= firstpart.length - leftm THEN B94 28200 BEGIN 28240 firstpart.sub(1,leftm):= NOTEXT; 28280 from(firstpart,leftm+1):= strip_model; E94 28320 END; 28360 line_model:= NOTEXT; E93 28400 END; 28401 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 22 DSK:MIDED1.SIM 23-MAR-1979 11:22 B95 28440 IF increment NE 0 THEN BEGIN ! update above line numbers?; 28480 i:= vpos-1; B96 28520 WHILE vpos_number <= low_bord_number DO BEGIN 28560 IF high_line == NOTEXT THEN GOTO stopnumber; 28600 vpos_number:= vpos_number-1; 28640 IF vpos_number < 1 THEN GOTO stopnumber; 28680 firstpart:- make_five_digits(vpos_number); B97 28720 IF i >= 0 AND printing THEN BEGIN 28760 move_the_cursor_to(0,i); 28800 outtext(firstpart); E97 28840 END ELSE high_line.sub(1,5):= firstpart; 28880 i:= i-1; ! backup one line more; B98 28920 IF top_fill+i < -1 THEN BEGIN 28960 high_line:- NOTEXT; low_bord_number:= last_line_number; B99 E98 29000 END ELSE BEGIN 29040 high_line:- IF i >= 0 THEN screen[i] ELSE 29080 top_of_page[top_fill+i+1]; 29120 low_bord_number:= vdlno(high_line); E99 29160 END; 29200 IF low_bord_number < 0 THEN GOTO stopnumber; E96 29240 END; 29280 IF badnumber THEN stopnumber: 29320 warning("Line numbers may be out of sequence",NOTEXT); E95 29360 END of increment NE 0; 29400 29440 IF printing THEN B100 29480 BEGIN 29520 IF insertline =/= NOTEXT 29560 COMMENT Will insertline be faster?; 29600 AND ((sink*insertline.length < 52*(heightm1-vpos-sink)) 29640 OR NOT restorebelow) THEN B101 29680 BEGIN 29720 IF vpos < heightm1 THEN B102 29760 BEGIN move_the_cursor_to(0,vpos); 29800 FOR i:= 1 STEP 1 UNTIL sink DO B103 29840 BEGIN outstring(terminalout,insertline); E103 29880 END; E102 29920 END; 29960 IF hpos > 0 THEN restore_lines(vpos,vpos); 30000 i:= number+vpos; 30040 IF increment NE 0 AND vpos < heightm1 THEN B104 30080 BEGIN IF i > heightm1 THEN i:= heightm1; 30120 restore_lines(vpos,i); E104 30160 END ELSE 30200 IF i <= heightm1 THEN restore_lines(i,i); E101 30240 END ELSE restore_lines(vpos,IF restorebelow THEN heightm1 30280 ELSE vpos); 30320 move_the_cursor_to(hpos,vpos); E100 30360 END; 30400 command_done:= TRUE; !z_t(-10); E81 30440 END; 30441 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 23 DSK:MIDED1.SIM 23-MAR-1979 11:22 30480 TEXT PROCEDURE to_continue; 30520 COMMENT restore the screen after user has pushed the 30560 carriage return key; 30600 INSPECT terminalin DO INSPECT terminalout DO B105 30640 BEGIN 30680 outimage; 30720 outtext("To continue push RETURN:"); breakoutimage; 30760 inimage; to_continue:- copy(terminalin.image.strip); 30800 restore_screen(q_verticalpos, 998); E105 30840 END; 30841 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 24 DSK:MIDED1.SIM 23-MAR-1979 11:22 30880 CLASS editin_inimage; B106 30920 BEGIN COMMENT input of one line from the input text file; 30960 INTEGER divpos, mindiv; 31000 detachloop: detach; 31040 IF lower_lines == NONE THEN B107 31080 BEGIN 31120 IF endpage OR editin.endfile THEN B108 31160 BEGIN COMMENT Input a fictitious blank line; 31200 editin.image:= NOTEXT; 31240 editin_image_strip:- NOTEXT; E108 31280 END ELSE B109 31320 BEGIN COMMENT there are more lines to be read; 31360 call(p_editin_true_inimage); 31400 editin_image_strip:- editin.image.strip; 31440 IF NOT endpage AND NOT editin.endfile THEN B110 31480 BEGIN COMMENT Was this last line of a page?; 31520 IF editin_image_strip =/= NOTEXT THEN B111 31560 BEGIN 31600 IF fetchar(editin_image_strip, 31640 editin_image_strip.length) = formfeed THEN B112 31680 BEGIN endpage:= TRUE; IF psearch THEN BEGIN 31720 IF (IF videdp THEN videdpcount ELSE top_fill + 31739 heightm1) + pbottom < warningheight THEN pfound:= 31769 TRUE; E113 31801 END; 31840 editin_image.setpos(editin_image_strip.length); 31880 editin_image.putchar(' '); 31920 editin_image_strip:- editin_image_strip.sub(1, 31960 editin_image_strip.length-1).strip; E112 32000 END of formfeed found; E111 32040 END of not empty line; E110 32080 END of was this last line; E109 32120 END of more lines to be read; E107 32160 END ELSE B114 32200 BEGIN editin.image:= pop_line; 32240 editin_image_strip:- editin.image.strip; E114 32280 END; 32320 IF editin_image_strip.length > width THEN B115 32360 BEGIN COMMENT split too long input lines into two lines; 32400 IF NOT long_line_warned THEN 32440 INSPECT terminalout DO B116 32480 BEGIN long_line_warned:= TRUE; 32520 breakoutimage; 32560 blankterminal; 32600 outtext("Input text contains lines longer than"); 32640 outint(width,3); outtext(" characters."); outimage; 32680 outtext( 32720 "Such long lines will be split. No further warnings."); 32760 outimage; 32800 outtext( 32840 "Type CONTROL-C to keep the old file! Your text" 32880 " may be destroyed!"); outimage; DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 24-1 DSK:MIDED1.SIM 23-MAR-1979 11:22 32920 to_continue; E116 32960 END; 33000 mindiv:= editin_image_strip.length-widthm1; 33040 FOR divpos:= widthm1 STEP -1 UNTIL mindiv DO B117 33080 BEGIN COMMENT split the line at a space character; 33120 IF fetchar(editin_image_strip,divpos) = ' ' 33160 THEN GOTO blankfound; E117 33200 END; 33240 divpos:= width; 33280 blankfound: 33320 editin_image_strip.setpos(divpos); 33360 NEW lower_line(copy(rest(editin_image_strip))); 33400 rest(editin_image_strip):= NOTEXT; 33440 editin_image_strip:- front(editin_image_strip); E115 33480 END; 33520 IF increment > 0 THEN B118 33560 BEGIN COMMENT check line number of line numbered file; 33600 divpos:= vdlno(editin_image_strip); IF divpos >= 0 THEN B119 33640 BEGIN 33680 IF largest_line_number < divpos THEN 33720 largest_line_number:= divpos; E119 33760 END ELSE IF editin_image_strip == NOTEXT THEN B120 33800 BEGIN 33840 editin_image_strip:- editin.image.sub(1,5); 33880 largest_line_number:= largest_line_number+increment; 33920 editin_image_strip:= make_five_digits( 33960 largest_line_number); E120 34000 END; E118 34040 END; 34080 GOTO detachloop; E106 34120 END; 34121 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 25 DSK:MIDED1.SIM 23-MAR-1979 11:22 34160 PROCEDURE center_line(left); INTEGER left; B121 34200 BEGIN TEXT start, body, newline; INTEGER leftpos; CHARACTER c; 34240 IF left < 0 THEN left:= leftmargin; 34280 body:- screen[q_verticalpos]; body.setpos(1); 34320 IF body.getchar = '.' THEN B122 34360 BEGIN 34400 c:= body.getchar; 34440 WHILE digit(c) AND body.more DO c:= body.getchar; 34480 start:- front(body); 34520 body:- rest(body); E122 34560 END; 34600 body:- frontstrip(body).strip; 34640 leftpos:= 34680 (left+(rightmargin-left-body.length)//2+1); 34720 IF leftpos + body.length < width AND 34760 leftpos > start.length THEN B123 34800 BEGIN 34840 newline:- line_model; newline.sub(1,start.length):= start; 34880 newline.setpos(leftpos); 34920 puttext(newline,body); 34960 move_the_cursor_to(0,q_verticalpos); 35000 outstring(terminalout,newline); 35040 outchr(terminalout,carriagereturn,1); 35080 move_the_cursor_to(0,q_verticalpos); 35120 line_model:- screen[q_verticalpos]; 35160 line_model:= NOTEXT; 35200 screen[q_verticalpos]:- newline; 35240 command_done:= TRUE; E123 35280 END; E121 35320 END; 35321 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 26 DSK:MIDED1.SIM 23-MAR-1979 11:22 35360 PROCEDURE case_shift(char); CHARACTER char; B124 35400 BEGIN 35440 TEXT body; INTEGER hpos; 35480 hpos:= q_horizontalpos; 35520 body:- from(screen[q_verticalpos],q_horizontalpos+1).strip; 35560 IF char = 'U' OR char = 'u' THEN storbokstav(body) 35600 ELSE litenbokstav(body); 35640 outstring(terminalout,body); 35680 q_horizontalpos:= q_horizontalpos+body.length; 35720 move_the_cursor_to(hpos,q_verticalpos); 35760 command_done:= TRUE; E124 35800 END; 35801 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 27 DSK:MIDED1.SIM 23-MAR-1979 11:22 35840 PROCEDURE charinsert; ! User has pushed insert char key; B125 35880 BEGIN TEXT thisline; INTEGER length; 35920 screen[q_verticalpos].setpos(q_horizontalpos+1); 35960 tshift(screen[q_verticalpos],-1); E125 36000 END; 36040 36080 PROCEDURE insert(qname,inserted); TEXT qname; BOOLEAN inserted; B126 36120 BEGIN COMMENT &I command of VIDED; 36160 INTEGER striplength, hpos, vpos, mindiv, divpos; 36200 TEXT lastpart, stripline, longline; 36240 hpos:= q_horizontalpos; vpos:= q_verticalpos; 36280 stripline:- screen(vpos).strip; 36320 striplength:= stripline.length; 36360 IF striplength + qname.length < width THEN B127 36400 BEGIN COMMENT New line not longer than screen width; 36440 IF striplength > hpos THEN lastpart:- copy(screen(vpos). 36480 sub(hpos+1,striplength-hpos)); 36520 outtext(qname); 36560 IF inserted THEN q_display_output:= FALSE; 36600 outtext(lastpart); B128 36640 IF inserted THEN BEGIN 36680 q_display_output:= TRUE; q_horizontalpos:= hpos+qname.length; E128 36720 END ELSE move_the_cursor_to(hpos+qname.length,vpos); E127 36760 END ELSE B129 36800 BEGIN COMMENT New line has to be split into two lines on 36840 the screen, since it is longer than the screen width; 36880 longline:- conc(stripline.sub(1,hpos),qname, 36920 stripline.sub(hpos+1,striplength-hpos)); 36960 mindiv:= longline.length-width; 37000 FOR divpos:= widthm1 STEP -1 UNTIL mindiv DO B130 37040 BEGIN IF fetchar(longline,divpos) = ' ' 37080 THEN GOTO blankfound; E130 37120 END; 37160 divpos:= width; 37200 blankfound: move_the_cursor_to(0,vpos); 37240 outtext(longline.sub(1,divpos)); 37280 make_blank(width-divpos); 37320 IF vpos = heightm1 THEN B131 37360 BEGIN 37400 move_the_cursor_to(0,vpos); 37440 outchr(terminalout,linefeed,1); 37480 call(p_scroll); 37520 vpos:= vpos-1; 37560 move_the_cursor_to(first_text_pos,heightm1); E131 37600 END ELSE move_the_cursor_to(first_text_pos,vpos+1); 37640 addlines(1,TRUE,FALSE,TRUE); 37680 outtext(longline.sub(divpos+1,longline.length-divpos)); 37720 hpos:= hpos+qname.length; 37760 IF hpos < divpos THEN 37800 move_the_cursor_to(hpos,vpos) ELSE 37840 move_the_cursor_to(hpos-divpos,vpos+1); E129 37880 END; DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 27-1 DSK:MIDED1.SIM 23-MAR-1979 11:22 37920 command_done:= TRUE; E126 37960 END of insert; 37961 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 28 DSK:MIDED1.SIM 23-MAR-1979 11:22 38000 INTEGER PROCEDURE written_lines; 38040 COMMENT VIDED strips blank lines from the bottom of the page 38080 when outputting a page to the output text file. This procedure 38120 finds how many non-blank lines there are to output; B132 38160 BEGIN TEXT check_line; INTEGER i, print_height; 38200 IF lower_lines == NONE AND (endpage OR editin.endfile) THEN B133 38240 BEGIN 38280 FOR print_height:= heightm1 STEP -1 UNTIL 0 DO B134 38320 BEGIN 38360 check_line:- screen(print_height); 38400 IF increment > 0 THEN check_line:- from(check_line,6); 38440 IF check_line.strip =/= NOTEXT THEN GOTO out; E134 38480 END; 38520 print_height:= -1; 38560 out: E133 38600 END ELSE print_height:= heightm1; 38640 written_lines:= print_height; E132 38680 END; 38681 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 29 DSK:MIDED1.SIM 23-MAR-1979 11:22 38720 PROCEDURE printpage; B135 38760 BEGIN COMMENT Output a page to the output text file; 38800 INTEGER i, print_height, breakchar; 38840 empty_top_of_page; 38880 print_height:= written_lines; 38920 IF NOT nooutput THEN 38960 FOR i:= 0 STEP 1 UNTIL print_height DO B136 39000 BEGIN 39040 output_line:- screen[i]; call(p_true_write); E136 39080 END; 39120 COMMENT Output lines which have been pushed below the screen; 39160 WHILE NOT lower_lines == NONE DO B137 39200 BEGIN output_line:- pop_line; 39240 IF NOT nooutput THEN call(p_true_write); E137 39280 END; 39320 39360 COMMENT Output lines which have not yet been read from the 39400 input text file; B138 39440 IF NOT endpage AND NOT editin.endfile THEN BEGIN B139 39480 IF numbered_infile EQV increment = 0 THEN BEGIN 39520 GOTO get_a_line; B140 39560 WHILE NOT endpage AND NOT editin.endfile DO BEGIN 39600 output_line:- editin_image_strip; 39640 IF NOT nooutput THEN call(p_true_write); 39680 get_a_line: 39720 call(p_editin_inimage); E140 39760 END; B141 E139 39800 END ELSE BEGIN ! no line number conversion; 39840 pgcopy(editin,IF nooutput THEN NONE ELSE editout, 39880 numbered_infile); last_line_number:= -1; 39920 inhibit_ff:= endpage:= NOT editin.endfile; E141 39960 END; E138 40000 END of output of not yet read input file lines; E135 40040 END of procedure printpage; 40041 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 30 DSK:MIDED1.SIM 23-MAR-1979 11:22 40080 COMMENT Main body of the CLASS VIDED1: initialization 40120 of certain variables; 40160 allow_cr:= TRUE; 40200 sixdigits:- blanks(10).sub(5,6); 40240 p_one_more_line_please:- NEW one_more_line_please; 40280 p_editin_true_inimage:- NEW editin_true_inimage; 40320 p_true_write:- NEW true_write; 40360 p_write:- NEW write; 40400 p_editin_inimage:- NEW editin_inimage; 40440 p_scroll:- NEW scroll; 40480 page_end_marker:- copy( 40520 "***??? END OF PAGE *** USE &PI COMMAND ***???"); 40560 IF page_end_marker.length > widthm1 THEN page_end_marker:- 40600 page_end_marker.sub(1,widthm1); E3 40640 END of vided1x; E1 40680 END of vided1; SWITCHES CHANGED FROM DEFAULT: -A NO CHECK OF ARRAY INDEX -D NO SYMBOL TABLE GENERATED FOR DEBUG E EXTERNAL CLASS/PROCEDURE -Q NO CHECK OF QUALIFICATION ERRORS DETECTED: 2 TYPE W MESSAGES DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 31 DSK:MIDED1.SIM 23-MAR-1979 11:22 LINE NUMBER TABLE 1240 000164 8280 000637 10840 001446 13920 002126 17120 002556 1360 000165 8320 000642 10880 001452 13960 002136 17200 002573 2000 000173 8360 000651 10960 001477 14040 002147 17240 002607 2040 000175 8400 000654 11040 001506 14120 002157 17280 002614 2120 000200 8440 000655 11080 001526 14160 002167 17320 002615 3160 000211 8480 000657 11120 001527 14200 002176 17360 002617 3280 000212 8560 000660 11160 001537 14240 002202 17400 002622 3480 000220 8640 000660 11200 001541 14400 002207 17480 002622 3560 000226 8680 000673 11240 001550 14440 002211 17520 002624 4160 000233 8720 000701 11400 001550 14480 002220 17560 002625 5880 000234 8722 000706 11480 001553 14520 002230 17640 002632 5960 000246 8726 000706 11560 001575 14560 002236 17680 002637 6000 000253 8728 000721 11600 001600 14600 002241 17720 002641 6080 000265 8731 000742 11640 001604 14760 002241 17760 002656 6120 000272 8734 000753 11680 001612 14800 002252 17800 002666 6160 000277 8736 000760 11720 001615 14840 002270 17880 002673 6240 000300 8738 001000 11760 001620 14880 002271 17960 002707 6360 000300 8748 001031 11800 001626 15000 002271 18000 002714 6400 000305 8750 001032 11840 001633 15040 002300 18080 002720 6440 000314 8752 001036 11880 001640 15080 002312 18120 002723 6480 000322 8760 001037 11960 001654 15120 002320 18160 002726 6560 000323 8800 001037 12000 001663 15160 002321 18280 002732 6680 000323 8920 001041 12040 001674 15240 002321 18440 002743 6760 000335 8960 001044 12080 001723 15280 002323 18520 002756 6800 000355 9000 001046 12120 001725 15320 002324 18640 002772 6840 000356 9080 001051 12160 001731 15360 002327 18760 002777 6880 000360 9160 001051 12200 001732 15440 002332 18800 003007 6920 000361 9200 001066 12240 001732 15480 002335 18840 003021 7040 000361 9240 001103 12320 001743 15560 002343 18920 003025 7080 000366 9280 001122 12560 001743 15640 002352 18960 003034 7120 000376 9360 001123 12680 001750 15680 002373 19040 003037 7120 000403 9440 001127 12720 001753 15720 002403 19080 003043 7160 000410 9480 001150 12800 001756 15720 002404 19120 003047 7200 000412 9600 001175 12840 001764 15800 002415 19160 003050 7240 000427 9640 001210 12880 001774 15840 002416 19200 003053 7320 000442 9680 001211 12920 001776 15880 002421 19240 003053 7360 000445 9800 001211 12960 002004 16080 002421 19280 003055 7400 000453 9840 001215 13000 002010 16120 002422 19320 003056 7440 000464 10000 001217 13080 002015 16200 002425 19360 003077 7480 000474 10040 001223 13120 002021 16240 002435 19440 003105 7520 000476 10120 001227 13200 002027 16280 002447 19480 003113 7560 000511 10240 001256 13240 002034 16360 002450 19520 003115 7600 000515 10280 001266 13320 002036 16400 002461 19560 003116 7640 000525 10320 001273 13360 002041 16480 002473 19760 003146 7680 000527 10360 001300 13400 002050 16520 002474 19840 003152 7760 000532 10400 001313 13480 002052 16680 002474 19920 003155 7800 000560 10480 001327 13560 002056 16800 002501 19960 003171 7920 000621 10560 001342 13600 002064 16840 002503 20000 003173 7960 000630 10600 001353 13640 002067 16920 002514 20040 003177 8000 000631 10640 001370 13680 002102 16960 002525 20080 003211 8200 000631 10680 001376 13760 002117 17000 002535 20120 003216 8240 000634 10760 001417 13840 002123 17040 002547 20200 003221 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 31-1 DSK:MIDED1.SIM 23-MAR-1979 11:22 LINE NUMBER TABLE 20240 003223 23520 003625 26200 004237 29000 004777 32240 005466 20320 003224 23560 003627 26240 004250 29040 005000 32320 005475 20360 003232 23600 003630 26280 004273 29120 005023 32400 005502 20440 003235 23640 003630 26360 004304 29200 005027 32480 005510 20480 003237 23720 003632 26440 004310 29240 005032 32520 005512 20520 003244 23760 003633 26480 004313 29280 005033 32560 005514 20560 003250 23800 003644 26520 004316 29440 005050 32600 005516 20720 003262 23840 003656 26600 004321 29520 005052 32640 005521 20800 003267 23880 003673 26680 004340 29720 005100 32680 005533 20960 003313 23920 003702 26720 004347 29760 005103 32760 005536 21000 003316 23939 003707 26760 004350 29800 005112 32800 005540 21040 003330 23949 003711 26800 004361 29840 005123 32880 005543 21080 003342 23962 003722 26840 004376 29880 005127 32920 005545 21160 003345 23979 003723 26920 004402 29960 005130 32960 005547 21200 003356 23986 003732 27000 004413 30000 005142 33000 005553 21240 003363 24040 003737 27040 004416 30040 005145 33040 005560 21360 003400 24080 003742 27080 004421 30080 005162 33120 005572 21400 003410 24120 003752 27160 004424 30120 005167 33200 005601 21520 003411 24160 003761 27240 004451 30160 005176 33240 005602 21560 003414 24200 003771 27320 004452 30200 005177 33280 005605 21640 003423 24240 004003 27360 004470 30240 005212 33360 005611 21720 003435 24280 004004 27440 004501 30320 005227 33400 005623 21760 003447 24320 004007 27480 004504 30400 005236 33440 005632 21800 003457 24360 004010 27520 004511 30440 005240 33520 005640 21840 003462 24480 004012 27600 004515 30480 005241 33600 005644 21880 003464 24520 004013 27680 004540 30600 005241 33680 005654 21960 003471 24560 004016 27720 004544 30600 005246 33760 005662 22040 003472 24680 004016 27760 004552 30680 005253 33840 005667 22080 003477 24720 004037 27800 004556 30720 005255 33880 005700 22120 003501 24760 004053 27920 004601 30760 005262 33920 005703 22240 003506 24800 004055 27960 004611 30800 005274 34080 005717 22320 003507 24880 004056 28000 004615 30840 005304 34120 005720 22360 003512 25200 004056 28080 004626 30880 005315 34160 005723 22400 003512 25240 004063 28120 004635 30920 005315 34240 005723 22480 003514 25280 004075 28160 004642 31000 005317 34280 005731 22520 003515 25360 004101 28240 004651 31040 005320 34320 005743 22560 003530 25400 004104 28280 004661 31120 005324 34400 005750 22600 003535 25440 004120 28360 004671 31200 005333 34440 005754 22680 003536 25520 004132 28440 004676 31240 005340 34480 005776 22720 003544 25560 004136 28480 004702 31280 005343 34520 006002 22800 003547 25600 004144 28520 004705 31360 005344 34600 006006 22840 003550 25640 004155 28560 004710 31400 005347 34640 006014 22880 003556 25680 004160 28600 004714 31440 005356 34720 006027 22920 003564 25720 004161 28640 004715 31520 005366 34840 006050 22960 003566 25800 004167 28680 004720 31600 005373 34880 006063 23000 003574 25880 004201 28720 004726 31680 005404 34920 006066 23040 003575 25920 004206 28760 004735 31720 005407 34960 006101 23080 003600 25960 004212 28800 004744 31840 005427 35000 006111 23320 003600 26000 004215 28840 004753 31880 005434 35040 006115 23360 003602 26080 004221 28880 004764 31920 005440 35080 006122 23440 003613 26120 004230 28920 004765 32160 005454 35120 006132 23480 003624 26160 004234 28960 004772 32200 005455 35160 006141 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 31-2 DSK:MIDED1.SIM 23-MAR-1979 11:22 LINE NUMBER TABLE 35200 006145 37920 006670 0 000000 35240 006154 37960 006672 35320 006155 38000 006673 35360 006156 38200 006673 35480 006156 38280 006710 35520 006161 38360 006722 35560 006176 38400 006731 35600 006214 38440 006742 35640 006220 38480 006747 35680 006224 38520 006750 35720 006232 38560 006751 35760 006242 38600 006752 35800 006244 38640 006755 35840 006245 38680 006757 35920 006245 38720 006760 35960 006256 38840 006760 36000 006266 38880 006762 36080 006267 38920 006765 36240 006267 39040 007000 36280 006274 39080 007011 36320 006304 39160 007012 36360 006307 39200 007016 36440 006316 39240 007022 36520 006337 39280 007026 36560 006346 39440 007027 36600 006352 39480 007040 36640 006361 39520 007047 36680 006363 39560 007050 36720 006372 39600 007061 36760 006405 39640 007064 36880 006406 39680 007070 36960 006446 39760 007073 37000 006453 39800 007074 37040 006465 39840 007075 37120 006473 39880 007111 37160 006474 39920 007113 37200 006477 40040 007121 37240 006506 40160 007122 37280 006525 40160 007124 37320 006534 40200 007125 37400 006540 40240 007135 37440 006547 40280 007140 37480 006554 40320 007143 37520 006557 40360 007146 37560 006560 40400 007151 37600 006570 40440 007154 37640 006602 40480 007157 37680 006615 40560 007163 37720 006637 40640 007175 37760 006644 40680 007200 37800 006656 40680 007202