home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 3 / goldfish_volume_3.bin / files / util / cli / fsort / fsort.asm < prev    next >
Assembly Source File  |  1995-02-07  |  5KB  |  328 lines

  1. ; File Sorting Utility 1.3
  2. ; (c) 1995 MJSoft System Software, Martin Mares
  3.  
  4. ;DEBUG    set    1
  5. _GlobVec    set    1
  6. SYSI    equ    1
  7.  
  8.     include    "ssmac.h"
  9.  
  10. QUANTLOG    equ    13
  11. QUANTUM    equ    1<<QUANTLOG
  12.  
  13.     clistart
  14.  
  15.     get.l    colstart,d0    ; Check the options first
  16.     beq.s    CheckOpt1
  17.     move.l    d0,a0
  18.     move.l    (a0),d0
  19.     put.l    d0,colstart
  20.     dtl    <Invalid COLSTART>,a0
  21.     bmi    ExitErr
  22.     swap    d0
  23.     tst.w    d0
  24.     bne    ExitErr
  25. CheckOpt1    get.l    width,d0
  26.     beq.s    CheckOpt2
  27.     move.l    d0,a0
  28.     move.l    (a0),d0
  29.     put.l    d0,width
  30.     dtl    <Invalid WIDTH>,a0
  31.     ble    ExitErr
  32.     swap    d0
  33.     tst.w    d0
  34.     bne    ExitErr
  35.  
  36. CheckOpt2    get.l    stdin,d7
  37.     dt    siname,<STDIN>
  38.     tpea    siname
  39.     get.l    ffrom,d1
  40.     beq.s    ReadInit
  41.     move.l    d1,a0
  42.     move.l    a0,(sp)
  43.     moveq    #OPEN_OLD,d0
  44.     call    TrackOpen
  45.     move.l    d0,d7
  46.     put.l    d1,srctrk
  47.     dv.l    srctrk
  48. ReadInit    moveq    #0,d6
  49.     moveq    #0,d5        ; Pointer to first block
  50.     moveq    #10,d4
  51.  
  52.     moveq    #64,d0
  53.     lsl.l    #QUANTLOG-6,d0
  54.     get.l    buffer,d1
  55.     beq.s    HaveBSize
  56.     move.l    d1,a0
  57.     move.l    (a0),d0
  58.     dtl    <Invalid buffer size>,a0
  59.     cmp.l    #256,d0
  60.     bcs.s    ExitErr
  61. HaveBSize    put.l    d0,buffer
  62.  
  63. ReadIn    get.l    buffer,d0
  64.     move.l    d0,d3
  65.     call    TrackAllocPub
  66.     move.l    d0,a3
  67.     add.l    d0,d3
  68.     move.l    d5,(a3)
  69.     move.l    a3,d5
  70.     addq.l    #6,a3
  71.     move.l    a3,a4
  72.     bra.s    CPL
  73. CPL1    move.b    (a2)+,(a3)+
  74. CPL    dbf    d6,CPL1
  75.     move.l    d7,d1
  76.     move.l    a3,d2
  77.     sub.l    d2,d3
  78.     call    TestBreak
  79.     call    dos,Read
  80.     move.l    (v),a6
  81.     add.l    d0,a3
  82.     move.l    a3,d1
  83.     sub.l    a4,d1
  84.     move.w    d1,-(a4)
  85.     tst.l    d0
  86.     ble.s    EndOrErr
  87.     move.l    a3,d6
  88.     subq.w    #1,d0
  89. RIFindEOL    cmp.b    -(a3),d4
  90.     dbeq    d0,RIFindEOL
  91.     beq.s    RIFoundEOL
  92.     dtl    <Line too long>,a0
  93. ExitErr    jump    ExitError
  94.  
  95. RIFoundEOL    addq.l    #1,a3
  96.     sub.l    a3,d6
  97.     sub.w    d6,(a4)
  98.     move.l    a3,a2
  99.     bra.s    ReadIn
  100.  
  101. EndOrErr    beq.s    PrepareIndex
  102.     moveq    #err_read,d0
  103. reperrsp    move.l    (sp),a1
  104.     jump    ss,ReportError
  105.  
  106. PrepareIndex    tst.w    (a4)
  107.     beq.s    LastLineOK
  108.     cmp.b    -1(a3),d4
  109.     beq.s    LastLineOK
  110.     move.b    d4,(a3)
  111.     addq.w    #1,(a4)
  112.  
  113. LastLineOK    move.l    d5,a0
  114.     moveq    #0,d0
  115. .pi    move.l    (a0)+,d1
  116.     move.w    (a0)+,d2
  117.     beq.s    .nx
  118.     subq.w    #1,d2
  119. .loop    cmp.b    (a0)+,d4
  120. .next    dbeq    d2,.loop
  121.     bne.s    .nx
  122.     addq.l    #1,d0
  123.     dbf    d2,.loop
  124. .nx    move.l    d1,a0
  125.     tst.l    d1
  126.     bne.s    .pi
  127.  
  128.     move.l    d0,d6
  129.     lsl.l    #2,d0
  130.     moveq    #64,d2
  131.     lsl.l    #4,d2
  132.     add.l    d2,d0
  133.     call    TrackAllocPub
  134.     move.l    d0,a4        ; A4=buf start
  135.     move.l    d0,a1
  136.     add.l    d2,a1
  137.     move.l    a1,a3        ; A3=buf limit
  138.     move.l    d5,a0
  139. .idx    move.l    (a0)+,d1
  140.     move.w    (a0)+,d2
  141.     beq.s    .nxx
  142.     subq.w    #1,d2
  143. .lin    move.l    a0,(a1)+
  144. .chr    cmp.b    (a0)+,d4
  145.     dbeq    d2,.chr
  146.     bne.s    .nxx
  147.     sf    -1(a0)
  148.     dbf    d2,.lin
  149. .nxx    move.l    d1,a0
  150.     tst.l    d1
  151.     bne.s    .idx
  152.  
  153.     move.l    d6,d0
  154.     move.l    a3,a0
  155.     lea    cmpcomplex(pc),a1
  156.     get.l    width,d2
  157.     get.l    colstart,d1
  158.     or.l    d2,d1
  159.     bne.s    go1
  160.     lea    cmpf(pc),a1
  161.     tsv.l    case
  162.     beq.s    go1
  163.     lea    cmpfcase(pc),a1
  164. go1    tst.w    d2
  165.     bne.s    go2
  166.     subqv.w    #1,width+2
  167. go2    moveq    #4,d1
  168.     call    QuickSort
  169.  
  170.     get.l    srctrk,a0
  171.     call    FreeObject
  172.     get.l    stdout,d7
  173.     dt    soname,<STDOUT>
  174.     tpea    soname
  175.     get.l    fto,d1
  176.     beq.s    wrt1
  177.     move.l    d1,a0
  178.     moveq    #OPEN_NEW,d0
  179.     move.l    a0,(sp)
  180.     call    TrackOpen
  181.     move.l    d0,d7
  182. wrt1    move.l    a4,a2        ; A2=buf current
  183.     subq.l    #1,d6
  184.     bmi.s    done
  185.     move.l    d6,d5
  186.     swap    d5
  187. wrt2    move.l    (a3)+,a0
  188. wrt3    cmp.l    a2,a3
  189.     bne.s    wrt4
  190.     push    a0
  191.     bsr.s    flushbuf
  192.     pop    a0
  193. wrt4    move.b    (a0)+,(a2)+
  194.     bne.s    wrt3
  195.     move.b    d4,-1(a2)
  196.     dbf    d6,wrt2
  197.     dbf    d5,wrt2
  198.  
  199. done    bsr.s    flushbuf
  200.     addq.l    #8,sp
  201.     rts
  202.  
  203. flushbuf    move.l    d7,d1
  204.     move.l    a4,d2
  205.     move.l    a2,d3
  206.     sub.l    d2,d3
  207.     beq.s    flubu1
  208.     call    ss,TestBreak
  209.     call    dos,Write
  210.     cmp.l    d0,d3
  211.     bne.s    wrterr
  212. flubu1    move.l    a4,a2
  213.     rts
  214.  
  215. wrterr    moveq    #err_write,d0
  216.     bra    reperrsp
  217.  
  218. ; String Comparison Routines (Optimized for speed)
  219.  
  220. cmpfcase    move.l    (a0),a0        ; Comparison of two lines (case-sensitive)
  221.     move.l    (a1),a1
  222. caseloop    move.b    (a0)+,d0
  223.     beq.s    caseend
  224.     cmp.b    (a1)+,d0
  225.     beq.s    caseloop
  226.     bcs.s    bgta
  227. agtb    moveq    #1,d0
  228.     rts
  229. bgta    moveq    #-1,d0
  230.     rts
  231. caseend    tst.b    (a1)
  232.     bne.s    bgta
  233.     moveq    #0,d0
  234.     rts
  235.  
  236. cmpf    move.l    (a0),a0        ; Comparison of two lines (case-insensitive)
  237.     move.l    (a1),a1
  238. cfloop    move.b    (a0)+,d0
  239.     beq.s    caseend
  240.     move.b    (a1)+,d1
  241.     cmp.b    #'a',d0
  242.     bcs.s    1$
  243.     cmp.b    #'z'+1,d0
  244.     bcc.s    1$
  245.     sub.b    #32,d0
  246. 1$    cmp.b    #'a',d1
  247.     bcs.s    2$
  248.     cmp.b    #'z'+1,d1
  249.     bcc.s    2$
  250.     sub.b    #32,d1
  251. 2$    cmp.b    d1,d0
  252.     beq.s    cfloop
  253.     bcs.s    bgta
  254.     bra.s    agtb
  255.  
  256. cxinse1end    move.l    (sp)+,d2
  257.     bra.s    caseend
  258.  
  259. cmpcomplex    move.l    (a0),a0        ; Comparison of two lines
  260.     move.l    (a1),a1        ; including COLSTART and WIDTH processing
  261.     get.w    colstart+2,d0
  262.     beq.s    cxskipdone
  263.     move.w    d0,d1
  264.     bra.s    cx1skip2    ; NE guaranteed
  265. cx1skip    tst.b    (a0)+
  266. cx1skip2    dbeq    d0,cx1skip
  267.     bne.s    cx2skip2    ; NE
  268.     subq.l    #1,a0
  269.     move.l    a0,d0        ; NE
  270.     bra.s    cx2skip2
  271.  
  272. cx2skip    tst.b    (a1)+
  273. cx2skip2    dbeq    d1,cx2skip
  274.     bne.s    cxskipdone
  275.     subq.l    #1,a1
  276. cxskipdone    move.l    d2,-(sp)
  277.     get.l    width,d2
  278.     tsv.l    case
  279.     bne.s    cxsens
  280.  
  281. cxinse1    subq.l    #1,d2
  282.     bmi.s    aeqbPOP
  283.     move.b    (a0)+,d0
  284.     beq.s    cxinse1end
  285.     move.b    (a1)+,d1
  286.     cmp.b    #'a',d0
  287.     bcs.s    1$
  288.     cmp.b    #'z'+1,d0
  289.     bcc.s    1$
  290.     sub.b    #32,d0
  291. 1$    cmp.b    #'a',d1
  292.     bcs.s    2$
  293.     cmp.b    #'z'+1,d1
  294.     bcc.s    2$
  295.     sub.b    #32,d1
  296. 2$    cmp.b    d1,d0
  297.     beq.s    cxinse1
  298.     bcs.s    bgtaPOP
  299. agtbPOP    moveq    #1,d0
  300.     move.l    (sp)+,d2
  301.     rts
  302. aeqbPOP    moveq    #0,d0
  303.     move.l    (sp)+,d2
  304.     rts
  305.  
  306. cxsens    subq.l    #1,d2
  307.     bmi.s    aeqbPOP
  308.     move.b    (a0)+,d0
  309.     beq.s    cxinse1end
  310.     cmp.b    (a1)+,d0
  311.     beq.s    cxsens
  312.     bcc.s    agtbPOP
  313. bgtaPOP    moveq    #-1,d0
  314.     move.l    (sp)+,d2
  315.     rts
  316.  
  317.     dt    <$VER: FSort 1.3 (7.2.95) © 1995 MJSoft System Software>
  318.     tags
  319.     template    <FROM,TO,CASE/S,BUF/N/K,COLSTART/N/K,WIDTH/N/K>
  320.     dv.l    ffrom
  321.     dv.l    fto
  322.     dv.l    case
  323.     dv.l    buffer
  324.     dv.l    colstart
  325.     dv.l    width
  326.     finish
  327.     end
  328.