90 lines
1.9 KiB
Plaintext
90 lines
1.9 KiB
Plaintext
#import <Cocoa/Cocoa.h>
|
|
|
|
#include <mach/mach_time.h>
|
|
#include "master.hpp"
|
|
|
|
namespace factor
|
|
{
|
|
|
|
void factor_vm::c_to_factor_toplevel(cell quot)
|
|
{
|
|
c_to_factor(quot);
|
|
}
|
|
|
|
void early_init(void)
|
|
{
|
|
SInt32 version;
|
|
Gestalt(gestaltSystemVersion,&version);
|
|
if(version < 0x1050)
|
|
{
|
|
std::cout << "Factor requires Mac OS X 10.5 or later.\n";
|
|
exit(1);
|
|
}
|
|
|
|
[[NSAutoreleasePool alloc] init];
|
|
}
|
|
|
|
const char *vm_executable_path(void)
|
|
{
|
|
return [[[NSBundle mainBundle] executablePath] UTF8String];
|
|
}
|
|
|
|
const char *default_image_path(void)
|
|
{
|
|
NSBundle *bundle = [NSBundle mainBundle];
|
|
NSString *path = [bundle bundlePath];
|
|
NSString *executable = [[bundle executablePath] lastPathComponent];
|
|
NSString *image = [executable stringByAppendingString:@".image"];
|
|
|
|
NSString *returnVal;
|
|
|
|
if([path hasSuffix:@".app"] || [path hasSuffix:@".app/"])
|
|
{
|
|
NSFileManager *mgr = [NSFileManager defaultManager];
|
|
|
|
NSString *imageInBundle = [[path stringByAppendingPathComponent:@"Contents/Resources"] stringByAppendingPathComponent:image];
|
|
NSString *imageAlongBundle = [[path stringByDeletingLastPathComponent] stringByAppendingPathComponent:image];
|
|
|
|
returnVal = ([mgr fileExistsAtPath:imageInBundle]
|
|
? imageInBundle : imageAlongBundle);
|
|
}
|
|
else
|
|
returnVal = [path stringByAppendingPathComponent:image];
|
|
|
|
return [returnVal UTF8String];
|
|
}
|
|
|
|
void factor_vm::init_signals(void)
|
|
{
|
|
unix_init_signals();
|
|
mach_initialize();
|
|
}
|
|
|
|
/* Amateurs at Apple: implement this function, properly! */
|
|
Protocol *objc_getProtocol(char *name)
|
|
{
|
|
if(strcmp(name,"NSTextInput") == 0)
|
|
return @protocol(NSTextInput);
|
|
else
|
|
return nil;
|
|
}
|
|
|
|
u64 nano_count()
|
|
{
|
|
u64 time = mach_absolute_time();
|
|
|
|
static u64 scaling_factor = 0;
|
|
if(!scaling_factor)
|
|
{
|
|
mach_timebase_info_data_t info;
|
|
kern_return_t ret = mach_timebase_info(&info);
|
|
if(ret != 0)
|
|
fatal_error("mach_timebase_info failed",ret);
|
|
scaling_factor = info.numer/info.denom;
|
|
}
|
|
|
|
return time * scaling_factor;
|
|
}
|
|
|
|
}
|