RequestFile >env:orig TITLE "Full path of drawer of archive?" DRAWERSONLY NOICONS DRAWER "$o" ;Saves the location of the archive in the environment variable 'orig', with the default path as that of the last archive if converting more
if WARN
skip end
endif
echo >env:o $orig ;Get rid of quotation marks, and also create default path for next archive if converting more
list >env:osz env:o LFORMAT=%L ;Get size of path name
if $osz EQ 1 ;Full path not selected
RequestChoice > NIL: "! Error !" "Choose FULL path!*n(i.e. start with DEVICE listing)" "Try again"
skip Path BACK
endif
lab File
RequestFile >env:ldfl TITLE "Chose file to convert" POSITIVE Convert ACCEPTPATTERN #?.(lha|lzx|lzh) DRAWER $orig ; $ldfl now contains the complete path and filename of the archive
if WARN
skip More
endif
echo >env:l $ldfl ;Get rid of quotation marks
list >env:lsz env:l LFORMAT=%L ;Get size of file name
list >env:bnm1 $ldfl LFORMAT=%S ;Strips the path of the archive to give only the filename with suffix
list >env:bnm $ldfl LFORMAT=%M ;Removes .lzx, .lha or .lzh suffix from filename
list >env:suf $ldfl LFORMAT=%E ;Gives suffix only
if $suf NOT EQ lha ;If file doesn't have .lha suffix
if $suf NOT EQ lzx ;If file doesn't have .lzx suffix
if $suf NOT EQ lzh ;If file doesn't have .lzh suffix (which is de-archived by LhA)
RequestChoice "! Error !" "File is NOT an LhA/LZX archive!" "Choose again!"
endif
endif
endif
lab Temp
RequestChoice >env:drw "Default directory" "Where should I store temporary files? A*ntemporary drawer called 'L2Z' will be*ncreated in your selected destination, and*nRAM: will be checked for space if chosen" "RAM:" "Other" "Cancel"
if $drw EQ 1 ;If the left button (i.e. RAM:) is chosen
echo RAM: >env:drw1
endif
lab Other
if $drw EQ 2 ;If "Other" is chosen
RequestFile >env:drw1 TITLE "Where should 'L2Z' be made?" DRAWERSONLY NOICONS POSITIVE Create DRAWER "$d"
if WARN
skip More
endif
echo >env:d $drw1 ;Get rid of quotation marks
list >env:dsz env:d LFORMAT=%L ;Get size of path name
if $dsz EQ 1 ;Full path not selected
RequestChoice > NIL: "! Error !" "Choose FULL path!*n(i.e. start with DEVICE listing)" "Try again"
skip Other BACK
endif
if NOT EXISTS $drw1
RequestChoice "! Error !" "PATH does not exist!" "Choose again!"
skip Other BACK
endif
endif
if $drw EQ 0 ;If "Cancel" is chosen
skip More
endif
lab Memchk ;This labels the following section as "Memchk" so the script can skip to this point from anywhere in the script if it encounters the line "skip Memchk"
set memsz `avail flush total` ;Saves the result from "avail flush total" (try it in a shell - it gets the total size of available memory) as ENV:memsz
cd $orig ;CD's to the directory of the original archive
list >env:flsz $ldfl LFORMAT=%L ;Gets size of original archive
eval >env:flmem $flsz * 4 ;Multiplies the archive size by 4
if NOT $memsz VAL GT $flmem ;If your available memory size is less than 4 times the size of the original archive (LZX often decompresses to 3-4 times the size of the archive)
if $drw1 EQ RAM: ;and RAM: has been chosen to store temporary files
RequestChoice >env:nomem "! Insufficient Memory!" "There may be insufficient memory to store temporary files in RAM:*n(may need at least $flmem bytes)" "Choose other path" "Continue anyway" "Cancel"
if $nomem EQ 0 ;"Cancel"
skip More
endif
if $nomem EQ 1 ;"Other"
skip Temp back
endif
if $nomem EQ 2 ;"Continue"
skip MkTemp
endif
endif
if "$drw1" EQ "Ram Disk:" ;If user clicks on RAM: in file requestor
RequestChoice >env:nomem "! Insufficient Memory!" "There may be insufficient memory to store temporary files in RAM:*n(may need at least $flmem bytes)" "Choose other path" "Continue anyway" "Cancel"
if $nomem EQ 0 ;"Cancel"
skip More
endif
if $nomem EQ 1 ;"Other"
skip Temp back
endif
if $nomem EQ 2 ;"Continue"
skip MkTemp
endif
endif
endif
lab MkTemp
cd $drw1
if NOT EXISTS l2z ;This creates a temporary drawer in which to de-archive the files in the archive
makedir > NIL: l2z
else ;Drawer is emptied if it is already there
delete l2z/#? FORCE QUIET
endif
lab extra
echo "*e[0 p"
RequestChoice >env:ext "Convert $l to . . ." "Do you want to convert to the other*nfiletype or to the smallest archive?*n*nConvert to:" "Other" "Smallest" "Cancel"
if WARN ;If 'Cancel' is selected
skip beg BACK ;This skips back to the section labelled 'Beg', at the beginning
endif
if $ext EQ 2 ;If the user wants to make the smallest archive
skip Conv ;This skips forward to the section labelled 'Conv'
endif
if $ext EQ 1 ;If the user wants to convert to the other format - original format is found and is intelligently converted to the other
if $suf EQ lha ;Means it is an LhA archive
lab L ;Label 'L' so the script can skip straight here if needed
cd $drw1
cd l2z
$wlha x -a -F -M -x $ldfl
if $RC EQ 20 ;If user aborts it will skip to 'More'
skip More ;RC stands for Return Code - the number returned by LhA if the operation fails
endif
$wlzx -r -e -3 -X -F a $bnm #?
if $RC EQ 50 ;If user aborts it will skip to 'More'
skip More
endif
list >env:old $ldfl LFORMAT=%L ;Gets the size of the original archive
list >env:new $bnm.lzx LFORMAT=%L ;Gets the size of the new archive
eval >env:diff $old - $new ;Subtracts the size of the new from the original
eval >env:diff1 $new - $old ;Subtracts the size of the original from the new
delete $ldfl QUIET ;Original archive is deleted
copy $bnm.lzx TO $orig QUIET ;New archive is copied in place of the original
if $old GT $new VAL ;Original archive is larger than the new one, so the original is deleted and replaced by the (smaller) new one
RequestChoice > NIL: "! Operation Successful !" "$o$bnm.lzx*n now replaces*n$l*n and is $diff bytes smaller!" "Okay"
else
RequestChoice > NIL: "! Operation Successful !" "$o$bnm.lzx*n now replaces*n$l*n and is $diff1 bytes larger" "Okay"
endif
else ;"If that fails, try this..." - i.e. means it is NOT an LhA archive
if $suf EQ lzh ;It is an LZH archive (processed by LhA)
skip l BACK
endif
cd $drw1 ;If this line is reached, it is an LZX archive
cd l2z
$wlzx x -a -F -x $ldfl ;LZX extracts the original archive to temporary drawer 'l2z'
if $RC EQ 50 ;If user aborts it will skip to 'More'
skip More
endif
$wlha -2 -a -r -F -y -M -e -x a $bnm #? ;LhA archives everything in 'l2z' and saves it as the original name with .lha suffix
if $RC EQ 20 ;If user aborts it will skip to 'More'
skip More
endif
list >env:old $ldfl LFORMAT=%L
list >env:new $bnm.lha LFORMAT=%L
eval >env:diff $old - $new
eval >env:diff1 $new - $old
delete $ldfl QUIET ;Original archive is deleted
copy $bnm.lha TO $orig QUIET ;New archive is copied in place of the original
if $old GT $new VAL
RequestChoice > NIL: "! Operation Successful !" "$o$bnm.lha*n now replaces*n$l*n and is $diff bytes smaller!" "Okay"
else
RequestChoice > NIL: "! Operation Successful !" "$o$bnm.lha*n now replaces*n$l*n and is $diff1 bytes larger" "Okay"
endif
endif
endif
skip More
lab Conv ;This part until 'lab More' converts the archive to either LhA or LZX, and saves whichever is smaller
if $suf EQ lha ;Means it is an LhA archive
lab l2
cd $drw1
cd l2z
$wlha x -a -F -M -x $ldfl
if $RC EQ 20 ;If user aborts it will skip to 'More'
skip More ;RC stands for Return Code - the number returned by LhA if the operation fails
endif
$wlzx -r -e -3 -X -F a $bnm #? ;If not aborted, file is archived
if $RC EQ 50 ;If user aborts it will skip to 'More'
skip More
endif
else ;Means it is not an LhA archive
if $suf EQ lzh ;Means it is an LZH archive
skip l2 BACK
endif
cd $drw1 ;If this line is reached, it is an LZX archive
cd l2z
$wlzx x -a -F -x $ldfl
if $RC EQ 50 ;If user aborts it will skip to 'More'
skip More
endif
$wlha -2 -a -r -F -y -M -e -x a $bnm #? ;If not aborted, file is archived
if $RC EQ 20 ;If user aborts it will skip to 'More'
skip More
endif
endif
list >env:old $ldfl LFORMAT=%L ;Gets the size of the original archive
list >env:new $bnm.(lzx|lha) LFORMAT=%L ;Gets the size of the new archive
eval >env:diff $old - $new ;Subtracts the size of the new from the original
eval >env:diff1 $new - $old ;Subtracts the size of the original from the new
if $old GT $new VAL ;Original archive is larger than the new one, so the original is deleted and replaced by the smaller new one
delete $ldfl QUIET
copy $bnm.(lzx|lha) TO $orig QUIET
list >env:arc $o$bnm.(lzx|lha) LFORMAT=%S%S ;Gets name of new archive
echo >env:arc1 $arc ;Removes quotation marks
RequestChoice > NIL: "! $arc1 used !" "Using the new archive because it's $diff bytes smaller!" "Nice one!"
else ;Original archive is smaller than the new one, so the smaller original one is kept
RequestChoice > NIL: " $l used" "Using the original archive because it's $diff1 bytes smaller!" "Okay" ;The difference in file sizes is cleverly given
cd $drw1
delete l2z ALL QUIET FORCE
endif
lab More
echo "*ec"
RequestChoice >env:ano "Other archives?" "Do you want to convert another archive?" "Yes" "No"
if $ano EQ 0
skip end
else
skip beg back
endif
lab end
echo "*ec" ;This clears the output window
echo "*n*n*n *e[1;32m Thank you for using"
echo " *e[33m LhA*e[0m*e[3;1m2*e[0m*e[2mLZX" ;All the *e[... parts do is change the colour/style of the text