home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 28 / amigaformatcd28.iso / -readerstuff- / richard_burke / lha2lzx / lha2lzx_v3.0 < prev    next >
AmigaDOS Script File  |  1998-05-02  |  18KB  |  312 lines

  1. .key pat    ;This allows a keyword to be passed to LhA2LZX in the internal variable "pat".  It will be the archive name that is stored here
  2. .bra {        ;This changes the normal AmigaDOS brackets < and > to { and }...
  3. .ket }        ;...because we need to use the character > for ouput re-direction - more on this later
  4.  
  5. if "`which RequestChoice`" NOT EQ "RES RequestChoice"    ;This checks to see if some of the program files that LhA2LZX uses are already resident in memory...
  6.     Resident > NIL: C:RequestChoice PURE        ;...and if they are not, they will be loaded into memory to save loading them off disk every time they are used
  7. endif                            ;If LhA2LZX has been run before in the same sitting, these programs will already be in memory
  8.                             
  9. if "`which RequestFile`" NOT EQ "RES RequestFile"    ;Comments like this one will not be read by LhA2LZX when it is running - it ignores anything after a semi-colon
  10.     Resident > NIL: C:RequestFile PURE
  11. endif
  12.  
  13. if "`which Eval`" NOT EQ "RES Eval"    ;Anything surrounded by `backticks` will be evaluated first, and the result is then given in its place (see 'v2.2' in the 'Program History' in the .guide for a fuller explanation and more examples)
  14.     Resident > NIL: C:Eval PURE    ;As another example, if you type "List `RequestFile`" in a CLI, the RequestFile requester will pop up, and the file(s) you select will be passed to the program 'List', and they will be listed
  15. endif                    ;It would be just the same as if you had typed "List RAM:new.file RAM:othernew.file RAM:old.file", which would list all the details about those 3 files, if you had selected those 3 files in the RequestFile requester
  16.  
  17. if "`which List`" NOT EQ "RES List"    ;If the result of `which List`, which will find the path of the program 'List', is not the text 'RES List' (which means it is resident in memory)...
  18.     Resident > NIL: C:List PURE    ;...this line will be processed.  If the reult IS 'RES List'...
  19. endif                    ;...LhA2LZX skips to this line from the 'if...'line
  20.  
  21.  
  22. ; $VER: LhA2LZX 3.0 (8.4.98) Richard Burke
  23. ; Above is a version string, to give details of the file's creation date, author and version number
  24.  
  25. Failat 60                    ;Allows errors when using LhA & LZX to be captured - this is to do with Return Codes (you will read more about these later - they are the numbers returned from an operation to tell you its outcome)
  26.  
  27. lab Beg                        ;'Lab' stands for 'Label', and gives us a reference point that we can easily 'skip' back to whenever we want
  28. if NOT EXISTS env:LhA2LZXpath            ;This checks to see if the path of the location of where LhA2LZX is stored on disk has been saved to the file 'env:LhA2LZXpath', which is done in the installation process
  29.     RequestChoice >nil: "LhA2LZX Error Message" "LhA2LZX not installed using the installer script!*nSee docs for details!" "Quit"
  30.     quit                    ;If the file isn't there, there's no point in carrying on...
  31. endif
  32.  
  33. if NOT EXISTS $LhA2LZXpath            ;This checks to see if the path of the location of where LhA2LZX is actually exists. The $ symbol means 'the contents of the environmental variable stored as the file env:LhA2LZXpath'. If LhA2LZX is stored in DH1:Stuff, this line will read 'if NOT EXISTS Dh1:Stuff/LhA2LZX' - ie, if LhA2LZX does not exist there then execute the next command line. If it *can* be found there, we skip to the next 'endif'
  34. RequestChoice >nil: "LhA2LZX Error Message" "LhA2LZX not installed using the installer script!*nSee docs for details!" "Quit"
  35.     quit                    ;If the file isn't there, there's no point in carrying on...
  36. endif
  37.  
  38. which >env:nl2zwlha lha all            ;Finds the location of the LhA tool
  39. if WARN                        ;If the LhA tool cannot be found
  40.     RequestChoice >nil: "LhA2LZX Error Message" "Can't find 'LhA' tool!*nSee docs for details!" "Quit"
  41.     skip end                ;Here we skip to the end, where all the files created so far are deleted
  42. endif
  43.  
  44. which >env:nl2zwlzx lzx all            ;Finds the location of the LZX tool e.g. 'C:LZX'
  45. if WARN
  46.     RequestChoice >nil: "LhA2LZX Error Message" "Can't find 'LZX' tool!*nSee docs for details!" "Quit"
  47.     skip end
  48. endif
  49.  
  50. if NOT EXISTS L:lzx.keyfile            ;The registered version of LZX won't work without the keyfile
  51.     RequestChoice >nil: "LhA2LZX Error Message" "Can't find lzx.keyfile!*nSee docs for details!" "Quit"
  52.     skip end
  53. endif
  54.  
  55. if NOT EXISTS env:nl2zorig            ;If starting, default path of archive is RAM:
  56.     echo "*"RAM:*"" >env:nl2zorig        ;Asterisks are used before quote marks to tell AmigaDOS to use the quote character - here the text "RAM:" will be stored in env:nl2zorig instead of the text RAM:
  57. endif
  58.  
  59. if NOT EXISTS env:nl2zd                ;If starting, default path of temporary drawer l2z is RAM:
  60.     echo RAM: >env:nl2zd            ;Here the text 'RAM:' is redirected to the file 'env:nl2zd' - this means the text is now stored in 'env:nl2zd', which is also created by the redirection
  61. endif
  62.  
  63. if EXISTS env:LhA2LZXl2zpath            ;If the file ENV:LhA2LZXl2zpath exists (which stores the path of the temporary directory 'l2z'), the script will perform the actions to endif
  64.     cd $LhA2LZXl2zpath            ;Current Directory is now that which is stated in the contents of the environmental variable 'LhA2LZXl2zpath'
  65.     if EXISTS l2z                ;If the directory exists...
  66.         delete l2z/#? ALL FORCE >NIL:    ;...the contents of the temporary drawer used to store the archive files are deleted to start freshly. '>NIL:' means 're-direct the output of this operation to the NIL: device'. This will suppress any output.
  67.     else                    ;If the directory doesn't exist...
  68.         makedir l2z >nil:        ;...create it...
  69.     endif
  70.     skip beg1                ;...then we skip to the main body of the program
  71. endif
  72.  
  73. lab Temp                    ;If a location for 'l2z' hasn't already been chosen, we now choose where to put it
  74. RequestChoice >env:nl2zdrw "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"
  75. if $nl2zdrw EQ 1                ;If the left button (i.e. RAM:) is chosen. The right-most button is assigned a value 0, and the other buttons are given ascending values from 1 on the left
  76.     echo "*"RAM:*"" >envarc:LhA2LZXl2zpath
  77.     copy envarc:LhA2LZXl2zpath TO env:LhA2LZXl2zpath >nil:    ;The directory is saved as default for subsequent runs
  78.     cd RAM:
  79.     makedir l2z >NIL:            ;Here we create the drawer
  80. endif
  81.  
  82. if $nl2zdrw EQ 2                ;If "Other" is chosen
  83.     lab Other
  84.     RequestFile >env:LhA2LZXl2zpath TITLE "Where should 'l2z' be made?" DRAWERSONLY NOICONS POSITIVE Create DRAWER RAM:
  85.     if WARN                    ;If the close gadget or the 'Cancel' button is chosen, RequestFile gives a Return Code of 5, which is detected by the WARN statement (this is set if the RC is 5 or greater)
  86.         skip Temp back            ;As the label 'Temp' occured previously in this file, we need to use the 'back' keyword to tell it to search backwards through this file instead of forwards
  87.     endif
  88.  
  89.     if $LhA2LZXl2zpath EQ "Ram Disk:"        ;If user clicks on RAM: in file requester...
  90.         echo "*"RAM:*"" >envarc:LhA2LZXl2zpath    ;...we change the text stored in 'env:LhA2LZXl2zpath' from 'Ram Disk:' to 'RAM:' to make things easier when checking for amount of memory needed later on
  91.     endif
  92.  
  93.     echo >env:nl2zd $LhA2LZXl2zpath        ;Get rid of quotation marks around the drawer name. This will read something like 'echo >env:nl2zd "DH1:TempStuff/"', and Echo will echo whatever is written inside the "quotation marks"
  94.     if NOT EXISTS $LhA2LZXl2zpath        ;This will check if the drawer exists, and if it doesn't it will tell the user
  95.         RequestChoice "LhA2LZX Error Message" "PATH does not exist!" "Choose again!"
  96.         skip Other BACK
  97.     else
  98.         copy env:LhA2LZXl2zpath TO envarc:LhA2LZXl2zpath >nil: ;The new path for 'l2z' is saved for future use
  99.         cd $LhA2LZXl2zpath
  100.         makedir l2z >NIL:
  101.     endif
  102. endif
  103.  
  104. if $nl2zdrw EQ 0                ;If "Cancel" is chosen
  105.     skip end
  106. endif
  107.  
  108.  
  109.  
  110.  
  111. ;...And now on to the main workings...
  112.  
  113.  
  114.  
  115.  
  116. lab beg1
  117. echo "{pat}" >env:nl2zldfl1            ;This saves the filename input "pat" to an env variable
  118. list >env:nl2zpatsize env:nl2zldfl1 LFORMAT=%L    ;This gets the size of the filename
  119. if $nl2zpatsize EQ 1                ;If no filename has been given...
  120.     skip exe                ;...jump to the procedure that lets you choose one...
  121. else                        ;...otherwise...
  122.     skip File                ;...start processing the file
  123. endif
  124.  
  125. lab exe
  126. RequestFile >env:nl2zldfls TITLE "Choose file(s) to convert" POSITIVE Convert ACCEPTPATTERN #?.(lha|lzx|lzh) MULTISELECT DRAWER $nl2zorig
  127. if WARN                    ;If no files are chosen...
  128.     skip end            ;...quit LhA2LZX
  129. endif
  130. list >RAM:LhA2LZX.exe `type env:nl2zldfls` LFORMAT="execute *"$LhA2LZXpath*" *"%F%N*""    ;The archives chosen from the requester will be output in a special format - something like 'execute "dh1:Scripts/LhA2LZX" "dh1:TempStuff/new.lzx"'
  131.  
  132. execute RAM:LhA2LZX.exe            ;Execute the file which lists all the archives to process - it is best just to read 'RAM:LhA2LZX.exe' whilst you are running 'LhA2LZX' to see what it contains!
  133. delete RAM:LhA2LZX.exe FORCE >NIL:    ;After all the files have been processed, delete the listing file
  134. echo "*e[1;1H*eJ"            ;This clears the output window
  135. echo "*n*n*n                       *e[1;32m  Thank you for using"
  136. 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 - known as ANSI - see "v2.2" in "Program History" in the .guide
  137. echo "*n*n*n"                ;All these echoes are merely to thank you for using this wonderful script!
  138. quit            ;The end of LhA2LZX  :^(
  139.  
  140.  
  141. lab File
  142.  
  143. echo "*"{pat}*"" >env:nl2zldfl
  144. list >env:nl2zorig $nl2zldfl LFORMAT="*"%F*""    ;Get the path of the directory that the file is in, surrounded by quotation marks
  145. if $nl2zorig EQ "Ram Disk:"
  146.     echo "*"RAM:*"" >env:nl2zorig        ;For some reason, if RAM: is chosen, "RAM:" is stored in env:nl2zldfl but "Ram Disk:" is stored in env:nl2zorig...
  147. endif
  148. echo >env:nl2zo $nl2zorig            ;Get rid of the quotes around the directory name
  149.  
  150. if NOT EXISTS $nl2zorig                ;On the off-chance that someone has entered a path via the CLI which doesn't actually exist...
  151.     RequestChoice >nil: "LhA2LZX Error Message" "PATH does not exist!" "Try again"
  152.     skip end                ;...skip to the end
  153. endif
  154.  
  155. if NOT EXISTS $nl2zldfl
  156.     RequestChoice >nil: "LhA2LZX Error Message" "FILE does not exist!" "Try again"
  157.     skip end
  158. endif
  159.  
  160.  
  161. lab Tilde
  162. search env:nl2zldfl ~ >nil:            ;Here we search the archive name to see if it contains a tilde (~), which LZX cannot process
  163. if $RC EQ 0                    ;If the Return Code is 0 (i.e. if the search was successful and a tilde was found)...
  164.     RequestChoice >nil: "LhA2LZX Error Message" "Filename contains a tilde (~)*n*nPlease rename the file without a tilde*n*nSee docs for details" "Okay"
  165.     skip end                ;...skip to the end so that the file can be renamed by the user
  166. endif
  167.  
  168. echo >env:nl2zl $nl2zldfl            ;Get rid of quotation marks
  169.  
  170. list >env:nl2zsuf $nl2zldfl LFORMAT=%E        ;Gives suffix of the archive only
  171.  
  172. if $nl2zsuf NOT EQ lha                ;If file doesn't have .lha suffix
  173.     if $nl2zsuf NOT EQ lzx            ;If file doesn't have .lzx suffix
  174.         if $nl2zsuf NOT EQ lzh        ;If file doesn't have .lzh suffix (which is de-archived by LhA and LZX)
  175.             RequestChoice "LhA2LZX Error Message" "File $nl2zl is NOT an LhA or LZX archive!" "Ooops!"
  176.             skip end
  177.         endif
  178.     endif
  179. endif
  180.  
  181. list >env:nl2zbnm1 $nl2zldfl LFORMAT=%S        ;Strips the path of the archive to give only the filename with suffix
  182. list >env:nl2zbnm $nl2zldfl LFORMAT=%M        ;Removes .lzx, .lha or .lzh suffix from filename
  183. list >env:nl2zcom $nl2zldfl LFORMAT=%C        ;Gets file comment
  184. list >env:nl2zdat $nl2zldfl LFORMAT=%D DATES    ;Gets file creation date
  185. list >env:nl2ztim $nl2zldfl LFORMAT=%T        ;Gets file creation time
  186. list >env:nl2zcomsz env:nl2zcom LFORMAT=%L    ;Gets size of comment
  187.  
  188. 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"
  189. set nl2zmemsz `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:nl2zmemsz
  190. cd $nl2zorig                    ;CD's to the directory of the original archive
  191. list >env:nl2zflsz $nl2zldfl LFORMAT=%L        ;Gets size of original archive
  192. eval >env:nl2zflmem $nl2zflsz * 4        ;Multiplies the archive size by 4
  193. eval >env:nl2zflk $nl2zflmem / 1024        ;Gives the size of the required memory in Kilobytes, as it will be easier to read and relate to than bytes
  194. if NOT $nl2zmemsz VAL GT $nl2zflmem        ;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)...
  195.     if $LhA2LZXl2zpath EQ "RAM:"            ;...and RAM: has been chosen to store temporary files...
  196.         RequestChoice >env:nl2znomem "! Insufficient Memory!" "There may be insufficient memory to store temporary files in RAM:*n(may need at least $nl2zflk k)" "Choose other path" "Continue anyway" "Cancel"
  197.         if $nl2znomem EQ 0        ;"Cancel"
  198.             skip end
  199.         endif
  200.         if $nl2znomem EQ 1        ;"Other"
  201.             skip Other back
  202.         endif
  203.     endif
  204. endif
  205.  
  206. if $nl2zsuf EQ lzh
  207.     rename $nl2zldfl AS "$nl2zo$nl2zbnm.lha"    ;Rename the .lzh archive with an .lha suffix, as it is virtually the same anyway and will make things easier later on
  208.     echo "*"$nl2zo$nl2zbnm.lha*"" >env:nl2zldfl    ;Get the new file name. We do this here so that the original file date and time is copied to the new archive instead of the date of this newly created archive
  209.     list >env:nl2zbnm1 $nl2zldfl LFORMAT=%S        ;Strips the path of the archive to give only the filename with suffix
  210.     list >env:nl2zbnm $nl2zldfl LFORMAT=%M        ;Removes .lzx, .lha or .lzh suffix from filename
  211.     list >env:nl2zsuf $nl2zldfl LFORMAT=%E        ;Gives suffix only
  212. endif
  213.  
  214. if $nl2zsuf EQ lha
  215.     echo LZX >env:nl2znsuf            ;Gives the type of file to convert to in a requester later
  216.     echo LhA >env:nl2zsuf
  217. endif
  218.  
  219. if $nl2zsuf EQ lzx
  220.     echo LhA >env:nl2znsuf
  221.     echo LZX >env:nl2zsuf            ;Makes it look better in the requester
  222. endif
  223.  
  224.  
  225. lab Extra
  226. echo "*e[0 p"                ;This clears the display (the output CLI)
  227. RequestChoice >env:nl2zext "Convert $nl2zl to . . ." "Do you want to convert $nl2zbnm1 to the other*nfiletype or to the smallest archive?*n*nConvert from $nl2zsuf to:" "$nl2znsuf" "Smallest" "Repack" "Cancel"
  228. if $nl2zext EQ 0            ;If 'Cancel' is selected
  229.     skip end            ;This skips back to the section labelled 'end', at the end
  230. endif
  231.  
  232. if $nl2zext EQ 3            ;If 'Repack' is selected...
  233.     echo $nl2znsuf >env:nl2zsuf1    ;...temporarily swap the suffix...
  234.     echo $nl2zsuf >env:nl2znsuf    ;...with the other file type suffix...
  235.     echo $nl2zsuf1 >env:nl2zsuf    ;...so that the correct program is used to repack the archive. We cleverly make LhA2LZX think that an LhA archive is an LZX archive to re-archive it using LhA, and vice versa
  236. endif
  237.  
  238. lab Conv                ;This part until 'lab end' converts the archive to either LhA or LZX, and saves whichever type the user requested
  239. cd $LhA2LZXl2zpath
  240. cd l2z
  241. "$nl2zwlzx" x -a -F -x -X0 $nl2zldfl    ;As the LZX keyfile is now available, the ability to de-archive LhA files is possible, and also much quicker
  242. if NOT $RC EQ 0                ;If user aborts it will skip to 'end'
  243.     skip er                ;RC stands for Return Code - the number returned by LhA if the operation fails
  244. endif
  245.     
  246. if $nl2zsuf EQ lzx                        ;Means it is an LZX archive
  247.     "$nl2zwlha" -2 -a -r -F -y -M -e -x a $nl2zbnm #?    ;If not aborted, file is archived
  248.     if NOT $RC EQ 0                        ;If user aborts it will skip to 'end'
  249.         skip er
  250.     endif
  251. else                            ;Means it is an LhA/LZH archive
  252.     "$nl2zwlzx" -r -e -3 -X -F a -Qf $nl2zbnm #?    ;If not aborted, file is archived
  253.     if NOT $RC EQ 0                    ;If user aborts it will skip to 'end'
  254.         skip er
  255.     endif
  256. endif
  257.  
  258. if $nl2zext EQ 3            ;If 'Repack' was selected
  259.     echo $nl2znsuf >env:nl2zsuf    ;Replace the original suffix
  260.     echo 2 >env:nl2zext        ;Now that the conversion has been done, we treat the rest of the process as if we want the smallest archive
  261. endif
  262.  
  263. lab Size
  264. list >env:nl2zold $nl2zldfl LFORMAT=%L            ;Gets the size of the original archive
  265. list >env:nl2znew $nl2zbnm.$nl2znsuf LFORMAT=%L        ;Gets the size of the new archive
  266. eval >env:nl2zdiff $nl2zold - $nl2znew            ;Subtracts the size of the new from the original
  267. eval >env:nl2zdiff1 $nl2znew - $nl2zold            ;Subtracts the size of the original from the new
  268.  
  269. if $nl2znew GE $nl2zold VAL                ;Original archive is smaller than the new one, so the original is kept
  270.     if $nl2zext EQ 2                ;If the user wanted to convert to the other filetype
  271.         RequestChoice > NIL: " $nl2zl used" "Using the original archive because it's $nl2zdiff1 bytes*nsmaller!" "Okay"        ;The difference in file sizes is cleverly given
  272.         skip end
  273.     endif
  274. endif
  275.  
  276. delete $nl2zldfl QUIET                        ;Delete the original archive
  277. copy "$nl2zbnm.$nl2znsuf" TO $nl2zorig QUIET            ;Copy the new archive over in place of the original
  278. if NOT env:nl2zcomsz EQ 1                    ;If the original archive had a comment...
  279.     filenote FILE "$nl2zo$nl2zbnm.$nl2znsuf" "$nl2zcom"    ;...copy it to the new archive
  280. endif
  281. setdate "$nl2zo$nl2zbnm.$nl2znsuf" $nl2zdat $nl2ztim        ;Sets the date of the new archive to the old
  282. if $nl2zext EQ 1                        ;If the user wanted to convert to the other filetype
  283.     if $nl2znew GT $nl2zold VAL
  284.         RequestChoice > NIL: "! Operation Successful !" "$nl2zo$nl2zbnm.$nl2znsuf*n  now replaces*n$nl2zl*n  and is $nl2zdiff1 bytes larger" "Okay"
  285.     else
  286.         RequestChoice > NIL: "! Operation Successful !" "$nl2zo$nl2zbnm.$nl2znsuf*n  now replaces*n$nl2zl*n  and is $nl2zdiff bytes smaller!" "Nice one!"
  287.     endif
  288. else
  289.     RequestChoice > NIL: "! $nl2zo$nl2zbnm.$nl2znsuf used !" "Using the new archive because it's $nl2zdiff bytes smaller!" "Nice one!"
  290. endif
  291.  
  292. skip end
  293.  
  294. lab er                        ;This will only be reached if an error has occured during the de-/archiving process
  295. RequestChoice >NIL: "LhA2LZX Error Message" "An error/user-abort has occured!*n*nSee docs for details" "Okay"
  296.  
  297. lab end
  298. if EXISTS env:LhA2LZXl2zpath
  299.     cd $LhA2LZXl2zpath
  300.     if EXISTS l2z
  301.         delete l2z ALL QUIET FORCE    ;Delete all the temporary files
  302.     endif
  303. endif
  304.  
  305. if EXISTS RAM:l2z                ;This is in case the drawer where 'l2z' was located had to be changed from RAM: due to insufficient memory
  306.     delete RAM:l2z ALL QUIET FORCE
  307. endif
  308.  
  309. list >nil: ENV:nl2z#? TO T:l2ztmp LFORMAT "delete %S%S >NIL:"    ;This generates a list of all the environment variables used and deletes them
  310. execute T:l2ztmp >nil:                        ;The variables are actually deleted by this line
  311. delete T:l2ztmp >nil:                        ;The new script generated is deleted here.  Now everything LhA2LZX created during its running has been disposed of.
  312.