Initial import of Scalos. To decrease size I have
[AROS-Contrib.git] / scalos / datatypes / IconObject / iconobj-classic.c
blob4261fe1a7af36645195aa08fbb4497a74e013bcb
1 // iconobj-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>
13 #include <limits.h>
16 #include "iconobj.h"
18 //----------------------------------------------------------------------------
20 extern struct ExecBase *SysBase;
22 //----------------------------------------------------------------------------
24 static LIB_SAVEDS(struct Library *) LIB_ASM LIB_INTERRUPT Initlib(LIB_REG(d0, struct Library *libbase),
25 LIB_REG(a0, struct SegList *seglist), LIB_REG(a6, struct ExecBase *sysbase));
27 static LIBFUNC_PROTO(Openlib, libbase, struct Library *);
28 static LIBFUNC_PROTO(Closelib, libbase, struct SegList *);
29 static LIBFUNC_PROTO(Expungelib, libbase, struct SegList *);
30 static LIBFUNC_PROTO(Extfunclib, libbase, ULONG);
32 //----------------------------------------------------------------------------
34 /* OS3.x Library */
36 static APTR functable[] =
38 #ifdef __MORPHOS__
39 (APTR) FUNCARRAY_32BIT_NATIVE,
40 #endif
41 Openlib,
42 Closelib,
43 Expungelib,
44 Extfunclib,
45 ObtainInfoEngine,
46 (APTR) -1
49 /* Init table used in library initialization. */
50 static ULONG inittab[] =
52 sizeof(struct IconObjectDtLibBase),
53 (ULONG) functable,
55 (ULONG) Initlib
59 /* The ROM tag */
60 struct Resident ALIGNED romtag =
62 RTC_MATCHWORD,
63 &romtag,
64 &romtag + 1,
65 #ifdef __MORPHOS__
66 RTF_PPC | RTF_AUTOINIT,
67 #else
68 RTF_AUTOINIT,
69 #endif
70 LIB_VERSION,
71 NT_LIBRARY,
73 libName,
74 libIdString,
75 inittab
78 #ifdef __MORPHOS__
79 ULONG __abox__=1;
80 #endif
82 //----------------------------------------------------------------------------
84 static LIB_SAVEDS(struct Library *) LIB_ASM LIB_INTERRUPT Initlib(LIB_REG(d0, struct Library *libbase),
85 LIB_REG(a0, struct SegList *seglist), LIB_REG(a6, struct ExecBase *sysbase))
87 struct IconObjectDtLibBase *dtLib = (struct IconObjectDtLibBase *) libbase;
89 SysBase = sysbase;
90 dtLib->nib_ClassLibrary.cl_Lib.lib_Revision = LIB_REVISION;
91 dtLib->nib_ClassLibrary.cl_Lib.lib_Node.ln_Pri = SCHAR_MIN;
92 dtLib->nib_SegList = seglist;
94 if (!InitDatatype(dtLib))
96 CALLLIBFUNC(Expungelib, &dtLib->nib_ClassLibrary.cl_Lib);
97 dtLib = NULL;
100 return dtLib ? &dtLib->nib_ClassLibrary.cl_Lib : NULL;
104 static LIBFUNC(Openlib, libbase, struct Library *)
106 struct IconObjectDtLibBase *dtLib = (struct IconObjectDtLibBase *) libbase;
108 dtLib->nib_ClassLibrary.cl_Lib.lib_OpenCnt++;
109 dtLib->nib_ClassLibrary.cl_Lib.lib_Flags &= ~LIBF_DELEXP;
111 if (!OpenDatatype(dtLib))
113 CALLLIBFUNC(Closelib, &dtLib->nib_ClassLibrary.cl_Lib);
114 return NULL;
117 return &dtLib->nib_ClassLibrary.cl_Lib;
119 LIBFUNC_END
122 static LIBFUNC(Closelib, libbase, struct SegList *)
124 struct IconObjectDtLibBase *dtLib = (struct IconObjectDtLibBase *) libbase;
126 dtLib->nib_ClassLibrary.cl_Lib.lib_OpenCnt--;
128 if (0 == dtLib->nib_ClassLibrary.cl_Lib.lib_OpenCnt)
130 if (dtLib->nib_ClassLibrary.cl_Lib.lib_Flags & LIBF_DELEXP)
132 return CALLLIBFUNC(Expungelib, &dtLib->nib_ClassLibrary.cl_Lib);
136 return NULL;
138 LIBFUNC_END
141 static LIBFUNC(Expungelib, libbase, struct SegList *)
143 struct IconObjectDtLibBase *dtLib = (struct IconObjectDtLibBase *) libbase;
145 if (0 == dtLib->nib_ClassLibrary.cl_Lib.lib_OpenCnt)
147 ULONG size = dtLib->nib_ClassLibrary.cl_Lib.lib_NegSize + dtLib->nib_ClassLibrary.cl_Lib.lib_PosSize;
148 UBYTE *ptr = (UBYTE *) dtLib - dtLib->nib_ClassLibrary.cl_Lib.lib_NegSize;
149 struct SegList *libseglist = dtLib->nib_SegList;
151 Remove((struct Node *) dtLib);
152 CloseDatatype(dtLib);
153 FreeMem(ptr,size);
155 return libseglist;
158 dtLib->nib_ClassLibrary.cl_Lib.lib_Flags |= LIBF_DELEXP;
160 return NULL;
162 LIBFUNC_END
165 static LIBFUNC(Extfunclib, libbase, ULONG)
167 (void) libbase;
169 d1(kprintf(__FUNC__ "/%ld: libbase=%08lx\n", __LINE__, libbase));
170 return 0;
172 LIBFUNC_END