home *** CD-ROM | disk | FTP | other *** search
/ Mods Anthology 2 / Music-AmigaModsAnthology-2of4-Psychodk.mcsteam.iso / Tools / Amiga / Misc / xList_v1.06 / xList_Sources / xlist106.123.s < prev    next >
Text File  |  1996-02-22  |  23KB  |  1,104 lines

  1. ; ezasm!
  2.  
  3. ; xList.s v1.06 (23.02.96) rev. 123
  4. ; Needs OS v37+ (or v39? not tested on v37)
  5. ; freely distributable,modifiable,trashable ==> adapt it to your needs !
  6.  
  7. ; xList has been ported to ezasm in early February. Later in the year it will
  8. ; be ported to C (jumping to v1.10, probably in July-August 96 ,release: Sept.)
  9. ; big new features will be probably added to v1.10 
  10.  
  11. ; includes
  12.     incdir    include:
  13.     include    dos/dos.i
  14.  
  15. ; EQUATES *****************************************************
  16.  
  17. numfbuff = 16
  18. VARSIZE        =    8
  19. FILE        =    1
  20. DIR        =    0
  21. FALSE = 0
  22. TRUE = 1
  23. GVF_GLOBAL_ONLY = $100
  24.  
  25. ;    STRUCTURE XpkHeader,0
  26. xh_CLen = 4 ;4 Crunched size
  27. xh_Type = 8 ;8 sublibrary (NUKE,SQSH,...)
  28. xh_ULen = 12 ;12 Uncrunched size
  29. xh_Sample = 16;16 (1st char of 16 bytes of the uncrunched file)
  30. xheadlen = 20; old lenght of infos to be read (now read more datas)
  31.  
  32. ;STRUCTURE StcHeader,0
  33. stc_UnpackLen = 8
  34. stc_CrunchLen = 12
  35. dummysize1 = 16
  36.  
  37. ;STRUCTURE CrmHeader,0
  38. crm_UnpackLen = 6
  39. crm_CrunchLen = 10
  40. dummysize2 = 14
  41.  
  42. ;STRUCTURE LhaHeader,0
  43. lha_clen3 = 7 ;lenghts inverted. dunno why...
  44. lha_clen2 = 8
  45. lha_clen1 = 9
  46. lha_clen0 = 10
  47. lha_ulen3 = 11
  48. lha_ulen2 = 12
  49. lha_ulen1 = 13
  50. lha_ulen0 = 14
  51. lha_chksum = 15 ; perhaps checksum? dunno
  52. lha_chksum2 = 19 ; =$2001 if done with lha on Unix
  53. lha_namesize = 21 ; lenght of filename - last byte useful for lha
  54. lha_char1 = 22 ; first char of filename
  55. lha_size = 32 ; the new lenght of data - useful for XPK (modname)
  56.  
  57. ;table offsets
  58. ;STRUCTURE Variables,0
  59. args_result_oldv = 0
  60. ;dirs = 28; DIRS/M
  61. ;sw1 IT=INTROTEXT/K
  62. ;sw2 NT=NOTOTALS/S
  63. ;sw3 TR=TESTRIPP/S
  64. ;sw4 TD=TESTDURATION/S
  65. ;sw5 ET=ENDTEXT/K
  66. ;sw6 NS=NOSORT/S
  67. ;sw7 NH=NOHEADER/S
  68. ;sw8 FO=FILESONLY/S
  69. ;sw9 FP=FULLPATH/S
  70. ;sw10 H2=HEADER2/S
  71. ;sw11 LF/N/K
  72. ;sw12 DL=DRAWLIMITS/S
  73. ;sw13 COF=COUNTONLYFILES/S
  74. ;sw14 SN=SONGNAME/S
  75. ;sw15 SU=SHOWULEN/S
  76. ;sw16 LA=LINEASPECT/K
  77. ;sw17 NC=NOCRUNCHINFOS/S
  78. ;sw18 SF=SHORTFILENAMES/S
  79. ; /S switches are activated if <> 0
  80.  
  81. vars_sizeof = 204; total size of the array above
  82.  
  83. ;output string structures
  84. ;STRUCTURE FileDatas,0
  85. Str_File = 0; filename (null offset)
  86. Dec_ULen = 4; unpacked
  87. Dec_CLen = 8; packed
  88. Str_Type = 12; compression format
  89. Dec_Ratio = 16; compression ratio
  90. Str_Comment = 20; file comments
  91. strlen = 24; max lenght for the output string above
  92.  
  93. ;STRUCTURE Totals,0
  94. Tot_numf = 0
  95. Tot_utot2 = 4
  96. Tot_ctot2 = 8
  97. Tot_ratio = 12
  98. Tot_strlen2 = 16
  99.  
  100. MAXCHARS = 160
  101.  
  102. ; START *********************************************
  103.  
  104.     OPT4
  105.  
  106.     LVER    dos.library 37
  107.  
  108. ; vars
  109. LONG    oldlock ofh acinq myhandle varfh pplast mylock sp1 fh itbuffer itsize
  110. LONG    itlock itfh varlock sumvarbuff myseg rdargs lhafh tmpfh hbuffer dirsptr
  111. LONG    lh_utot numfiles numdirs ctot longsum numf_buff tmp_lhsize sp2
  112. LONG    delim_strptr strloc2 utot dummy_null_string_dont_remove Packlib
  113. LONG    filename fib output_buffer membase
  114.  
  115. ; args
  116. LONG    sf_arg nc_arg la_arg su_arg sn_arg cof_arg dl_arg lf_arg h2_arg
  117. LONG    fp_arg fo_arg nh_arg ns_arg et_arg td_arg tr_arg nt_arg it_arg mdirs
  118.  
  119. ; flags
  120. BYTE    la_flag tmpdeleted entrytype spcecnt atleastone sortflag onlydirs
  121. BYTE    namegiv_bool xpked
  122. BYTE    lhsize[4] newname[160] fib_buf[416] header_buf[32] files_data[32]
  123. BYTE    total_data[32] numf_data[32] sum_buffer[32]
  124.  
  125.     a0 = &fib_buf
  126.     fib = a0
  127.     a0 = &header_buf
  128.     hbuffer = a0
  129.     a0 = &files_data
  130.     output_buffer = a0
  131.     a0 = &total_data
  132.     strloc2 = a0
  133.     a0 = &numf_data
  134.     numf_buff = a0
  135.     a0 = &sum_buffer
  136.     sumvarbuff = a0
  137.     ofh = Output()
  138. readargs
  139.     a0 = &args_template
  140.     a1 = &mdirs
  141.     rdargs = ReadArgs( a0 a1 #0 )
  142.     not.l    h2_arg(a5) ; Finally H2 becomes the def output !
  143.     a0 = &delim
  144.     delim_strptr = a0
  145.     la_flag = #0
  146.     a0 = la_arg ; LINEASPECT/K
  147.     a0 != 0 {
  148.         delim_strptr = la_arg
  149.         la_flag = #1
  150.     }
  151. test_tr ; TESTRIPP
  152.     tr_arg != 0 {
  153.         a0 = &tr.msg
  154.         PutStr( a0 )
  155.     }
  156. test_td ; TESTDURATION
  157.     td_arg != 0 {
  158.         a0 = &td.msg
  159.         PutStr( a0 )
  160.     }
  161. test_it_arg
  162.     d1 = it_arg ; INTROTEXT
  163.     beq    testsort1
  164.     bsr    type ; write your intro text
  165. testsort1 ; NOSORT/S - if specified, jumps to giveargs
  166.     ns_arg = 0 {
  167.         ;findseg ; if Sort is not yet resident
  168.         a0 = &segname
  169.         FindSegment( a0 #0 #0 ) ; is Sort already resident ?
  170.         d0 = 0 {
  171.             a0 = &cmdname
  172.             myseg = LoadSeg( a0 ) ; load code from c:Sort
  173.             myseg = 0 {
  174.                 ns_arg = #1 ; unable to load c:Sort, activating NOSORT
  175.                 bra.s    giveargs
  176.             } else {
  177.                 a0 = &segname
  178.                 AddSegment( a0 myseg #1 ) ; make it resident
  179.             }
  180.         }
  181.     }
  182. giveargs
  183.     mdirs = 0 {
  184.         GetCurrentDirName( &newname #MAXCHARS )
  185.         d0 != 0 { ; success ! very likely to append
  186.             a0 = &newname
  187.             sp1 = a0
  188.         } else {
  189.             sp1 = #0
  190.         }
  191.     } else {
  192.         dirsptr = mdirs ; save dirs array
  193.         a0 = dirsptr
  194.         sp1 = (a0)+ ; if a4 is null, no arg -> current dir is locked
  195.         dirsptr = a0
  196.         sp1 = 0 {
  197.             a0 = dirsptr
  198.             -(a0) = sp1 ; if no arg was given, back to the old state
  199.             dirsptr = a0
  200.         } else {
  201.             d1 = sp1
  202.         }
  203.     }
  204. lockfile ;         lock for Examine().
  205.     mylock = Lock( sp1 #ACCESS_READ )
  206.     mylock != 0 { ; branch to scan the dir, else...
  207.         nh_arg = 0 examine ; NOHEADER
  208.         bra    testsort
  209.     }
  210.     PutStr( sp1 )
  211.     a0 = &inter2
  212.     PutStr( a0 )
  213.     IoErr() ; get the error
  214.     PrintFault( d0 #0 ); output an error msg, then exit
  215. free_args
  216.     tmpdeleted != 0 { ; close+del tmpfile if break
  217.         tmpfh != 0 {
  218.             Close( tmpfh )
  219.         }
  220.         a0 = &tmpname
  221.         DeleteFile( a0 )
  222.     }
  223. free_args2
  224.     bsr    multi_lf
  225.     FreeArgs( rdargs )
  226.     bra     closeall
  227.  
  228. ;--------------------------------------------
  229. examine        ; to get the comments and the crunched size
  230.     d1 = delim_strptr
  231.     bsr    wdelim
  232.     namegiv_bool = #0
  233.     a0 = sp1
  234.     a0 = 0 l { ; remove hit
  235.         namegiv_bool = #1
  236.     }
  237.     Examine( mylock fib )
  238.     d0 = 0 exnext
  239.     namegiv_bool = 0 {
  240.         a0 = sp1
  241. findend
  242.         (a0)+ != 0 findend b ; ENFORCER HIT ! offset $1A2
  243.         lea    -2(a0),a0
  244.         (a0) = #'/' b { ; ENFORCER HIT ! offset $1AA
  245.             (a0) = 0 b ; erase last '/' for good filepart (only dirname)
  246.         }
  247.         (a0) = #':' b { ; ENFORCER HIT ! offset $1B2
  248.             (a0) = 0 b
  249.         }
  250.         fp_arg = 0 {
  251.             sp1 = FilePart( sp1 )
  252.         }
  253.         h2_arg = 0 {
  254.             a0 = &stars
  255.             PutStr( a0 ) ; put '******'
  256.         }
  257.         d1 = sp1
  258.     } else {
  259.         a0 = fib
  260.         a1 = &fib_FileName(a0)
  261.         d1 = a1
  262.     }
  263.     h2_arg != 0 { ; H2=HEADER2/S
  264.         bsr    centersub
  265.     }
  266.     PutStr( * )
  267.     a0 = fib
  268.     a0 = &fib_Comment(a0)
  269.     a0 = 0 nodircomms
  270. sel_headerfmt
  271.     sp1 = a0 ; save comments
  272.     h2_arg != 0 { ; H2=HEADER2/S
  273.         bsr    linefeed
  274.     } else {
  275.         a1 = &inter
  276.         PutStr( a1 )
  277.     }
  278.     d1 = sp1
  279.     h2_arg != 0 { ; H2=HEADER2/S
  280.         bsr    centersub
  281.     }
  282. nocentercomms
  283.     PutStr( * )
  284. nodircomms
  285.     ns_arg != 0 { ; NOSORT/S
  286.         bsr    linefeed
  287.     } else {
  288.         h2_arg = 0 { ; H2=HEADER2/S
  289.             bsr    linefeed
  290.         }
  291.     }
  292.     h2_arg = 0 { ; H2=HEADER2/S
  293.         d1 = delim_strptr
  294.         bsr    wdelim
  295.     }
  296.     bsr    linefeed
  297.     Flush( ofh )
  298.  
  299. ;------------------------------- NH
  300. testsort
  301.     ns_arg = 0 { ; NOSORT/S
  302.         a0 = &tmpname
  303.         tmpfh = Open( a0 #MODE_NEWFILE )
  304.         tmpfh != 0 {
  305.             tmpdeleted = #1
  306.             bra.s    currentdir
  307.         }
  308.         ns_arg = #1 ; NOSORT/S
  309.     }
  310. currentdir
  311.     a0 = sp1
  312.     oldlock = CurrentDir( mylock )
  313.     Examine( mylock fib )
  314.     d0 != 0 { ; if error, unlock and try next arg
  315.         a0 = fib
  316.         d0 = fib_DirEntryType(a0)
  317.         d0 > 0 exnext ; scan only if d0 > 0 (entry is a dir)
  318.     }
  319. loop
  320.     bsr.s    unlockdir
  321. loop2
  322.     mdirs != 0 {
  323.         a0 = dirsptr
  324.         d1 = (a0)+ ; get the next arg
  325.         dirsptr = a0
  326.         d1 != 0 gotonext ; continue if arg found
  327.     }
  328. nomore
  329.     d1 = et_arg ; ET=ENDTEXT/K
  330.     beq    free_args
  331.     bsr    type
  332.     bra    free_args ; no more args, exit
  333.  
  334.  
  335. gotonext
  336.     sp1 = d1
  337. lf_mdirs_gry ; added on 20.10.95 on request of gryzor
  338.     bsr    multi_lf
  339.     d1 = sp1
  340.     bra    lockfile
  341. unlockdir
  342.     CurrentDir( oldlock )
  343.     UnLock( d0 )
  344.     rts
  345.  
  346.  
  347. dirempty
  348.     d1 = delim_strptr
  349.     bsr    wdelim
  350.     a0 = &empty.msg
  351.     PutStr( a0 )
  352.     tmpfh != 0 {
  353.         Close( tmpfh )
  354.         tmpfh = 0
  355.     }
  356.  
  357. deltmp2
  358.     a0 = &tmpname
  359.     DeleteFile( a0 )
  360.     bra    free_args2
  361.  
  362. noexnext
  363.     bsr.s    unlockdir
  364.     atleastone = 0 dirempty
  365.  
  366. ins_totfiles
  367.     ns_arg != 0 notmpclose ; NOSORT/S
  368.     h2_arg = 0 noftot ; H2=HEADER2/S
  369.     nh_arg != 0 noftot ; NH=NOHEADER/S
  370.     a1 = strloc2
  371.     cof_arg = 0 { ; COF=COUNTONLYFILES/S (not Jean-Pierre, you fool ! :)
  372.         d0 = numdirs
  373.         numfiles += d0
  374.     }
  375.     onlydirs = 0 {
  376.         a0 = &fmtdnum
  377.     } else {
  378.         a0 = &fmtnum
  379.     }
  380. keepfmt
  381.     (a1) = numfiles
  382.     cof_arg != 0 {
  383.         onlydirs = 0 {
  384.             (a1) = numdirs
  385.         }
  386.     }
  387.     a3 = numf_buff
  388.     bsr    sprintf
  389.     d1 = numf_buff
  390.     bsr    centersub
  391.     PutStr( * )
  392.     bsr    linefeed
  393. limafthead
  394.     d1 = delim_strptr
  395.     bsr    wdelim
  396. nolim1
  397.     bsr    linefeed
  398.     Flush( ofh )
  399. noftot
  400.     h2_arg = 0 {
  401.         a1 = strloc2
  402.         cof_arg = 0 {
  403.             d0 = numdirs
  404.             numfiles += d0
  405.         }
  406.     }
  407.     tmpfh != 0 {
  408.         Close( tmpfh )
  409.         tmpfh = 0
  410.         sortflag != 0 {
  411.             a0 = &comline
  412.             Execute( a0 #0 #0 )
  413.             a0 = &sortedname
  414.             d1 = a0
  415.             bsr    type
  416.             d0 = 0 {
  417.                 a0 = &sortedname
  418.                 DeleteFile( a0 )
  419.                 a0 = &tmpname
  420.                 DeleteFile( a0 )
  421.                 tmpdeleted = #0
  422.             }
  423.         }
  424.     }
  425. notmpclose
  426.     nt_arg != 0 loop2
  427.     a1 = strloc2
  428.     onlydirs = 0 {
  429.         (a1) = numdirs
  430.         a0 = &totdirfmt ; the format
  431.     } else {
  432.         (a1) = numfiles
  433.         Tot_utot2(a1) = utot
  434.         Tot_ctot2(a1) = ctot
  435.         utot = 0 {
  436.             d2 = 0
  437.         } else {
  438.             d3 = utot
  439.             d0 = ctot
  440.             bsr    calc_ratio ; in: d3=utot,d0=ctot / out: d2=ratio
  441.         }
  442.         Tot_ratio(a1) = d2 l ; ratio=100-100*CLen/ULen
  443.         a0 = &totfmt ; the format
  444.         su_arg = 0 { ; SU=SHOWULEN/S
  445.             nc_arg != 0 { ; NC=NOCRUNCHINFOS/S
  446.                 a0 = &nctot
  447.             } else {
  448.                 sf_arg != 0 { ; SF=SHORTFILENAMES/S
  449.                     a0 = &shorttot
  450.                 } else {
  451.                     (Tot_ctot2-4)(a1) = Tot_ctot2(a1) l ; shift up struct (gry fmt)
  452.                     (Tot_ratio-4)(a1) = Tot_ratio(a1) l
  453.                     a0 = &grytot
  454.                 }
  455.             }
  456.         }
  457.     }
  458.         VPrintf( a0 a1 ) ; printing the final string
  459.         Flush( ofh )
  460. wxltot
  461.     a1 = &totvarname
  462.     varfh = Open( a1 #MODE_NEWFILE )
  463.     onlydirs = 0 {
  464.         cof_arg != 0 {
  465.             a0 = strloc2
  466.             (a0) = #0 l
  467.         }
  468.     }
  469.     a1 = &fmtvar
  470.     VFWritef( varfh a1 strloc2 ) 
  471.     Close( varfh )
  472.     bsr    dosumvar
  473.  
  474. clrintvars
  475.     d0 = #0
  476.     utot = #0
  477.     ctot = #0
  478.     numfiles = #0
  479.     numdirs = #0
  480.     bra    loop2
  481.  
  482.  
  483. isdir ; called when filename was a dir
  484.     a0 = fib
  485.     d0 = fib_DirEntryType(a0)
  486.     ble.s    exnext
  487.     fo_arg = 0 { ; FO=FILESONLY/S (not Marc Blondel, you fool ! :)
  488.         entrytype = #DIR
  489.         a1 = &fib_FileName(a0)
  490.         a2 = output_buffer
  491.         (a2) = a1
  492.         move.l    #'Dir ',Packlib(a5)
  493.         a1 = &Packlib
  494.         Str_Type(a2) = a1
  495.         Dec_Ratio(a2) = #0 l
  496.         numdirs += #1
  497.         bra    testsort2
  498.     }
  499.  
  500. ;************  mainloop
  501.  
  502. exnext
  503.     CheckSignal( #SIGBREAKF_CTRL_C )
  504.     d0 != 0 {
  505.         bsr    unlockdir
  506.         bra    free_args
  507.     }
  508.     ExNext( mylock fib )
  509.     d0 = 0 noexnext ; break if error (like no more entries)
  510.     a0 = fib
  511.     a1 = &fib_FileName(a0)
  512.     filename = a1
  513.     a2 = output_buffer
  514.     Dec_CLen(a2) = fib_Size(a0) l
  515.     Dec_ULen(a2) = fib_Size(a0) l ; ulen=clen for normal files
  516.     a1 = &fib_Comment(a0)
  517.  
  518.     tr_arg != 0 {
  519.         (a1) = 0 exnext b
  520.         d0 = #25
  521. rip
  522.         (a1,d0) != #'Ripp' l {
  523.             dbra    d0,rip
  524.             bra    exnext
  525.         }
  526.     }
  527.  
  528.     td_arg != 0 {
  529.         (a1) = 0 test_xfh b
  530.         d0 = 3
  531. dur
  532.         (a1,d0) = #'[' exnext b
  533.         dbra    d0,dur
  534.     }
  535.  
  536. test_xfh
  537.     (a1) = #'XF' w { ; detects XFH comments (by xScan). 'Erase' them.
  538.         (a1) = 0 l
  539.     }
  540.  
  541. ; lets read the first 16 bytes
  542.     a2 = output_buffer
  543.     Str_Comment(a2) = a1
  544.     myhandle = Open( filename #MODE_OLDFILE )
  545.     beq    isdir ; if error (dir) examine next entry
  546.     entrytype = #FILE
  547.     onlydirs = #1
  548.     a1 = hbuffer ; clear the readbuffer because old infos are...
  549.     (a1) = 0 l ; ...still here. (Ex. if <.file> detected just before)
  550.     Read( myhandle hbuffer #lha_size )
  551.     Close( myhandle )
  552.  
  553. testxpk__
  554.     a1 = hbuffer ;         a1=readbuffer
  555.     move.l    (a1),d1 ; =xh_Reco(a1)        d1=first 4 bytes of the file
  556.     d1 != #'XPKF' testpp20 l
  557. hereisxpk__
  558.     sn_arg != 0 {
  559.         a2 = output_buffer
  560.         a0 = &xh_Sample(a1)
  561.         move.l    a0,Str_File(a2)
  562.         d0 = #$1f l
  563.         d1 = #4 l
  564. .loop
  565.         cmp.b    (a0,d1),d0
  566.         bge    nosong
  567.         dbra    d1,.loop
  568.         d0 = #$80 l
  569.         d1 = #15 l
  570. .loop2
  571.         cmp.b    (a0,d1),d0
  572.         bge    nosong
  573.         dbra    d1,.loop2
  574.         xpked = #1
  575.     }
  576. nosong
  577.     move.l    xh_CLen(a1),d0
  578.     d0 += #8
  579.     a2 = output_buffer
  580.     d0 = Dec_CLen(a2) l {
  581.         move.l    xh_ULen(a1),Dec_ULen(a2) ; Unpacked lenght
  582.         Packlib = xh_Type(a1) ; Packing method
  583.         bra    print ; output to stdio
  584.     }
  585.     move.l    #'!XPK',Packlib(a5)
  586.     bra    print
  587.  
  588. testpp20
  589.     Packlib = d1 ; Packlib=PP20,Crm2 or S404
  590.     d1 != #'PP20' testcrm2 l
  591. hereispp20__        ; reopen file for decrunched size
  592.     myhandle = Open( filename #MODE_OLDFILE )
  593.     beq    exnext
  594.     Seek( myhandle #-4 #OFFSET_END )
  595.     a0 = &pplast
  596.     Read( myhandle a0 #4 ) ; let's read the last 4 bytes
  597.     Close( myhandle )
  598.     d0 = pplast ; XXXXXXxx
  599.     d0 >> 8 ; calculating the PP-Decrunch-Info
  600.     a2 = output_buffer
  601.     Dec_ULen(a2) = d0 ; 00XXXXXX
  602.     cmp.l    Dec_CLen(a2),d0 
  603.     blt    nopp
  604.     d1 = Dec_CLen(a2)
  605.     d2 = d1
  606.     d1 += d1 ; C*2
  607.     d1 += d1 ; C*4
  608.     d2 += d1 ; C*5
  609.     d2 += d2 ; C*10
  610.     cmp.l    d2,d0
  611.     blt    print
  612. nopp
  613.     move.l    Dec_CLen(a2),Dec_ULen(a2)
  614.     move.l    #'!PP2',Packlib(a5)
  615.     bra    print
  616.  
  617. testcrm2
  618.     d1 = #'Crm2' hereiscrm l
  619.     d1 = #'CrM2' hereiscrm l
  620.     d1 = #'CrM!' hereiscrm l
  621.     d1 != #'Crm!' teststc l
  622.  
  623. hereiscrm
  624.     a2 = output_buffer
  625.     move.l    crm_CrunchLen(a1),d0
  626.     add.l    #14,d0
  627.     cmp.l    Dec_CLen(a2),d0
  628.     bne.s    nocrm
  629.     move.l    crm_UnpackLen(a1),Dec_ULen(a2)
  630.     bra    print
  631. nocrm
  632.     move.l    #'!Crm',Packlib(a5)
  633.     bra    print
  634.  
  635. teststc
  636.     d1 = #'S403' hereisstc l
  637.     d1 != #'S404' testlha l
  638. hereisstc
  639.     a2 = output_buffer
  640.     move.l    stc_CrunchLen(a1),d0
  641.     add.l    #20,d0
  642.     cmp.l    Dec_CLen(a2),d0
  643.     bne.s    nostc
  644.     move.l    stc_UnpackLen(a1),Dec_ULen(a2)
  645.     bra    print
  646. nostc
  647.     move.l    #'!S40',Packlib(a5)
  648.     bra    print
  649.  
  650. testlha
  651.     a1 = hbuffer
  652.     move.w    3(a1),d1
  653.     d1 != #'lh' nopacker w
  654.     move.b    2(a1),d1
  655.     d1 != #'-' nopacker b
  656. hereislh5
  657.     bsr    getlhanfo
  658.     bra    print
  659.  
  660. nopacker
  661.     move.l    #'    ',Packlib(a5)
  662. print        ; put the infos in the right places
  663.     FilePart( filename ) ; trash the full path, keep basename
  664.     sn_arg != 0 { ; SN=SONGNAME/S
  665.         xpked = 0 {
  666.             a2 = output_buffer
  667.             Str_File(a2) = d0 l
  668.         }
  669.     } else {
  670.         a2 = output_buffer
  671.         Str_File(a2) = d0 l
  672.     }
  673.  
  674. printbis
  675.     a1 = d0 l
  676.     (a1) = #'.' exnext b ; strip out the ".*" files (.EPDir)
  677.     numfiles += #1
  678.     a1 = &Packlib
  679.     a2 = output_buffer
  680.     move.l    a1,Str_Type(a2)
  681.     move.l    Dec_CLen(a2),d0
  682.     move.l    Dec_ULen(a2),d3
  683.     ctot += d0
  684.     utot += d3
  685.     bsr    calc_ratio
  686.     move.l    d2,Dec_Ratio(a2) ; ratio=100-100*CLen/ULen
  687.     nc_arg = 0 {
  688.         sf_arg = 0 {
  689.             su_arg = 0 {
  690. ;------- for Gry fmt -------------------
  691.                 (Dec_CLen-4)(a2) = Dec_CLen(a2) l
  692.                 (Str_Type-4)(a2) = Str_Type(a2) l
  693.                 (Dec_Ratio-4)(a2) = Dec_Ratio(a2) l
  694.                 (Str_Comment-4)(a2) = Str_Comment(a2) l
  695.             }
  696.         } else {
  697.             (Str_Comment-12)(a2) = Str_Comment(a2) l
  698.         }
  699.     } else {
  700. ;------------- for nc fmt --------------------
  701.         (Str_Comment-12)(a2) = Str_Comment(a2) l
  702.     }
  703. testsort2
  704.     ns_arg != 0 {
  705.         fh = ofh
  706.     } else {
  707.         fh = tmpfh
  708.         fh != 0 {
  709.             sortflag = #1
  710.             } else {
  711.             fh = ofh
  712.         }
  713.     }
  714. vfprint
  715.     a2 = output_buffer
  716.     entrytype = 1 {
  717. ;--------------- adjust file fmts ------------------
  718.         a0 = &gryfmt
  719.         su_arg != 0 { ; SU=SHOWULEN/S
  720.             a0 = &cformat
  721.         } else {
  722.             nc_arg != 0 { ; NC=NOCRUNCHINFOS/S
  723.                 a0 = &ncfmt
  724.             } else {
  725.                 sf_arg != 0 { ; SF=SHORTFILENAMES/S
  726.                     a0 = &shortfmt
  727.                 }
  728.             }
  729.         }
  730.     } else {
  731.         a0 = &dirfmt
  732.         su_arg = 0 { ; SU=SHOWULEN/S
  733.             nc_arg != 0 { ; NC=NOCRUNCHINFOS/S
  734.                 move.l    Str_Comment(a2),(Str_Comment-16)(a2)
  735.                 a0 = &ncdirfmt
  736.             } else {
  737.                 sf_arg != 0 { ; SF=SHORTFILENAMES/S
  738.                     (Str_Comment-16)(a2) = Str_Comment(a2) l
  739.                     a0 = &shortdirfmt
  740.                 } else {
  741. ;---------- gry dir fmt --------------------
  742.                     move.l    Dec_CLen(a2),(Dec_CLen-4)(a2)
  743.                     move.l    Str_Type(a2),(Str_Type-4)(a2)
  744.                     move.l    Dec_Ratio(a2),(Dec_Ratio-4)(a2)
  745.                     move.l    Str_Comment(a2),(Str_Comment-4)(a2)
  746.                     a0 = &grydirfmt
  747. ;------------------------------------------
  748.                 }
  749.             }
  750.         }
  751.     }
  752.  
  753. begin_print
  754.     VFPrintf( fh a0 a2 )
  755.     Flush( fh )
  756.  
  757.     a0 = fib
  758.     a1 = &fib_Comment(a0)
  759.     d0 = #18
  760.  
  761. clrcomm
  762.     (a1)+ = #0 l
  763.     dbra    d0,clrcomm
  764.     atleastone = #1
  765.     xpked = #0
  766.     bra    exnext ; next entry please
  767.  
  768. ;#########********** SUBROUTINES *************#############
  769.  
  770.  
  771. calc_ratio ; in: d0=ctot,d3=utot / out: d2=ratio
  772.     d3 != 0 {
  773.         d0 != 0 { ; test if clen = ulen ( => ratio = 0% )
  774.             d1 = #100
  775.             d5 = d0
  776.             d0 = d3
  777.             d3 >= #1000000 { ; change method at 1 Mb
  778.                 ; 2nd method, for 1 Mb => 2 Gb (uncrunched) sizes
  779.                 ; if d3 is big enough for the "bigsizes" ratio
  780.                 UDivMod32( * * ) ; ulen / 100
  781.                 d1 = d0
  782.                 d0 = d5
  783. div
  784.                 UDivMod32( * * ) ; clen / (ulen / 100)
  785.                 d2 = #100
  786.                 sub.l    d0,d2 ; 100 - quotient = ratio
  787.                 rts
  788.             }
  789.             d0 = d5 ; classic method, for 0 => 21 Mo sizes
  790.             UMult32( * * ) ; clen * 100 (oveflow with too big numbers!)
  791.             d1 = d3
  792.             bra.s    div ; (clen * 100) / ulen
  793.         }
  794.     }
  795.     d2 = #0
  796.     rts
  797. ;**************** end (calc_ratio)
  798.  
  799. linefeed
  800.     FPutC( ofh #10 )
  801.     rts
  802.  
  803.  
  804. multi_lf
  805.     lf_arg != 0 { ; LF
  806.         a0 = lf_arg ; LF
  807.         d0 = (a0)
  808.         d0 > 0 { ; LF<=0
  809.             d0 -= 1
  810.             d4 = d0
  811. putlf
  812.             bsr    linefeed
  813.             dbra    d4,putlf
  814.         }
  815.     }
  816.     rts
  817.  
  818.  
  819. type ; d1: strptr on file to write to stdout
  820.     sp1 = d1
  821.     itlock = Lock( * #ACCESS_READ )
  822.     itlock = 0 {
  823.         d0 = #-1
  824.         rts
  825.     } else {
  826.         Examine( itlock fib )
  827.         a0 = fib
  828.         itsize = fib_Size(a0)
  829.         itfh = Open( sp1 #MODE_OLDFILE )
  830.         itfh != 0 {
  831.             itbuffer = AllocVec( itsize $10001 )
  832.             itbuffer != 0 {
  833.                 Read( itfh itbuffer itsize )
  834.                 Write( ofh itbuffer itsize )
  835.                 FreeVec( itbuffer )
  836.             }
  837.             Close( itfh )
  838.         }
  839.         UnLock( itlock )
  840.         d0 = #0
  841.         rts
  842.     }
  843.  
  844.  
  845. centersub ; d1=strptr on string to center (80 cols display)
  846.     sp2 = d1
  847.     a0 = d1
  848.     d0 = #-1
  849. countlen
  850.     d0 += #1
  851.     (a0)+ != 0 countlen
  852.     d1 = #80
  853.     d1 -= d0
  854.     d1 > 0 b {
  855.         lsr.l    #1,d1
  856.         spcecnt = d1
  857.         spcecnt != 0 {
  858. putspace
  859.             FPutC( ofh #" " )
  860.             spcecnt -= 1
  861.             spcecnt != 0 putspace
  862.         }
  863.     }
  864.     d1 = sp2
  865.     rts
  866.  
  867.  
  868. dosumvar ; env:xlsumtot, sumvarfname
  869.     a0 = &sumvarfname
  870.     varlock = Lock( a0 #ACCESS_READ )
  871.     varlock = 0 {
  872.         a0 = &sumvarfname
  873.         varfh = Open( a0 #MODE_NEWFILE )
  874.         varfh != 0 {
  875.             a0 = &fmtvar
  876.             VFWritef( varfh a0 strloc2 )
  877.         }
  878.     } else {
  879.         UnLock( varlock )
  880.         a0 = &sumvarname
  881.         GetVar( a0 sumvarbuff #VARSIZE #GVF_GLOBAL_ONLY )
  882.         a0 = &longsum
  883.         StrToLong( sumvarbuff a0 )
  884.         d0 = numfiles
  885.         longsum += d0
  886.         a0 = &sumvarfname
  887.         varfh = Open( a0 #MODE_NEWFILE )
  888.         varfh != 0 {
  889.             a0 = &longsum
  890.             a1 = &fmtvar
  891.             VFWritef( varfh a1 a0 )
  892.         }
  893.     }
  894.     varfh != 0 {
  895.         Close( varfh )
  896.     }
  897.     rts
  898.  
  899. sprintf ; a0 - format, a1 - data, a2 - PutChProc, a3 - buffer
  900.     a2 = &stuffChar
  901.     RawDoFmt( * * * * )
  902.     rts
  903. stuffChar
  904.     move.b    d0,(a3)+
  905.     rts
  906.  
  907.  
  908. wdelim ; d1 - strptr on line to write
  909.     dl_arg != 0 { ; DRAWLIMITS/S
  910.         bsr    centersub
  911.         PutStr( * )
  912.         Flush( ofh )
  913.         la_flag != 0 b {
  914.             bsr    linefeed
  915.         }
  916.     }
  917.     rts
  918.  
  919.  
  920. getlhanfo
  921.     d4 = #0 ; index
  922.     bsr    getlh_clen
  923.     d0 = tmp_lhsize
  924.     cmp.l    Dec_CLen(a2),d0
  925.     blt    goodlha
  926.     move.l    #'!LHA',Packlib(a5)
  927.     rts
  928. goodlha
  929.     d0 += #45
  930.     cmp.l    Dec_CLen(a2),d0
  931.     bgt    onefileinside
  932. multiplelha
  933.     move.l    #'LHAs',Packlib(a5)
  934.     lh_utot = #0
  935.     lhafh = Open( filename #MODE_OLDFILE )
  936.     lhafh = 0 {
  937.         move.l    Dec_CLen(a2),Dec_ULen(a2)
  938.         rts
  939.     }
  940. refreshindex
  941.     a1 = hbuffer
  942.     lha_chksum2(a1) = #$2001 w { ; whaw! I was lucky to find this.
  943.         d4 += #3
  944.     }
  945.     d0 = #0
  946.     a1 = hbuffer
  947.     move.b    lha_namesize(a1),d0
  948.     d4 += d0
  949.     d4 += #24 ; 24=size of checksum and other stuff.
  950.     d4 += tmp_lhsize ; tmp_lhsize=clen of an arc file
  951.     d0 = d4
  952.     bsr    getlh_ulen
  953.     move.l    Dec_ULen(a2),d0
  954.     lh_utot += d0 ; lh_utot = total unpacked lenght of files
  955.     d0 = lh_utot
  956. readnextlha
  957.     Seek( lhafh d4 #OFFSET_BEGINNING ) ; go to the next lha header
  958.     d0 = -1 {
  959.         Close( lhafh )
  960.         d1 = Dec_ULen(a2)
  961.         lh_utot -= d1
  962.         Dec_ULen(a2) = lh_utot
  963.         Dec_ULen(a2) < 0 {
  964.             move.l    Dec_CLen(a2),Dec_ULen(a2)
  965.         }
  966.         rts
  967.     } else {
  968.         Read( lhafh hbuffer #lha_size ); read the next lha header in archive
  969.         a1 = hbuffer
  970.         bsr    getlh_clen
  971.         bra    refreshindex
  972.     }
  973. ;*----------------------------------
  974. onefileinside
  975. ;    Dec_CLen(a2) = tmp_lhsize
  976. ;this line above put the crunched size appearing in Lha. I choose not to
  977. ;do this here but feel free to do it if you want.
  978.     bsr    getlh_ulen
  979.     move.l    #'LHA ',Packlib(a5)
  980.     rts
  981. getlh_clen ; d1=index -> clen in tmp_lhsize
  982.     a0 = &lhsize
  983.     3(a0) = lha_clen3(a1) b 
  984.     2(a0) = lha_clen2(a1) b
  985.     1(a0) = lha_clen1(a1) b
  986.     (a0) = lha_clen0(a1) b
  987.     tmp_lhsize = lhsize l
  988.     rts
  989. getlh_ulen ; d1=index -> ulen in dec_ulen
  990.     (Dec_ULen+3)(a2) = lha_ulen3(a1) b
  991.     (Dec_ULen+2)(a2) = lha_ulen2(a1) b
  992.     (Dec_ULen+1)(a2) = lha_ulen1(a1) b
  993.     Dec_ULen(a2) = lha_ulen0(a1) b
  994.     rts
  995.  
  996. closeall ; ezasm inserts its exit routine below  
  997.     end
  998.  
  999. ;---- datas ----
  1000. cformat
  1001.     dc.b    '%-26.26s %8ld %8ld (%s/%2ld%%) %s',$a,0
  1002. gryfmt
  1003.     dc.b    '%-30.30s %8ld (%s/%2ld%%) %s',$a,0
  1004. ncfmt
  1005.     dc.b    '%-32.32s %8ld %s',$a,0
  1006. shortfmt
  1007.     dc.b    '%-20.20s %8ld %s',$a,0
  1008. ;File                           Real   Packed Type/Ratio     Comment
  1009. dirfmt
  1010.     dc.b    ' %-25.25s %8ld %8ld (%s/%2ld%%) %s',$a,0
  1011. grydirfmt
  1012.     dc.b    ' %-29.29s %8ld (%s/%2ld%%) %s',$a,0
  1013. ncdirfmt
  1014.     dc.b    ' %-32.32s         %s',$a,0
  1015. shortdirfmt
  1016.     dc.b    ' %-20.20s         %s',$a,0
  1017. grytot
  1018.     dc.b    '                                ~~~~~~~      ~~~~~',10
  1019.     dc.b    '=> %5ld files                 %8ld       %2ld%%',10,0
  1020. totfmt
  1021.     dc.b    '                            ~~~~~~~  ~~~~~~~      ~~~~~',10
  1022.     dc.b    '=> %5ld files           %10ld %8ld       %2ld%%',10,0
  1023. nctot
  1024.     dc.b    '                                  ~~~~~~~',10
  1025.     dc.b    '=> %5ld files                   %8ld',10,0
  1026. shorttot
  1027.     dc.b    '                    ~~~~~~~',10
  1028.     dc.b    '=>%4ld files       %8ld',10,0
  1029. totdirfmt
  1030.     dc.b    '~~~~~~~~~~~~',10,'=> %ld dirs',10,0
  1031. dosname
  1032.     dc.b    'dos.library',0
  1033. uname
  1034.     dc.b    'utility.library',0
  1035. empty.msg
  1036.     dc.b    'Directory is empty!'
  1037. flush_string
  1038.     dc.b    10,0
  1039. tr.msg
  1040.     dc.b    '(Filtering mods WITH "Ripp" in DOS_Comment)',10,0
  1041. td.msg
  1042.     dc.b    '(Filtering mods WITHOUT duration in DOS_Comment)',10,0
  1043. stars
  1044.     dc.b    '********** ',0
  1045. delim
  1046.     dc.b    '============================================================'
  1047.     dc.b    '===================',10,0
  1048. inter
  1049.     dc.b    ' - ',0
  1050. inter2
  1051.     dc.b    ' : ',0
  1052. fmtvar
  1053.     dc.b    '%N',0
  1054. fmtnum
  1055.     dc.b    '%ld files',0
  1056. fmtdnum
  1057.     dc.b    '%ld dirs',0
  1058. totvarname
  1059.     dc.b    'ENV:xltotal',0
  1060. sumvarfname
  1061.     dc.b    'ENV:'
  1062. sumvarname
  1063.     dc.b    'xlsumtot',0
  1064. tmpname
  1065.     dc.b    'T:xltmp1',0
  1066. sortedname
  1067.     dc.b    'T:xltmp2',0
  1068. cmdname
  1069.     dc.b    'C:'
  1070. segname
  1071.     dc.b    'Sort',0
  1072. comline ; lame but true
  1073.     dc.b    'Sort >NIL: T:xltmp1 to T:xltmp2',0
  1074. version_string
  1075.     dc.b    '$VER: xList 1.06 (23.02.96) by Reez/Osmose',0
  1076. dummylabel
  1077.     dc.b    '(David Le Corfec, lecorfec@diva.univ-mlv.fr)',0
  1078. args_template
  1079.     dc.b    'DIR/M,IT=INTROTEXT/K,NT=NOTOTALS/S,TR=TESTRIPP/S,'
  1080.     dc.b    'TD=TESTDURATION/S,ET=ENDTEXT/K,NS=NOSORT/S,NH=NOHEADER/S,'
  1081.     dc.b    'FO=FILESONLY/S,FP=FULLPATH/S,H2=HEADER2/S,LF/N/K,'
  1082.     dc.b    'DL=DRAWLIMITS/S,COF=COUNTONLYFILES/S,SN=SONGNAME/S,'
  1083.     dc.b    'SU=SHOWUSIZE/S,LA=LINEASPECT/K,NC=NOCRUNCHINFOS/S,'
  1084.     dc.b    'SF=SHORTFILENAMES/S',0
  1085.  
  1086. ; Contact me for ANY reason ( I like to get (e)mails ! ) :
  1087. ;Snail:  David Le Corfec          Email:
  1088. ;        57 rue C.J. Romain        <lecorfec@diva.univ-mlv.fr>
  1089. ;        94170 Le Perreux
  1090. ;           - France -            
  1091. ;                     -=: 100% aNSWeR! :=-
  1092. ; on IRC : Reez
  1093.  
  1094. ; Special greets to The Cyborg / NGC, Gryzor,
  1095. ; and VoDkA/Saturne^Osmose (Many Thanx for adverts in ur list and in Dream :)
  1096. ; about the output formats:
  1097. ; originally I had a format called 'cfmt' (C-Formatting String)
  1098. ; lately I added the 'gryfmt' (Gryzor Format), which became the default output
  1099. ; the cfmt is called with SU, but it's the default output internally (!)
  1100. ; today I add the 'ncfmt' (with NC=NOCRUNCHINFOS) , so I had to rewrite the
  1101. ; quick&bad coded fmtchange-routines.
  1102. ; so dont worry for the mess with switches,offsets and formats at each printing.
  1103. ; let's add a 'shortfmt'
  1104.