3 #include <exec/types.h>
5 #include <exec/execbase.h>
6 #include <intuition/intuition.h>
7 #include <libraries/dos.h>
8 #include <proto/exec.h>
12 #include <libraries/pm.h>
15 ULONG __asm
_LibExpunge( register __a6
struct PopupMenuBase
*libbase
);
16 ULONG __asm
_LibInit ( register __a0 APTR seglist
,
17 register __d0
struct PopupMenuBase
*libbase
);
19 int __saveds __asm
__UserLibInit (register __a6
struct PopupMenuBase
*libbase
);
20 void __saveds __asm
__UserLibCleanup(register __a6
struct PopupMenuBase
*libbase
);
22 int __saveds __asm
__UserDevInit (register __d0
long unit
,
23 register __a0
struct IORequest
*ior
,
24 register __a6
struct PopupMenuBase
*libbase
);
25 void __saveds __asm
__UserDevCleanup(register __a0
struct IORequest
*ior
,
26 register __a6
struct PopupMenuBase
*libbase
);
28 int __saveds __asm
__libfpinit (register __a6
struct PopupMenuBase
*libbase
);
29 void __saveds __asm
__libfpterm (register __a6
struct PopupMenuBase
*libbase
);
32 typedef LONG (*myPFL
)(); /* pointer to function returning 32-bit int */
34 /* library initialization table, used for AUTOINIT libraries */
36 ULONG
*it_DataSize
; /* library data space size */
37 myPFL
*it_FuncTable
; /* table of entry points */
38 APTR it_DataInit
; /* table of data initializers */
39 myPFL it_InitFunc
; /* initialization function to run */
42 /* symbols generated by blink */
43 extern char __far _LibID
[]; /* ID string */
44 extern char __far _LibName
[]; /* Name string */
45 extern char __far RESLEN
; /* size of init data */
46 extern long __far NEWDATAL
; /* size of global data */
47 extern long __far NUMJMPS
; /* number of jmp vectors to copy */
48 extern myPFL _LibFuncTab
[]; /* my function table */
49 extern long __far _LibVersion
; /* Version of library */
50 extern long __far _LibRevision
; /* Revision of library */
51 #define MYVERSION ((long)&_LibVersion)
52 #define MYREVISION ((long)&_LibRevision)
53 #define DATAWORDS ((long)&NEWDATAL) /* magic to get right tpye of reloc */
54 #define SIZEJMPTAB ((long)libbase->pmb_origbase->pmb_numjmps)
55 /* size in bytes of jmp table */
57 /* From libent.o, needed to determine where data is loaded by loadseg */
58 extern long far _Libmergeddata
;
60 #define MYLIBRARYSIZE ((sizeof(struct PopupMenuBase) +3) & ~3)
64 struct InitTable __far _LibInitTab
= {
65 (long *)(&RESLEN
+MYLIBRARYSIZE
),
67 NULL
, /* will initialize my own data */
71 __asm ULONG
_LibInit( register __a0 APTR seglist
,
72 register __d0
struct PopupMenuBase
*libbase
)
80 libbase
->pmb_SegList
= (ULONG
) seglist
;
82 /* init. library structure (since I don't do automatic data init.) */
83 libbase
->pmb_Library
.lib_Node
.ln_Type
= NT_LIBRARY
;
84 libbase
->pmb_Library
.lib_Node
.ln_Name
= _LibName
;
85 libbase
->pmb_Library
.lib_Node
.ln_Succ
= NULL
;
86 libbase
->pmb_Library
.lib_Node
.ln_Pred
= NULL
;
87 libbase
->pmb_Library
.lib_Flags
= LIBF_SUMUSED
| LIBF_CHANGED
;
88 libbase
->pmb_Library
.lib_Version
= MYVERSION
;
89 libbase
->pmb_Library
.lib_Revision
= MYREVISION
;
90 libbase
->pmb_Library
.lib_IdString
= (APTR
) _LibID
;
92 /* Start of copy of global data after structure */
93 ddata
= (char *)libbase
+ MYLIBRARYSIZE
;
95 sdata
= (long *)&_Libmergeddata
; /* where loadseg loaded the data */
96 memcpy(ddata
, (void *)sdata
, DATAWORDS
*4);
98 /* perform relocs if we want one global section for all programs */
99 /* that have this lib open. If we want a global section for each */
100 /* open, copy the relocs, and do them on each open call. */
101 sdata
= sdata
+ DATAWORDS
;
106 reloc
= (long *)((long)ddata
+ *sdata
++);
107 *reloc
+= (long)ddata
;
111 if (__UserLibInit(libbase
) != 0)
112 return NULL
; /* abort if user init failed */
114 return ( (ULONG
) libbase
);
118 register __a6
struct PopupMenuBase
*libbase
)
120 /* mark us as having another customer */
121 libbase
->pmb_Library
.lib_OpenCnt
++;
123 /* clear delayed expunges (standard procedure) */
124 libbase
->pmb_Library
.lib_Flags
&= ~LIBF_DELEXP
;
126 return ( (LONG
) libbase
);
129 ULONG __asm
_LibClose(
130 register __a6
struct PopupMenuBase
*libbase
)
134 if (( --libbase
->pmb_Library
.lib_OpenCnt
== 0 ) &&
135 ( libbase
->pmb_Library
.lib_Flags
& LIBF_DELEXP
))
137 /* no more people have me open,
138 * and I have a delayed expunge pending
140 retval
= _LibExpunge( libbase
); /* return segment list */
146 ULONG __asm
_LibExpunge( register __a6
struct PopupMenuBase
*libbase
)
151 libbase
->pmb_Library
.lib_Flags
|= LIBF_DELEXP
;
152 if ( libbase
->pmb_Library
.lib_OpenCnt
== 0 )
154 /* really expunge: remove libbase and freemem */
155 __UserLibCleanup(libbase
);
156 //KPutStr("libcleanup done\n");
158 seglist
= libbase
->pmb_SegList
;
160 //kprintf("Removing: %08lx (%s)\n", libbase, libbase->lib_Node.ln_Name);
161 //kprintf("SysBase: %08lx\n", SysBase);
162 SysBase
=*((struct ExecBase
**)4);
163 //kprintf("SysBase: %08lx\n", SysBase);
164 Remove( (struct Node
*) libbase
);
165 //KPutStr("Removed library\n");
167 libsize
= libbase
->pmb_Library
.lib_NegSize
+ libbase
->pmb_Library
.lib_PosSize
;
168 FreeMem( (char *) libbase
- libbase
->pmb_Library
.lib_NegSize
,(LONG
) libsize
);
171 /* return NULL or real seglist */
172 return ( (ULONG
) seglist
);