'===========================================================================
' Subject: TEXT FILE VIEWER FOR PB/CC         Date: 06-27-98 (00:00)       
'  Author: PowerBASIC, Inc.                   Code: PBCC                   
'  Origin: ftp.powerbasic.com               Packet: PBCC.ABC
'===========================================================================
'=============================================================================
'
'  Text File Viewer for PowerBASIC Console Compiler
'  Copyright (c) 1995-98 by PowerBASIC, Inc.  All Rights Reserved.
'
'  Supports long filenames and text files of unlimited size.
'
'=============================================================================

$REGISTER NONE
$INCLUDE "WIN32API.INC"
$INCLUDE "SCRNIO.INC"

'============================================================================

FUNCTION Exist(BYVAL Filenam AS STRING) AS LONG

  FUNCTION = LEN(DIR$(Filenam)) > 0

END FUNCTION

'============================================================================

FUNCTION FileDateTime(BYVAL Filenam AS STRING) AS STRING

  LOCAL fd    AS WIN32_FIND_DATA
  LOCAL fh    AS LONG
  LOCAL zText AS ASCIIZ * 256
  LOCAL st    AS SYSTEMTIME
  LOCAL Temp  AS STRING

  zText = Filenam

  ' -- Find the file
  fh = FindFirstFile(zText, fd)
  IF fh = %INVALID_HANDLE_VALUE THEN
    EXIT FUNCTION
  END IF
  FindClose fh

  ' -- Convert the file time from UTC to local time
  FileTimeToLocalFileTime fd.ftLastWriteTime, fd.ftLastWriteTime

  ' -- Convert the file time into a compatible system time
  FileTimeToSystemTime fd.ftLastWriteTime, st

  ' -- Create a date string using the local settings
  GetDateFormat %LOCALE_USER_DEFAULT, %DATE_SHORTDATE, st, BYVAL %NULL, zText, 256
  Temp = zText

  ' -- Create a time string using the local settings
  GetTimeFormat %LOCALE_USER_DEFAULT, %TIME_NOSECONDS, st, BYVAL %NULL, zText, 256

  ' -- Return the file date and time
  FUNCTION = Temp + " " + zText

END FUNCTION

'============================================================================

FUNCTION PbMain() EXPORT AS LONG

  LOCAL Arrows   AS STRING
  LOCAL CurX     AS LONG
  LOCAL CurY     AS LONG
  LOCAL FileDate AS STRING
  LOCAL FileName AS STRING
  LOCAL FileTime AS STRING
  LOCAL I        AS STRING
  LOCAL Last     AS LONG
  LOCAL Percent  AS LONG
  LOCAL Tmp      AS STRING
  LOCAL Y        AS LONG
  LOCAL hConOut  AS LONG
  LOCAL Rect     AS SMALL_RECT
  LOCAL Char     AS CHAR_INFO
  LOCAL Cord     AS COORD

  hConOut         = GETSTDOUT
  CurY            = 1
  CurX            = 1
  Last            = 0
  Arrows          = CHR$(24,25,26,27)
  Char.Ch         = ASC(" ")
  Char.Attributes = 7

  FileName = UCASE$(COMMAND$)

  PRINT "PBLIST v1.00 - Text file viewer for Win32"
  PRINT "Copyright (c) 1995-98 by PowerBASIC, Inc. All Rights Reserved."
  PRINT

  IF LEN(Filename) = 0 THEN
    PRINT "Usage: PBLIST filename"
    PRINT ""
    PRINT "Long filenames are supported."
    EXIT FUNCTION

  ELSEIF INSTR(FileName, ANY "?*") THEN
    PRINT "Error!  Wildcards not supported."
    EXIT FUNCTION

  ELSEIF NOT Exist(FileName) THEN
    PRINT Filename; " not found!"
    EXIT FUNCTION

  ELSE
    FileDate = FileDateTime(Filename)

  END IF

  DIM Text(1:35000) AS STRING   'maximum of 35,000 lines of text

  'Read the text file into memory
  OPEN FileName FOR INPUT AS #1
    WHILE NOT EOF(1)
      INCR Last
      LINE INPUT #1, Text(Last)
      IF Last = 35000 THEN
        EXIT DO
      END IF
    WEND
  CLOSE

  CURSOR OFF
  QPRINT SCREENY, 1, SPACE$(80), &H1F
  QPRINT SCREENY, 2, Filename + " - " + FileDate + "  ³", &H1F
  QPRINT SCREENY, 47, " ³  " + Arrows + " PgDn PgUp  ³  Esc = Exit", &H1F

  DO

    BeginBuffer
      FOR y = 0 TO SCREENY - 2
        Tmp = LEFT$(MID$(Text(CurY + y), CurX, 80) + SPACE$(80), 80)
        QPRINT y + 1, 1, Tmp, &H07
      NEXT y
    EndBuffer

SkipWrite:
    Percent = (CurY * 100) \ (Last - 23)
    IF Percent < 0 THEN
      Percent = 0
    ELSEIF Percent > 100 THEN
      Percent = 100
    END IF
    QPRINT SCREENY, 42, FORMAT$(Percent, "###%"), &H1F

    I = WAITKEY$

    SELECT CASE I
      CASE CHR$(27)                       'ESC
        EXIT DO
      CASE CHR$(0, 72)                    'Up Arrow
        IF CurY > 1 THEN
          DECR CurY
          Rect.xLeft   = 0
          Rect.xTop    = 0
          Rect.xRight  = SCREENX - 1
          Rect.xBottom = SCREENY - 3
          SCROLL UP 1, 1, 1, SCREENY - 1, SCREENX
          QPRINT 1, 1, LEFT$(MID$(Text(CurY), CurX, 80) + SPACE$(80), 80), &H07
          GOTO SkipWrite
        END IF
      CASE CHR$(0, 80)                    'Down Arrow
        IF CurY < Last - 22 THEN
          INCR CurY
          Rect.xLeft   = 0
          Rect.xTop    = 1
          Rect.xRight  = SCREENX - 1
          Rect.xBottom = SCREENY - 2
          SCROLL DOWN 1, 1, 1, SCREENY - 1, SCREENX
          QPRINT SCREENY - 1, 1, LEFT$(MID$(Text(CurY + SCREENY - 2), CurX, 80) + SPACE$(80), 80), &H07
          GOTO SkipWrite
        END IF
      CASE CHR$(0, 75)                    'Left Arrow
        IF CurX > 1 THEN
          CurX = CurX - 4
        END IF
      CASE CHR$(0, 77)                    'Right Arrow
        CurX = CurX + 4
      CASE CHR$(0, 73)                    'PgUp
        CurY = CurY - (SCREENY - 2)
        IF CurY < 1 THEN
          CurY = 1
        END IF
      CASE CHR$(0, 81)                    'PgDn
        IF CurY + 23 <= Last THEN
          CurY = CurY + (SCREENY - 2)
        END IF
      CASE CHR$(0, 71)                    'Home
        CurY = 1
      CASE CHR$(0, 79)                    'End
        CurY = Last - (SCREENY - 3)
        IF CurY < 1 THEN
          CurY = 1
        END IF
    END SELECT

  LOOP

  QPRINT SCREENY, 1, SPACE$(80), &H07
  LOCATE SCREENY - 1, 1
  CURSOR ON, 1

END FUNCTION
