diff --git a/library/skeleton_library/lib_base.c b/library/skeleton_library/lib_base.c new file mode 100755 index 0000000..1e6880f --- /dev/null +++ b/library/skeleton_library/lib_base.c @@ -0,0 +1,373 @@ +/* + * $Id: lib_base.c,v 1.1 2005-07-04 09:39:00 obarthel Exp $ + * + * :ts=4 + * + * Amiga shared library skeleton example + * Copyright (c) 2002-2005 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include + +#include + +/****************************************************************************/ + +#ifndef __NOLIBBASE__ +#include + +/****************************************************************************/ + +#include "lib_base.h" +#include "macros.h" + +/****************************************************************************/ + +#include "skeleton.library_rev.h" + +/****************************************************************************/ + +LONG _start(VOID); + +/****************************************************************************/ + +STATIC struct SkeletonBase *ASM LibInit(REG (d0, struct SkeletonBase *sb ), REG (a0, BPTR segment_list ), REG (a6, struct Library *sys_base )); +STATIC struct SkeletonBase *ASM LibOpen(REG (a6, struct SkeletonBase *sb )); +STATIC BPTR ASM LibExpunge(REG (a6, struct SkeletonBase *sb )); +STATIC BPTR ASM LibClose(REG (a6, struct SkeletonBase *sb )); +STATIC LONG LibReserved(VOID); + +/****************************************************************************/ + +/* This is the first executable location of the library. It must return + an error to the unsuspecting caller who tries to run it as a program. */ +LONG +_start(VOID) +{ + return(-1); +} + +/****************************************************************************/ + +/* This routine is called after the library has been loaded into + memory and its base data structure has been created. Here we + must initialize those parts of the base data structure which + have not been set up yet. As of Kickstart 2.0 the setup code + in ROM will have initialized the entire Library structure with + the exception of the lib_Revision field, i.e. everything that + could be gained from the Resident structure is now in the + Library structure. Earlier operating system releases would leave + the entire Library structure uninitialized. For this example + we assume that Kickstart 2.0 is around as it must be possible + to open dos.library V37. + + The library initialization is single threaded, i.e. the operating + system processes library initialization in a queue. The longer it + takes for the following routine to set up the base data structure, + the longer will other Tasks and Processes have to wait to get their + disk resident libraries opened. This means, the initialization code + has to be as brief as possible. This particular example code opens + ROM resident libraries here, which is permitted. You should not + open disk resident libraries and devices or do anything else that + could take a long time to complete (in this context "long" is anything + that takes up a second or longer). + + This routine must return the Library base pointer if it succeeds. + Failure is indicated by returning NULL instead. */ +STATIC struct SkeletonBase * ASM +LibInit( + REG(d0,struct SkeletonBase * sb), + REG(a0,BPTR segment_list), + REG(a6,struct Library * sys_base)) +{ + struct SkeletonBase * result = NULL; + struct Library * SysBase; + + SysBase = sys_base; + + /* This library implementation requires Kickstart 2.04 or + better to work. */ + if(SysBase->lib_Version < 37) + { + sb->sb_UserData = NULL; + goto out; + } + + sb->sb_SysBase = SysBase; + + InitSemaphore(&sb->sb_Semaphore); + + /* The segment pointer must be stored for later, when this library is + unloaded from memory again. */ + sb->sb_SegmentList = segment_list; + + sb->sb_Library.lib_Revision = REVISION; + + /* Allocate the implementation-specific user data structure. */ + sb->sb_UserData = AllocMem(sizeof(*sb->sb_UserData),MEMF_ANY|MEMF_PUBLIC); + if(sb->sb_UserData == NULL) + goto out; + + /* Now try the user-supplied library initialization function. */ + if(UserLibInit(SysBase,sb->sb_UserData) == FALSE) + goto out; + + result = sb; + + out: + + /* Free the library data if the initialization failed. */ + if(result == NULL) + { + /* First take care of the user data. */ + if(sb->sb_UserData != NULL) + FreeMem(sb->sb_UserData,sizeof(*sb->sb_UserData)); + + /* Finally, free the library data. This is necessary for a library + of type RTF_AUTOINIT (see the "struct Resident" rt_Flags + initialization value for the LibTag declaration at the end of + this file). */ + FreeMem(((BYTE *)sb) - sb->sb_Library.lib_NegSize, + (ULONG)(sb->sb_Library.lib_NegSize + sb->sb_Library.lib_PosSize)); + } + + return(result); +} + +/****************************************************************************/ + +/* This routine is called every time a Task or Process invokes + OpenLibrary() on this library. Task switching will be disabled + when control passes through this routine. Every action in this + routine happens on the context of the calling Task, so unlike + the library initialization routine one can open disk resident + libraries, devices, etc. and generally Wait() for something + to happen. The catch is that every busy operation that takes + a while to execute will "freeze" the machine until control + returns from this routine (Task switching is disabled). The Task + switching is disabled in order to avoid having two Tasks + execute this code at the same time. In a way, this makes the + library routine a critical region in the textbook sense. + + This routine must return the Library base pointer if it succeeds. + Failure is indicated by returning NULL instead. */ +STATIC struct SkeletonBase * ASM +LibOpen(REG(a6,struct SkeletonBase * sb)) +{ + USE_EXEC(sb); + + struct SkeletonBase * result = NULL; + + /* Mark the library as having another customer and + clear the delayed expunge flag. This flag is + referenced at the time the last customer closes + the library. If set, the library will be both + closed and removed from memory. We increment the + counter here since we will attempt to gain + access to a semaphore, which may have the effect + of causing the caller to wait. During the time + the caller is waiting somebody might trigger + the library expunge function which, if the + usage counter is zero, would unload the library. */ + sb->sb_Library.lib_OpenCnt++; + sb->sb_Library.lib_Flags &= ~LIBF_DELEXP; + + /* Now comes the really critical region of the code + Only one Task at a time may enter here. */ + ObtainSemaphore(&sb->sb_Semaphore); + + /* Invoke the user-supplied library open function. */ + if(UserLibOpen(sb->sb_UserData) == FALSE) + goto out; + + /* We have another customer. */ + sb->sb_Library.lib_OpenCnt++; + + result = sb; + + out: + + ReleaseSemaphore(&sb->sb_Semaphore); + + sb->sb_Library.lib_OpenCnt--; + + return(result); +} + +/****************************************************************************/ + +/* This routine will be called when the library needs to be + removed from memory. If there are no Tasks or Processes + which have the library open, the routine must remove itself + from the public list of libraries, free the data that had + been allocated for it and return the segment list pointer + it had been given at initialization time so all its code + can be unloaded. This routine is the last to be called in + the life cycle of the library. It is called while Task + switching is disabled. */ +STATIC BPTR ASM +LibExpunge(REG(a6,struct SkeletonBase * sb)) +{ + USE_EXEC(sb); + + BPTR result = ZERO; + + /* If there are still customers which have the + library open, mark the library for delayed + expunge. This means, the library will be removed + as soon as the last customer closes it. */ + if(sb->sb_Library.lib_OpenCnt > 0) + { + sb->sb_Library.lib_Flags |= LIBF_DELEXP; + } + else + { + /* Invoke the user-supplied expunge function. It must + not break a Forbid(), i.e. it must not call Wait() + directly or indirectly. */ + UserLibExpunge(sb->sb_UserData); + + /* Free the user data itself. */ + FreeMem(sb->sb_UserData,sizeof(*sb->sb_UserData)); + + /* This is the segment list pointer we have to return. */ + result = sb->sb_SegmentList; + + /* Remove the library from the public list. */ + Remove((struct Node *)sb); + + /* Finally, free the data allocated for the + base data structure. */ + FreeMem(((BYTE *)sb) - sb->sb_Library.lib_NegSize, + (ULONG)(sb->sb_Library.lib_NegSize + sb->sb_Library.lib_PosSize)); + } + + return(result); +} + +/****************************************************************************/ + +/* This routine is called every time CloseLibrary() is used + on the Library base data structure. It is called while + Task switching is disabled and has to return the result + code of the library expunge routine when the time is right. */ +STATIC BPTR ASM +LibClose(REG(a6,struct SkeletonBase * sb)) +{ + USE_EXEC(sb); + + BPTR result = ZERO; + + /* Now comes the really critical region of the code + Only one Task at a time may enter here. */ + ObtainSemaphore(&sb->sb_Semaphore); + + /* Invoke the user-supplied library close function. */ + UserLibClose(sb->sb_UserData); + + ReleaseSemaphore(&sb->sb_Semaphore); + + /* One less customer. */ + sb->sb_Library.lib_OpenCnt--; + + /* Trigger the library expunge function, if desired. */ + if(sb->sb_Library.lib_OpenCnt == 0 && (sb->sb_Library.lib_Flags & LIBF_DELEXP) != 0) + result = LibExpunge(sb); + + return(result); +} + +/****************************************************************************/ + +/* This is the reserved library entry point. It always + has to return 0. */ +STATIC LONG +LibReserved(VOID) +{ + return(0); +} + +/****************************************************************************/ + +/* The following data structures and data are responsible for + setting up the Library base data structure and the library + function vector. */ +struct LibraryInitTable +{ + ULONG lit_BaseSize; /* Size of the base data structure. */ + APTR * lit_VectorTable; /* Points to the function vector. */ + APTR lit_InitTable; /* Library base data structure setup table. */ + APTR lit_InitRoutine; /* The address of the routine to do the setup. */ +}; + +/****************************************************************************/ + +/* This is the table of functions that make up the library. The first + four are mandatory, everything following it are user callable + routines. The table is terminated by the value -1. */ +STATIC CONST APTR LibVectors[] = +{ + LibOpen, + LibClose, + LibExpunge, + LibReserved, + + (APTR) -1 +}; + +/****************************************************************************/ + +/* This finally sets up the library base data structure and the + function vector. */ +STATIC CONST struct LibraryInitTable LibInitTable = +{ + sizeof(struct SkeletonBase), + LibVectors, + NULL, + LibInit +}; + +/****************************************************************************/ + +/* The library loader looks for this marker in the memory + the library code and data will occupy. It is responsible + setting up the Library base data structure. */ +struct Resident LibTag[] = +{ + RTC_MATCHWORD, /* Marker value. */ + &LibTag[0], /* This points back to itself. */ + &LibTag[1], /* This points behind this marker. */ + RTF_AUTOINIT, /* The Library should be set up according to the given table. */ + VERSION, /* The version of this Library. */ + NT_LIBRARY, /* This defines this module as a Library. */ + 0, /* Initialization priority of this Library; unused. */ + "skeleton.library", /* Points to the name of the Library. */ + VSTRING, /* The identification string of this Library. */ + &LibInitTable /* This table is for initializing the Library. */ +}; diff --git a/library/skeleton_library/lib_base.h b/library/skeleton_library/lib_base.h new file mode 100755 index 0000000..a78d1ee --- /dev/null +++ b/library/skeleton_library/lib_base.h @@ -0,0 +1,75 @@ +/* + * $Id: lib_base.h,v 1.1 2005-07-04 09:39:00 obarthel Exp $ + * + * :ts=4 + * + * Amiga shared library skeleton example + * Copyright (c) 2002-2005 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _LIB_BASE_H +#define _LIB_BASE_H + +/****************************************************************************/ + +#ifndef EXEC_LIBRARIES_H +#include +#endif /* EXEC_LIBRARIES_H */ + +#ifndef EXEC_SEMAPHORES_H +#include +#endif /* EXEC_SEMAPHORES_H */ + +#ifndef DOS_DOS_H +#include +#endif /* DOS_DOS_H */ + +/****************************************************************************/ + +#ifndef _LIB_USER_H +#include "lib_user.h" +#endif /* _LIB_USER_H */ + +/****************************************************************************/ + +struct SkeletonBase +{ + struct Library sb_Library; + struct SignalSemaphore sb_Semaphore; + BPTR sb_SegmentList; + struct Library * sb_SysBase; + struct UserData * sb_UserData; +}; + +/****************************************************************************/ + +#define USE_EXEC(sb) \ + struct Library * SysBase = (sb)->sb_SysBase + +/****************************************************************************/ + +#endif /* _LIB_BASE_H */ diff --git a/library/skeleton_library/lib_user.c b/library/skeleton_library/lib_user.c new file mode 100755 index 0000000..7c2f663 --- /dev/null +++ b/library/skeleton_library/lib_user.c @@ -0,0 +1,116 @@ +/* + * $Id: lib_user.c,v 1.1 2005-07-04 09:39:00 obarthel Exp $ + * + * :ts=4 + * + * Amiga shared library skeleton example + * Copyright (c) 2002-2005 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "lib_base.h" +#include "lib_user.h" + +/****************************************************************************/ + +/* The following function is called as part of the library initialization, + right after the library is loaded. This function should perform only + initialization operations which can be accomplished quickly and without + delay because only one library initialization function at a time can + be run by the operating system. This means that until this function has + has returned, no other program or operating system component will be able + to open a library. + + By the time this function is invoked the library base has already been + initialized. It has to return TRUE for success and FALSE otherwise. */ +BOOL +UserLibInit(struct Library * SysBase,struct UserData * ud) +{ + BOOL result; + + /* We reset the use count of the user data to 0, so that we can + keep track of how many users are actually using it. Note that + the contents of the UserData structure are completely random + when this function is called. */ + ud->ud_UseCount = 0; + + /* Also remember the SysBase pointer. */ + ud->ud_SysBase = SysBase; + + result = TRUE; + + return(result); +} + +/****************************************************************************/ + +/* The following function is called whenever the library is opened. Since + by the time is called the library may have had another opener, it cannot + rely upon the sb->sb_Library.lib_OpenCnt value to be current, it must + find other means to keep track of whether it was invoked for the first + time or not. In this function initializations such as resource allocations + are performed. Unlike the UserLibInit() function, these initializations + can take their time to complete since these will execute on the + schedule of the caller. Take care: some callers may be plain Tasks which + cannot call all dos.library functions! This function has to return TRUE for + success and FALSE otherwise. */ +BOOL +UserLibOpen(struct UserData * ud) +{ + BOOL result; + + /* Remember that one more customer is using this data structure. */ + ud->ud_UseCount++; + + result = TRUE; + + return(result); +} + +/****************************************************************************/ + +/* The following function is called whenever the library is closed. Its + purpose is to release any resources allocated by the UserLibOpen() + function, such as when the last caller has closed the library. */ +VOID +UserLibClose(struct UserData * ud) +{ + /* Remember that one less customer is using this data structure. */ + ud->ud_UseCount--; +} + +/****************************************************************************/ + +/* The following function is called shortly before the library is to be + unloaded from memory. Its purpose is to release any resources + allocated by the UserLibInit() function. Note that this function must + not break the Forbid() condition, i.e. it must not call Wait() directly + or indirectly. */ +VOID +UserLibExpunge(struct UserData * ud) +{ + /* In this brief example no special cleanup operations are performed. */ +} diff --git a/library/skeleton_library/lib_user.h b/library/skeleton_library/lib_user.h new file mode 100755 index 0000000..d6c7640 --- /dev/null +++ b/library/skeleton_library/lib_user.h @@ -0,0 +1,60 @@ +/* + * $Id: lib_user.h,v 1.1 2005-07-04 09:39:00 obarthel Exp $ + * + * :ts=4 + * + * Amiga shared library skeleton example + * Copyright (c) 2002-2005 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _LIB_USER_H +#define _LIB_USER_H + +/****************************************************************************/ + +#ifndef EXEC_LIBRARIES_H +#include +#endif /* EXEC_LIBRARIES_H */ + +/****************************************************************************/ + +struct UserData +{ + struct Library * ud_SysBase; + ULONG ud_UseCount; +}; + +/****************************************************************************/ + +BOOL UserLibInit(struct Library *SysBase,struct UserData *ud); +BOOL UserLibOpen(struct UserData *ud); +VOID UserLibClose(struct UserData *ud); +VOID UserLibExpunge(struct UserData *ud); + +/****************************************************************************/ + +#endif /* _LIB_USER_H */ diff --git a/library/skeleton_library/macros.h b/library/skeleton_library/macros.h new file mode 100755 index 0000000..dd723b6 --- /dev/null +++ b/library/skeleton_library/macros.h @@ -0,0 +1,105 @@ +/* + * $Id: macros.h,v 1.1 2005-07-04 09:39:00 obarthel Exp $ + * + * :ts=4 + * + * Amiga shared library skeleton example + * Copyright (c) 2002-2005 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _MACROS_H +#define _MACROS_H + +/****************************************************************************/ + +#ifndef EXEC_TYPES_H +#include +#endif /* EXEC_TYPES_H */ + +#ifndef DOS_DOS_H +#include +#endif /* DOS_DOS_H */ + +/****************************************************************************/ + +/* We use a few macros to ease the declaration of function parameters + which are normally part of the AmigaOS4 header files. They are + automatically included by the header file. However, + if you are going to build this code on the plain 68k AmigaOS + platform, you will need to define these macros locally. */ + +/****************************************************************************/ + +#ifndef AMIGA_COMPILER_H + +/****************************************************************************/ + +#ifdef __SASC + +#ifndef ASM +#define ASM __asm +#endif /* ASM */ + +#ifndef REG +#define REG(reg,arg) register __##reg arg +#endif /* REG */ + +#define APICALL + +#endif /* __SASC */ + +/****************************************************************************/ + +#ifdef __GNUC__ + +#ifndef ASM +#define ASM +#endif /* ASM */ + +#ifndef REG +#define REG(reg,arg) arg __asm(#reg) +#endif /* REG */ + +#define APICALL + +#define VARARGS68K + +#endif /* __GNUC__ */ + +/****************************************************************************/ + +#endif /* AMIGA_COMPILER_H */ + +/****************************************************************************/ + +#ifndef ZERO +#define ZERO ((BPTR)NULL) +#endif /* ZERO */ + +/****************************************************************************/ + +#endif /* _MACROS_H */ diff --git a/library/skeleton_library/skeleton.library_rev.h b/library/skeleton_library/skeleton.library_rev.h new file mode 100755 index 0000000..dec05ea --- /dev/null +++ b/library/skeleton_library/skeleton.library_rev.h @@ -0,0 +1,6 @@ +#define VERSION 1 +#define REVISION 1 +#define DATE "4.7.2005" +#define VERS "skeleton.library 1.1" +#define VSTRING "skeleton.library 1.1 (4.7.2005)\r\n" +#define VERSTAG "\0$VER: skeleton.library 1.1 (4.7.2005)" diff --git a/library/skeleton_library/skeleton.library_rev.rev b/library/skeleton_library/skeleton.library_rev.rev new file mode 100755 index 0000000..d00491f --- /dev/null +++ b/library/skeleton_library/skeleton.library_rev.rev @@ -0,0 +1 @@ +1 diff --git a/library/skeleton_library/smakefile b/library/skeleton_library/smakefile new file mode 100755 index 0000000..a38b0bc --- /dev/null +++ b/library/skeleton_library/smakefile @@ -0,0 +1,105 @@ +# +# $Id: smakefile,v 1.1 2005-07-04 09:39:00 obarthel Exp $ +# +# :ts=4 +# +# Amiga shared library skeleton example +# Copyright (c) 2002-2005 by Olaf Barthel +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Neither the name of Olaf Barthel nor the names of contributors +# may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +############################################################################# +# +# Library version +# +############################################################################# + +VERSION = 1 + +############################################################################### + +#OPTIMIZE = optimize optsize optinline optinlocal +CPU = 060 +#DEBUG = line + DEBUG = symbolflush noopt + +############################################################################### + +CFLAGS = idlen=64 comnest strmerge nostkchk \ + strsect=code $(OPTIMIZE) cpu=$(CPU) debug=$(DEBUG) \ + params=register data=faronly commentnest idir=V:include +LFLAGS = smallcode noicons + +############################################################################### + +OBJS = lib_base.o lib_user.o + +############################################################################### + +LIBS = lib:scnb.lib lib:amiga.lib lib:debug.lib + +############################################################################### + +all: skeleton.library + +skeleton.library: $(OBJS) + slink $(OBJS) to $@.debug lib $(LIBS) $(LFLAGS) \ + map $@.map,fhx fwidth 32 pwidth 32 swidth 32 + slink $@.debug to $@ noicons nodebug + +############################################################################### + +clean: + -delete \#?.o skeleton.library(%|.debug) + +realclean: clean + -delete tags tagfiles \#?.map all + +############################################################################### + +install: skeleton.library + copy skeleton.library libs: + +############################################################################### + +mkid: + mkid -v \#?.(c|h|a|asm|i) + +update: + mkid -v -u + +version: + bumprev $(VERSION) skeleton.library + +############################################################################### + +cvs-tag: + cvs -q tag V$(VERSION)_`type skeleton.library_rev.rev` + +############################################################################### + +lib_base.o : lib_base.c lib_base.h lib_user.h skeleton.library_rev.h +lib_user.o : lib_user.c lib_user.h lib_base.h