DECLARE SUB AddNode (SStr$)
DECLARE SUB J (junk$)
DECLARE SUB OpenFiles (file1$, file2$)
DECLARE SUB ReadBuffer (f$)
'Objective: Find the longest matching, repeating string!
CLEAR , , 3500
DIM SHARED buffer AS STRING * 5000
DIM SHARED search AS STRING * 25
DIM SHARED hdr1 AS STRING * 1, hdr2 AS STRING * 1, hdr3 AS STRING * 1
hdr1 = CHR$(213)
hdr2 = CHR$(57)
hdr3 = CHR$(45)
CLS
PRINT "/-----------------------------------------\"
PRINT "|Keene-Lampton Compression Program Alpha-1|"
PRINT "\-----------------------------------------/"
PRINT
'INPUT "Input File-->", File1$
'INPUT "Output File-->", File2$
file1$ = "command.com"
file2$ = "comm.kam"
OPEN file2$ FOR BINARY AS #1
IF LOF(1) > 0 THEN CLOSE 1: KILL file2$ ELSE CLOSE 1
OpenFiles file1$, file2$
tmp$ = "KrAM"
PUT #8, , tmp$
ReadBuffer r$
CLOSE 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

SUB AddNode (SStr$)
DIM Varchnk AS INTEGER
Varchnk = Varchnk + 1
PUT #8, , hdr1
PUT #8, , hdr2
PUT #8, , hdr3
PUT #8, , SStr$
PUT #8, , Varchnk
PUT #8, , hdr3
PUT #8, , hdr2
PUT #8, , hdr1
END SUB

SUB Compress (junk$)
DIM onoff AS INTEGER
PRINT "****** Next Chunk ******"
FOR searcharea = 1 TO LEN(junk$) STEP LEN(search)
   search = MID$(junk$, searcharea, LEN(search))
   maxhitsofar = 0
   FOR qqq = 100 TO LEN(junk$) STEP LEN(search)
      IF search = MID$(junk$, qqq, LEN(search)) THEN onoff = 1 ELSE onoff = 0
      'PRINT onoff; ":";
      IF onoff = 1 THEN maxhitsofar = maxhitsofar + 1
   NEXT qqq
   PRINT maxhitsofar; ":";
NEXT searcharea
PUT #7, LOC(6), junk$
END SUB

SUB J (junk$)
FOR q = 1 TO LEN(junk$)
IF INSTR(q + 1, junk$, Strd$) = 0 THEN
        IF LEN(Strd$) > BigNum THEN BigNum = LEN(Strd$) - 1
        IF LEN(Strd$) = 0 THEN q = q + 1 ELSE q = q + LEN(Strd$): Strd$ = LEFT$(Strd$, LEN(Strd$) - 1)
        PRINT ".";
        IF LEN(Strd$) > 7 THEN AddNode Strd$
        Strd$ = ""
        x = CSRLIN: y = POS(0): LOCATE 25, 1: PRINT "Current Pos: "; q; "  Largest String:"; BigNum; : LOCATE x, y
ELSE
        'PRINT strd$; ":";
        PRINT "0";
        Strd$ = Strd$ + MID$(junk$, q + 1, 1)
END IF
q = q - 1
NEXT q
AddNode Strd$
PUT #7, , junk$
PRINT BigNum; "<-- Large!!"
END SUB

SUB OpenFiles (file1$, file2$)
OPEN file2$ FOR BINARY AS #7
IF LOF(7) <> 0 THEN CLOSE 7: KILL file2$ ELSE CLOSE 7
OPEN "VMEM.SWP" FOR BINARY AS #7
IF LOF(7) <> 0 THEN CLOSE 7: KILL "VMEM.SWP" ELSE CLOSE 7
OPEN "FOTR.SWP" FOR BINARY AS #7
IF LOF(7) <> 0 THEN CLOSE 7: KILL "FOTR.SWP" ELSE CLOSE 7
OPEN file1$ FOR BINARY ACCESS READ AS #6
OPEN file2$ FOR BINARY ACCESS WRITE AS #7
OPEN "VMEM.SWP" FOR BINARY AS #8
OPEN "FOTR.SWP" FOR BINARY AS #9

END SUB

SUB ReadBuffer (f$)
'Objective: To load and resize the buffer!
FOR q = 0 TO LOF(6)
GET #6, , buffer: Cnt = Cnt + 1
IF LEN(buffer) + q > LOF(6) THEN m = ABS(((Cnt * LEN(buffer)) - LEN(buffer)) - LOF(6)) ELSE m = LEN(buffer)
IF m = LEN(buffer) THEN J buffer ELSE J LEFT$(buffer, m)
q = q + (m - 1)
IF Cnt * LEN(buffer) > LOF(6) THEN END
IF q + 1 = LOF(6) THEN EXIT FOR
NEXT q
END SUB

