home *** CD-ROM | disk | FTP | other *** search
- {TITLE: Reading big text files}
- PROGRAM Browse;
- {Created 9/8/86 offered to the world via BIX, for any convenience it brings.
- No charge. No warranty. Equal support.
- Lawrence Judy (BIX: larryjudy)
- }
-
- CONST linelength=79;
- OneScreen=23;
- MaxFileSize=1000;{this could be adjusted according to max. file size}
- {the bigger this is, the bigger the file read can be}
- {i.e.:500 = 40000 bytes, 1200 = 96000 bytes etc.}
- TYPE oneline=STRING[linelength];
- LineArr=ARRAY[1..MaxFileSize] OF ^oneline;
- Filename=STRING[66];
- VAR
- MsgFileName:Filename;
- Infile:Text;
- resp:Char;
- FirstLn,LastLn,CurrentLn,
- j:Integer;
- HeapTop:^Integer;
- TextArr:LineArr;
- Quit:Boolean;
-
- PROCEDURE WriteScreen(fstln,lstln:Integer;VAR TargetArray:LineArr);
- VAR index:Integer;
- BEGIN
- ClrScr;
- GoToXY(1,1);
- FOR index:=fstln TO lstln DO WriteLn(TargetArray[index]^);
- END;
-
- BEGIN
- ClrScr;
- IF ParamCount=0 THEN
- BEGIN
- {$I-}
- REPEAT
- ClrScr;
- Write('What is the file to read? ');
- ReadLn(MsgFileName);
- Assign(Infile,MsgFileName);
- Reset(Infile);
- UNTIL IOResult=0;
- {$I+}
- END
- ELSE
- BEGIN
- MsgFileName:=ParamStr(1);
- Assign(Infile,MsgFileName);
- Reset(Infile)
- END;
- Mark(HeapTop);{so you can free up memory used when done}
- FirstLn:=1;
- j:=FirstLn;
- WHILE NOT EoF(Infile) DO
- BEGIN
- New(TextArr[j]);
- ReadLn(Infile,TextArr[j]^);
- j:=Succ(j);
- END;{end of while}
- Close(Infile);
- LastLn:=Pred(j);{on exiting loop, j was incremented one more time}
- CurrentLn:=FirstLn;
- Quit:=False;
- REPEAT
- IF CurrentLn+OneScreen>LastLn THEN
- BEGIN{reaching the end of file }
- WriteScreen(CurrentLn,LastLn,TextArr);
- CurrentLn:=FirstLn;{ready to start over}
- END
- ELSE
- BEGIN
- WriteScreen(CurrentLn,CurrentLn+OneScreen,TextArr);
- IF CurrentLn=LastLn THEN CurrentLn:=FirstLn
- ELSE CurrentLn:=CurrentLn+OneScreen;
- END;
- REPEAT
- GoToXY(1,25);
- Write('<Reading from: ',MsgFileName);
- Write(' N>ext page, P>revious page, Q>uit >');
- Read(Kbd,resp);
- resp:=UpCase(resp);
- UNTIL resp IN ['N','Q','P',#13,#27,' '];
- IF resp='P' THEN{this is the function for going back one page}
- BEGIN
- IF CurrentLn=FirstLn THEN
- BEGIN
- IF LastLn<OneScreen THEN CurrentLn:=FirstLn
- ELSE CurrentLn:=LastLn-(2*OneScreen)
- END
- ELSE
- IF CurrentLn=FirstLn+OneScreen THEN CurrentLn:=LastLn-OneScreen
- ELSE IF (CurrentLn-2*(OneScreen))>1
- THEN CurrentLn:=CurrentLn-2*(OneScreen)
- ELSE CurrentLn:=FirstLn;
- END;
- IF resp IN [#27,'Q'] THEN Quit:=True;
- UNTIL Quit=True;
- Release(HeapTop);
- ClrScr
- END.