(*2:*)MODULE WEBMERGE; (*5:*)FROM InOut IMPORT WriteString , ReadString , Write , WriteCard , WriteLn ;FROM ASCII IMPORT ff ;(*:5*)(*10:*)FROM SYSTEM IMPORT DOSCALL; (*:10*)(*20:*)FROM FileSystem IMPORT Lookup , Response , ReadChar , WriteChar , File , Close ;FROM ASCII IMPORT EOL, nul ; (*:20*)CONST(*6:*)BUFSIZE=1000;MAXCHANGEFILES=6;FILENAMELEN=200; (*:6*)TYPE(*12:*)ASCIICODE=[0..127]; (*:12*)(*19:*)CHANGEFILERANGE=[1..MAXCHANGEFILES]; (*:19*)VAR(*7:*)HISTORY:[0..3]; (*:7*)(*14:*)XORD:ARRAY CHAR OF ASCIICODE;XCHR:ARRAY ASCIICODE OF CHAR; (*:14*)(*21:*)BUFFER:ARRAY[0..BUFSIZE]OF ASCIICODE; WEBFILE,OUTWEBFILE,OUTCHANGEFILE: File ; CHANGEFILES:ARRAY CHANGEFILERANGE OF File ; FILENAME:ARRAY[0..FILENAMELEN-1]OF CHAR;MORENAMES:BOOLEAN; (*:21*)(*26:*)LINE:CARDINAL;WEBLINE:CARDINAL;OUTWEBLINE:CARDINAL; OUTCHLINE:CARDINAL;THECHANGELINE:ARRAY CHANGEFILERANGE OF CARDINAL; LIMIT:[0..BUFSIZE];LOC:[0..BUFSIZE];INPUTHASENDED:BOOLEAN; (*:26*)(*28:*)THECHANGEBUFFER:ARRAY CHANGEFILERANGE OF ARRAY[0..BUFSIZE] OF ASCIICODE;THECHANGELIMIT:ARRAY CHANGEFILERANGE OF[0..BUFSIZE]; THECHANGEFLAGS:ARRAY CHANGEFILERANGE OF BOOLEAN; ACTIVECHANGEFILE:[0..MAXCHANGEFILES]; LASTACTIVECHANGEFILE,NUMBEROFACTUALCHANGEFILES:CHANGEFILERANGE; (*:28*)(*:2*)(*3:*)PROCEDURE INITIALIZE;VAR(*16:*)I:[0..127]; (*:16*)BEGIN(*8:*)HISTORY:=0;(*:8*)(*15:*)XCHR[32]:=' ';XCHR[33]:='!'; XCHR[34]:='"';XCHR[35]:='#';XCHR[36]:='$';XCHR[37]:='%';XCHR[38]:='&'; XCHR[39]:="'";XCHR[40]:='(';XCHR[41]:=')';XCHR[42]:='*';XCHR[43]:='+'; XCHR[44]:=',';XCHR[45]:='-';XCHR[46]:='.';XCHR[47]:='/';XCHR[48]:='0'; XCHR[49]:='1';XCHR[50]:='2';XCHR[51]:='3';XCHR[52]:='4';XCHR[53]:='5'; XCHR[54]:='6';XCHR[55]:='7';XCHR[56]:='8';XCHR[57]:='9';XCHR[58]:=':'; XCHR[59]:=';';XCHR[60]:='<';XCHR[61]:='=';XCHR[62]:='>';XCHR[63]:='?'; XCHR[64]:='@';XCHR[65]:='A';XCHR[66]:='B';XCHR[67]:='C';XCHR[68]:='D'; XCHR[69]:='E';XCHR[70]:='F';XCHR[71]:='G';XCHR[72]:='H';XCHR[73]:='I'; XCHR[74]:='J';XCHR[75]:='K';XCHR[76]:='L';XCHR[77]:='M';XCHR[78]:='N'; XCHR[79]:='O';XCHR[80]:='P';XCHR[81]:='Q';XCHR[82]:='R';XCHR[83]:='S'; XCHR[84]:='T';XCHR[85]:='U';XCHR[86]:='V';XCHR[87]:='W';XCHR[88]:='X'; XCHR[89]:='Y';XCHR[90]:='Z';XCHR[91]:='[';XCHR[92]:='\';XCHR[93]:=']'; XCHR[94]:='^';XCHR[95]:='_';XCHR[96]:='`';XCHR[97]:='a';XCHR[98]:='b'; XCHR[99]:='c';XCHR[100]:='d';XCHR[101]:='e';XCHR[102]:='f'; XCHR[103]:='g';XCHR[104]:='h';XCHR[105]:='i';XCHR[106]:='j'; XCHR[107]:='k';XCHR[108]:='l';XCHR[109]:='m';XCHR[110]:='n'; XCHR[111]:='o';XCHR[112]:='p';XCHR[113]:='q';XCHR[114]:='r'; XCHR[115]:='s';XCHR[116]:='t';XCHR[117]:='u';XCHR[118]:='v'; XCHR[119]:='w';XCHR[120]:='x';XCHR[121]:='y';XCHR[122]:='z'; XCHR[123]:='{';XCHR[124]:='|';XCHR[125]:='}';XCHR[126]:='~'; XCHR[0]:=' ';XCHR[127]:=' '; (*:15*)(*17:*)FOR I:=1 TO 31 DO XCHR[I]:=' ';END; (*:17*)(*18:*)FOR I:=0 TO 127 DO XORD[CHR(I)]:=32;END; FOR I:=1 TO 126 DO XORD[XCHR[I]]:=I;END;(*:18*)END INITIALIZE; (*:3*)(*11:*)PROCEDURE ERROR;VAR K,L:[0..BUFSIZE]; BEGIN(*45:*)IF(ACTIVECHANGEFILE>0)THEN WriteString ('. (change file '); WriteCard (ACTIVECHANGEFILE,1); Write (' ');ELSE WriteString ('. ('); END; WriteString ('l.'); WriteCard (LINE,1); WriteString (')'); WriteLn ;;IF LOC>=LIMIT THEN L:=LIMIT ELSE L:=LOC;END; FOR K:=1 TO L DO IF BUFFER[K-1]=9 THEN Write (' ')ELSE Write (XCHR[ BUFFER[K-1]]);END;END; WriteLn ;FOR K:=1 TO L DO Write (' ');END; FOR K:=L+1 TO LIMIT DO Write (XCHR[BUFFER[K-1]]);END; WriteLn ;(*:45*); HISTORY:=2;END ERROR; (*:11*)(*22:*)PROCEDURE INPUTLN(VAR F: File ):BOOLEAN; VAR FINALLIMIT:[0..BUFSIZE];CH:CHAR;LINEPRES:BOOLEAN;BEGIN LIMIT:=0; FINALLIMIT:=0;CH:='?'; IF(F.eof)THEN LINEPRES:=FALSE ELSE WHILE NOT(CH=EOL)DO ReadChar (F,CH);; IF CH= nul THEN RETURN FALSE END;BUFFER[LIMIT]:=XORD[CH];INC(LIMIT); IF BUFFER[LIMIT-1]<>32 THEN FINALLIMIT:=LIMIT END; IF LIMIT=BUFSIZE THEN WHILE NOT(CH=EOL)DO ReadChar (F,CH);END; DEC(LIMIT); WriteString ('! Input line too long'); WriteLn ;;ERROR;; LOC:=0;END;END;WHILE NOT(CH=EOL)DO ReadChar (F,CH);;END;; LIMIT:=FINALLIMIT;LINEPRES:=TRUE;END;RETURN LINEPRES;END INPUTLN; (*:22*)(*23:*)PROCEDURE OUTPUTLN(VAR F: File );VAR CH:CHAR; TEMP:[0..BUFSIZE]; BEGIN IF LIMIT>0 THEN FOR TEMP:=0 TO LIMIT-1 DO CH:=XCHR[BUFFER[TEMP]]; WriteChar (F,CH);END;END; WriteChar (F,EOL);;END OUTPUTLN; (*:23*)(*29:*)PROCEDURE LINESDONTMATCH():BOOLEAN;VAR K:[0..BUFSIZE]; BEGIN IF(THECHANGELIMIT[ACTIVECHANGEFILE]<>LIMIT)OR(NOT THECHANGEFLAGS[ ACTIVECHANGEFILE])THEN RETURN TRUE;END; IF LIMIT>0 THEN FOR K:=0 TO LIMIT-1 DO IF THECHANGEBUFFER[ ACTIVECHANGEFILE][K]<>BUFFER[K]THEN RETURN TRUE;END;END;END; RETURN FALSE;END LINESDONTMATCH; (*:29*)(*30:*)PROCEDURE PRIMETHECHANGEBUFFER;VAR K:[0..BUFSIZE]; BEGIN THECHANGELIMIT[ACTIVECHANGEFILE]:=0; (*31:*)LOOP INC(THECHANGELINE[ACTIVECHANGEFILE]); IF NOT INPUTLN(CHANGEFILES[ACTIVECHANGEFILE])THEN Close (CHANGEFILES[ ACTIVECHANGEFILE]);;THECHANGEFLAGS[ACTIVECHANGEFILE]:=FALSE;;RETURN; ELSIF(LIMIT>=2)AND(BUFFER[0]=64)THEN IF(BUFFER[1]>=88)AND(BUFFER[1]<=90) THEN BUFFER[1]:=BUFFER[1]+32;END;;IF BUFFER[1]=120 THEN EXIT; ELSIF(BUFFER[1]=121)OR(BUFFER[1]=122)THEN LOC:=2; WriteString ('! Where is the matching @x?'); WriteLn ;;ERROR;;END;END; END;(*:31*);(*32:*)REPEAT INC(THECHANGELINE[ACTIVECHANGEFILE]); IF NOT INPUTLN(CHANGEFILES[ACTIVECHANGEFILE])THEN WriteString ( '! Change file ended after @x'); WriteLn ;;ERROR;; Close (CHANGEFILES[ACTIVECHANGEFILE]);; THECHANGEFLAGS[ACTIVECHANGEFILE]:=FALSE;;RETURN;END;UNTIL LIMIT>0; (*:32*);(*33:*)THECHANGELIMIT[ACTIVECHANGEFILE]:=LIMIT; IF LIMIT>0 THEN FOR K:=0 TO LIMIT-1 DO THECHANGEBUFFER[ACTIVECHANGEFILE] [K]:=BUFFER[K];END;END;(*:33*);END PRIMETHECHANGEBUFFER; (*:30*)(*34:*)PROCEDURE CHECKCHANGE;VAR N:CARDINAL;K:[0..BUFSIZE]; NONEMATCH:BOOLEAN;TEMPINDEX:[1..MAXCHANGEFILES+1];PREVHISTORY:[0..3]; FLUSHNEEDED:ARRAY CHANGEFILERANGE OF BOOLEAN; BEGIN(*37:*)NONEMATCH:=TRUE;TEMPINDEX:=1; REPEAT IF(TEMPINDEX<=NUMBEROFACTUALCHANGEFILES)THEN ACTIVECHANGEFILE:= TEMPINDEX;END;INC(TEMPINDEX);NONEMATCH:=NONEMATCH AND LINESDONTMATCH(); UNTIL(NOT NONEMATCH)OR(TEMPINDEX>NUMBEROFACTUALCHANGEFILES); LASTACTIVECHANGEFILE:=ACTIVECHANGEFILE;ACTIVECHANGEFILE:=0;(*:37*); IF NONEMATCH THEN RETURN;END;N:=0; (*38:*)IF(ACTIVECHANGEFILE>0)THEN LASTACTIVECHANGEFILE:=ACTIVECHANGEFILE ;THECHANGELINE[ACTIVECHANGEFILE]:=LINE;ACTIVECHANGEFILE:=0; LINE:=WEBLINE;ELSE ACTIVECHANGEFILE:=LASTACTIVECHANGEFILE;WEBLINE:=LINE; LINE:=THECHANGELINE[ACTIVECHANGEFILE];END;;BUFFER[0]:=64;BUFFER[1]:=120; LIMIT:=2;OUTPUTLN(OUTCHANGEFILE);INC(OUTCHLINE);; LIMIT:=THECHANGELIMIT[ACTIVECHANGEFILE]; BUFFER[0]:=THECHANGEBUFFER[ACTIVECHANGEFILE][0]; BUFFER[1]:=THECHANGEBUFFER[ACTIVECHANGEFILE][1]; IF(ACTIVECHANGEFILE>0)THEN LASTACTIVECHANGEFILE:=ACTIVECHANGEFILE; THECHANGELINE[ACTIVECHANGEFILE]:=LINE;ACTIVECHANGEFILE:=0;LINE:=WEBLINE; ELSE ACTIVECHANGEFILE:=LASTACTIVECHANGEFILE;WEBLINE:=LINE; LINE:=THECHANGELINE[ACTIVECHANGEFILE];END;;OUTPUTLN(OUTCHANGEFILE); INC(OUTCHLINE);;(*:38*); LOOP(*35:*)FOR ACTIVECHANGEFILE:=1 TO NUMBEROFACTUALCHANGEFILES DO FLUSHNEEDED[ACTIVECHANGEFILE]:=(ACTIVECHANGEFILE<>LASTACTIVECHANGEFILE) AND(NOT LINESDONTMATCH()); IF FLUSHNEEDED[ACTIVECHANGEFILE]THEN PREVHISTORY:=HISTORY; WriteString ('overlapping change files --- '); WriteCard (LASTACTIVECHANGEFILE,1); WriteString (' and '); WriteCard (ACTIVECHANGEFILE,1); WriteString (' --- '); WriteCard (ACTIVECHANGEFILE,1); WriteString (' flushed'); WriteLn ;; ERROR;;HISTORY:=PREVHISTORY;IF HISTORY=0 THEN HISTORY:=1;END;;END;END; FOR ACTIVECHANGEFILE:=1 TO NUMBEROFACTUALCHANGEFILES DO IF FLUSHNEEDED[ ACTIVECHANGEFILE]THEN(*36:*)LOOP INC(THECHANGELINE[ACTIVECHANGEFILE]); IF NOT INPUTLN(CHANGEFILES[ACTIVECHANGEFILE])THEN Close (CHANGEFILES[ ACTIVECHANGEFILE]);;THECHANGEFLAGS[ACTIVECHANGEFILE]:=FALSE;;EXIT; ELSIF(LIMIT>=2)AND(BUFFER[0]=64)THEN IF(BUFFER[1]>=88)AND(BUFFER[1]<=90) THEN BUFFER[1]:=BUFFER[1]+32;END;;IF BUFFER[1]=122 THEN EXIT;END;END; END;(*:36*);PRIMETHECHANGEBUFFER;END;END;ACTIVECHANGEFILE:=0;(*:35*); IF(ACTIVECHANGEFILE>0)THEN LASTACTIVECHANGEFILE:=ACTIVECHANGEFILE; THECHANGELINE[ACTIVECHANGEFILE]:=LINE;ACTIVECHANGEFILE:=0;LINE:=WEBLINE; ELSE ACTIVECHANGEFILE:=LASTACTIVECHANGEFILE;WEBLINE:=LINE; LINE:=THECHANGELINE[ACTIVECHANGEFILE];END;;INC(LINE); IF NOT INPUTLN(CHANGEFILES[ACTIVECHANGEFILE])THEN WriteString ( '! Change file ended before @y'); WriteLn ;;ERROR;; THECHANGELIMIT[ACTIVECHANGEFILE]:=0; IF(ACTIVECHANGEFILE>0)THEN LASTACTIVECHANGEFILE:=ACTIVECHANGEFILE; THECHANGELINE[ACTIVECHANGEFILE]:=LINE;ACTIVECHANGEFILE:=0;LINE:=WEBLINE; ELSE ACTIVECHANGEFILE:=LASTACTIVECHANGEFILE;WEBLINE:=LINE; LINE:=THECHANGELINE[ACTIVECHANGEFILE];END;;RETURN;END; (*39:*)IF(LIMIT>1)AND(BUFFER[0]=64)THEN IF(BUFFER[1]>=88)AND(BUFFER[1]<= 90)THEN BUFFER[1]:=BUFFER[1]+32;END;; IF(BUFFER[1]=120)OR(BUFFER[1]=122)THEN LOC:=2; WriteString ('! Where is the matching @y?'); WriteLn ;;ERROR;; ELSIF BUFFER[1]=121 THEN OUTPUTLN(OUTCHANGEFILE);INC(OUTCHLINE);; IF N>0 THEN LOC:=2; WriteString ('! Hmm... '); WriteCard (N,1); WriteString (' of the preceding lines failed to match'); WriteLn ;; ERROR;;END;RETURN;END;END;(*:39*); (*33:*)THECHANGELIMIT[ACTIVECHANGEFILE]:=LIMIT; IF LIMIT>0 THEN FOR K:=0 TO LIMIT-1 DO THECHANGEBUFFER[ACTIVECHANGEFILE] [K]:=BUFFER[K];END;END;(*:33*); IF(ACTIVECHANGEFILE>0)THEN LASTACTIVECHANGEFILE:=ACTIVECHANGEFILE; THECHANGELINE[ACTIVECHANGEFILE]:=LINE;ACTIVECHANGEFILE:=0;LINE:=WEBLINE; ELSE ACTIVECHANGEFILE:=LASTACTIVECHANGEFILE;WEBLINE:=LINE; LINE:=THECHANGELINE[ACTIVECHANGEFILE];END;;INC(LINE); IF NOT INPUTLN(WEBFILE)THEN WriteString ( '! WEB file ended during a change'); WriteLn ;;ERROR;; INPUTHASENDED:=TRUE;RETURN;END; IF(ACTIVECHANGEFILE>0)THEN LASTACTIVECHANGEFILE:=ACTIVECHANGEFILE; THECHANGELINE[ACTIVECHANGEFILE]:=LINE;ACTIVECHANGEFILE:=0;LINE:=WEBLINE; ELSE ACTIVECHANGEFILE:=LASTACTIVECHANGEFILE;WEBLINE:=LINE; LINE:=THECHANGELINE[ACTIVECHANGEFILE];END;; IF LINESDONTMATCH()THEN INC(N)ELSE OUTPUTLN(OUTCHANGEFILE); INC(OUTCHLINE);;END; IF(ACTIVECHANGEFILE>0)THEN LASTACTIVECHANGEFILE:=ACTIVECHANGEFILE; THECHANGELINE[ACTIVECHANGEFILE]:=LINE;ACTIVECHANGEFILE:=0;LINE:=WEBLINE; ELSE ACTIVECHANGEFILE:=LASTACTIVECHANGEFILE;WEBLINE:=LINE; LINE:=THECHANGELINE[ACTIVECHANGEFILE];END;;END;END CHECKCHANGE; (*:34*)(*41:*)PROCEDURE GETLINE;VAR PREVIOUSCHANGEMODE:BOOLEAN; BEGIN REPEAT PREVIOUSCHANGEMODE:=(ACTIVECHANGEFILE>0); IF(ACTIVECHANGEFILE>0)THEN(*43:*)INC(LINE); IF NOT INPUTLN(CHANGEFILES[ACTIVECHANGEFILE])THEN WriteString ( '! Change file ended without @z'); WriteLn ;;ERROR;;BUFFER[0]:=64; BUFFER[1]:=122;LIMIT:=2;END; IF LIMIT>1 THEN IF BUFFER[0]=64 THEN IF(BUFFER[1]>=88)AND(BUFFER[1]<=90) THEN BUFFER[1]:=BUFFER[1]+32;END;; IF(BUFFER[1]=120)OR(BUFFER[1]=121)THEN LOC:=2; WriteString ('! Where is the matching @z?'); WriteLn ;;ERROR;; ELSIF BUFFER[1]=122 THEN OUTPUTLN(OUTCHANGEFILE);INC(OUTCHLINE);; LIMIT:=0;OUTPUTLN(OUTCHANGEFILE);INC(OUTCHLINE);; IF(ACTIVECHANGEFILE>0)THEN LASTACTIVECHANGEFILE:=ACTIVECHANGEFILE; THECHANGELINE[ACTIVECHANGEFILE]:=LINE;ACTIVECHANGEFILE:=0;LINE:=WEBLINE; ELSE ACTIVECHANGEFILE:=LASTACTIVECHANGEFILE;WEBLINE:=LINE; LINE:=THECHANGELINE[ACTIVECHANGEFILE];END;; ACTIVECHANGEFILE:=LASTACTIVECHANGEFILE;PRIMETHECHANGEBUFFER; ACTIVECHANGEFILE:=0;END;END;END;(*:43*);ELSE(*42:*)INC(LINE); IF NOT INPUTLN(WEBFILE)THEN INPUTHASENDED:=TRUE ELSE CHECKCHANGE;END; (*:42*);END;UNTIL PREVIOUSCHANGEMODE=(ACTIVECHANGEFILE>0);LOC:=0; BUFFER[LIMIT]:=32;END GETLINE;(*:41*)(*48:*)BEGIN INITIALIZE; WriteString ('This is WEBMERGE, Version 1.0'); WriteLn ;; (*24:*)FILENAME[0]:=' '; WriteString ('web file:'); WriteLn ;; ReadString (FILENAME); WriteLn ; WriteString (FILENAME); WriteLn ;; WriteLn ;MORENAMES:=(FILENAME[0]<>'!');; Lookup (WEBFILE,FILENAME,FALSE);;FILENAME[0]:=' '; WriteString ('out_web_file:'); WriteLn ;; ReadString (FILENAME); WriteLn ; WriteString (FILENAME); WriteLn ;; WriteLn ; MORENAMES:=(FILENAME[0]<>'!');; Lookup (OUTWEBFILE,FILENAME,TRUE);; FILENAME[0]:=' '; WriteString ('out_change_file:'); WriteLn ;; ReadString (FILENAME); WriteLn ; WriteString (FILENAME); WriteLn ;; WriteLn ;MORENAMES:=(FILENAME[0]<>'!');; Lookup (OUTCHANGEFILE,FILENAME,TRUE);;MORENAMES:=TRUE; ACTIVECHANGEFILE:=0;WHILE MORENAMES DO(*25:*)FILENAME[0]:=' '; WriteString ('change_file:'); WriteLn ;; ReadString (FILENAME); WriteLn ; WriteString (FILENAME); WriteLn ;; WriteLn ; MORENAMES:=(FILENAME[0]<>'!');; MORENAMES:=MORENAMES AND(ACTIVECHANGEFILE0)THEN LASTACTIVECHANGEFILE:=ACTIVECHANGEFILE; THECHANGELINE[ACTIVECHANGEFILE]:=LINE;ACTIVECHANGEFILE:=0;LINE:=WEBLINE; ELSE ACTIVECHANGEFILE:=LASTACTIVECHANGEFILE;WEBLINE:=LINE; LINE:=THECHANGELINE[ACTIVECHANGEFILE];END;;LIMIT:=0;LOC:=1; BUFFER[0]:=32;INPUTHASENDED:=FALSE;(*:24*); (*40:*)WHILE NOT INPUTHASENDED DO GETLINE;OUTPUTLN(OUTWEBFILE); INC(OUTWEBLINE);IF(OUTWEBLINE MOD 100)=0 THEN Write ('.'); IF(OUTWEBLINE MOD 2000)=0 THEN WriteLn ;END;END; IF(ACTIVECHANGEFILE>0)THEN OUTPUTLN(OUTCHANGEFILE);INC(OUTCHLINE);;END; END;(*:40*);(*44:*) Close (WEBFILE);; Close (OUTWEBFILE);; Close (OUTCHANGEFILE);; FOR ACTIVECHANGEFILE:=1 TO NUMBEROFACTUALCHANGEFILES DO IF THECHANGEFLAGS[ACTIVECHANGEFILE]THEN Close (CHANGEFILES[ACTIVECHANGEFILE ]);;THECHANGEFLAGS[ACTIVECHANGEFILE]:=FALSE;; IF THECHANGELIMIT[ACTIVECHANGEFILE]<>0 THEN FOR LOC:=0 TO THECHANGELIMIT [ACTIVECHANGEFILE]DO BUFFER[LOC]:=THECHANGEBUFFER[ACTIVECHANGEFILE][LOC] ;END;LIMIT:=THECHANGELIMIT[ACTIVECHANGEFILE];LINE:=WEBLINE; LOC:=THECHANGELIMIT[ACTIVECHANGEFILE]; WriteString ('! Change file entry did not match'); WriteLn ;;ERROR;;END; END;END;(*:44*);(*47:*)(* WriteLn ; WriteString ('Line count statistics:'); WriteLn ;; WriteCard (WEBLINE,1); WriteString (' lines in input web file'); WriteLn ;; FOR ACTIVECHANGEFILE:=1 TO NUMBEROFACTUALCHANGEFILES DO WriteCard ( THECHANGELINE[ACTIVECHANGEFILE],1); WriteString (' lines in change file '); WriteCard (ACTIVECHANGEFILE,1); WriteLn ;END; WriteCard (OUTWEBLINE,1); WriteString (' lines in output web file'); WriteLn ;; WriteCard (OUTCHLINE,1); WriteString (' lines in output change file'); WriteLn ;;*)(*:47*); (*46:*)CASE HISTORY OF 0: WriteString ('(No errors were found.)'); WriteLn ;|1: WriteString ('(Did you see the warning message above?)'); WriteLn ; |2: WriteString ('(Pardon me, but I think I spotted something wrong.)'); WriteLn ;|3: WriteString ('(That was a fatal error, my friend.)'); WriteLn ;END;(*:46*);(*9:*)DOSCALL(76,HISTORY);(*:9*); END WEBMERGE.(*:48*)