'===========================================================================
' Subject: SMODEM LOG FILE VIEWER             Date: 04-19-98 (16:21)       
'  Author: Viktor Rootselainen                Code: QB, QBasic, PDS        
'  Origin: viktor@pcb.mpoli.fi              Packet: MODEM.ABC
'===========================================================================
'SREAD.BAS v1.0  Smodem log file reader by Viktor Rootselainen  1998
'If you use this code please give credit.

DEFINT A-Z
'$DYNAMIC
DECLARE SUB BigFile ()
DECLARE SUB GetFile ()
DECLARE SUB PrintText ()
DECLARE SUB SaveText ()
COMMON SHARED lastrow, Slog$, LongFile
DIM SHARED TxtLine$(2000), LineColr(2000), Filebuf AS STRING * 160
Slog$ = "Smodem.$$$"
IF LEN(COMMAND$) THEN Slog$ = COMMAND$
LOCATE , , 0: WIDTH 80, 25: usecolor = 1
CLS : GetFile: CLS : row = 0
FOR i = 1 TO 20: k$ = INKEY$: NEXT       'clear keyboard buffer

IF LongFile THEN
  OPEN "I", 3, "smodem.txt"
  REDIM SHARED Seeks&(1 TO 16384)
  CurSeek& = 1: lastrow = 0
  DO UNTIL EOF(3)
      LINE INPUT #3, text$
      lastrow = lastrow + 1: Seeks&(lastrow) = CurSeek&
      CurSeek& = CurSeek& + LEN(text$) + 2
  LOOP
END IF


printscr: COLOR 7, 0
IF LongFile THEN
  IF row < 1 THEN row = 1
  SEEK #3, Seeks&(row)
  FOR i = 2 TO 24
    IF NOT EOF(3) THEN LINE INPUT #3, text$ ELSE text$ = ""
    Strg$ = SPACE$(80): LSET Strg$ = text$
    LOCATE i, 1: PRINT Strg$;
  NEXT i
        ELSE
  FOR i = 2 TO 24
    LOCATE i, 1: PRINT STRING$(80, 32);
    IF usecolor THEN COLOR LineColr(i + row - 1)
    LOCATE i, 1: PRINT TxtLine$(i + row - 1);
  NEXT
END IF
COLOR 15, 1: LOCATE 25, 1: PRINT " "; CHR$(25); CHR$(24); " Home, End, Page down, Page up - move| ESC - exit| P - print"; : IF LongFile = 0 THEN PRINT "| S - save text";  ELSE PRINT SPC(17);

main: DO
k$ = INKEY$: inkey = INP(&H60)
IF k$ = CHR$(0) + CHR$(72) THEN IF row > 0 THEN row = row - 1: GOTO printscr
IF k$ = CHR$(0) + CHR$(80) THEN IF row < lastrow - 23 THEN row = row + 1: GOTO printscr
IF k$ = CHR$(0) + CHR$(71) THEN IF row <> 0 THEN row = 0: GOTO printscr
IF k$ = CHR$(0) + CHR$(79) THEN IF row < lastrow - 23 THEN row = lastrow - 23: GOTO printscr
IF k$ = CHR$(0) + CHR$(73) THEN
  IF row - 23 > 0 THEN row = row - 23: GOTO printscr ELSE IF row <> 0 THEN row = 0: GOTO printscr
END IF

IF k$ = CHR$(0) + CHR$(81) THEN
  IF row < lastrow - 46 THEN row = row + 23: GOTO printscr ELSE IF row <> lastrow - 23 THEN row = lastrow - 23: GOTO printscr
END IF

IF UCASE$(k$) = "C" THEN usecolor = usecolor XOR 1: GOTO printscr
IF LongFile = 0 AND UCASE$(k$) = "S" THEN SaveText: SLEEP 1
IF UCASE$(k$) = "P" THEN PrintText: SLEEP 1

dat$ = MID$(DATE$, 4, 2) + "." + LEFT$(DATE$, 2) + "." + RIGHT$(DATE$, 4)
txt$ = dat$ + " | " + TIME$ + "       Smodem log file reader  v1.0      " + "line" + STR$(row + 23) + " /" + STR$(lastrow)
COLOR 15, 1: LOCATE 1, 1: PRINT txt$; SPC(80 - LEN(txt$));
LOOP WHILE NOT k$ = CHR$(27)
COLOR 7, 0: CLS : END

filerr: LOCATE 1, 1: PRINT "Can't open file - "; Slog$
INPUT "Input Smodem log file: ", Slog$: : IF LEN(Slog$) THEN CLS : RESUME
END

printerr: LOCATE 1, 1: PRINT "Printer error:"; ERR: SLEEP 1
CLOSE 1: RESUME printscr

progerr: CLS : COLOR 7, 0: LOCATE 1, 1: PRINT "Program error:"; ERR
END

REM $STATIC
SUB BigFile
rowstotal = LOF(1) / 160 + 1
PRINT "File Name to save (Enter=Smodem.txt): "; : INPUT "", File$
File$ = LTRIM$(RTRIM$(File$)): IF LEN(File$) = 0 THEN File$ = "Smodem.txt"
LOCATE 4, 1: PRINT "Please wait - converting "; UCASE$(Slog$); " to "; File$
PRINT "Press ESC to abort": PRINT : PRINT "Line"
OPEN File$ FOR OUTPUT AS 2
DO WHILE NOT EOF(1)
GET #1, , Filebuf: a$ = Filebuf: row = row + 1: tmp$ = ""
                            
FOR i = 1 TO LEN(a$)
b$ = MID$(a$, i, 2): z$ = LEFT$(b$, 1)
IF ASC(z$) >= 1 AND ASC(z$) <= 15 THEN GOTO skip2
IF z$ = CHR$(0) THEN GOTO skip2
tmp$ = tmp$ + z$
skip2: NEXT: k$ = INKEY$

txt$ = RTRIM$(tmp$): PRINT #2, txt$
IF k$ = CHR$(27) THEN PRINT "Aborted!": CLOSE : EXIT SUB
LOCATE 7, 5: PRINT row; "of"; rowstotal
LOOP: lastrow = row
PRINT "Smodem log file ("; LTRIM$(STR$(LOF(1))); " bytes) converted to Smodem.txt ("; LTRIM$(STR$(LOF(2))); " bytes)"
CLOSE : SLEEP 2
END SUB

SUB GetFile
ON ERROR GOTO filerr: OPEN Slog$ FOR INPUT AS 1: CLOSE 1
ON ERROR GOTO progerr
OPEN Slog$ FOR BINARY SHARED AS 1 LEN = LEN(Filebuf)
rowstotal = LOF(1) / 160 + 1
LOCATE 1, 14: PRINT "Smodem log file reader v1.0 by Viktor Rootselainen  1998"
IF rowstotal > 720 THEN PRINT : PRINT "The file is too big to load it in memory.": LongFile = 1: BigFile: EXIT SUB
LOCATE 3, 1: PRINT "Please wait - loading "; UCASE$(Slog$): PRINT "Line"
DO WHILE NOT EOF(1)
GET #1, , Filebuf: a$ = Filebuf: row = row + 1
                             
FOR i = 1 TO LEN(a$)
b$ = MID$(a$, i, 2): z$ = LEFT$(b$, 1): C$ = RIGHT$(b$, 1)
IF ASC(z$) >= 1 AND ASC(z$) <= 15 THEN GOTO skip
IF z$ = CHR$(0) THEN GOTO skip
TxtLine$(row) = TxtLine$(row) + z$
LineColr(row) = ASC(C$)
skip: NEXT

LOCATE 4, 5: PRINT row; "of"; rowstotal
LOOP: CLOSE : lastrow = row
END SUB

SUB PrintText
ON ERROR GOTO printerr
LOCATE 1, 1: PRINT STRING$(80, 32)
OPEN "LPT1:" FOR OUTPUT AS 1
IF LongFile THEN
 SEEK #3, Seeks&(1)
 FOR i = 1 TO lastrow
   IF NOT EOF(3) THEN LINE INPUT #3, text$ ELSE text$ = ""
   txt$ = SPACE$(80): LSET txt$ = text$: txt$ = RTRIM$(txt$)
   PRINT #1, txt$
 NEXT i
        ELSE
 FOR i = 1 TO lastrow
   txt$ = RTRIM$(TxtLine$(i))
   PRINT #1, txt$
 NEXT
END IF
LOCATE 1, 1: PRINT "Smodem log printed"
ON ERROR GOTO progerr: CLOSE 1
END SUB

SUB SaveText
LOCATE 1, 1: PRINT STRING$(80, 32)
LOCATE 1, 1: PRINT "File Name to save (ENTER=Smodem.txt): "; : INPUT "", File$
File$ = LTRIM$(RTRIM$(File$)): IF LEN(File$) = 0 THEN File$ = "Smodem.txt"

OPEN File$ FOR OUTPUT AS 1
FOR i = 1 TO lastrow: txt$ = RTRIM$(TxtLine$(i)): PRINT #1, txt$: NEXT

LOCATE 1, 1: PRINT "Smodem log file saved to text file "; File$; " ("; LTRIM$(STR$(LOF(1))); " bytes)"
CLOSE
END SUB
