;TestProgramm für "tracker.library"

; Testet TRK_DupLockFromFH, TRK_UnLock, TRK_ExamineFH und TRK_FreeFIB.
; geht vom funktionieren von TRK_Open aus

        NOLIST
        INCLUDE "exec/LVO.i"
        INCLUDE "exec/memory.i"
        INCLUDE "dos/LVO.i"
        INCLUDE "dos/dosextens.i"
        INCLUDE "tracker.i"
        LIST

Print:  MACRO
        move.l  Output,d1
        move.l  #\1,d2
        CALLDOS VFPrintf
        ENDM

_TrackerBase:   EQUR a5
_DosBase:       EQUR a4
Output:         EQUR d7

; WB-Message ?
        sub.l   a1,a1           ;a1=0->eigener Task
        CALLEXEC FindTask       ;Wo darf man denn nachschauen ?
        move.l  d0,a0
        tst.l   pr_CLI(a0)      ;von CLI oder WB aus gestartet ?
        bne     fromCLI
;von WB aus:
        lea     pr_MsgPort(a0),a0
        move.l  a0,-(sp)
        CALLEXEC WaitPort       ;auf Start-Message warten
        move.l  (sp)+,a0
        CALLEXEC GetMsg ;muß nachher beantwortet werden
        move.l  d0,WBenchMsg

fromCLI:
; Tracker-Library öffnen
        OPENLIB TrName
        tst.l   d0
        beq     ende_all
        move.l  d0,_TrackerBase
        TRK_OPENSTDLIB DOS,36
        tst.l   d0
        beq     ende_trk
        move.l  d0,_DosBase

        tst.l   WBenchMsg
        bne     fromWB
;von CLI aus -> Ausgaben ins CLI-Fenster
        CALLDOS Output
        move.l  d0,Output
        bra     main
;von WB aus gestartet -> eigenes Window nötig
fromWB: move.l  #WdName,d1
        move.l  #MODE_OLDFILE,d2
        CALLTRK TRK_Open
        move.l  d0,Output
;---------------------------------------------------------------------------
;Dateipuffer anlegen

main:

;Haupt-Testteil

LOCKVIAFH: MACRO        ;Name
        move.l  #\1,d1
        bsr     LockViaFH
        ENDM
UNLOCK: MACRO   ;Lock
        move.l  \1,d1
        bsr     UnLock
        ENDM
EXAMINEVIAFH: MACRO     ;Name
        move.l  #\1,d1
        bsr     ExamineViaFH
        ENDM
FREE:   MACRO   ;FIB
        move.l  \1,d1
        bsr     FreeFIB
        ENDM
SHORTINFO: MACRO ;FIB
        move.l  \1,a0
        bsr     ShortInfo
        ENDM

;Test 1: Lock zu 's:Startup-Sequence' holen, dazu FIB holen und daraus
; Länge und Dateinamen lesen.
        LOCKVIAFH       Name_1
        EXAMINEVIAFH    Name_1
        SHORTINFO       d0
;Test 2: Lock zu 'sys:EZAsm/scrwin.s' holen, dazu FIB holen und Dateinamen
; und -Länge auslesen. Der Lock-BPTR wird vergessen.
        LOCKVIAFH       Name_2
        EXAMINEVIAFH    Name_2
        move.l          d0,FIB_2
        SHORTINFO       d0
;Test 3: Lock zu 's:MakeShell' holen, dazu FIB holen und daraus Länge und
; Dateinamen lesen.
1$:     LOCKVIAFH       Name_3
        move.l          d0,Lock_3
        EXAMINEVIAFH    Name_3
        move.l          d0,FIB_3
        SHORTINFO       d0
;FIB_2 freigeben
        FREE            FIB_2
;Test 4: Lock zu 'devs:MountList' holen, dazu FIB holen und daraus Länge und
; Dateinamen lesen.
        LOCKVIAFH       Name_4
        move.l          d0,Lock_4
        EXAMINEVIAFH    Name_4
        move.l          d0,FIB_4
        SHORTINFO       d0
;Lock_3 und FIB_3 freigeben
        FREE            FIB_3
        UNLOCK          Lock_3
;Test 5: Lock zu 'sys:inc/case.i' holen, dazu FIB holen und daraus Länge und
; Dateinamen lesen.
        LOCKVIAFH       Name_5
        EXAMINEVIAFH    Name_5
        SHORTINFO       d0
;Lock_4 freigeben
        UNLOCK          Lock_4
;---------------------------------------------------------------------------

ende_main:
;ggf. End-Botschaft und Verzögerung
        tst.l   WBenchMsg
        beq     ende_trk
        move.l  Output,d1
        move.l  #GoodBye,d2
        moveq   #GoodByeLen,d3
        CALLDOS Write
        move.l  #150,d1
        CALL    Delay
;Library schließen
ende_trk:
        CLOSELIB _TrackerBase
ende_all:
        tst.l   WBenchMsg       ;war da was ?
        beq     toCLI           ;na dann halt nicht
;Message zur WB zurück
        move.l  WBenchMsg,a1
        CALLEXEC ReplyMsg
toCLI:  moveq   #0,d0
        rts

;---------------------------------------------------------------------------
; Unterprogramm: File des Namens d1 mit Umweg über FileHandle locken
; Parameter: d1 = Namens-Zeiger
; Ergebnis: Lock-BPTR

LockViaFH:
        movem.l d1/d2,-(sp)
        move.l  #MODE_OLDFILE,d2
        CALLTRK TRK_Open
        move.l  d0,d1
        bne     1$
;'Abbruch', weil TRK_Open fehlschlug:
        rts
1$:     CALLTRK TRK_DupLockFromFH
        move.l  d0,4(sp)
        move.l  sp,d3
        Print   Lock_Text
        add.w   #4,sp
        move.l  (sp)+,d0
        rts
;---------------------------------------------------------------------------
; Unterprogramm: File namens d1 mit Umweg über FileHandle untersuchen
; Parameter: d1 = Namenszeiger
; Ergebnis: FIB-Zeiger

ExamineViaFH:
        movem.l d1/d2,-(sp)
        move.l  #MODE_OLDFILE,d2
        CALLTRK TRK_Open
        move.l  d0,d1
        bne     1$
;'Abbruch', weil TRK_Open fehlschlug:
        rts
1$:     CALLTRK TRK_ExamineFH
        move.l  d0,4(sp)
        move.l  sp,d3
        Print   Examine_Text
        add.w   #4,sp
        move.l  (sp)+,d0
        rts
;---------------------------------------------------------------------------
; Unterprogramm: Kurzinfo aus FIB generieren
; Parameter: a0 = FIB-Zeiger
; Ergebnis: -

ShortInfo:
        tst.l   fib_DirEntryType(a0)
        bmi     1$
;Directory:
        pea     fib_FileName(a0)
        move.l  sp,d3
        Print   SI_Dir_Text
        add.w   #4,sp
        rts
;File:
1$:     move.l  fib_Size(a0),-(sp)
        pea     fib_FileName(a0)
        move.l  sp,d3
        Print   SI_File_Text
        add.w   #8,sp
        rts
;---------------------------------------------------------------------------
; Unterprogramm: FIB freigeben
; Parameter: d1 = Zeiger auf den FIB
; Ergebnis: -

FreeFIB: tst.l  d1
        bne     1$
        rts
1$:     move.l  d1,-(sp)
        CALLTRK TRK_FreeFIB
        move.l  sp,d3
        Print   Free_Text
        add.w   #4,sp
        rts
;---------------------------------------------------------------------------
; Unterprogramm: Lock freigeben
; Parameter: d1 = BPTR auf das Lock
; Ergebnis: -

UnLock: tst.l   d1
        bne     1$
        rts
1$:     move.l  d1,-(sp)
        CALLTRK TRK_UnLock
        move.l  sp,d3
        Print   UnLock_Text
        add.w   #4,sp
        rts
;---------------------------------------------------------------------------
WBenchMsg:      dc.l 0

FIB_2:          dc.l 0
Lock_3:         dc.l 0
FIB_3:          dc.l 0
Lock_4:         dc.l 0
FIB_4:          dc.l 0

TrName: TRACKERNAME

WdName:         dc.b "CON:0/0/640/200/Dos-Test für tracker.library",0
GoodBye:        dc.b 10,"Bye - closing soon !"
GoodByeLen:     equ *-GoodBye
Name_1:         dc.b "s:Startup-Sequence",0
Name_2:         dc.b "a68k:EZAsm/scrwin.s",0
Name_3:         dc.b "a68k:s/MakeShell",0
Name_4:         dc.b "devs:MountList",0
Name_5:         dc.b "a68k:inc/case.i",0
CrLf:           dc.b 10,0
ReadNN:         dc.b "%ld Bytes of File with FileHandle at 4*$%06lx read : ",10,0
Lock_Text:      dc.b "DupLockFromFH(Open(",34,"%s",34,",MODE_OLDFILE)) returns $%06lx",10,0
UnLock_Text:    dc.b "Lock at 4*$%06lx freed",10,0
Examine_Text:   dc.b "ExamineFH(Open(",34,"%s",34,",MODE_OLDFILE)) returns FIB at $%06lx",10,0
Free_Text:      dc.b "FIB at $%06lx freed",10,0
SI_Dir_Text:    dc.b "The examined item was the directory %s",10,0
SI_File_Text:   dc.b "The examined item was the file %s. It contains %ld Bytes",10,0

        END
