File: dll_loader.h

package info (click to toggle)
gcvs 1.0final-12
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 12,248 kB
  • ctags: 10,631
  • sloc: ansic: 71,709; cpp: 39,780; sh: 18,434; makefile: 1,915; yacc: 1,299; tcl: 1,283; perl: 910; lex: 249; csh: 185; lisp: 7
file content (122 lines) | stat: -rwxr-xr-x 4,200 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 1, or (at your option)
** any later version.

** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
** GNU General Public License for more details.

** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

/*
 * Author : Alexandre Parenteau <aubonbeurre@hotmail.com> --- December 1997
 */

/*
 * dll_loader.h --- code to load dynamic code
 */

#ifndef DLLLOADER_H
#define DLLLOADER_H

#ifdef macintosh
#	include <CodeFragments.h>
	typedef CFragConnectionID CompatConnectID;
#elif defined(WIN32)
	typedef HINSTANCE CompatConnectID;
#else /* !macintosh && !WIN32 */
#	include <dlfcn.h>
	typedef void *CompatConnectID;
#endif /* !macintosh && !WIN32 */

#ifdef __cplusplus
extern "C" {
#endif

int CompatLoadLibrary(CompatConnectID * connID, const char *name_dll);
	// return false if failed
	// mac : name_dll is the fragment name of the shared library
	// others : name_dll is the filename of the library

int CompatCloseLibrary(CompatConnectID * connID);
	// unload the shared library, connID should not
	// be used anymore after this call

// CompatCallLibrary(CompatConnectID ID, <atype> result, macFuncDescInfo idf,
//     const char *nf, <atype> tf, <arguments...>
//
// Call a function named "nf", prototype "tf", macDescInfo idf (0 if not mac)
// with the arguments "a1", "a2"... and put the result in "res"

#if defined(macintosh) && !TARGET_API_MAC_CARBON
	extern UniversalProcPtr sCompatProc;
#	define CompatCallLibrary1(ID, res, idf, nf, tf, a1) \
		( \
			sCompatProc = _CompatCallLibrary(ID, idf, nf), \
			res = sCompatProc != NULL ? \
				CallUniversalProc(sCompatProc, idf, a1) : res, \
			sCompatProc != NULL ? (DisposeRoutineDescriptor(sCompatProc), true) : false \
		)
#	define CompatCallLibrary2(ID, res, idf, nf, tf, a1, a2) \
		( \
			sCompatProc = _CompatCallLibrary(ID, idf, nf), \
			res = sCompatProc != NULL ? \
				CallUniversalProc(sCompatProc, idf, a1, a2) : res, \
			sCompatProc != NULL ? (DisposeRoutineDescriptor(sCompatProc), true) : false \
		)
#	define CompatCallLibrary3(ID, res, idf, nf, tf, a1, a2, a3) \
		( \
			sCompatProc = _CompatCallLibrary(ID, idf, nf), \
			res = sCompatProc != NULL ? \
				CallUniversalProc(sCompatProc, idf, a1, a2, a3) : res, \
			sCompatProc != NULL ? (DisposeRoutineDescriptor(sCompatProc), true) : false \
		)
	UniversalProcPtr _CompatCallLibrary(CompatConnectID connID, long id_func, const char *name_func);
#else /* !macintosh || TARGET_API_MAC_CARBON */
	extern void *sCompatProc;
#	define CompatCallLibrary1(ID, res, idf, nf, tf, a1) \
		( \
			sCompatProc = _CompatCallLibrary(ID, nf), \
			res = sCompatProc != NULL ? \
				((tf)sCompatProc)(a1) : res, \
			sCompatProc != NULL \
		)
#	define CompatCallLibrary2(ID, res, idf, nf, tf, a1, a2) \
		( \
			sCompatProc = _CompatCallLibrary(ID, nf), \
			res = sCompatProc != NULL ? \
				((tf)sCompatProc)(a1, a2) : res, \
			sCompatProc != NULL \
		)
#	define CompatCallLibrary3(ID, res, idf, nf, tf, a1, a2, a3) \
		( \
			sCompatProc = _CompatCallLibrary(ID, nf), \
			res = sCompatProc != NULL ? \
				((tf)sCompatProc)(a1, a2, a3) : res, \
			sCompatProc != NULL \
		)
	void *_CompatCallLibrary(CompatConnectID connID, const char *name_func);
#endif /* !macintosh || TARGET_API_MAC_CARBON */

// used with CompatCallLibrary when you want to give a function
// as an argument : for mac funcInfo is the desc. of the function
// arguments, if not 0

#if defined(macintosh) && !TARGET_API_MAC_CARBON
#	define CompatFuncArg(funcInfo, func) \
		NewRoutineDescriptor((ProcPtr)func, funcInfo, kPowerPCISA)
#else /* !macintosh || TARGET_API_MAC_CARBON */
#	define CompatFuncArg(funcInfo, func) func
#endif /* macintosh || TARGET_API_MAC_CARBON */

#ifdef __cplusplus
}
#endif

#endif /* DLLLOADER_H */