• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2     SDL - Simple DirectMedia Layer
3     Copyright (C) 1997-2012 Sam Lantinga
4 
5     This library is free software; you can redistribute it and/or
6     modify it under the terms of the GNU Lesser General Public
7     License as published by the Free Software Foundation; either
8     version 2.1 of the License, or (at your option) any later version.
9 
10     This library is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13     Lesser General Public License for more details.
14 
15     You should have received a copy of the GNU Lesser General Public
16     License along with this library; if not, write to the Free Software
17     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18 
19     Sam Lantinga
20     slouken@libsdl.org
21 */
22 #include "SDL_config.h"
23 
24 #ifdef SDL_LOADSO_MACOS
25 
26 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
27 /* System dependent library loading routines                           */
28 
29 #include <stdio.h>
30 #include <string.h>
31 #define OLDP2C 1
32 #include <Strings.h>
33 #include <CodeFragments.h>
34 #include <Errors.h>
35 
36 #include "SDL_loadso.h"
37 
SDL_LoadObject(const char * sofile)38 void *SDL_LoadObject(const char *sofile)
39 {
40 	void *handle = NULL;
41 	const char *loaderror = NULL;
42 	CFragConnectionID library_id;
43 	Ptr mainAddr;
44 	Str255 errName;
45 	OSErr error;
46 	char psofile[512];
47 
48 	SDL_strlcpy(psofile, sofile, SDL_arraysize(psofile));
49 	error = GetSharedLibrary(C2PStr(psofile), kCompiledCFragArch,
50 			kLoadCFrag, &library_id, &mainAddr, errName);
51 	switch (error) {
52 		case noErr:
53 			loaderror = NULL;
54 			break;
55 		case cfragNoLibraryErr:
56 			loaderror = "Library not found";
57 			break;
58 		case cfragUnresolvedErr:
59 			loaderror = "Unabled to resolve symbols";
60 			break;
61 		case cfragNoPrivateMemErr:
62 		case cfragNoClientMemErr:
63 			loaderror = "Out of memory";
64 			break;
65 		default:
66 			loaderror = "Unknown Code Fragment Manager error";
67 			break;
68 	}
69 	if ( loaderror == NULL ) {
70 		handle = (void *)(library_id);
71 	} else {
72 		SDL_SetError("Failed loading %s: %s", sofile, loaderror);
73 	}
74 	return(handle);
75 }
76 
SDL_LoadFunction(void * handle,const char * name)77 void *SDL_LoadFunction(void *handle, const char *name)
78 {
79 	void *symbol = NULL;
80 	const char *loaderror = NULL;
81 	CFragSymbolClass class;
82 	CFragConnectionID library_id = (CFragConnectionID)handle;
83 	char pname[512];
84 
85 	SDL_strlcpy(pname, name, SDL_arraysize(pname));
86 	if ( FindSymbol(library_id, C2PStr(pname),
87 	                (char **)&symbol, &class) != noErr ) {
88 		loaderror = "Symbol not found";
89 	}
90 
91 	if ( symbol == NULL ) {
92 		SDL_SetError("Failed loading %s: %s", name, loaderror);
93 	}
94 	return(symbol);
95 }
96 
SDL_UnloadObject(void * handle)97 void SDL_UnloadObject(void *handle)
98 {
99 	CFragConnectionID library_id;
100 	if ( handle != NULL ) {
101 		library_id = (CFragConnectionID)handle;
102 		CloseConnection(&library_id);
103 	}
104 }
105 
106 #endif /* SDL_LOADSO_MACOS */
107