0010  // Sorteret katalogudskrift
0020
0030 USE SYSTEM
0040 USE DOS_LIBRARY
0050
0060 RECORD fileinfo@
0070   FIELD diskkey# // drevnummer
0080   FIELD direntrytype# // + = directory, - = fil
0090   FIELD filename!(108)
0100   FIELD rest!(144) // resten har ingen interesse her
0110 ENDRECORD fileinfo@
0120 POINTER infoblock@ TO fileinfo@
0130
0140 RECORD kat'indgang@
0150   FIELD navn$ OF 30
0160   POINTER venstre@ TO kat'indgang@
0170   POINTER højre@ TO kat'indgang@
0180 ENDRECORD kat'indgang@
0190 POINTER dir'start@ TO kat'indgang@
0200 POINTER fil'start@ TO kat'indgang@
0210
0220 allocate(infoblock@,1) // Hel langords-adresse!
0230 kat$:="df0:" // For eksempel
0240
0250 page
0260 lock#:=pcklock(^kat$+4,-2)
0270 IF lock#>0 THEN
0280   status#:=pckexamine(lock#,^infoblock@)
0290   IF status#<>0 THEN
0300     status#:=pckexnext(lock#,^infoblock@)
0310     WHILE status#<>0 DO  // Læs katalog og sorter
0320       IF infoblock@.direntrytype#>0 THEN  // Dirrectory
0330         indsæt(dir'start@,c_string$(infoblock@.filename!())+" (Dir)")
0340       ELSE  // Fil
0350         indsæt(fil'start@,c_string$(infoblock@.filename!()))
0360       ENDIF
0370       status#:=pckexnext(lock#,^infoblock@)
0380     ENDWHILE
0390      // Udskriv
0400     ZONE 80
0410     udskriv(dir'start@) // .. først kataloger
0420     ZONE 40
0430     udskriv(fil'start@) // .. og så filer
0440     ZONE 0
0450   ENDIF
0460   pckunlock(lock#)
0470 ENDIF
0480 deallocate(infoblock@)
0490
0500 PROC indsæt(REF kat'ptr@,fil'navn$)
0510   IF ^kat'ptr@=0 THEN  // Toppen af træet er nået
0520     allocate(kat'ptr@)
0530     kat'ptr@.navn$:=fil'navn$
0540   ELIF kat'ptr@.navn$>fil'navn$ THEN  // søg til venstre
0550     indsæt(kat'ptr@.venstre@,fil'navn$)
0560   ELSE  // søg til højre
0570     indsæt(kat'ptr@.højre@,fil'navn$)
0580   ENDIF
0590 ENDPROC indsæt
0600
0610 PROC udskriv(REF kat'ptr@)
0620   IF ^kat'ptr@<>0 THEN
0630     udskriv(kat'ptr@.venstre@)
0640     PRINT kat'ptr@.navn$;
0650     udskriv(kat'ptr@.højre@)
0660   ENDIF
0670 ENDPROC udskriv
