home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_progs / prog_oth / turbodex.lha / examplesources / DirSort.dex < prev    next >
Encoding:
Text File  |  1992-10-11  |  2.6 KB  |  128 lines

  1. /* nice directory command in dex ! */
  2.  
  3. PROC main(ARG)
  4.   DEF lock:LONG, info=260:ARRAY, ok:LONG
  5.   DEF entries=10000:ARRAY, end:LONG, dir:LONG, nr:LONG
  6.   MCHAR argadr+argl-1,0
  7.   lock := Lock(argadr,-2)
  8.   IF lock?FALSE
  9.     ok := Examine(lock,info)
  10.     IF ok?FALSE
  11.       dir := MLONG(info+4)
  12.       IF dir>0
  13.         WRITE 'Directory of: \s\n',info+8
  14.         end := readentries(entries,10000)
  15.         nr := end-entries/24
  16.         IF nr>2
  17.           VOID sortentries(entries,nr)
  18.         ENDIF
  19.         IF nr>0
  20.           VOID displayentries(entries,nr)
  21.         ENDIF
  22.       ELSE
  23.         WRITE 'No Dir!\n'
  24.       ENDIF
  25.     ENDIF
  26.     VOID UnLock(lock)
  27.   ELSE
  28.     WRITE 'What ?!?\n'
  29.   ENDIF
  30. ENDPROC
  31.  
  32. PROC readentries(start,max)
  33.   LOCAL start:LONG, max:LONG, ok:REGLONG, d:REGLONG, dir:REGLONG
  34.   REPEAT
  35.     ok := ExNext(lock,info)
  36.     IF ok?FALSE
  37.       d := MLONG(info+124)
  38.       dir := MLONG(info+4)
  39.       IF dir>0
  40.         d := TRUE
  41.       ENDIF
  42.       VOID CopyMemQuick(info+8,start,20)
  43.       MLONG start+20,d
  44.       start := start+24
  45.     ENDIF
  46.   UNTIL ok=FALSE
  47. ENDPROC start
  48.  
  49. PROC sortentries(start,nr)
  50.   LOCAL start:LONG, nr:LONG, cur:REGLONG, d:REGLONG, flag:REGLONG, p:REGLONG
  51.   LOCAL p1:LONG, p2:LONG, switch:REGLONG
  52.   DEF buf=24:ARRAY
  53.   REPEAT
  54.     flag := FALSE
  55.     DOWN cur,nr-1
  56.       switch := FALSE
  57.       p := nr-2-cur*24+start
  58.       p1 := MLONG(p)
  59.       p2 := MLONG(p+24)
  60.       IF p1>$5E000000
  61.         p1 := p1-$20000000
  62.       ENDIF
  63.       IF p2>$5E000000
  64.         p2 := p2-$20000000
  65.       ENDIF
  66.       IF p1>p2
  67.         switch := TRUE
  68.       ENDIF
  69.       p1 := MLONG(p+20)
  70.       p2 := MLONG(p+44)
  71.       IF p1?TRUE
  72.         IF p2=TRUE
  73.           switch := TRUE
  74.         ENDIF
  75.       ENDIF
  76.       IF p2?TRUE
  77.         IF p1=TRUE
  78.           switch := FALSE
  79.         ENDIF
  80.       ENDIF
  81.       IF switch=TRUE
  82.         flag := TRUE
  83.         VOID CopyMemQuick(p,buf,24)
  84.         VOID CopyMemQuick(p+24,p,24)
  85.         VOID CopyMemQuick(buf,p+24,24)
  86.       ENDIF
  87.     ENDDOWN
  88.   UNTIL flag=FALSE
  89. ENDPROC
  90.  
  91. PROC displayentries(start,nr)
  92.   LOCAL start:LONG, nr:LONG, c:REGLONG, d:REGLONG, col:LONG
  93.   LOCAL first:REGLONG, item:LONG, a:REGLONG, dum:REGLONG
  94.   col := nr/3
  95.   IF col*3<nr
  96.     col := col+1
  97.   ENDIF
  98.   dum := col*3-nr
  99.   first := 0
  100.   c := 0
  101.   DOWN a,nr
  102.     IF dum+c=4
  103.       item := col*2-1
  104.     ELSE 
  105.       item := c*col
  106.     ENDIF
  107.     item := item+first*24+start
  108.     INC 1,c
  109.     d := MLONG(item+20)
  110.     IF d=TRUE
  111.       WRITE '\e[1;32m\w25\m25\l\s\e[0;31m',item
  112.     ELSE
  113.       WRITE '\w17\m17\l\s \r\w7\d',item,d
  114.     ENDIF
  115.     IF c=3
  116.       WRITE '\n'
  117.       c := 0
  118.       INC 1,first
  119.     ELSE
  120.       WRITE ' '  
  121.     ENDIF
  122.   ENDDOWN
  123.   IF c?0
  124.     WRITE '\n'
  125.   ENDIF
  126. ENDPROC
  127.  
  128.