Initial import of Scalos. To decrease size I have
[AROS-Contrib.git] / scalos / datatypes / AmigaIconObj3.5 / AmigaIconObj35-classic.c
blob9f5cc148070dc79d456a6a5fd7c337d4fa9920e2
1 // amigaiconobj35-classic.c
2 // $Date$
3 // $Revision$
6 #include <exec/types.h>
7 #include <exec/initializers.h>
9 #include <exec/resident.h>
11 #include <proto/exec.h>
14 #include "AmigaIconObj35.h"
16 //----------------------------------------------------------------------------
18 extern struct ExecBase *SysBase;
20 //----------------------------------------------------------------------------
22 static LIB_SAVEDS(struct Library *) LIB_ASM LIB_INTERRUPT Initlib(LIB_REG(d0, struct Library *libbase),
23 LIB_REG(a0, struct SegList *seglist), LIB_REG(a6, struct ExecBase *sysbase));
25 static LIBFUNC_PROTO(Openlib, libbase, struct Library *);
26 static LIBFUNC_PROTO(Closelib, libbase, struct SegList *);
27 static LIBFUNC_PROTO(Expungelib, libbase, struct SegList *);
28 static LIBFUNC_PROTO(Extfunclib, libbase, ULONG);
30 //----------------------------------------------------------------------------
32 /* OS3.x Library */
34 static APTR functable[] =
36 #ifdef __MORPHOS__
37 (APTR) FUNCARRAY_32BIT_NATIVE,
38 #endif
39 Openlib,
40 Closelib,
41 Expungelib,
42 Extfunclib,
43 ObtainInfoEngine,
44 (APTR) -1
47 /* Init table used in library initialization. */
48 static ULONG inittab[] =
50 sizeof(struct AmigaIconObj35DtLibBase),
51 (ULONG) functable,
53 (ULONG) Initlib
57 /* The ROM tag */
58 struct Resident ALIGNED romtag =
60 RTC_MATCHWORD,
61 &romtag,
62 &romtag + 1,
63 #ifdef __MORPHOS__
64 RTF_PPC | RTF_AUTOINIT,
65 #else
66 RTF_AUTOINIT,
67 #endif
68 LIB_VERSION,
69 NT_LIBRARY,
71 libName,
72 libIdString,
73 inittab
76 #ifdef __MORPHOS__
77 ULONG __abox__=1;
78 #endif
80 //----------------------------------------------------------------------------
82 static LIB_SAVEDS(struct Library *) LIB_ASM LIB_INTERRUPT Initlib(LIB_REG(d0, struct Library *libbase),
83 LIB_REG(a0, struct SegList *seglist), LIB_REG(a6, struct ExecBase *sysbase))
85 struct AmigaIconObj35DtLibBase *dtLib = (struct AmigaIconObj35DtLibBase *) libbase;
87 SysBase = sysbase;
88 dtLib->nib_ClassLibrary.cl_Lib.lib_Revision = LIB_REVISION;
89 dtLib->nib_ClassLibrary.cl_Lib.lib_Node.ln_Pri = 7;
90 dtLib->nib_SegList = seglist;
92 if (!InitDatatype(dtLib))
94 CALLLIBFUNC(Expungelib, &dtLib->nib_ClassLibrary.cl_Lib);
95 dtLib = NULL;
98 return dtLib ? &dtLib->nib_ClassLibrary.cl_Lib : NULL;
102 static LIBFUNC(Openlib, libbase, struct Library *)
104 struct AmigaIconObj35DtLibBase *dtLib = (struct AmigaIconObj35DtLibBase *) libbase;
106 dtLib->nib_ClassLibrary.cl_Lib.lib_OpenCnt++;
107 dtLib->nib_ClassLibrary.cl_Lib.lib_Flags &= ~LIBF_DELEXP;
109 if (!OpenDatatype(dtLib))
111 CALLLIBFUNC(Closelib, &dtLib->nib_ClassLibrary.cl_Lib);
112 return NULL;
115 return &dtLib->nib_ClassLibrary.cl_Lib;
117 LIBFUNC_END
120 static LIBFUNC(Closelib, libbase, struct SegList *)
122 struct AmigaIconObj35DtLibBase *dtLib = (struct AmigaIconObj35DtLibBase *) libbase;
124 dtLib->nib_ClassLibrary.cl_Lib.lib_OpenCnt--;
126 if (0 == dtLib->nib_ClassLibrary.cl_Lib.lib_OpenCnt)
128 if (dtLib->nib_ClassLibrary.cl_Lib.lib_Flags & LIBF_DELEXP)
130 return CALLLIBFUNC(Expungelib, &dtLib->nib_ClassLibrary.cl_Lib);
134 return NULL;
136 LIBFUNC_END
139 static LIBFUNC(Expungelib, libbase, struct SegList *)
141 struct AmigaIconObj35DtLibBase *dtLib = (struct AmigaIconObj35DtLibBase *) libbase;
143 if (0 == dtLib->nib_ClassLibrary.cl_Lib.lib_OpenCnt)
145 ULONG size = dtLib->nib_ClassLibrary.cl_Lib.lib_NegSize + dtLib->nib_ClassLibrary.cl_Lib.lib_PosSize;
146 UBYTE *ptr = (UBYTE *) dtLib - dtLib->nib_ClassLibrary.cl_Lib.lib_NegSize;
147 struct SegList *libseglist = dtLib->nib_SegList;
149 Remove((struct Node *) dtLib);
150 CloseDatatype(dtLib);
151 FreeMem(ptr,size);
153 return libseglist;
156 dtLib->nib_ClassLibrary.cl_Lib.lib_Flags |= LIBF_DELEXP;
158 return NULL;
160 LIBFUNC_END
163 static LIBFUNC(Extfunclib, libbase, ULONG)
165 (void) libbase;
167 d1(kprintf(__FUNC__ "/%ld: libbase=%08lx\n", __LINE__, libbase));
168 return 0;
170 LIBFUNC_END