OPTION COLLAPSE TRUE
SPLIT ARGUMENT$ BY " " TO arg$ SIZE amount
IF amount < 2 THEN
PRINT "Usage: ", arg$[0], " <file>"
END
ENDIF
IF NOT(FILEEXISTS(arg$[1])) THEN
PRINT "File ", arg$[1], " not found!"
END 1
END IF
FileSize = FILELEN(arg$[1])
FileData = MEMORY(FileSize+1)
OPEN arg$[1] FOR READING AS myfile
GETBYTE FileData FROM myfile SIZE FileSize
CLOSE FILE myfile
memsize = FileSize
FileDest = MEMORY(memsize)
newpos = 0
FOR x = 0 TO FileSize-1
IF newpos+y > memsize THEN
INCR memsize, memsize
RESIZE FileDest TO memsize
END IF
p = PEEK(FileData+x)
IF (p&128) > 0 THEN
FOR y = 0 TO (p&127)-1
POKE FileDest+newpos+y, PEEK(FileData+x+1+y)
NEXT
INCR newpos, y
INCR x, (p&127)
ELSE
FOR y = 0 TO (p&127)-1
POKE FileDest+newpos+y, PEEK(FileData+x+1)
NEXT
INCR newpos, y
INCR x
END IF
NEXT
PRINT "Resulting filesize: ", newpos, " bytes. ";
newname$ = LEFT$(arg$[1], INSTRREV(arg$[1], ".")-1)
OPEN newname$ FOR WRITING AS myfile
PUTBYTE FileDest TO myfile SIZE newpos
CLOSE FILE myfile
PRINT "File '", arg$[1], "' decompressed from RLE and saved as '", newname$, "'."
FREE FileData
FREE FileDest
END