'===========================================================================
' Subject: GET LZH LIST                       Date: 10-25-99 (18:05)       
'  Author: Randall L. Glass                   Code: PB                     
'  Origin: rlglass@yahoo.com                Packet: PB.ABC
'===========================================================================
'----------------------------------------------------------------------------
'
'                                 Get Lzh List
'                               BY Randall Glass
'                                Copyright 1999
'
'----------------------------------------------------------------------------
'
' FREEWARE
'
' You may use this as long as you give me credit somewhere in the documentation
'
' Email rlglass@yahoo.com
'
'--------------------------------------------------------------------------

DEFINT A-Z

TYPE LZHHead
     HeadSize       AS BYTE
     CheckSum       AS BYTE
     Id1            AS STRING * 3
     Method         AS BYTE
     Id2            AS BYTE
     CompressSize   AS DWORD
     UnCompressSize AS DWORD
     FileTime       AS WORD
     FileDate       AS WORD
     Attrs          AS BYTE
     HeaderLevel    AS BYTE
     FileNameLen    AS BYTE
     FileName       AS STRING * 12
END TYPE

DIM ArchiveFiles$(200),ArchiveInfo$(200)

GetLzhList Command$, ArchiveFiles$(), ArchiveInfo$(), FilesInfo$
TotalFiles?? = CVWRD(ArchiveFiles$(%TotalFiles))

FOR I% = 1 to TotalFiles??
        PRINT ArchiveInfo$(I%)
NEXT I%

END

SUB GetLzhList(LzhFile$,ArchiveFiles$(),ArchiveInfo$(), FilesInfo$)
 DIM Lzh AS LZHHead
 DIM FileName AS STRING * 8
 DIM Ext AS STRING * 4

  FilePos??? = 0: QUIT% = 0

  Handle% = FREEFILE

  OPEN LzhFile$ FOR BINARY AS Handle%
  RestOfFileSize??? = LOF(Handle%)
  IF RestOfFileSize??? = 0 THEN
    CLOSE Handle%
    PRINT LzhFile$+" has an FileSize of Zero !"
    EXIT SUB
  END IF


  DO
          GET  Handle%,FilePos???,Lzh
          IF Lzh.Id1 = "-lh" Or Lzh.Id1 = "-lz" Or Lzh.Id1 = "-lZ" THEN
            IF Lzh.HeadSize AND (Lzh.HeadSize < RestOfFileSize???) THEN
                Get Handle%,FilePos??? + Lzh.HeadSize,DirLen??
                SEEK Handle%,FilePos??? + Lzh.HeadSize+3

                IF DirLen?? > 0 AND DirLen?? < 256 THEN
                              GET$ Handle%,DirLen??-3,Directory$
                              REPLACE  CHR$(255) WITH "\" IN Directory$
                ELSE
                              Directory$ = ""
                END IF

                INCR FilePos???, Lzh.CompressSize + Lzh.HeadSize + 2
                DECR RestOfFileSize???, FilePos???

                INCR FileNumber??

                File$ = LEFT$(Lzh.FileName,Lzh.FileNameLen)
                LSET FileName$ = Extract$(File$,".")
                LSET Ext$ = Extension$(File$)
                GetDateAndTime Lzh.Filedate,Lzh.FileTime,Filedate$,FileTime$
                IF DirLen?? THEN
                	DirSign$ = " + "
                ELSE
                	DirSign$ = "   "
                END IF
                ArchiveFiles$(FileNumber??) = Directory$ + File$
                ArchiveInfo$(FileNumber??)  = DirSign$ + FileName$ + Ext$ + USING$("########",Lzh.UnCompressSize) + " " + Filedate$ + "  "+FileTime$
            END IF
          ELSE
                INCR FilePos???, 2
           	    DECR RestOfFileSize???, FilePos???
          END IF

  Loop UNTIL Lzh.HeadSize = 0 Or Lzh.HeadSize > RestOfFileSize??? OR FilePos??? = RestOfFileSize???

  Close Handle%
  FilesInfo$ =  LzhFile$ + ":" + STR$(FileNumber??)+" Files"
  ArchiveFiles$(0) = MKWRD$(FileNumber??)
  ArchiveInfo$(0)  = MKWRD$(FileNumber??)

END SUB

SUB GetDateAndTime(Filedate??,FileTime??,Filedate$,FileTime$)
       Year?? = (Filedate?? AND &B1111111000000000):SHIFT RIGHT Year??,9
       INCR Year??,1980
       Month?? = Filedate?? AND &B0000000111100000:SHIFT RIGHT Month??,5
       Day?? = Filedate?? AND &B0000000000011111
       Hours?? = FileTime?? AND &B1111100000000000:SHIFT RIGHT Hours??,11
       Minutes?? = FileTime?? AND &B0000011111100000:SHIFT RIGHT Minutes??,5
       Seconds?? = (FileTime?? AND &B0000000000011111) * 2

       Month$ = LTRIM$(STR$(Month??))
       Day$ = LTRIM$(STR$(Day??))
       IF LEN(Month$) = 1 THEN Month$="0"+Month$
       IF LEN(Day$) = 1 THEN Day$ = "0"+Day$
       'IF Hours?? > 12 THEN
       '	Hours?? = Hours?? -12:AmPm$ = "p & "
       'ELSE
       '	AmPm$ = "a & "
       'END IF
       Hours$ = LTRIM$(STR$(Hours??))
       Minutes$ = LTRIM$(STR$(Minutes??))
       Seconds$ = LTRIM$(STR$(Seconds??))
       IF LEN(Hours$) = 1 THEN Hours$="0"+Hours$
       IF LEN(Minutes$) = 1 THEN Minutes$="0"+Minutes$
       IF LEN(Seconds$) = 1 THEN Seconds$="0"+Seconds$

       Filedate$ = Month$ + "-" + Day$ + "-" + LTRIM$(STR$(Year??))
       FileTime$ = Hours$ + ":" + Minutes$ + ":" + Seconds$
       'FileTime$ = Hours$ + ":" + Minutes$ + AmPm$ + Seconds$ +"s"

END SUB

FUNCTION Extension$(File$)
      FOR I% = LEN(File$) TO 1 STEP -1
		Period$ = MID$(File$,I%,1)
            IF Period$ = "." THEN Extension$ = MID$(File$,I%):EXIT FUNCTION
	NEXT I%
END FUNCTION

FUNCTION FileDirExist%(d$)
Ln% = LEN(D$)
FOR I% = Ln% TO 1 STEP -1
      Char$ = MID$(D$,I%,1)
	IF Char$ = "\" OR CHAR$ = "/" THEN EXIT FOR
NEXT I%
FileDirExist% = I%
END FUNCTION
