home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 623a.lha / TurboDEX / ExampleSources / DirSort.dex < prev    next >
Text File  |  1992-03-22  |  3KB  |  126 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?0
  9.     ok := Examine(lock,info)
  10.     IF ok?0
  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.         VOID displayentries(entries,nr)
  20.       ELSE
  21.         WRITE 'No Dir!\n'
  22.       ENDIF
  23.     ENDIF
  24.     VOID UnLock(lock)
  25.   ELSE
  26.     WRITE 'What ?!?\n'
  27.   ENDIF
  28. ENDPROC
  29.  
  30. PROC readentries(start,max)
  31.   LOCAL start:LONG, max:LONG, ok:REGLONG, d:REGLONG, dir:REGLONG
  32.   REPEAT
  33.     ok := ExNext(lock,info)
  34.     IF ok?0
  35.       d := MLONG(info+124)
  36.       dir := MLONG(info+4)
  37.       IF dir>0
  38.         d := -1
  39.       ENDIF
  40.       VOID CopyMemQuick(info+8,start,20)
  41.       MLONG start+20,d
  42.       start := start+24
  43.     ENDIF
  44.   UNTIL ok=0
  45. ENDPROC start
  46.  
  47. PROC sortentries(start,nr)
  48.   LOCAL start:LONG, nr:LONG, cur:REGLONG, d:REGLONG, flag:REGLONG, p:REGLONG
  49.   LOCAL p1:LONG, p2:LONG, switch:REGLONG
  50.   DEF buf=24:ARRAY
  51.   REPEAT
  52.     flag := 0
  53.     DOWN cur,nr-1
  54.       switch := 0
  55.       p := nr-2-cur*24+start
  56.       p1 := MLONG(p)
  57.       p2 := MLONG(p+24)
  58.       IF p1>$5E000000
  59.         p1 := p1-$20000000
  60.       ENDIF
  61.       IF p2>$5E000000
  62.         p2 := p2-$20000000
  63.       ENDIF
  64.       IF p1>p2
  65.         switch := 1
  66.       ENDIF
  67.       p1 := MLONG(p+20)
  68.       p2 := MLONG(p+44)
  69.       IF p1?-1
  70.         IF p2=-1
  71.           switch := 1
  72.         ENDIF
  73.       ENDIF
  74.       IF p2?-1
  75.         IF p1=-1
  76.           switch := 0
  77.         ENDIF
  78.       ENDIF
  79.       IF switch=1
  80.         flag := 1
  81.         VOID CopyMemQuick(p,buf,24)
  82.         VOID CopyMemQuick(p+24,p,24)
  83.         VOID CopyMemQuick(buf,p+24,24)
  84.       ENDIF
  85.     ENDDOWN
  86.   UNTIL flag=0
  87. ENDPROC
  88.  
  89. PROC displayentries(start,nr)
  90.   LOCAL start:LONG, nr:LONG, c:REGLONG, d:REGLONG, col:LONG
  91.   LOCAL first:REGLONG, item:LONG, a:REGLONG, dum:REGLONG
  92.   col := nr/3
  93.   IF col*3<nr
  94.     col := col+1
  95.   ENDIF
  96.   dum := col*3-nr
  97.   first := 0
  98.   c := 0
  99.   DOWN a,nr
  100.     IF dum+c=4
  101.       item := col*2-1
  102.     ELSE 
  103.       item := c*col
  104.     ENDIF
  105.     item := item+first*24+start
  106.     INC 1,c
  107.     d := MLONG(item+20)
  108.     IF d=-1
  109.       WRITE '\e[1;32m\w25\m25\l\s\e[0;31m',item
  110.     ELSE
  111.       WRITE '\w17\m17\l\s \r\w7\d',item,d
  112.     ENDIF
  113.     IF c=3
  114.       WRITE '\n'
  115.       c := 0
  116.       INC 1,first
  117.     ELSE
  118.       WRITE ' '  
  119.     ENDIF
  120.   ENDDOWN
  121.   IF c?0
  122.     WRITE '\n'
  123.   ENDIF
  124. ENDPROC
  125.  
  126.