#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;
}