[Back to TEXTFILE SWAG index] [Back to Main SWAG index] [Original]

    (*
      From: Mike Copeland                                Read: Yes    Replied: No
    >>    This is definitely possible in Turbo/Borland Pascals, and
    >> you don't need any ASM, either.  The basic process is to (1)
    >> read the entire file into memory (probably to the Heap, via
    >> pointers) and (2) display "pages" of the data, using ReadKey
    >> interpretation to "move" through the data (starting with
    >> record 1-20, and adjusting what you display by whatever key
    >> "command" is invoked.

       Here it is {tested}.  Note that I use some TechnoJocks screen
    i/o routines here, but you should be able to substitute normal TP/BP
    procedures.  Also, I wrote this program to process Tagline files, so the
    "record" is limited to 80 character strings - you can change that, too,
    as needed...
    *)

    program Text_File_Viewer;                    { MRCopeland 941231 }
    {$M 8192,0,655000}
    Uses CRT,DOS,FastTTT5,WinTTT5,RPU1;

    const VERSION = '1.0';
          TLIM    = 10000;                           { Records Limit }
    type  S80     = string[80];
          LLPTR   = ^S80;
    var   I,J,K   : integer;
          PAX,B,E : integer;                   { Pointer Array indeX }
          OFFSET  : integer;
          DONE    : boolean;
          T       : S80;
          PA      : array[1..TLIM] of LLPTR;  {  P/A for stored recs }

    procedure HEADER;
    begin
      ClrScr;
      WriteCenter (2,LightGray,Black,'**** Scrolling Viewer - Ver '+
                  VERSION+'****');
    end;  { HEADER }

    procedure INITIALIZE;            { initialize system & variables }
    begin
      HEADER;
      if ParamCount > 0 then F3 := ParamStr(1)
      else
        begin
          WPROM (LONORM,'Enter filename: '); readln (F3);
        end;
      if not EXISTS (F3) then FATAL ('Cannot Open '+F3+' as input file');
      FastWrite (1,25,LONORM,FSI(MemAvail,1)+' Bytes @ start ');
      for I := 1 to TLIM do PA[I] := Nil;
      BBOPEN (FV3,F3,'r',BUFFIN); OFFSET := 1  { default record offset }
    end;  { INITIALIZE }

    procedure SORT_RECS (LEFT,RIGHT : word);         { Lo-Hi QuickSort }
    var LOWER,UPPER,MIDDLE : Word;
        PIVOT              : S80;
    begin
      LOWER := LEFT; UPPER := RIGHT; MIDDLE := (LEFT+RIGHT) Shr 1;
      PIVOT := PA[MIDDLE]^;
      repeat
        while PA[LOWER]^ < PIVOT do Inc(LOWER);
        while PIVOT < PA[UPPER]^ do Dec(UPPER);
        if LOWER <= UPPER then
          begin
            T := PA[LOWER]^; PA[LOWER]^ := PA[UPPER]^; PA[UPPER]^ := T;
            Inc (LOWER); Dec (UPPER);
          end;
      until LOWER > UPPER;
      if LEFT < UPPER then SORT_RECS (LEFT, UPPER);
      if LOWER < RIGHT then SORT_RECS (LOWER, RIGHT)
    end;  { SORT_RECS }

    procedure DISPLAY_PAGE (F,L : integer);
    Var N,M : integer;
    begin
      ClrScr; M := 0;
      for N := F to L do
        begin
          Inc (M); FastWrite (1,M,HINORM,Copy(PA[N]^,OFFSET,80))
        end
    end;  { DISPLAY_PAGE }

    procedure DO_HOME;
    begin
      B := 1; E := 20;
      if E > PAX then E := PAX
    end;  { DO_HOME }

    procedure CHECK_END;
    begin
      if E <= 0 then E := 1;
      if E > PAX then E := PAX;
      B := E-19;
      if B <= 0 then B := 1
    end;  { CHECK_END }

    function GET_CMD : char;                         { Get User Command }
    Var WCH : char;
    begin
      WriteCenter (DSLINE,LightGray,Black,'Cursor keys to move; Q or Esc to Quit');
      WPROM (LONORM,'Command: '); WCH := ReadKey;{ fetch user keystroke }
      case WCH of
        #00 : begin                        { special/extended keystroke }
                WCH := ReadKey;
                case WCH of
                  #71 : DO_HOME;                                 { Home }
                  #79 : E := PAX;                                 { End }
                  #72 : Dec (E);                              { UpArrow }
                  #73 : Dec (E,20);                              { PgUp }
                  #80 : Inc (E);                            { DownArrow }
                  #13,                                            { c/r }
                  #81 : begin                                    { PgDn }
                          Inc (E,20); WCH := ' ';
                        end;
                  #77 : begin                                 { RtArrow }
                          Inc (OFFSET,10);
                          if OFFSET > 71 then OFFSET := 70
                        end;
                  #75 : begin                               { LeftArrow }
                          Dec (OFFSET,10);
                          if OFFSET < 1 then OFFSET := 1
                        end;
                end  { case }
              end;
        else
      end;  { case }
      CHECK_END; GET_CMD := UpCase(WCH)
    end;  { GET_CMD }

    procedure READ_RECS;
    begin
      PAX := 0;
      while not EOF (FV3) do
        begin
          readln (FV3,S1); Inc (CT); FastWrite (1,DSLINE,LONORM,FSI(CT,5));
          CH := S1[1]; S2 := TTB(S1); Inc (PAX);
          if PAX <= TLIM then
            begin
              New (PA[PAX]); PA[PAX]^ := S2;
              FastWrite (7,DSLINE,LONORM,FSI(PAX,4));
            end
        end;
      FastWrite (50,25,LONORM,FSI(MemAvail,1)+' Bytes with data loaded');
      Close (FV3); Dispose (BUFFIN);
      SORT_RECS (1,PAX);
      DONE := false; DO_HOME;              { set up 1st page of display }
      repeat               { display "pages" of data, using cursor keys }
        DISPLAY_PAGE(B,E);
        CH := GET_CMD; DONE := CH in [#27,'Q']
      until DONE
    end;  { READ_RECS }

    begin  { MAIN LINE }
      INITIALIZE;                       { initialize system & variables }
      READ_RECS;                           { read & store records, list }
      WriteCenter (ERLINE,LightGray,Black,'Finis...'); PAUSE
    end.

[Back to TEXTFILE SWAG index] [Back to Main SWAG index] [Original]