$libName = shift;
$sourceFile = shift;
$assemblyFile = shift;
$exportFile = shift;
$loadLibrary = shift;
foreach $arg (@ARGV) {
local $/;
undef $/;
open (ARG, "$arg") or die ("Can't open $arg for reading.");
$file .= <ARG>;
close (ARG);
}
foreach $symbol (split (/\n|\r/, $file)) {
if ($symbol =~ /^\s*_(.*)\s*$/) { push @symbols, $1;
}
}
open (EXPORT, ">$exportFile") or die ("Can't open $exportFile for writing.");
select (EXPORT);
print ("___${libName}_LoadKerberosFramework\n");
foreach $symbol (@symbols) {
print ("_${symbol}\n");
}
close (EXPORT);
open (ASSEMBLER, ">$assemblyFile") or die ("Can't open $assemblyFile for writing.");
select (ASSEMBLER);
print ("; Data Section: storage for function pointers\n");
print (" .data\n\n");
foreach $symbol (@symbols) {
print <<SYMBOLPTR
.globl _${symbol}_ProcPtr
_${symbol}_ProcPtr:
.long 0
SYMBOLPTR
}
print ("\n; Text Section: code for the exported functions\n");
print (" .text\n\n");
foreach $symbol (@symbols) {
print <<SYMBOLCODE;
.globl _${symbol}
_${symbol}:
mflr r0
bl L0\$${symbol}
L0\$${symbol}:
mflr r11
mtlr r0
addis r11,r11,ha16(_${symbol}_ProcPtr - L0\$${symbol})
lwz r12,lo16(_${symbol}_ProcPtr - L0\$${symbol})(r11)
mtctr r12
bctr
SYMBOLCODE
}
close (ASSEMBLER);
open (SOURCE, ">$sourceFile") or die ("Can't open $sourceFile for writing.");
select (SOURCE);
print ("#include <CoreFoundation/CoreFoundation.h>\n\n");
foreach $symbol (@symbols) {
print ("extern ProcPtr ${symbol}_ProcPtr;\n");
}
print <<LOADKERBEROSFRAMEWORK;
void __${libName}_LoadKerberosFramework (void);
void __${libName}_LoadKerberosFramework (void)
{
CFBundleRef kerberosBundle = NULL;
CFURLRef kerberosURL = NULL;
int loaded = 0;
kerberosURL = CFURLCreateWithFileSystemPath (kCFAllocatorDefault,
CFSTR("$loadLibrary"),
kCFURLPOSIXPathStyle,
true);
if (kerberosURL == NULL) {
exit (1);
}
kerberosBundle = CFBundleCreate (kCFAllocatorDefault, kerberosURL);
CFRelease (kerberosURL);
if (kerberosBundle == NULL) {
exit (1);
}
loaded = CFBundleLoadExecutable (kerberosBundle);
if (!loaded) {
CFRelease (kerberosBundle);
exit (1);
}
LOADKERBEROSFRAMEWORK
foreach $symbol (@symbols) {
print (" ${symbol}_ProcPtr = (ProcPtr) CFBundleGetFunctionPointerForName (kerberosBundle, CFSTR(\"${symbol}\"));\n\n");
}
print ("}\n");
close( SOURCE);