| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | #include "master.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | s64 current_millis(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	FILETIME t; | 
					
						
							|  |  |  | 	GetSystemTimeAsFileTime(&t); | 
					
						
							|  |  |  | 	return (((s64)t.dwLowDateTime | (s64)t.dwHighDateTime<<32) | 
					
						
							|  |  |  | 		- EPOCH_OFFSET) / 10000; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-13 01:09:38 -05:00
										 |  |  | DEFINE_PRIMITIVE(os_envs) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	GROWABLE_ARRAY(result); | 
					
						
							| 
									
										
										
										
											2007-12-26 01:45:16 -05:00
										 |  |  | 	REGISTER_ROOT(result); | 
					
						
							| 
									
										
										
										
											2007-11-13 01:09:38 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	TCHAR *env = GetEnvironmentStrings(); | 
					
						
							|  |  |  | 	TCHAR *finger = env; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for(;;) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		TCHAR *scan = finger; | 
					
						
							|  |  |  | 		while(*scan != '\0') | 
					
						
							|  |  |  | 			scan++; | 
					
						
							|  |  |  | 		if(scan == finger) | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		CELL string = tag_object(from_u16_string(finger)); | 
					
						
							| 
									
										
										
										
											2008-05-30 02:31:05 -04:00
										 |  |  | 		GROWABLE_ARRAY_ADD(result,string); | 
					
						
							| 
									
										
										
										
											2007-11-13 01:09:38 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		finger = scan + 1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	FreeEnvironmentStrings(env); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-26 01:45:16 -05:00
										 |  |  | 	UNREGISTER_ROOT(result); | 
					
						
							| 
									
										
										
										
											2008-05-30 02:31:05 -04:00
										 |  |  | 	GROWABLE_ARRAY_TRIM(result); | 
					
						
							| 
									
										
										
										
											2007-12-26 01:45:16 -05:00
										 |  |  | 	dpush(result); | 
					
						
							| 
									
										
										
										
											2007-11-13 01:09:38 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-25 04:37:45 -04:00
										 |  |  | long exception_handler(PEXCEPTION_POINTERS pe) | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2007-09-25 04:37:45 -04:00
										 |  |  | 	PEXCEPTION_RECORD e = (PEXCEPTION_RECORD)pe->ExceptionRecord; | 
					
						
							|  |  |  | 	CONTEXT *c = (CONTEXT*)pe->ContextRecord; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-04 12:45:53 -05:00
										 |  |  | 	if(in_code_heap_p(c->EIP)) | 
					
						
							|  |  |  | 		signal_callstack_top = (void *)c->ESP; | 
					
						
							| 
									
										
										
										
											2007-09-27 16:10:37 -04:00
										 |  |  | 	else | 
					
						
							|  |  |  | 		signal_callstack_top = NULL; | 
					
						
							| 
									
										
										
										
											2007-09-25 04:37:45 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if(e->ExceptionCode == EXCEPTION_ACCESS_VIOLATION) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		signal_fault_addr = e->ExceptionInformation[1]; | 
					
						
							| 
									
										
										
										
											2008-02-04 12:45:53 -05:00
										 |  |  | 		c->EIP = (CELL)memory_signal_handler_impl; | 
					
						
							| 
									
										
										
										
											2007-09-25 04:37:45 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	else if(e->ExceptionCode == EXCEPTION_FLT_DIVIDE_BY_ZERO | 
					
						
							|  |  |  | 			|| e->ExceptionCode == EXCEPTION_INT_DIVIDE_BY_ZERO) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		signal_number = ERROR_DIVIDE_BY_ZERO; | 
					
						
							| 
									
										
										
										
											2008-02-04 12:45:53 -05:00
										 |  |  | 		c->EIP = (CELL)divide_by_zero_signal_handler_impl; | 
					
						
							| 
									
										
										
										
											2007-09-25 04:37:45 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 	else | 
					
						
							| 
									
										
										
										
											2007-09-25 04:37:45 -04:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		signal_number = 11; | 
					
						
							| 
									
										
										
										
											2008-02-04 12:45:53 -05:00
										 |  |  | 		c->EIP = (CELL)misc_signal_handler_impl; | 
					
						
							| 
									
										
										
										
											2007-09-25 04:37:45 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return EXCEPTION_CONTINUE_EXECUTION; | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-24 00:52:58 -04:00
										 |  |  | void c_to_factor_toplevel(CELL quot) | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2007-12-12 02:29:41 -05:00
										 |  |  | 	if(!AddVectoredExceptionHandler(0, (void*)exception_handler)) | 
					
						
							|  |  |  | 		fatal_error("AddVectoredExceptionHandler failed", 0); | 
					
						
							| 
									
										
										
										
											2007-09-24 00:52:58 -04:00
										 |  |  | 	c_to_factor(quot); | 
					
						
							| 
									
										
										
										
											2007-12-12 14:01:25 -05:00
										 |  |  | 	RemoveVectoredExceptionHandler((void*)exception_handler); | 
					
						
							| 
									
										
										
										
											2007-09-25 04:37:45 -04:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2007-11-21 15:27:25 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | void open_console(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2007-11-24 19:07:05 -05:00
										 |  |  | 	/*
 | 
					
						
							|  |  |  | 	// Do this: http://www.cygwin.com/ml/cygwin/2007-11/msg00432.html
 | 
					
						
							| 
									
										
										
										
											2007-11-24 19:17:25 -05:00
										 |  |  | 	if(console_open) | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if(AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole()) | 
					
						
							| 
									
										
										
										
											2007-11-21 15:47:15 -05:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2007-11-24 19:17:25 -05:00
										 |  |  | 		console_open = true; | 
					
						
							| 
									
										
										
										
											2007-11-21 15:47:15 -05:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2007-11-24 19:07:05 -05:00
										 |  |  | 	*/ | 
					
						
							| 
									
										
										
										
											2007-11-21 15:27:25 -05:00
										 |  |  | } |