From 9334098b1bda87b10d0c85b025e448cba0c96f8f Mon Sep 17 00:00:00 2001
From: johnvg
Date: Thu, 29 Apr 2004 11:13:17 +0000
Subject: add set_compiler_id and get_compiler_id

git-svn-id: https://svn.cs.ru.nl/repos/clean-compiler/trunk@1492 1f8540f1-abd5-4d5b-9d24-4c5ce8603e2d
---
 main/Windows/Clean System Files/thread_message.obj | Bin 3665 -> 2496 bytes
 main/Windows/thread_message.c                      | 254 +++++++++++++++++++++
 main/Windows/thread_message.h                      |   0
 3 files changed, 254 insertions(+)
 create mode 100644 main/Windows/thread_message.c
 create mode 100644 main/Windows/thread_message.h

(limited to 'main/Windows')

diff --git a/main/Windows/Clean System Files/thread_message.obj b/main/Windows/Clean System Files/thread_message.obj
index 79e99da..d600ff0 100644
Binary files a/main/Windows/Clean System Files/thread_message.obj and b/main/Windows/Clean System Files/thread_message.obj differ
diff --git a/main/Windows/thread_message.c b/main/Windows/thread_message.c
new file mode 100644
index 0000000..d261842
--- /dev/null
+++ b/main/Windows/thread_message.c
@@ -0,0 +1,254 @@
+
+#include <stdio.h>
+#include <windows.h>
+#include "Clean.h"
+#include "thread_message.h"
+
+static int CleanCompiler_message_nunber;
+
+int get_message_number (void)
+{
+	return RegisterWindowMessage ("CleanCompiler");
+}
+
+int get_current_thread_id (void)
+{
+	return GetCurrentThreadId();
+}
+
+int compiler_result_handler_installed=0;
+
+#ifdef IDE
+extern void (*dispatch_null_message_hook) (MSG*);
+
+#define MAX_N_COMPILERS 32
+
+int compiler_finished[MAX_N_COMPILERS];
+int compiler_exit_codes[MAX_N_COMPILERS];
+
+void compiler_result_handler (MSG *msg)
+{	
+	if (msg->message==CleanCompiler_message_nunber){
+		unsigned int compiler_n;
+
+		compiler_n=msg->wParam;
+
+		if (compiler_n<MAX_N_COMPILERS){
+			compiler_exit_codes[compiler_n]=msg->lParam;
+			compiler_finished[compiler_n]=1;
+		}
+	}
+}
+
+void install_compiler_result_handler (void)
+{
+	CleanCompiler_message_nunber=get_message_number();
+
+	dispatch_null_message_hook = &compiler_result_handler;
+}
+
+int start_compiler_process (CleanString compiler_path,CleanString compiler_directory,CleanString command,
+							int *compiler_thread_id_p,int *compiler_thread_handle_p,int *compiler_process_handle_p)
+{
+	PSTR application_name,command_line,env,dir;
+	STARTUPINFO si;
+	PROCESS_INFORMATION pi;
+	int r;
+
+	if (!compiler_result_handler_installed){
+		install_compiler_result_handler();
+		compiler_result_handler_installed=1;
+	}
+
+	application_name=CleanStringCharacters (compiler_path);
+	dir=CleanStringCharacters (compiler_directory);
+	command_line=CleanStringCharacters (command);
+	env=NULL;
+	
+	si.cb = sizeof (STARTUPINFO);
+	si.lpReserved = NULL;
+	si.lpReserved2 = NULL;
+	si.cbReserved2 = 0;
+	si.lpDesktop = NULL;
+	si.lpTitle = NULL;
+	si.dwFlags = 0;
+
+	r=CreateProcess (application_name,command_line,NULL,NULL,TRUE,DETACHED_PROCESS/*0*/,env,dir,&si,&pi);
+
+	if (r!=0){
+		*compiler_thread_id_p=pi.dwThreadId;
+		*compiler_thread_handle_p=pi.hThread;
+		*compiler_process_handle_p=pi.hProcess;
+	} else {
+		*compiler_thread_id_p=0;
+		*compiler_thread_handle_p=0;
+		*compiler_process_handle_p=0;
+	}
+	
+	return r;
+}
+
+int get_finished_compiler_id_and_exit_code (int *exit_code_p)
+{
+	int compiler_n;
+	
+	for (compiler_n=0; compiler_n<MAX_N_COMPILERS; ++compiler_n)
+		if (compiler_finished[compiler_n]){
+			*exit_code_p=compiler_exit_codes[compiler_n];
+			compiler_finished[compiler_n]=0;
+			return compiler_n;
+		}
+	
+	*exit_code_p=0;
+	return -1;
+}
+#endif
+
+int get_integers_from_message (int wm_number,int *i1_p,int *i2_p)
+{
+	MSG message;
+	int r;
+
+	r=GetMessage (&message,NULL,wm_number,wm_number);
+
+	if (r!=0){
+		*i1_p=message.wParam;
+		*i2_p=message.lParam;
+	} else {
+		*i1_p=0;
+		*i2_p=0;
+	}
+	
+	return r;
+}
+
+#define PM_QS_POSTMESSAGE   ((QS_POSTMESSAGE | QS_HOTKEY | QS_TIMER) << 16)
+
+int get_integers_from_thread_message (int wm_number,int thread_handle,int *i1_p,int *i2_p)
+{
+	MSG message;
+	int r;
+
+	r=PeekMessage (&message,INVALID_HANDLE_VALUE,wm_number,wm_number,PM_NOREMOVE | (QS_POSTMESSAGE<<16));
+	while (r==0){
+		r=MsgWaitForMultipleObjects (1,&thread_handle,0,INFINITE,QS_POSTMESSAGE);
+
+		if (r==-1 || r==WAIT_OBJECT_0 || r==WAIT_ABANDONED_0){
+			*i1_p=0;
+			*i2_p=0;
+			return 0;
+		}
+
+		r=PeekMessage (&message,INVALID_HANDLE_VALUE,wm_number,wm_number,PM_NOREMOVE | (QS_POSTMESSAGE<<16));
+	}
+
+	r=PeekMessage (&message,INVALID_HANDLE_VALUE,wm_number,wm_number,PM_REMOVE | (QS_POSTMESSAGE<<16));
+/*	r=GetMessage (&message,INVALID_HANDLE_VALUE,wm_number,wm_number); */
+
+	if (r!=0){
+		*i1_p=message.wParam;
+		*i2_p=message.lParam;
+	} else {
+		*i1_p=0;
+		*i2_p=0;
+	}
+	
+	return r;
+}
+
+int get_string_from_file_map_and_delete_map (int file_map,CleanString s)
+{
+	int l,i;
+	char *chars,*p;
+	
+	chars=CleanStringCharacters (s);
+	l=CleanStringLength (s);
+	
+	p=MapViewOfFile ((HANDLE)file_map,FILE_MAP_ALL_ACCESS,0,0,l);
+	if (p==NULL)
+		return 0;
+
+	for (i=0; i<l; ++i)
+		chars[i]=p[i];
+				
+	UnmapViewOfFile (p);
+
+	CloseHandle ((HANDLE)file_map);
+	
+	return 1;
+}
+
+int send_string_to_thread (int thread_id,int process_handle,int wm_number,CleanString s)
+{
+	HANDLE file_map,file_map2;
+	char *chars,*p1;
+	int r,l;
+	/*
+	int a;
+	*/
+
+	chars=CleanStringCharacters (s);
+	l=CleanStringLength (s);
+	
+	if (l==0 || chars[l-1]!='\0')
+		return 0;
+
+	file_map=CreateFileMapping ((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,l,NULL);
+	if (file_map==NULL)
+		return 0;
+
+	p1=MapViewOfFile (file_map,FILE_MAP_ALL_ACCESS,0,0,l);
+	if (p1==NULL)
+		return 0;
+		
+	{
+		char *s_p,*d_p,c;
+		
+		s_p=chars;
+		d_p=p1;
+		do {
+			c=*s_p++;
+			*d_p++=c;
+		} while (c!='\0');
+	}
+	
+	UnmapViewOfFile (p1);
+
+	r=DuplicateHandle (GetCurrentProcess(),file_map,(HANDLE)process_handle,&file_map2,0,0,DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS);
+
+	if (r==0)
+		return 0;
+
+	do {
+		/*
+		r=PostThreadMessage (thread_id,wm_number,a,l);
+		*/
+		r=PostThreadMessage (thread_id,wm_number,l,(int)file_map2);
+	} while (r==0);
+	
+	return r;
+}
+
+int send_integers_to_thread (int thread_id,int wm_number,int i1,int i2)
+{
+	int r;
+		
+	do {
+		r=PostThreadMessage (thread_id,wm_number,i1,i2);
+	} while (r==0);
+	
+	return r;
+}
+
+int compiler_id=-1;
+
+int set_compiler_id (int compiler_id_p)
+{
+	compiler_id=compiler_id_p;
+	return compiler_id_p;
+}
+
+int get_compiler_id (void)
+{
+	return compiler_id;
+}
diff --git a/main/Windows/thread_message.h b/main/Windows/thread_message.h
new file mode 100644
index 0000000..e69de29
-- 
cgit v1.2.3