;****** Auto-Revision Header (do not edit) *******************************
;*
;* © Copyright by PetiWare
;*
;* Filename         : PToolLibrary.i
;* Created on       : 23-Aug-92
;* Created by       : Peter Simons
;* Current revision : V2.000
;*
;*
;* Purpose: Functionoffsets for PTool.library
;*
;*
;* V2.000 : Definitionen für v2.xxx der PTool.Library
;*                                               Peter Simons (15-Mär-93)
;*
;* V1.000 : Definitionen für V1.xxx der Library
;*
;* V0.000 : --- Initial release ---
;*
;*************************************************************************

;-------------------------------------- Offsets -----------
                LIBINIT

                LIBDEF  _LVOAllocNewStack
                LIBDEF  _LVORestoreStack

                LIBDEF  _LVOGetErrorMsg
                LIBDEF  _LVOErrorHandleDos
                LIBDEF  _LVOErrorHandleIntuition

                LIBDEF  _LVOCheckConfig
                LIBDEF  _LVODisplayConfigErrorDos

                LIBDEF  _LVOGetStackSize

                LIBDEF  _LVOParsePatternFast
                LIBDEF  _LVOPatternMatchFast
                LIBDEF  _LVOParsePatternFastArray
                LIBDEF  _LVOPatternMatchFastArray
                LIBDEF  _LVOPatternTest

                LIBDEF  _LVOLoadFile

                LIBDEF  _LVOInterpretConfigBuffer
                LIBDEF  _LVOInterpretConfigFile

                LIBDEF  _LVOPrintF
                LIBDEF  _LVOPrintFSimple

                LIBDEF  _LVOLoadBreak
                LIBDEF  _LVOSaveBreak

                LIBDEF  _LVOGetFileSize

                LIBDEF  _LVOCRC16Buffer
                LIBDEF  _LVOCRC16File

                LIBDEF  _LVOPTAllocRemember
                LIBDEF  _LVOPTFreeRemember
                LIBDEF  _LVOPTFreeOneBlock

                LIBDEF  _LVOLoadFileRemember
                LIBDEF  _LVOInterpretConfigFileRemember

                LIBDEF  _LVOFind
                LIBDEF  _LVOReplace
                LIBDEF  _LVOCmpStrings
                LIBDEF  _LVOCmpStringsSen

                LIBDEF  _LVOCRC32Buffer
                LIBDEF  _LVOCRC32File

;-------------------------------------- LibraryName -------
PTOOLNAME       MACRO
                CSTR    "ptool.library"
                EVEN
                ENDM

;-------------------------------------- LibraryBase -------
            STRUCTURE PToolLib,LIB_SIZE
                ULONG   ptl_SysBase
                ULONG   ptl_DOSBase
                ULONG   ptl_IntuitionBase
                ULONG   ptl_LocaleBase
                ULONG   ptl_MessageCatalog
                ULONG   ptl_SegList
                LABEL   ptl_SIZEOF

;-------------------------------------- CheckConfig -------
                BITDEF  CC,68010,0
                BITDEF  CC,68020,1
                BITDEF  CC,68030,2
                BITDEF  CC,68040,3
                BITDEF  CC,68881,4
                BITDEF  CC,68882,5
                BITDEF  CC,FPU40,6
                BITDEF  CC,OS_VERSION,16
CC_MAXCONFIG    EQU     %00000000000000010000000001111111

;-------------------------------------- InterpretConfig ---
IC_TagBase      EQU     TAG_USER+$F0000

IC_String       EQU     IC_TagBase+$01
IC_Number       EQU     IC_TagBase+$02
IC_YesNo        EQU     IC_TagBase+$03

;-------------------------------------- PTAllocRemember ---
PTMemoryList    CLRSO           ; Interner Aufbau der Remember-Liste
ptml_NextBlock  SO.L    1
ptml_Size       SO.L    1
ptml_SIZEOF     SOVAL

;-------------------------------------- ErrorHandle -------
; ERRORHANDLE ist ein fertig ausgearbeitetes Macro, daß die komfortable
; Einbindung von Fehlermeldungen erlaubt. Die Parameter sind:
; SaveTo, Errornummer, Continue, [Dataflow], [DataFlow2]
;
; SaveTo - kann auch weggelassen werden (sprich:''), dann wird D0 nicht
;         gespeichert sondern lediglich getestet. Wichtig: Dieses Macro
;         funktioniert nach Routinen, die eine 0L als Fehler
;         zurückgeben!
;
; Errornummer - Die Errornummer
;
; DataFlow - Der erste Parameter für die Fehlermeldung, je nachdem eine
;         Zahl oder Adresse. Um die richtige Verwaltung kümmert sich das
;         Macro selbst.
;
; DataFlow2 - genau wie der vorherige Parameter, nur ist dieser optional
;
;
;
; Das Macro ruft eine Funktion mir Namen _ErrorHandle auf, die ungefähr
; folgendes Aussehen haben sollte:
;
; _ErrorHandle    movem.l d0-d1/a0-a2/a6,-(SP)
;                 lea     (PrgName,PC),a0
;                 sub.l   a2,a2
;                 move.l  (_PToolBase,PC),a6
;                 jsr     (_LVOErrorHandleIntuition,a6)
;                 movem.l (SP)+,d0-d1/a0-a2/a6
;                 rts
;
; Für ErrorHandleDos() kann A2 natuerlich vernachlässigt werden,
; allerdings muß dann D1 initialisiert werden. Die Routine bekommt als
; Parameter einfach D0 und A1 fertig initialisiert. Wollen sie also
; demnächst einen Fehler mittels IoErr() abfangen, reicht jetzt:
;
;                 [...]
;                 tst.l   d0
;                 bne.b   .NoError
;                 pea     (.GoOn,PC)
;                 bra     _ErrorHandle    ; Die Null steht schon in D0!!
;
; .NoError        [...]
;
;         oder sogar:
;
;                 ERRORHANDLE ,0,(.GoOn,PC)
;
;

ERRORHANDLE     MACRO
errbyte         set     0
        IFC ,\1
                tst.l   d0                      ; Ist ein Ziel für D0 an-
        ELSE                                    ; gegeben? Wenn nein, dann
                move.l  d0,\1                   ; einfach D0 testen.
        ENDC
                bne.b   .NoError\@              ; In D0 steht schon eine
        IFEQ \2                                 ; Null!!
                pea     \3
                bra     _ErrorHandle            ; Fehler 0 --> keine Parameter
        ELSE
          IFEQ \2-5
                pea     \3
                bra     _ErrorHandle            ; Fehler 5 --> keine Parameter
          ELSE

                moveq   #\2,d0                  ; Fehlernummer nach D0
            IFNC \5                             ; Wenn vorhanden, den
              IFEQ \2-9                         ; zweiten DataFlow auf den
                move.w  #\5,-(SP)               ; Stack legen.
errbyte         set     errbyte+2
              ELSE                              ; Sonderfälle:
                pea     \5                      ; Err 9 = Zahl.W
errbyte         set     errbyte+4
              ENDC                              ; Ansonsten immer ein Zeiger
            ENDC                                ; auf einen String

            IFEQ \2-2                           ; Ersten DataFlow auf den
                move.l  #\4,-(SP)               ; Stack legen.
errbyte         set     errbyte+4
            ELSE                                ; Sonderfälle:
              IFEQ \2-8                         ; Err 2 = Zahl.L
                move.l  #\4,-(SP)               ; Err 8 = Zahl.L
errbyte         set     errbyte+4
              ELSE
                pea     \4                      ; Ansonsten immer ein Zeiger
errbyte         set     errbyte+4
              ENDC
            ENDC
                move.l  SP,a1                   ; Zeiger auf den DataFlow
                bsr     _ErrorHandle            ; nach A1 laden und in
                addq.w  #errbyte,SP             ; ErrorHandle() springen.
                bra     \3
          ENDC
        ENDC
.NoError\@
                ENDM

