home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / bix / browser.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1986-11-01  |  2.6 KB  |  104 lines

  1. {TITLE: Reading big text files}
  2. PROGRAM Browse;
  3.  {Created 9/8/86  offered to the world via BIX, for any convenience it brings.
  4.  No charge.  No warranty.  Equal support.
  5.  Lawrence Judy  (BIX: larryjudy)
  6.  }
  7.  
  8. CONST linelength=79;
  9.  OneScreen=23;
  10.  MaxFileSize=1000;{this could be adjusted according to max. file size}
  11.  {the bigger this is, the bigger the file read can be}
  12.  {i.e.:500 = 40000 bytes, 1200 = 96000 bytes etc.}
  13. TYPE oneline=STRING[linelength];
  14.  LineArr=ARRAY[1..MaxFileSize] OF ^oneline;
  15.  Filename=STRING[66];
  16. VAR
  17.  MsgFileName:Filename;
  18.  Infile:Text;
  19.  resp:Char;
  20.  FirstLn,LastLn,CurrentLn,
  21.  j:Integer;
  22.  HeapTop:^Integer;
  23.  TextArr:LineArr;
  24.  Quit:Boolean;
  25.  
  26.  PROCEDURE WriteScreen(fstln,lstln:Integer;VAR TargetArray:LineArr);
  27.  VAR index:Integer;
  28.  BEGIN
  29.   ClrScr;
  30.   GoToXY(1,1);
  31.   FOR index:=fstln TO lstln DO WriteLn(TargetArray[index]^);
  32.  END;
  33.  
  34. BEGIN
  35.  ClrScr;
  36.  IF ParamCount=0 THEN
  37.   BEGIN
  38.    {$I-}
  39.    REPEAT
  40.     ClrScr;
  41.     Write('What is the file to read? ');
  42.     ReadLn(MsgFileName);
  43.     Assign(Infile,MsgFileName);
  44.     Reset(Infile);
  45.    UNTIL IOResult=0;
  46.    {$I+}
  47.   END
  48.  ELSE
  49.   BEGIN
  50.    MsgFileName:=ParamStr(1);
  51.    Assign(Infile,MsgFileName);
  52.    Reset(Infile)
  53.   END;
  54.  Mark(HeapTop);{so you can free up memory used when done}
  55.  FirstLn:=1;
  56.  j:=FirstLn;
  57.  WHILE NOT EoF(Infile) DO
  58.   BEGIN
  59.    New(TextArr[j]);
  60.    ReadLn(Infile,TextArr[j]^);
  61.    j:=Succ(j);
  62.   END;{end of while}
  63.  Close(Infile);
  64.  LastLn:=Pred(j);{on exiting loop, j was incremented one more time}
  65.  CurrentLn:=FirstLn;
  66.  Quit:=False;
  67.  REPEAT
  68.   IF CurrentLn+OneScreen>LastLn THEN
  69.    BEGIN{reaching the end of file }
  70.     WriteScreen(CurrentLn,LastLn,TextArr);
  71.     CurrentLn:=FirstLn;{ready to start over}
  72.    END
  73.   ELSE
  74.    BEGIN
  75.     WriteScreen(CurrentLn,CurrentLn+OneScreen,TextArr);
  76.     IF CurrentLn=LastLn THEN CurrentLn:=FirstLn
  77.     ELSE CurrentLn:=CurrentLn+OneScreen;
  78.    END;
  79.   REPEAT
  80.    GoToXY(1,25);
  81.    Write('<Reading from: ',MsgFileName);
  82.    Write('  N>ext page, P>revious page, Q>uit >');
  83.    Read(Kbd,resp);
  84.    resp:=UpCase(resp);
  85.   UNTIL resp IN ['N','Q','P',#13,#27,' '];
  86.   IF resp='P' THEN{this is the function for going back one page}
  87.    BEGIN
  88.     IF CurrentLn=FirstLn THEN
  89.      BEGIN
  90.       IF LastLn<OneScreen THEN CurrentLn:=FirstLn
  91.       ELSE CurrentLn:=LastLn-(2*OneScreen)
  92.      END
  93.     ELSE
  94.      IF CurrentLn=FirstLn+OneScreen THEN CurrentLn:=LastLn-OneScreen
  95.      ELSE IF (CurrentLn-2*(OneScreen))>1
  96.      THEN CurrentLn:=CurrentLn-2*(OneScreen)
  97.      ELSE CurrentLn:=FirstLn;
  98.    END;
  99.   IF resp IN [#27,'Q'] THEN Quit:=True;
  100.  UNTIL Quit=True;
  101.  Release(HeapTop);
  102.  ClrScr
  103. END.
  104.