! Program to list through a series of files in paged form
! MDP Feb'84
! Modded by AJS so that filename is printed before connecting file 14/4/84
! Ported to FMAC by JHB with minimal mods to LOAD DIRECTORY and main prog.
! Modified by RWT to take account of V200EM-supplied screensize 11/4/85
! Modified by AJS to use VTLIB so will work with Wyses as well 11/7/85

!Parameters:          Filespec

!Commands:
!s, ' ', Cursor-down: Next page       -, <Cursor-Up>:     Last page
!r or Cursor-Home:    Restart         q:                  Quit
!b:                   Back one file   n:                  Next file

include  "Inc:Util.Imp"
include  "inc:fs.imp"
include  "inc:fsutil.imp"
Include  "inc:vtlib.imp"
@16_3fa0 byte  screenrows{,screencols;@16_3fa2 %routine screenput(%integer sym)

begin 
   string  (31) array  File Names (1 : 110)
   integer  array  Page Starts (1 : 1000)
   integer  Number of Files = 0
   string  (63) This File, A, B, Base File Name, Directory, Line
   integer  Ptr 1, Ptr 2, Index

   routine  Load Directory (string  (7) Directory)

      string  (127) Line

      on  3,9 start 
         -> End Load
      finish 

      Directory = Directory . ":" if  Directory # ""
      Open Input (1, Directory."Directory")
      Select Input (1)

      Number of Files = 0
      cycle 
         Read Line (Line)
         Number of Files = Number of Files + 1
         File Names (Number of Files) = Line
      repeat 

 End Load:
      Close Input
      Select Input (0)
      if  Number of files = 0 start 
         Print String ("PERUSE : - can't get at directory - ".Event_Message); New Line
         stop 
      finish 
   end 

   routine  Display Line (integer  name  Start, F End, Print)

      integer  Sym

      cycle 
         Sym = Byte Integer (Start)
         Sym = Sym & 127
         Sym = '_' if  (Sym < ' ' or  Sym = 127) and  Sym # Nl
         Print Symbol (Sym) if  Print = 1
         Start = Start + 1
         Start = -1 and  return  if  Start > F End
      repeat  until  Sym = Nl
   end 

   routine  Display Page (integer  P Start, integer  name  NP Start,
                          integer  P End,integer  name  Print)

      integer  Lines = 0

      NP Start = P Start
      cycle 
         Lines = Lines + 1
         Display Line (NP Start, P End, Print)
         exit  if  NP Start < 0
      repeat  until  Lines > {was 21} screenrows-3
      Print = 1
   end 


   routine   Peruse File (string  (31) Directory, File)

      integer  Previous Page, Page Start, New Page Start
      integer  Addr, Len, File End
      integer  Sym, Page Number = 1, Print = 1
      Byte     First = 1

!!      %integerfn last page
!!         !Return the base address of the last page
!!         !Uses globals PAGE NUMBER, FILE END
!!         %integer lines, pointer, page
!!         page = page number
!!         %cycle
!!            pointer = page start
!!            %for lines = 1, 1, 21 %cycle
!!                pointer = pointer + 1 %until byteinteger(pointer) = nl %or %c
!!                pointer > file end
!!            %repeat
!!            page = page + 1
!!         %repeatuntil pointer > file end
!!         %result = page - 1
!!      %end

      File = Directory .":". File if  Directory # ""
      clear frame
      Print String (File)

      Connect File (File, 0, Addr, Len)
      File End = Addr + Len - 1
      Page Start = Addr

      cycle 
          exit  if  Page Start < 0

          if  first = 1 Start   ;! Don't clear screen first time round
             first = 0
          Else 
             clear frame
             Print String (File)
         Finish 

         Spaces (70 - Length (File))
         Print String ("Page ")
         Write (Page Number, 0)
         New Line
         Display Page (Page Start, New Page Start, File End, Print)
!         Print Symbol (27); Print Symbol ('Y')
!         Print Symbol ({was 23}screenrows-1 + ' '); Print Symbol (0 + ' ')
         Gotoxy (screenrows-1,0)
         Print String ("** End **") if  New Page Start < 0
         cycle 
            Sym = 1
            Sym = Test Symbol while  Sym > 0 ;!Flush input buffer
            Sym = Test Symbol until  Sym >= 10;!Skip till first printable char
            if  sym = 27 start  ;!Cursor key
               sym = testsymbol until  sym >= 0
               sym = sym ! 128
            finish 
            Sym = Sym + ' ' if  'A' <= Sym <= 'Z'
            if  Sym = 'q' start      ;! quit
               New Line
               stop 
            else  if  Sym = 'b'      ;! back one file
               heapput(addr)
               signal  11
            else  if  Sym = 'n'      ;! next file
               heapput(addr)
               signal  12
            else  if  Sym = 'r' or  sym = 'H'+128      ;! restart
               Page Start = Addr
               Page Number = 1
               exit 
            else  if  Sym <= ' ' or  Sym = 's' or  sym = 'B'+128      ;! more %or skip
               Print = 0 if  Sym = 's'
               Page Starts (Page Number) = Page Start
               Page Start = New Page Start
               Page Number = Page Number + 1
               exit 
            else  if  Sym = '-' or  sym = 'A'+128
               exit  if  Page Number = 1
               Page Number = Page Number - 1
               Page Start = Page Starts (Page Number)
               exit 
!!            %elseif sym = 'e'
!!               page starts(page number) = page start
!!               page start = new page start
!!               page number = last page
!!               %exit
            else 
               Print Symbol (7)
            finish 
         repeat 
      repeat 
      heapput(addr)
   end 

   on  3,9,11,12 start 
      newline and  stop  if  event_event = 9
      Index = Index - 1 if  Index # 1 and  Event_Event = 11
      Index = Index + 1 if  Event_Event = 12
      -> Next File
   finish 

   Set Terminal Mode (No Page)
   Base File Name = CLI Param
   while  Base File Name = "" cycle 
      Prompt ("File :")
      Read Line (Base File Name)
   repeat 

   Directory = "" unless  Base File Name -> Directory .(":"). Base File Name
   Load Directory (Directory)

   Ptr 1 = 1; Ptr 2 = 1
   while  Ptr 1 <= Number of Files cycle 
      This File = File Names (Ptr 1)
      if  Matches (This File, Base File Name) start 
         if  Base File Name = "*" start 
            Ptr 1 = Ptr 1 + 1 and  continue  if  This File -> A .("."). B
         finish 
         File Names (Ptr 2) = This File
         Ptr 2 = Ptr 2 + 1
      finish 
      Ptr 1 = Ptr 1 + 1
   repeat 

   Number of Files = Ptr 2 - 1
   if  Number of Files = 0 start 
      Print String ("No files matched file specification.")
      New Line
      stop 
   finish 
   Index = 1

Next File:
   while  Index <= Number of Files cycle 
      Print String (File Names (Index)); New Line
      Peruse File (Directory, File Names (Index))
      Index = Index + 1
   repeat 
   New Line
end  of  program