home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / opus / v4 / arexx / listlha.rexx < prev    next >
OS/2 REXX Batch file  |  1977-12-31  |  7KB  |  284 lines

  1. /*rx
  2.  *
  3.  * ListLhA.rexx - List and display an LhA archive file in a DOpus window
  4.  *                (companion script ExtractLhaFiles.rexx will allow the user 
  5.  *                to select and extract files to the destination window)
  6.  *
  7.  * $VER: ListLhA 40.6 (22/05/94) by Geoff Seeley
  8.  *
  9.  * Usage: ARexx command ListLhA.rexx (from DOpus)
  10.  *
  11.  */
  12.  
  13. /* configuration variables (change these to suit your setup) */
  14.  
  15. LhaCommand = 'sys:C/LhA -x -m v '
  16. LhaOutput  = 'T:lha_out'
  17.  
  18. /*---------------NO USER SERVICABLE PARTS BELOW :-)----------------------------*/
  19.  
  20. /* misc. variables */
  21.  
  22. DOpusPort   = 'DOPUS.1'
  23. HandlerPort = 'LHALIST.1'
  24.  
  25. LhaHeader  = '--------'
  26.  
  27. userdata     = '  0'      /* default      */
  28. fgpen        = '  1'      /* palette 1    */
  29. bgpen        = '  0'      /* palette 2    */
  30. selectable   = ' 1'       /* can select   */
  31. unselectable = ' 0'       /* can't select */
  32. show         = ' 0'       /* update win   */
  33. before       = ' -1'      /* add to end   */
  34.  
  35. if ~show(l,"rexxsupport.library") then        
  36.     call addlib("rexxsupport.library",0,-30,0)
  37.  
  38. /* make sure we've got somebody to talk to... */
  39.  
  40. if showlist('Ports', DOpusPort) = 0 then do
  41.    say 'Directory Opus Arexx port not found. Aborting.'
  42.    call CleanUp
  43. end
  44. else do
  45.  
  46.    /* make sure DOpus is listening to us... */
  47.  
  48.    address 'DOPUS.1'
  49.    options results
  50.  
  51.    /* get some information from DOpus */
  52.  
  53.    Status 3
  54.    CurrentWindow = Result
  55.  
  56.    /* check if window is already and LhA archive */
  57.  
  58.    Status 14 CurrentWindow
  59.    LhaFileName = Result
  60.  
  61.    /* if we don't see the proper extension, look at file in window */
  62.  
  63.    if (IsLhAFile(LhaFileName) = 0) then do
  64.  
  65.       /* get name of LhA archive file selected */
  66.  
  67.       GetNextSelected CurrentWindow
  68.       LhaFileName = result
  69.  
  70.       /* make sure its got the right extension */
  71.  
  72.       if (IsLhAFile(LhaFileName) = 0) then do
  73.  
  74.          Notify "Sorry, You *must* select an archive file\ending with '.LHA' or '.LZH'\Aborting."
  75.          TopText "List LhA archive aborted."
  76.          call CleanUp
  77.  
  78.       end
  79.  
  80.       /* get the directory of the LhA archive */
  81.  
  82.       Status 13 CurrentWindow
  83.       LhaFilePath = result
  84.  
  85.       /* make a full path/filename from above */
  86.  
  87.       LhaArchive = LhaFilePath || LhaFileName
  88.  
  89.    end
  90.    else do
  91.  
  92.       /* get path to archive, check if it exists */
  93.  
  94.       call FindLhAPath
  95.       LhaArchive = LhaFilePath || LhaFileName
  96.  
  97.       if ~exists(LhaArchive) then do
  98.          Notify "Can't find LhA archive " || LhaArchive
  99.          call CleanUp
  100.       end
  101.    end
  102. end
  103.  
  104. /* setup DOpus window and tell user what's happening */
  105.  
  106. ClearWin CurrentWindow
  107. SetWinTitle LhaFileName
  108.  
  109. Busy on
  110.  
  111. TopText "Getting List of File(s) From Archive. Please Wait..."
  112.  
  113. /* make a listing file from the archive so we can parse it... */
  114.  
  115. CliString = LhaCommand || Quote(LhaArchive) || ' > ' || LhaOutput
  116. address command CliString
  117.  
  118. /* parse the list of LhA files */
  119.  
  120. TopText "Parsing File(s). Please Wait..."
  121.  
  122. call ParseLhaList
  123. 'DisplayDir -1'
  124.  
  125. /* if handler is running, attach a custom handler to the window */
  126.  
  127. if show('p', HandlerPort) then 
  128.    'AddCustHandler '||HandlerPort||' -1'
  129.  
  130. /* That's all folks... */
  131.  
  132. Totals = "Files: 0/"||FileNumber-1||"  Bytes: 0/"||strip(TotalBytes)
  133. TopText Totals
  134.  
  135. Busy off
  136.  
  137. call CleanUp
  138.  
  139. exit
  140.  
  141. /*---------------------------------------------------------------------------*/
  142.  
  143. ParseLhaList: /* open the listing file, and parse it */
  144.  
  145.    if open(LhaList, LhaOutput, 'R') then do
  146.  
  147.       /* skip the header */
  148.  
  149.       junk = ''
  150.  
  151.       do while left(junk, 8, '') ~= LhaHeader & ~eof(LhaList)
  152.          junk = readln(LhaList)
  153.       end
  154.  
  155.       if eof(LhaList) then do
  156.  
  157.          /* what the hell?? Abort. */
  158.  
  159.          Notify "No files found in selected LhA archive\Aborting."
  160.          call CleanUp
  161.  
  162.       end
  163.  
  164.       /* read in list of files */
  165.  
  166.       FileNumber = 1
  167.       line = ''
  168.       FName = ""
  169.       do while line ~= LhaHeader & ~eof(LhaList)
  170.          line = readln(LhaList)
  171.          if left(line, 1) = ':' then
  172.             iterate
  173.          if substr(line, 1, 6) = '0d'x||"     " then do
  174.             Notify FName||"\"||substr(line, 7, (length(line)-9))
  175.             iterate
  176.          end
  177.          if left(line, 8, '') = LhaHeader then
  178.             leave
  179.          FileNumber = FileNumber + 1
  180.          FSize = substr(line, 1, 8)
  181.          FName = substr(line, 44)
  182.          File = FSize||' '||FName
  183.          File = Quote(File)
  184.          Entry = File || userdata || fgpen || bgpen || selectable || show || before 
  185.          AddCustEntry Entry
  186.       end
  187.  
  188.       /* grab totals */
  189.  
  190.       TotalsLine = readln(LhaList)
  191.  
  192.       close(LhaList)
  193.  
  194.       /* add two unselectable entries for the totals */
  195.  
  196.       File = Quote(LhaHeader)
  197.       Entry = File || userdata || fgpen || bgpen || unselectable || show || before 
  198.       AddCustEntry Entry
  199.  
  200.       FSize = substr(TotalsLine, 1, 8)
  201.       TotalBytes = FSize
  202.       FName = substr(TotalsLine, 44)
  203.       File = '"'||FSize||' '||FName||'"'
  204.       Entry = File || userdata || fgpen || bgpen || unselectable || show || before 
  205.       AddCustEntry Entry
  206.  
  207.       /* add invisible entry giving us the path */
  208.  
  209.       File = Quote(LhaFilePath)
  210.       Entry = File || userdata || bgpen || bgpen || unselectable || show || before 
  211.       AddCustEntry Entry
  212.  
  213.    end
  214.    else do
  215.  
  216.       TopText "Can't open temp file " || LhaOutput
  217.       call CleanUp
  218.  
  219.    end
  220.  
  221. return
  222.  
  223. /*--------------------------------------------------------------------------*/
  224.  
  225. IsLhAFile: procedure   /* look at extension, return 1 if right, else 0 */
  226.  
  227.    parse arg AFileName
  228.  
  229.    lps = lastpos(".", AFileName)               
  230.    if lps = 0 then                           
  231.       return 0
  232.  
  233.    FileExt = upper(right(AFileName,length(AFileName)-lps))
  234.  
  235.    if FileExt ~= "LHA" & FileExt ~= "LZH" then
  236.       return 0
  237.    else
  238.       return 1
  239.  
  240. return 0
  241.  
  242. /*--------------------------------------------------------------------------*/
  243.  
  244. FindLhAPath: /* grab invisible file path to archive */
  245.  
  246.    /* find number of entries, path is the last one */
  247.  
  248.    'Status 6 -1'
  249.  
  250.    GetEntry Result
  251.    LhaFilePath = Result
  252.  
  253. return
  254.  
  255. /*---------------------------------------------------------------------------*/
  256.  
  257. Quote: procedure /* add quotes to string */
  258.  
  259.    parse arg string
  260.  
  261. return '"'||string||'"'
  262.  
  263. /*---------------------------------------------------------------------------*/
  264.  
  265. StripQuotes: procedure /* strip quotes from string */
  266.  
  267.    parse arg string
  268.  
  269. return strip(string,, '"')
  270.  
  271. /*---------------------------------------------------------------------------*/
  272.  
  273. CleanUp: /* Remove any files and exit */
  274.  
  275.    if exists(LhaOutput) then
  276.       delete(LhaOutput)
  277.  
  278.    Busy off
  279.  
  280.    exit
  281.  
  282. return
  283.  
  284.