Home | History | Annotate | Download | only in macos
      1 /*
      2     SDL - Simple DirectMedia Layer
      3     Copyright (C) 1997-2006 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 (at) 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 
     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 
     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 
     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