' +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' DIRTREE.LST  Directory displayed as a simple Tree diagram     +
' +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' by  Peter Ubachs                                              +
' +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' (c) 1992 MAXON Computer GmbH                                  +
' +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'
' GEMDOS-Functions used
DEFFN fsfirst(adr_filename%,attribut%)=GEMDOS(&H4E,L:adr_filename%,attribut%)
DEFFN fsnext=GEMDOS(&H4F)
@switch(4) !8x8 Small-text
'
max_files%=2500
max_levels%=15
DIM name$(max_files%,max_levels%)
DIM no_files%(max_levels%),nr%(max_levels%)
'
indent%=10
'
DO
  ' Which Path?
  FILESELECT DIR$(0)+"\*.*","",path$
  ' -------------------------------------------------------------
  EXIT IF path$="" !~Cancel clicked on?
  ' -------------------------------------------------------------
  WHILE RIGHT$(path$)<>"\"
    path$=LEFT$(path$,LEN(path$)-1)
  WEND
  CHDIR path$
  '
  ' Output method?
  ALERT 2,"O u t p u t - m e t h o d ?",1,"Monitor|Printer|File",reply%
  IF reply%=1
    OPEN "O",#1,"CON:"
    CLS
  ELSE
    IF reply%=2
      OPEN "O",#1,"PRN:"
    ELSE
      FILESELECT DIR$(0)+"\*.*","",dirpath$
      OPEN "O",#1,dirpath$
    ENDIF
  ENDIF
  '
  VOID GEMDOS(&H1A,L:BASEPAGE+128) !set DTA 
  PRINT #1;path$
  level%=1
  @directory_to_search(level%,path$)
  '
  IF reply%=1
    PRINT "                                 p Press a Key q";
    REPEAT
    UNTIL LEN(INKEY$)
  ENDIF
  CLOSE
LOOP
@switch(8)
EDIT
'
PROCEDURE directory_to_search(level%,path$)
  LOCAL fsret%,filename$,file_nr%,searchpath$
  searchpath$=path$+"*.*"+CHR$(0)
  file_nr%=0
  fsret%=FN fsfirst(VARPTR(searchpath$),16)
  WHILE fsret%=0
    @filename_identify(*filename$) !d.h. read from the DTA
    IF filename$<>"." AND filename$<>".."
      INC file_nr%
      NAME "$(file_nr%" AS "level%)=filename$ !save"
    ENDIF
    fsret%=FN fsnext
  WEND
  no_files%(level%)=file_nr%
  '
  '
  IF no_files%(level%)>0
    @intended(level%)
    PRINT #1;"|"
  ENDIF
  '
  nr%(level%)=1
  WHILE nr%(level%)<=no_files%(level%)
    IF MOUSEK=1 !left Mousekey: Stop
      REPEAT
      UNTIL MOUSEK=2 !right Mousekey: Continue
    ENDIF
    @intended(level%)
    PRINT #1;"|_____ ";name$(nr%(level%),level%)
    @directory_to_search(level%+1,path$+name$(nr%(level%),level%)+"\")
    INC nr%(level%)
  WEND
  '
  IF (no_files%(level%)>0) AND (nr%(level%-1)<no_files%(level%-1))
    @intended(level%)
    PRINT #1
  ENDIF
  '
RETURN
'
PROCEDURE filename_identify(adr_name%)
  LOCAL name$,i%
  i%=BASEPAGE+128+30
  WHILE PEEK(i%)
    NAME "$=name$+CHR$(PEEK(i%))" AS ""
    INC i%
  WEND
  *adr_name%=name$
RETURN
'
PROCEDURE intended(level%)
  LOCAL l%
  IF level%>1
    FOR l%=1 TO level%-1
      IF nr%(l%)<no_files%(l%)
        PRINT #1;"|";SPACE$(indent%-1);
      ELSE
        PRINT #1;SPACE$(indent%);
      ENDIF
    NEXT l%
  ENDIF
RETURN
'
PROCEDURE switch(x)
  a$=MKI$(&HA000)+MKI$(&H2009)+MKI$(&H4E75)
  a=VARPTR(a$)
  a=C:a()
  LPOKE INTIN,LPEEK(a+x)
  DPOKE CONTRL+2,0
  DPOKE CONTRL+6,0
  DPOKE CONTRL+10,102
  VDISYS 5
RETURN
' @switch(4)=Small-text 8*8
' @switch(8)=Large-text 8*16
