;* $Revision Header built automatically *************** (do not edit) ************
;*
;* © Copyright by (none)
;*
;* File             : FlushLibs.asm
;* Created on       : Saturday, 02.04.94 21:40:31
;* Created by       : Arnold Schommer
;* Current revision : V1.0
;*
;*
;* Purpose
;* -------
;*   - versucht, alle unbenutzten Libraries zu schließen, indem es
;*     sie öffnet, das DELEXP-Flag setzt und sie dann schließt.
;*
;* Revision V1.0
;* --------------
;* created on Saturday, 02.04.94 21:40:31  by  Arnold Schommer.   LogMessage :
;*     --- Initial release ---
;*
;*********************************************************************************
REVISION  MACRO
          dc.b "1.0"
          ENDM
REVDATE   MACRO
          dc.b "02.04.94"
          ENDM
REVTIME   MACRO
          dc.b "21:40:31"
          ENDM
AUTHOR    MACRO
          dc.b "Arnold Schommer"
          ENDM
VERNUM    EQU  1
REVNUM    EQU  0
****************************************************************************
        NOLIST
        INCLUDE "exec/LVO.i"
        INCLUDE "dos/dosextens.i"
        INCLUDE "exec/lists.i"
        INCLUDE "exec/libraries.i"
        INCLUDE "exec/memory.i"
        INCLUDE "exec/execbase.i"
        LIST

MAXSTR:         equ     100

        STRUCTURE LibName,0
        ; (meine Erfindung, zur kompakten Speicherung der Library-Namen)
        APTR      ln_next
        STRUCT    ln_Name,MAXSTR
        LABEL     ln_SIZEOF

****************************************************************************
;Register-Variablen:

WBMsg:          EQUR d5
LibsAnchor:     equr a5
****************************************************************************

        SECTION prg,CODE

;Library-Namen kopieren:
_main:  moveq   #0,WBMsg
        moveq   #RETURN_FAIL,d3
        move.l  WBMsg,a1        ;a1=0->eigener Task
        CALLEXEC FindTask       ;Wo darf man denn nachschauen ?
        move.l  d0,a4
        tst.l   pr_CLI(a4)      ;von CLI oder WB aus gestartet ?
        bne     fromCLI
;von WB aus:
        lea     pr_MsgPort(a4),a0
        CALL    WaitPort        ;auf Start-Message warten
        lea     pr_MsgPort(a4),a0
        CALL    GetMsg          ;muß nachher beantwortet werden
        move.l  d0,WBMsg
****************************************************************************
;das eigentliche Programm:
fromCLI:
;Library-Namen kopieren:
        CALLEXEC Forbid         ;keine Änderungen während des Lesens !

        sub.l   LibsAnchor,LibsAnchor
        move.l  LibsAnchor,a2
        move.l  LibList+LH_HEAD(a6),a3

LibsLoop:
        tst.l   LN_SUCC(a3)
        beq     EndLibList
        tst.w   LIB_OPENCNT(a3)
        bne     NextLib

        move.l  #ln_SIZEOF,d0
        move.l  #MEMF_CLEAR,d1
        CALL    AllocMem
        tst.l   d0
        beq     EndLibList              ;Ende der Liste, weil kein Speicher
        move.l  a2,d1   ;tst.l a2
        beq     3$
        move.l  d0,ln_next(a2)
        bra     4$
3$:     move.l  d0,LibsAnchor
4$:     move.l  d0,a2
        lea     ln_Name(a2),a0
        move.l  LN_NAME(a3),a1
;Stringkopie bis (max.) MAXSTR Zeichen:
        moveq   #MAXSTR-1,d0
1$:     move.b  (a1)+,(a0)+
        dbeq    d0,1$
        move.b  #0,-(a0)

NextLib: move.l LN_SUCC(a3),a3
        bra     LibsLoop

EndLibList:
        CALL    Permit

; los geht's:
FlushLoop:
        move.l  LibsAnchor,d0   ;tst.l LibsAnchor
        beq     ende
        lea     ln_Name(LibsAnchor),a1
        CALL    OldOpenLibrary
        tst.l   d0
        beq     2$
        move.l  d0,a1
        bset    #LIBB_DELEXP,LIB_FLAGS(a1)
        CALL    CloseLibrary
; Library-Knoten freigeben:
2$:     move.l  LibsAnchor,a1
        move.l  ln_next(LibsAnchor),LibsAnchor
        move.l  #ln_SIZEOF,d0
        CALL    FreeMem
        bra     FlushLoop
****************************************************************************
ende:   tst.l   WBMsg           ;war da was ?
        beq     toCLI           ;na dann halt nicht
;Message zur WB zurück
        CALL    Forbid
        move.l  WBMsg,a1
        CALL    ReplyMsg
toCLI:  moveq   #RETURN_OK,d0   ;keine Fehler
        rts
****************************************************************************
;Versions-String
        dc.b    "$VER: FlushLibs "
        REVISION
        dc.b    " ("
        REVDATE
        dc.b    ")",0
        END

