[LANGUAGE english; PARENT keywords; PAGE 11-6] [C;6;B] AMIGALIBRARY or AL [7]Default: normal executable [J;1;N] NOTE: if this flag is set (or one of the LIBFD, LIBID, \ LIBPREFIX, LIBREVISION or LIBVERSION instructions is used,) \ lk supposes that you want to use the default 'library.o' \ file. Any file which contains the '_LibraryBase' symbol \ (XDEF) will replace the default lk object. lk will \ link that file as the first object and it must be of \ type code. If such symbol does not exist, lk will first \ check for 'LK:LIB/library.o', if that file does not \ exist, the internal one will be used instead. The \ default lk header file does not handle Slink or DICE \ required initialisations. Another solution is to use the DEFINE instruction \ to forbid the usage of the default library with: DEFINE _LibraryBase=0 This instruction supposes that you are creating an Amiga \ library (like those present into your LIBS: path.) lk will \ automatically generates the table list for the function \ jumps from the corresponding file description ('.fd' file.) \ The name of the '.fd' file will be defined with the LIBFD \ instruction or from the destination file name. The name of \ the library will be the destination file name. If you have to define private functions into the file \ description, you should define them with the names \ 'private1', 'private2', etc... and use the DEFINE \ instruction to redirect them on your functions: DEFINE private1= DEFINE private2= ... If you need to receive the parameters on the stack \ you will use LIBSTACKPARAM instruction. By default lk \ supposes that your functions receive registers. The version and revision numbers of the library are \ defined through the instructions LIBVERSION and LIBREVISION. \ Those will also define the __LIBRARYVERSION and \ __LIBRARYREVISION symbols respectivly. Both values \ are used to define the library identification as well \ than the library version used to bump an open. The string identification will be defined throught \ one of the COPYRIGHT or LIBID instructions. Only the \ copyright is required because the remained is always \ generated by lk. If no copyright is defined, the default \ identification string is still created by lk. If you use the default library header given with lk, \ you must define the following functions, and the \ variable '_LibraryBase' is available to you. This \ global variable contains the pointer of your \ library which does not need to be opened by again, \ and can always be used in replacement to the variable \ called 'mylib' given in any of the following functions. \ To avoid the usual auto-init/exit open/close code, you \ may add a definition when you link: DEFINE =_LibraryBase like for instance: DEFINE _BOSBase=_LibraryBase [INDENT 5] 1. 'LibInit' which contains all necessary initialisations \ for your library. Its C proto-type is: [2] extern struct Library * _LibInit( [R] struct Library *mylib); [L;1] If you have nothing to create, just type: [2] long _LibInit(mylib) struct Library *struct; { return (mylib); } [J;1] This function must return the library pointer \ (mylib) to accept the library installation, otherwise \ return null (failed) and the complete library will be \ freed by the system. This function should avoid calls \ to other functions of the library. If your compiler support register definition you \ may defines 'mylib' as register D0 (and A6 is SysBase.) 2. 'LibOpen' which contains the necessary initialisations \ for each new open intented by user. The system will increment \ the open counter by one when this routine does not fail. \ Its C proto-type is: [2] extern struct Library * _LibOpen( [R] struct Library *mylib); [L;1] If you have nothing to allocate, just type: [2] long _LibOpen(mylib) struct Library *struct; { return (mylib); } [J;1] This function must return the library pointer if the \ library has been opened with success. If your compiler supports register definitions you \ may defines 'mylib' as register D0. 3. 'LibClose' which contains the necessary destructors. \ The system will decrement the open counter by one. Its C proto-type \ is: [2] extern BOOLEAN _LibClose( [R] struct Library *mylib); [L;1] If you have nothing to free, just type: [2] long _LibClose(mylib) struct Library *struct; { return (0); } [J;1] This function must return FALSE if the library does \ not have to be expunged. Do not forget that you cannot \ expunge your library until all users closes it (however \ the expunge code check the counter.) If your compiler supports register definitions you \ may defines 'mylib' as A6. 4. 'LibExpunge' which contains the necessary destructors \ to free the library from memory. If this function is not \ defined lk assume that no expunge is available and the \ default LibExpunge will be used (it does nothing!) Its \ C proto-type is: [2] extern long _LibExpunge( [R] struct Library *mylib); [L;1] If you have nothing to destroy, just type: [2] long _LibExpunge(mylib) struct Library *struct; { return (1); } [J;1] This function must return FALSE if the library cannot \ be expunged. Otherwise it will return any non zero value \ and the system expunge function will free the library \ memories (base and segment list.) The system expunge \ function automatically prevents the destruction while \ some users still access the library. If your compiler supports register definitions you \ may defines 'mylib' as A6. [INDENT] [5] IMPORTANT: In the LibInit() and LibExpunge() functions, you MUST \ avoid the usage of the DOS filer system, otherwise the \ Forbid()/Permit() of the system are lost and the system may \ crash. [1] See also: [L;3][LINK copyright] COPYRIGHT [LINK fdlib] FDLIB [LINK libfd] LIBFD [LINK copyright] LIBID [LINK libprefix] LIBPREFIX [LINK version] LIBREVISION [LINK version] LIBVERSION [LINK version] VERSION [5; LINK about; GOTO address] Become Registred