************************ Tag ****************************
* Base pour l'ecriture d'un scanner pour GoldED         *
* Basé sur le code © 1995 de Leon Woestenberg           *
*                        (leon@stack.urc.tue.nl).       *
*                                                       *
* AUTEUR:       BURGHARD Eric | WANABOSO/AGOA           *
* VERSION:      1.0                                     *
* DATE:         11/08/95                                *
*********************************************************
*******************************************************************************
*                               DONNEES EXTERNES
*******************************************************************************
        INCDIR INCLUDE:
        INCLUDE exec/initializers.i
        INCLUDE exec/funcdef.i
        INCLUDE exec/resident.i
        INCLUDE exec/libraries.i
        INCLUDE exec/exec_lib.i
        INCLUDE GOLDED:developer/Syntax/include/scanlib.i
        INCLUDE tag_rev.i

FUNCEXEC MACRO
    jsr _LVO\1(\2)
    ENDM

***** Définitions *****
        XREF _MountScanner                    ;Fonctions parser externes
        XREF _StartScanner
        XREF _CloseScanner
        XREF _FlushScanner
        XREF _SetupScanner
        XREF _BriefScanner
        XREF _ParseLine
        XREF _UnparseLines
        XREF _ParseSection

        XREF _LinkerDB                        ;Interface code C
        XREF _SysBase
        XREF _DOSBase
        XREF _LibBase
        XREF _LocaleBase
        XREF _RexxSysBase
        XREF _SegList
        XREF _li

***** Strutures *****
        STRUCTURE ebase,PB_SIZE
            ULONG ebase_seglist
            ULONG ebase_execbase
            LABEL ebase_SIZE

        STRUCTURE LocaleInfo,0
            APTR  li_LocaleBase
            APTR  li_Catalog
            LABEL li_SIZE

*******************************************************************************
*                               MAIN
*******************************************************************************
main:   moveq   #-1,d0
        rts

*******************************************************************************
*                               BASE, INITIALISATION
*******************************************************************************
RomTag: dc.w RTC_MATCHWORD
        dc.l RomTag
        dc.l EndCod
        dc.b RTF_AUTOINIT
        dc.b VERSION
        dc.b NT_LIBRARY
        dc.b 0
        dc.l ScName
        dc.l IDStrg
        dc.l IniTab

        even

IniTab: dc.l ebase_SIZE
        dc.l FunTab
        dc.l DatTab
        dc.l InitRt

FunTab: dc.l Open
        dc.l Close
        dc.l Expunge
        dc.l DoNothing
        dc.l _MountScanner
        dc.l _StartScanner
        dc.l _CloseScanner
        dc.l _FlushScanner
        dc.l _SetupScanner
        dc.l _BriefScanner
        dc.l _ParseLine
        dc.l _UnparseLines
        dc.l _ParseSection
        dc.l -1

DatTab: INITBYTE LN_TYPE,NT_LIBRARY
        INITLONG LN_NAME,ScName
        INITBYTE LIB_FLAGS,LIBF_SUMUSED ! LIBF_CHANGED
        INITWORD LIB_VERSION,VERSION
        INITWORD LIB_REVISION,REVISION
        INITLONG LIB_IDSTRING,IDStrg
        INITLONG PB_MAGIC,PARSER_MAGIC
        dc.l 0

************************* InitRt ************************
* Routine d'initialisation appelée a l'ouverture de la  *
* bibliotheque                                          *
*                                                       *
* ->    D0 Structure library a initialiser              *
*       A0 liste des segments de la bibliotheque        *
*       A6 _SysBase                                     *
* <-    D0 Structure library initialisé                 *
*********************************************************
InitRt: pea     (a4)
        exg     d0,a0
        move.l  d0,ebase_seglist(a0)    ;Sauve qq infos dans struct lib
        move.l  a6,ebase_execbase(a0)
        exg     d0,a0
        lea     _LinkerDB,a4            ;Sauve qq infos dans data code C
        move.l  a6,_SysBase(a4)
        move.l  d0,_LibBase(a4)
        move.l  a0,_SegList(a4)
        moveq   #0,d0

        lea     DName(pc),a1
        FUNCEXEC OpenLibrary,a6
        tst.l   d0
        beq.s   end
        move.l  d0,_DOSBase(a4)

        moveq   #0,d0
        lea     RName(pc),a1
        FUNCEXEC OpenLibrary,a6
        tst.l   d0
        beq.s   ClsDos
        move.l  d0,_RexxSysBase(a4)

        moveq   #0,d0
        lea     LName(pc),a1
        FUNCEXEC OpenLibrary,a6
        move.l  d0,_LocaleBase(a4)
        move.l  d0,_li+li_LocaleBase(a4)
        moveq   #0,d0
        move.l  d0,_li+li_Catalog(a4)

        move.l  _LibBase(a4),d0
        bra.s   end

ClsLoc: move.l  _LocaleBase(a4),a1
        FUNCEXEC CloseLibrary,a6
ClsRex: move.l  _RexxSysBase(a4),a1
        FUNCEXEC CloseLibrary,a6
ClsDos: move.l  _DOSBase(a4),a1
        FUNCEXEC CloseLibrary,a6

end:    move.l  (sp)+,a4
        rts

********* Open(), Close(), Expunge(), Reserved() ********
* Fonctions minimales présentes dans toutes les         *
* bibliotheques                                         *
*********************************************************
Open:   addq.w  #1,LIB_OPENCNT(a6)
        bclr.b  #LIBB_DELEXP,LIB_FLAGS(a6)
        move.l  a6,d0
        rts

Close:  moveq   #0,d0
        subq.w  #1,LIB_OPENCNT(a6)
        bne     EndCls
        btst.b  #LIBB_DELEXP,LIB_FLAGS(a6)
        beq     EndCls
        bsr     Expunge
EndCls: rts

Expunge:
        movem.l d2/a4-a6,-(sp)
        movea.l a6,a5
        movea.l ebase_execbase(a5),a6
        tst.w   LIB_OPENCNT(a5)
        beq     ExpNow
        bset.b  #LIBB_DELEXP,LIB_FLAGS(a5)
        moveq   #0,d0
        bra     EndExp
ExpNow: lea     _LinkerDB,a4
        move.l  _LocaleBase(a4),a1
        FUNCEXEC CloseLibrary,a6
        move.l  _RexxSysBase(a4),a1
        FUNCEXEC CloseLibrary,a6
        move.l  _DOSBase(a4),a1
        FUNCEXEC CloseLibrary,a6

        move.l  ebase_seglist(a5),d2
        movea.l a5,a1
        FUNCEXEC Remove,a6
        movea.l a5,a1
        moveq   #0,d0
        move.w  LIB_NEGSIZE(a5),d0
        suba.l  d0,a1
        add.w   LIB_POSSIZE(a5),d0
        FUNCEXEC FreeMem,a6
        move.l  d2,d0
EndExp: movem.l (sp)+,d2/a4-a6
        rts

DoNothing:
        moveq   #0,d0
        rts

*******************************************************************************
*                               DONNEES INTERNES
*******************************************************************************
DName:  dc.b 'dos.library',0
        even
LName:  dc.b 'locale.library',0
        even
RName:  dc.b 'rexxsyslib.library',0
        even
ScName: PARSERNAME
        dc.b 0
        VERSTAG
IDStrg: PARSERSTRING
        
EndCod:
