From 79f4e89182f131d4ce3273b6d77ff51145a47756 Mon Sep 17 00:00:00 2001 From: Alain Magloire Date: Thu, 29 Apr 2004 15:54:32 +0000 Subject: [PATCH] Commit support for i18n from Alex Chapiro. updates spawner and starter --- core/org.eclipse.cdt.core.win32/ChangeLog | 4 + .../library/Win32ProcessEx.c | 218 +++++++++--------- .../library/iostream.c | 54 +++-- .../library/raise.c | 15 +- .../library/spawner.c | 8 +- .../library/spawner.dsp | 8 +- .../library/starter/starter.cpp | 127 +++++----- .../os/win32/x86/spawner.dll | Bin 61440 -> 61440 bytes .../os/win32/x86/starter.exe | Bin 16384 -> 16384 bytes 9 files changed, 233 insertions(+), 201 deletions(-) diff --git a/core/org.eclipse.cdt.core.win32/ChangeLog b/core/org.eclipse.cdt.core.win32/ChangeLog index 624610e2450..25e25bd91c5 100644 --- a/core/org.eclipse.cdt.core.win32/ChangeLog +++ b/core/org.eclipse.cdt.core.win32/ChangeLog @@ -1,3 +1,7 @@ +2004-04-29 Alex Chapiro + + Support for I18N within spawner. + 2004-03-25 David Inglis Added platform attribute to processlist extension diff --git a/core/org.eclipse.cdt.core.win32/library/Win32ProcessEx.c b/core/org.eclipse.cdt.core.win32/library/Win32ProcessEx.c index 4379580730b..d69f02230bd 100644 --- a/core/org.eclipse.cdt.core.win32/library/Win32ProcessEx.c +++ b/core/org.eclipse.cdt.core.win32/library/Win32ProcessEx.c @@ -32,9 +32,6 @@ #define MAX_PROCS (100) // Maximum number of simultaneiously runnig processes -// Theses are VM helpers -typedef JNIEXPORT void * (JNICALL * JVM_GetThreadInterruptEvent)(); -typedef JNIEXPORT char * (JNICALL * JVM_NativePath)(const char *); // Process description block. Should be created for each launched process typedef struct _procInfo { @@ -64,7 +61,7 @@ pProcInfo_t findProcInfo(int pid); unsigned int _stdcall waitProcTermination(void* pv) ; // This is a helper function to prevent losing of quotatin marks -static int copyTo(char * target, const char * source, int cpyLenght, int availSpace); +static int copyTo(_TCHAR * target, const _TCHAR * source, int cpyLenght, int availSpace); // Use this function to clean project descriptor and return it to the pool of available blocks. static void cleanUpProcBlock(pProcInfo_t pCurProcInfo); @@ -82,7 +79,7 @@ typedef enum { extern CRITICAL_SECTION cs; -extern TCHAR path[MAX_PATH]; // Directory where spawner.dll is located +extern _TCHAR path[MAX_PATH]; // Directory where spawner.dll is located static HMODULE hVM = NULL; // VM handler @@ -104,14 +101,14 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0 { HANDLE stdHandles[3]; PROCESS_INFORMATION pi = {0}; - STARTUPINFO si; + STARTUPINFOW si; DWORD flags = 0; - char * cwd = NULL; + const _TCHAR * cwd = NULL; LPVOID envBlk = NULL; int ret = 0; - char szCmdLine[MAX_CMD_SIZE]; + _TCHAR szCmdLine[MAX_CMD_SIZE]; int nBlkSize = MAX_ENV_SIZE; - char * szEnvBlock = (char *)malloc(nBlkSize); + _TCHAR * szEnvBlock = (_TCHAR *)malloc(nBlkSize * sizeof(_TCHAR)); jsize nCmdTokens = 0; jsize nEnvVars = 0; int i; @@ -119,16 +116,16 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0 int nPos; pProcInfo_t pCurProcInfo; DWORD dwThreadId; - char eventBreakName[20]; - char eventWaitName[20]; - char eventTerminateName[20]; + _TCHAR eventBreakName[20]; + _TCHAR eventWaitName[20]; + _TCHAR eventTerminateName[20]; #ifdef DEBUG_MONITOR - char buffer[1000]; + _TCHAR buffer[1000]; #endif int nLocalCounter; - char inPipeName[PIPE_NAME_LENGTH]; - char outPipeName[PIPE_NAME_LENGTH]; - char errPipeName[PIPE_NAME_LENGTH]; + _TCHAR inPipeName[PIPE_NAME_LENGTH]; + _TCHAR outPipeName[PIPE_NAME_LENGTH]; + _TCHAR errPipeName[PIPE_NAME_LENGTH]; if((HIBYTE(LOWORD(GetVersion()))) & 0x80) { @@ -146,21 +143,21 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0 // Create pipe names EnterCriticalSection(&cs); - sprintf(inPipeName, "\\\\.\\pipe\\stdin%08i%010i", pid, nCounter); - sprintf(outPipeName, "\\\\.\\pipe\\stdout%08i%010i", pid, nCounter); - sprintf(errPipeName, "\\\\.\\pipe\\stderr%08i%010i", pid, nCounter); + _stprintf(inPipeName, _T("\\\\.\\pipe\\stdin%08i%010i"), pid, nCounter); + _stprintf(outPipeName, _T("\\\\.\\pipe\\stdout%08i%010i"), pid, nCounter); + _stprintf(errPipeName, _T("\\\\.\\pipe\\stderr%08i%010i"), pid, nCounter); nLocalCounter = nCounter; ++nCounter; LeaveCriticalSection(&cs); - if ((INVALID_HANDLE_VALUE == (stdHandles[0] = CreateNamedPipe(inPipeName, PIPE_ACCESS_OUTBOUND, + if ((INVALID_HANDLE_VALUE == (stdHandles[0] = CreateNamedPipeW(inPipeName, PIPE_ACCESS_OUTBOUND, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, PIPE_SIZE, PIPE_SIZE, PIPE_TIMEOUT, NULL))) || - (INVALID_HANDLE_VALUE == (stdHandles[1] = CreateNamedPipe(outPipeName, PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, + (INVALID_HANDLE_VALUE == (stdHandles[1] = CreateNamedPipeW(outPipeName, PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, PIPE_SIZE, PIPE_SIZE, PIPE_TIMEOUT, NULL))) || - (INVALID_HANDLE_VALUE == (stdHandles[2] = CreateNamedPipe(errPipeName, PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, + (INVALID_HANDLE_VALUE == (stdHandles[2] = CreateNamedPipeW(errPipeName, PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, PIPE_SIZE, PIPE_SIZE, PIPE_TIMEOUT, NULL)))) { CloseHandle(stdHandles[0]); @@ -171,8 +168,8 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0 } #ifdef DEBUG_MONITOR - sprintf(buffer, "Opened pipes: %s, %s, %s\n", inPipeName, outPipeName, errPipeName); - OutputDebugString(buffer); + _stprintf(buffer, _T("Opened pipes: %s, %s, %s\n"), inPipeName, outPipeName, errPipeName); + OutputDebugStringW(buffer); #endif @@ -188,25 +185,25 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0 } // Construct starter's command line - sprintf(eventBreakName, "SABreak%p", pCurProcInfo); - sprintf(eventWaitName, "SAWait%p", pCurProcInfo); - sprintf(eventTerminateName, "SATerm%p", pCurProcInfo); - pCurProcInfo -> eventBreak = CreateEvent(NULL, TRUE, FALSE, eventBreakName); + _stprintf(eventBreakName, _T("SABreak%p"), pCurProcInfo); + _stprintf(eventWaitName, _T("SAWait%p"), pCurProcInfo); + _stprintf(eventTerminateName, _T("SATerm%p"), pCurProcInfo); + pCurProcInfo -> eventBreak = CreateEventW(NULL, TRUE, FALSE, eventBreakName); ResetEvent(pCurProcInfo -> eventBreak); - pCurProcInfo -> eventWait = CreateEvent(NULL, TRUE, FALSE, eventWaitName); + pCurProcInfo -> eventWait = CreateEventW(NULL, TRUE, FALSE, eventWaitName); ResetEvent(pCurProcInfo -> eventWait); - pCurProcInfo -> eventTerminate = CreateEvent(NULL, TRUE, FALSE, eventTerminateName); + pCurProcInfo -> eventTerminate = CreateEventW(NULL, TRUE, FALSE, eventTerminateName); ResetEvent(pCurProcInfo -> eventTerminate); - nPos = sprintf(szCmdLine, "%sstarter.exe %i %i %s %s %s ", path, pid, nLocalCounter, eventBreakName, eventWaitName, eventTerminateName); + nPos = _stprintf(szCmdLine, _T("%sstarter.exe %i %i %s %s %s "), path, pid, nLocalCounter, eventBreakName, eventWaitName, eventTerminateName); // Prepare command line for(i = 0; i < nCmdTokens; ++i) { jobject item = (*env) -> GetObjectArrayElement(env, cmdarray, i); - jsize len = (*env) -> GetStringUTFLength(env, item); + jsize len = (*env) -> GetStringLength(env, item); int nCpyLen; - const char * str = (*env) -> GetStringUTFChars(env, item, 0); + const _TCHAR * str = (*env) -> GetStringChars(env, item, 0); if(NULL != str) { if(0 > (nCpyLen = copyTo(szCmdLine + nPos, str, len, MAX_CMD_SIZE - nPos))) @@ -215,13 +212,13 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0 return 0; } nPos += nCpyLen; - szCmdLine[nPos] = ' '; + szCmdLine[nPos] = _T(' '); ++nPos; - (*env) -> ReleaseStringUTFChars(env, item, str); + (*env) -> ReleaseStringChars(env, item, str); } } - szCmdLine[nPos] = '\0'; + szCmdLine[nPos] = _T('\0'); // Prepare environment block if (nEnvVars > 0) @@ -230,45 +227,47 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0 for(i = 0; i < nEnvVars; ++i) { jobject item = (*env) -> GetObjectArrayElement(env, envp, i); - jsize len = (*env) -> GetStringUTFLength(env, item); - const char * str = (*env) -> GetStringUTFChars(env, item, 0); + jsize len = (*env) -> GetStringLength(env, item); + const _TCHAR * str = (*env) -> GetStringChars(env, item, 0); if(NULL != str) { while((nBlkSize - nPos) <= (len + 2)) // +2 for two '\0' { nBlkSize += MAX_ENV_SIZE; - szEnvBlock = (char *)realloc(szEnvBlock, nBlkSize); + szEnvBlock = (_TCHAR *)realloc(szEnvBlock, nBlkSize * sizeof(_TCHAR)); if(NULL == szEnvBlock) { ThrowByName(env, "java/io/IOException", "Not enough memory"); return 0; } #ifdef DEBUG_MONITOR - sprintf(buffer, "Realloc environment block; new length is %i \n", nBlkSize); - OutputDebugString(buffer); + _stprintf(buffer, _T("Realloc environment block; new length is %i \n"), nBlkSize); + OutputDebugStringW(buffer); #endif } - strncpy(szEnvBlock + nPos, str, len); +#ifdef DEBUG_MONITOR + _stprintf(buffer, _T("%s\n"), str); + OutputDebugStringW(buffer); +#endif + _tcsnccpy(szEnvBlock + nPos, str, len); nPos += len; - szEnvBlock[nPos] = '\0'; + szEnvBlock[nPos] = _T('\0'); ++nPos; - (*env) -> ReleaseStringUTFChars(env, item, str); + (*env) -> ReleaseStringChars(env, item, str); } } - szEnvBlock[nPos] = '\0'; - envBlk = szEnvBlock; } if (dir != 0) { - const char * str = (*env) -> GetStringUTFChars(env, dir, 0); + const _TCHAR * str = (*env) -> GetStringChars(env, dir, 0); if(NULL != str) { - cwd = strdup(str); - (*env) -> ReleaseStringUTFChars(env, dir, str); + cwd = _tcsdup(str); + (*env) -> ReleaseStringChars(env, dir, str); } } @@ -286,13 +285,14 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0 flags = CREATE_NEW_CONSOLE; flags |= CREATE_NO_WINDOW; + flags |= CREATE_UNICODE_ENVIRONMENT; #ifdef DEBUG_MONITOR - OutputDebugString(szCmdLine); + OutputDebugStringW(szCmdLine); #endif // launches starter; we need it to create another console group to correctly process // emulation of SYSint signal (Ctrl-C) - ret = CreateProcess(0, /* executable name */ + ret = CreateProcessW(0, /* executable name */ szCmdLine, /* command line */ 0, /* process security attribute */ 0, /* thread security attribute */ @@ -306,13 +306,13 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0 if(NULL != cwd) - free(cwd); + free((void *)cwd); free(szEnvBlock); if (!ret) // Launching error { - LPTSTR lpMsgBuf; + char * lpMsgBuf; CloseHandle(stdHandles[0]); CloseHandle(stdHandles[1]); @@ -324,7 +324,7 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0 NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (LPTSTR) &lpMsgBuf, + (char *)&lpMsgBuf, 0, NULL ); @@ -354,11 +354,14 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0 if((what != WAIT_OBJECT_0) && (pCurProcInfo -> pid > 0)) // CreateProcess failed { #ifdef DEBUG_MONITOR - sprintf(buffer, "Process %i failed\n", pi.dwProcessId); - OutputDebugString(buffer); + _stprintf(buffer, _T("Process %i failed\n"), pi.dwProcessId); + OutputDebugStringW(buffer); #endif cleanUpProcBlock(pCurProcInfo); ThrowByName(env, "java/io/IOException", "Launching failed"); +#ifdef DEBUG_MONITOR + OutputDebugStringW(_T("Process failed\n")); +#endif } else { @@ -369,12 +372,12 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0 file_handles[1] = (int)stdHandles[1]; file_handles[2] = (int)stdHandles[2]; (*env) -> SetIntArrayRegion(env, channels, 0, 3, file_handles); +#ifdef DEBUG_MONITOR + OutputDebugStringW(_T("Process started\n")); +#endif } CloseHandle(h[1]); LeaveCriticalSection(&cs); -#ifdef DEBUG_MONITOR - OutputDebugString("Process started\n"); -#endif } @@ -397,18 +400,18 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec1 SECURITY_ATTRIBUTES sa; PROCESS_INFORMATION pi = {0}; - STARTUPINFO si; + STARTUPINFOW si; DWORD flags = 0; - char * cwd = NULL; - LPVOID envBlk = NULL; + _TCHAR * cwd = NULL; + _TCHAR * envBlk = NULL; int ret = 0; jsize nCmdTokens = 0; jsize nEnvVars = 0; int i; int nPos; - char szCmdLine[MAX_CMD_SIZE]; + _TCHAR szCmdLine[MAX_CMD_SIZE]; int nBlkSize = MAX_ENV_SIZE; - char * szEnvBlock = (char *)malloc(nBlkSize); + _TCHAR * szEnvBlock = (_TCHAR *)malloc(nBlkSize * sizeof(_TCHAR)); sa.nLength = sizeof(sa); @@ -425,9 +428,9 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec1 for(i = 0; i < nCmdTokens; ++i) { jobject item = (*env) -> GetObjectArrayElement(env, cmdarray, i); - jsize len = (*env) -> GetStringUTFLength(env, item); + jsize len = (*env) -> GetStringLength(env, item); int nCpyLen; - const char * str = (*env) -> GetStringUTFChars(env, item, 0); + const _TCHAR * str = (*env) -> GetStringChars(env, item, 0); if(NULL != str) { if(0 > (nCpyLen = copyTo(szCmdLine + nPos, str, len, MAX_CMD_SIZE - nPos))) @@ -436,13 +439,13 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec1 return 0; } nPos += nCpyLen; - szCmdLine[nPos] = ' '; + szCmdLine[nPos] = _T(' '); ++nPos; - (*env) -> ReleaseStringUTFChars(env, item, str); + (*env) -> ReleaseStringChars(env, item, str); } } - szCmdLine[nPos] = '\0'; + szCmdLine[nPos] = _T('\0'); // Prepare environment block if (nEnvVars > 0) @@ -451,28 +454,28 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec1 for(i = 0; i < nEnvVars; ++i) { jobject item = (*env) -> GetObjectArrayElement(env, envp, i); - jsize len = (*env) -> GetStringUTFLength(env, item); - const char * str = (*env) -> GetStringUTFChars(env, item, 0); + jsize len = (*env) -> GetStringLength(env, item); + const _TCHAR * str = (*env) -> GetStringChars(env, item, 0); if(NULL != str) { while((nBlkSize - nPos) <= (len + 2)) // +2 for two '\0' { nBlkSize += MAX_ENV_SIZE; - szEnvBlock = (char *)realloc(szEnvBlock, nBlkSize); + szEnvBlock = (_TCHAR *)realloc(szEnvBlock, nBlkSize * sizeof(_TCHAR)); if(NULL == szEnvBlock) { ThrowByName(env, "java/io/Exception", "Not enough memory"); return 0; } } - strncpy(szEnvBlock + nPos, str, len); + _tcsnccpy(szEnvBlock + nPos, str, len); nPos += len; - szEnvBlock[nPos] = '\0'; + szEnvBlock[nPos] = _T('\0'); ++nPos; - (*env) -> ReleaseStringUTFChars(env, item, str); + (*env) -> ReleaseStringChars(env, item, str); } } - szEnvBlock[nPos] = '\0'; + szEnvBlock[nPos] = _T('\0'); envBlk = szEnvBlock; } @@ -480,11 +483,11 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec1 if (dir != 0) { - const char * str = (*env) -> GetStringUTFChars(env, dir, 0); + const _TCHAR * str = (*env) -> GetStringChars(env, dir, 0); if(NULL != str) { - cwd = strdup(str); - (*env) -> ReleaseStringUTFChars(env, dir, str); + cwd = _tcsdup(str); + (*env) -> ReleaseStringChars(env, dir, str); } } @@ -498,7 +501,7 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec1 flags = CREATE_NEW_CONSOLE; - ret = CreateProcess(0, /* executable name */ + ret = CreateProcessW(0, /* executable name */ szCmdLine, /* command line */ 0, /* process security attribute */ 0, /* thread security attribute */ @@ -517,7 +520,7 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec1 if (!ret) // error { - LPTSTR lpMsgBuf; + char * lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | @@ -526,9 +529,9 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec1 NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (LPTSTR) &lpMsgBuf, - 0, - NULL + (char *)&lpMsgBuf, + 0, + NULL ); ThrowByName(env, "java/io/IOException", lpMsgBuf); // Free the buffer. @@ -563,7 +566,7 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_raise HANDLE hProc; pProcInfo_t pCurProcInfo = findProcInfo(uid); #ifdef DEBUG_MONITOR - char buffer[100]; + _TCHAR buffer[100]; #endif if(NULL == pCurProcInfo) { @@ -574,8 +577,8 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_raise } #ifdef DEBUG_MONITOR - sprintf(buffer, "Spawner received signal %i for process %i\n", signal, pCurProcInfo -> pid); - OutputDebugString(buffer); + _stprintf(buffer, _T("Spawner received signal %i for process %i\n"), signal, pCurProcInfo -> pid); + OutputDebugStringW(buffer); #endif hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, pCurProcInfo -> pid); @@ -596,12 +599,13 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_raise case SIG_KILL: case SIG_TERM: #ifdef DEBUG_MONITOR - sprintf(buffer, "Spawner received KILL or TERM signal for process %i\n", pCurProcInfo -> pid); - OutputDebugString(buffer); + _stprintf(buffer, _T("Spawner received KILL or TERM signal for process %i\n"), + pCurProcInfo -> pid); + OutputDebugStringW(buffer); #endif SetEvent(pCurProcInfo -> eventTerminate); #ifdef DEBUG_MONITOR - OutputDebugString("Spawner signalled KILL event\n"); + OutputDebugStringW(_T("Spawner signalled KILL event\n")); #endif ret = 0; break; @@ -780,7 +784,7 @@ unsigned int _stdcall waitProcTermination(void* pv) int i; int pid = (int)pv; #ifdef DEBUG_MONITOR - char buffer[1000]; + _TCHAR buffer[1000]; #endif HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, pid); @@ -788,16 +792,18 @@ unsigned int _stdcall waitProcTermination(void* pv) if(NULL == hProc) { #ifdef DEBUG_MONITOR - sprintf(buffer, "waitProcTermination: cannot get handler for PID %i (error %i)\n", pid, GetLastError()); - OutputDebugString(buffer); + _stprintf(buffer, _T("waitProcTermination: cannot get handler for PID %i (error %i)\n"), + pid, + GetLastError()); + OutputDebugStringW(buffer); #endif } else { WaitForSingleObject(hProc, INFINITE); #ifdef DEBUG_MONITOR - sprintf(buffer, "Process PID %i terminated\n", pid); - OutputDebugString(buffer); + _stprintf(buffer, _T("Process PID %i terminated\n"), pid); + OutputDebugStringW(buffer); #endif } @@ -808,8 +814,10 @@ unsigned int _stdcall waitProcTermination(void* pv) if(WaitForSingleObject(pInfo[i].eventWait, 1) == WAIT_OBJECT_0) // Correct finish { #ifdef DEBUG_MONITOR - sprintf(buffer, "waitProcTermination: set PID %i to 0\n", pid, GetLastError()); - OutputDebugString(buffer); + _stprintf(buffer, _T("waitProcTermination: set PID %i to 0\n"), + pid, + GetLastError()); + OutputDebugStringW(buffer); #endif cleanUpProcBlock(pInfo + i); } @@ -832,7 +840,7 @@ unsigned int _stdcall waitProcTermination(void* pv) // availSpace - size of the target buffer // Return :number of bytes used in target, or -1 in case of error ///////////////////////////////////////////////////////////////////////////////////// -int copyTo(char * target, const char * source, int cpyLength, int availSpace) +int copyTo(_TCHAR * target, const _TCHAR * source, int cpyLength, int availSpace) { BOOL bSlash = FALSE; int i = 0, j = 0; @@ -849,12 +857,12 @@ int copyTo(char * target, const char * source, int cpyLength, int availSpace) if(availSpace <= cpyLength) // = to reserve space for final '\0' return -1; - if(('\"' == *source) && ('\"' == *(source + cpyLength - 1))) + if((_T('\"') == *source) && (_T('\"') == *(source + cpyLength - 1))) { nQuotationMode = QUOTATION_DONE; } else - if(strchr(source, ' ') == NULL) + if(_tcschr(source, _T(' ')) == NULL) { // No reason to quotate term becase it doesn't have embedded spaces nQuotationMode = QUOTATION_NONE; @@ -863,25 +871,25 @@ int copyTo(char * target, const char * source, int cpyLength, int availSpace) { // Needs to be quotated nQuotationMode = QUOTATION_DO; - *target = '\"'; + *target = _T('\"'); ++j; } for(; i < cpyLength; ++i, ++j) { - if(source[i] == '\\') + if(source[i] == _T('\\')) bSlash = TRUE; else { // Don't escape embracing quotation marks - if((source[i] == '\"') && !((nQuotationMode == QUOTATION_DONE) && ((i == 0) || (i == (cpyLength - 1))) ) ) + if((source[i] == _T('\"')) && !((nQuotationMode == QUOTATION_DONE) && ((i == 0) || (i == (cpyLength - 1))) ) ) { if(!bSlash) // If still not escaped { if(j == availSpace) return -1; - target[j] = '\\'; + target[j] = _T('\\'); ++j; } } @@ -897,7 +905,7 @@ int copyTo(char * target, const char * source, int cpyLength, int availSpace) { if(j == availSpace) return -1; - target[j] = '\"'; + target[j] = _T('\"'); ++j; } diff --git a/core/org.eclipse.cdt.core.win32/library/iostream.c b/core/org.eclipse.cdt.core.win32/library/iostream.c index 2c091176775..01bc078e3c0 100644 --- a/core/org.eclipse.cdt.core.win32/library/iostream.c +++ b/core/org.eclipse.cdt.core.win32/library/iostream.c @@ -23,6 +23,7 @@ #include "jni.h" #include "io.h" +//#define READ_REPORT JNIEXPORT void JNICALL ThrowByName(JNIEnv *env, const char *name, const char *msg); @@ -40,7 +41,7 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_rea BYTE tmpBuf[BUFF_SIZE]; int nBuffOffset = 0; #ifdef DEBUG_MONITOR - char buffer[1000]; + _TCHAR buffer[1000]; #endif OVERLAPPED overlapped; overlapped.Offset = 0; @@ -51,7 +52,7 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_rea NULL); // unnamed event object if(NULL == overlapped.hEvent) { - LPTSTR lpMsgBuf; + char * lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | @@ -59,17 +60,21 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_rea NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (LPTSTR) &lpMsgBuf, + (char *) &lpMsgBuf, 0, NULL ); ThrowByName(env, "java/io/IOException", lpMsgBuf); + // Free the buffer. + LocalFree( lpMsgBuf ); } #ifdef DEBUG_MONITOR - sprintf(buffer, "Start read %i\n", fd); - OutputDebugString(buffer); +#ifdef READ_REPORT + _stprintf(buffer, _T("Start read %i\n"), fd); + OutputDebugStringW(buffer); +#endif #endif while(len > nBuffOffset) @@ -95,11 +100,10 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_rea break; if(err != 0) { - LPTSTR lpMsgBuf; + char * lpMsgBuf; #ifdef DEBUG_MONITOR - char buffer[200]; - sprintf(buffer, "Read failed - %i, error %i\n", fd, err); - OutputDebugString(buffer); + _stprintf(buffer, _T("Read failed - %i, error %i\n"), fd, err); + OutputDebugStringW(buffer); #endif if(err != ERROR_MORE_DATA) // Otherwise error means just that there are more data { // than buffer can accept @@ -110,7 +114,7 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_rea NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (LPTSTR) &lpMsgBuf, + (char *) &lpMsgBuf, 0, NULL ); @@ -132,8 +136,10 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_rea } CloseHandle(overlapped.hEvent); #ifdef DEBUG_MONITOR - sprintf(buffer, "End read %i\n", fd); - OutputDebugString(buffer); +#ifdef READ_REPORT + _stprintf(buffer, _T("End read %i\n"), fd); + OutputDebugStringW(buffer); +#endif #endif return nBuffOffset; // This is a real full readed length @@ -149,15 +155,15 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_clo { int rc; #ifdef DEBUG_MONITOR - char buffer[1000]; - sprintf(buffer, "Close %i\n", fd); - OutputDebugString(buffer); + _TCHAR buffer[1000]; + _stprintf(buffer, _T("Close %i\n"), fd); + OutputDebugStringW(buffer); #endif DisconnectNamedPipe((HANDLE)fd); rc = (CloseHandle((HANDLE)fd) ? 0 : -1); #ifdef DEBUG_MONITOR - sprintf(buffer, "Closed %i\n", fd); - OutputDebugString(buffer); + _stprintf(buffer, _T("Closed %i\n"), fd); + OutputDebugStringW(buffer); #endif return (rc ? GetLastError() : 0); } @@ -181,7 +187,7 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_wr (*env) -> GetByteArrayRegion(env, buf, nBuffOffset, nNumberOfBytesToWrite, tmpBuf); if(0 == WriteFile((HANDLE)fd, tmpBuf, nNumberOfBytesToWrite, &nNumberOfBytesWritten, NULL)) { - LPTSTR lpMsgBuf; + char * lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | @@ -189,7 +195,7 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_wr NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (LPTSTR) &lpMsgBuf, + (char *) &lpMsgBuf, 0, NULL ); @@ -213,15 +219,15 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_cl { int rc; #ifdef DEBUG_MONITOR - char buffer[1000]; - sprintf(buffer, "Close %i\n", fd); - OutputDebugString(buffer); + _TCHAR buffer[1000]; + _stprintf(buffer, _T("Close %i\n"), fd); + OutputDebugStringW(buffer); #endif DisconnectNamedPipe((HANDLE)fd); rc = (CloseHandle((HANDLE)fd) ? 0 : -1); #ifdef DEBUG_MONITOR - sprintf(buffer, "Closed %i\n", fd); - OutputDebugString(buffer); + _stprintf(buffer, _T("Closed %i\n"), fd); + OutputDebugStringW(buffer); #endif return (rc ? GetLastError() : 0); } diff --git a/core/org.eclipse.cdt.core.win32/library/raise.c b/core/org.eclipse.cdt.core.win32/library/raise.c index b4305e222f4..ecd8bedbac8 100644 --- a/core/org.eclipse.cdt.core.win32/library/raise.c +++ b/core/org.eclipse.cdt.core.win32/library/raise.c @@ -64,7 +64,7 @@ find_child_console (HWND hwnd, LPARAM arg) int interruptProcess(int pid) { #ifdef DEBUG_MONITOR - char buffer[1000]; + _TCHAR buffer[1000]; #endif int rc; // Try another method @@ -72,8 +72,8 @@ int interruptProcess(int pid) consoleHWND = NULL; #ifdef DEBUG_MONITOR - sprintf(buffer, "Try to interrupt process %i\n", pid); - OutputDebugString(buffer); + _stprintf(buffer, _T("Try to interrupt process %i\n"), pid); + OutputDebugStringW(buffer); #endif // Find console EnumWindows (find_child_console, (LPARAM) pid); @@ -140,16 +140,15 @@ int interruptProcess(int pid) AttachThreadInput (GetCurrentThreadId (), child_thread, FALSE); #ifdef DEBUG_MONITOR - sprintf(buffer, "Sent Ctrl-C & Ctrl-Break to process %i\n", pid); - OutputDebugString(buffer); + _stprintf(buffer, _T("Sent Ctrl-C & Ctrl-Break to process %i\n"), pid); + OutputDebugStringW(buffer); #endif } } #ifdef DEBUG_MONITOR else { - sprintf(buffer, "Cannot find console for process %i\n", pid); - - OutputDebugString(buffer); + _stprintf(buffer, _T("Cannot find console for process %i\n"), pid); + OutputDebugStringW(buffer); } #endif diff --git a/core/org.eclipse.cdt.core.win32/library/spawner.c b/core/org.eclipse.cdt.core.win32/library/spawner.c index b32679980b3..6ada9da075e 100644 --- a/core/org.eclipse.cdt.core.win32/library/spawner.c +++ b/core/org.eclipse.cdt.core.win32/library/spawner.c @@ -20,7 +20,7 @@ CRITICAL_SECTION cs; -TCHAR path[MAX_PATH + 1] = {_T('\0') }; // Directory where spawner.dll is located +_TCHAR path[MAX_PATH + 1] = {_T('\0') }; // Directory where spawner.dll is located BOOL APIENTRY DllMain( HANDLE hModule, @@ -32,14 +32,14 @@ BOOL APIENTRY DllMain( HANDLE hModule, { case DLL_PROCESS_ATTACH: { - LPTSTR p; + _TCHAR * p; InitializeCriticalSection(&cs); - GetModuleFileName(hModule, path, MAX_PATH); + GetModuleFileNameW(hModule, path, MAX_PATH); p = _tcsrchr(path, _T('\\')); if(NULL != p) *(p + 1) = _T('\0'); else - _tcscat(path, "\\"); + _tcscat(path, _T("\\")); } break; case DLL_THREAD_ATTACH: diff --git a/core/org.eclipse.cdt.core.win32/library/spawner.dsp b/core/org.eclipse.cdt.core.win32/library/spawner.dsp index 272158054a9..abfb8eedbfc 100644 --- a/core/org.eclipse.cdt.core.win32/library/spawner.dsp +++ b/core/org.eclipse.cdt.core.win32/library/spawner.dsp @@ -43,7 +43,7 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SPAWNER_EXPORTS" /Yu"stdafx.h" /FD /c -# ADD CPP /nologo /Gz /MT /W3 /GX /O2 /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\Win32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SPAWNER_EXPORTS" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /Gz /MT /W3 /GX /O2 /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\Win32" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "_USRDLL" /D "SPAWNER_EXPORTS" /Yu"stdafx.h" /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" @@ -69,7 +69,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SPAWNER_EXPORTS" /Yu"stdafx.h" /FD /GZ /c -# ADD CPP /nologo /Gz /MD /W3 /Gm /GX /ZI /Od /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\Win32" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SPAWNER_EXPORTS" /FR /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /Gz /MD /W3 /Gm /GX /ZI /Od /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\Win32" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "_USRDLL" /D "SPAWNER_EXPORTS" /FR /Yu"stdafx.h" /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" @@ -96,7 +96,7 @@ SOURCE=.\iostream.c !IF "$(CFG)" == "spawner - Win32 Release" -# ADD CPP /I "E:\Java\jdk1.3.1\include" /I "E:\Java\jdk1.3.1\include\Win32" +# ADD CPP /I "E:\Java\jdk1.3.1\include" /I "E:\Java\jdk1.3.1\include\Win32" /FAcs !ELSEIF "$(CFG)" == "spawner - Win32 Debug" @@ -141,7 +141,7 @@ SOURCE=.\Win32ProcessEx.c !IF "$(CFG)" == "spawner - Win32 Release" -# ADD CPP /I "E:\Java\jdk1.3.1\include" /I "E:\Java\jdk1.3.1\include\Win32" +# ADD CPP /I "E:\Java\jdk1.3.1\include" /I "E:\Java\jdk1.3.1\include\Win32" /FAcs !ELSEIF "$(CFG)" == "spawner - Win32 Debug" diff --git a/core/org.eclipse.cdt.core.win32/library/starter/starter.cpp b/core/org.eclipse.cdt.core.win32/library/starter/starter.cpp index 7939182bf54..a60e8ac5b32 100644 --- a/core/org.eclipse.cdt.core.win32/library/starter/starter.cpp +++ b/core/org.eclipse.cdt.core.win32/library/starter/starter.cpp @@ -25,7 +25,8 @@ #define MAX_CMD_LINE_LENGTH (2049) #define PIPE_NAME_LENGTH 100 -int copyTo(char * target, const char * source, int cpyLength, int availSpace); +int copyTo(_TCHAR * target, const _TCHAR * source, int cpyLength, int availSpace); +void DisplayErrorMessage(); /////////////////////////////////////////////////////////////////////////////// BOOL WINAPI HandlerRoutine( DWORD dwCtrlType) // control signal type @@ -54,17 +55,17 @@ BOOL WINAPI HandlerRoutine( DWORD dwCtrlType) // control signal type -extern "C" int _tmain(int argc, TCHAR* argv[]) { +extern "C" int _tmain(int argc, _TCHAR * argv[]) { // Make sure that we've been passed the right number of arguments if (argc < 7) { - _tprintf(__TEXT("Usage: %s (Three InheritableEventHandles) (CommandLineToSpawn)\n"), + _tprintf(_T("Usage: %s (Three InheritableEventHandles) (CommandLineToSpawn)\n"), argv[0]); return(0); } // Construct the full command line - TCHAR szCmdLine[MAX_CMD_LINE_LENGTH] = { 0 }; + _TCHAR szCmdLine[MAX_CMD_LINE_LENGTH] = { 0 }; int nPos = 0; for(int i = 6; i < argc; ++i) @@ -73,7 +74,7 @@ extern "C" int _tmain(int argc, TCHAR* argv[]) { if(0 > (nCpyLen = copyTo(szCmdLine + nPos, argv[i], _tcslen(argv[i]), MAX_CMD_LINE_LENGTH - nPos))) { #ifdef DEBUG_MONITOR - OutputDebugString("Not enough space to build command line\n"); + OutputDebugStringW(_T("Not enough space to build command line\n")); #endif return 0; } @@ -83,34 +84,34 @@ extern "C" int _tmain(int argc, TCHAR* argv[]) { } szCmdLine[nPos] = _T('\0'); - STARTUPINFO si = { sizeof(si) }; + STARTUPINFOW si = { sizeof(si) }; PROCESS_INFORMATION pi = { 0 }; DWORD dwExitCode = 0; #ifdef DEBUG_MONITOR int currentPID = GetCurrentProcessId(); - char buffer[MAX_CMD_LINE_LENGTH]; + _TCHAR buffer[MAX_CMD_LINE_LENGTH]; #endif BOOL exitProc = FALSE; - HANDLE waitEvent = OpenEvent(EVENT_ALL_ACCESS, TRUE, argv[4]); + HANDLE waitEvent = OpenEventW(EVENT_ALL_ACCESS, TRUE, argv[4]); HANDLE h[3]; - h[0] = OpenEvent(EVENT_ALL_ACCESS, TRUE, argv[3]); - h[2] = OpenEvent(EVENT_ALL_ACCESS, TRUE, argv[5]); // This is a terminate event + h[0] = OpenEventW(EVENT_ALL_ACCESS, TRUE, argv[3]); + h[2] = OpenEventW(EVENT_ALL_ACCESS, TRUE, argv[5]); // This is a terminate event SetConsoleCtrlHandler(HandlerRoutine, TRUE); - int parentPid = strtol(argv[1], NULL, 10); - int nCounter = strtol(argv[2], NULL, 10); - char inPipeName[PIPE_NAME_LENGTH]; - char outPipeName[PIPE_NAME_LENGTH]; - char errPipeName[PIPE_NAME_LENGTH]; + int parentPid = _tcstol(argv[1], NULL, 10); + int nCounter = _tcstol(argv[2], NULL, 10); + _TCHAR inPipeName[PIPE_NAME_LENGTH]; + _TCHAR outPipeName[PIPE_NAME_LENGTH]; + _TCHAR errPipeName[PIPE_NAME_LENGTH]; - sprintf(inPipeName, "\\\\.\\pipe\\stdin%08i%010i", parentPid, nCounter); - sprintf(outPipeName, "\\\\.\\pipe\\stdout%08i%010i", parentPid, nCounter); - sprintf(errPipeName, "\\\\.\\pipe\\stderr%08i%010i", parentPid, nCounter); + _stprintf(inPipeName, _T("\\\\.\\pipe\\stdin%08i%010i"), parentPid, nCounter); + _stprintf(outPipeName, _T("\\\\.\\pipe\\stdout%08i%010i"), parentPid, nCounter); + _stprintf(errPipeName, _T("\\\\.\\pipe\\stderr%08i%010i"), parentPid, nCounter); #ifdef DEBUG_MONITOR - sprintf(buffer, "Pipes: %s, %s, %s\n", inPipeName, outPipeName, errPipeName); - OutputDebugString(buffer); + _stprintf(buffer, _T("Pipes: %s, %s, %s\n"), inPipeName, outPipeName, errPipeName); + OutputDebugStringW(buffer); #endif HANDLE stdHandles[3]; @@ -120,13 +121,13 @@ extern "C" int _tmain(int argc, TCHAR* argv[]) { sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; - if((INVALID_HANDLE_VALUE == (stdHandles[0] = CreateFile(inPipeName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, &sa))) || - (INVALID_HANDLE_VALUE == (stdHandles[1] = CreateFile(outPipeName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, &sa))) || - (INVALID_HANDLE_VALUE == (stdHandles[2] = CreateFile(errPipeName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, &sa)))) + if((INVALID_HANDLE_VALUE == (stdHandles[0] = CreateFileW(inPipeName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, &sa))) || + (INVALID_HANDLE_VALUE == (stdHandles[1] = CreateFileW(outPipeName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, &sa))) || + (INVALID_HANDLE_VALUE == (stdHandles[2] = CreateFileW(errPipeName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, &sa)))) { #ifdef DEBUG_MONITOR - sprintf(buffer, "Failed to open pipe %i, %i, %i: %i\n", stdHandles[0], stdHandles[1], stdHandles[2], GetLastError()); - OutputDebugString(buffer); + _stprintf(buffer, _T("Failed to open pipe %i, %i, %i: %i\n"), stdHandles[0], stdHandles[1], stdHandles[2], GetLastError()); + OutputDebugStringW(buffer); #endif CloseHandle(stdHandles[0]); CloseHandle(stdHandles[1]); @@ -141,8 +142,8 @@ extern "C" int _tmain(int argc, TCHAR* argv[]) { !SetStdHandle(STD_OUTPUT_HANDLE, stdHandles[1]) || !SetStdHandle(STD_ERROR_HANDLE, stdHandles[2])) { #ifdef DEBUG_MONITOR - sprintf(buffer, "Failed to reassign standard streams: %i\n", GetLastError()); - OutputDebugString(buffer); + _stprintf(buffer, _T("Failed to reassign standard streams: %i\n"), GetLastError()); + OutputDebugStringW(buffer); #endif CloseHandle(stdHandles[0]); CloseHandle(stdHandles[1]); @@ -150,19 +151,22 @@ extern "C" int _tmain(int argc, TCHAR* argv[]) { return -1;; } +#ifdef DEBUG_MONITOR + _stprintf(buffer, _T("Starting: %s\n"), szCmdLine); + OutputDebugStringW(buffer); +#endif // Spawn the other processes as part of this Process Group - BOOL f = CreateProcess(NULL, szCmdLine, NULL, NULL, TRUE, + BOOL f = CreateProcessW(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi); // We don't need them any more CloseHandle(stdHandles[0]); CloseHandle(stdHandles[1]); CloseHandle(stdHandles[2]); - if (f) - { + if (f) { #ifdef DEBUG_MONITOR - sprintf(buffer, "Process %i started\n", pi.dwProcessId); - OutputDebugString(buffer); + _stprintf(buffer, _T("Process %i started\n"), pi.dwProcessId); + OutputDebugStringW(buffer); #endif SetEvent(waitEvent); // Means thar process has been spawned CloseHandle(pi.hThread); @@ -175,8 +179,8 @@ extern "C" int _tmain(int argc, TCHAR* argv[]) { { case WAIT_OBJECT_0 + 0: // Send Ctrl-C #ifdef DEBUG_MONITOR - sprintf(buffer, "starter (PID %i) received CTRL-C event\n", currentPID); - OutputDebugString(buffer); + _stprintf(buffer, _T("starter (PID %i) received CTRL-C event\n"), currentPID); + OutputDebugStringW(buffer); #endif GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); SetEvent(waitEvent); @@ -185,16 +189,17 @@ extern "C" int _tmain(int argc, TCHAR* argv[]) { case WAIT_OBJECT_0 + 1: // App terminated normally // Make it's exit code our exit code #ifdef DEBUG_MONITOR - sprintf(buffer, "starter: launched process has been terminated(PID %i)\n", currentPID); - OutputDebugString(buffer); + _stprintf(buffer, _T("starter: launched process has been terminated(PID %i)\n"), + pi.dwProcessId); + OutputDebugStringW(buffer); #endif GetExitCodeProcess(pi.hProcess, &dwExitCode); exitProc = TRUE; break; case WAIT_OBJECT_0 + 2: // Kill #ifdef DEBUG_MONITOR - sprintf(buffer, "starter received KILL event (PID %i)\n", currentPID); - OutputDebugString(buffer); + _stprintf(buffer, _T("starter received KILL event (PID %i)\n"), currentPID); + OutputDebugStringW(buffer); #endif GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); TerminateProcess(h[1], 0); @@ -203,22 +208,7 @@ extern "C" int _tmain(int argc, TCHAR* argv[]) { default: // Unexpected code #ifdef DEBUG_MONITOR - LPTSTR lpMsgBuf; - - FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - GetLastError(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (LPTSTR) &lpMsgBuf, - 0, - NULL - ); - OutputDebugString(lpMsgBuf); - // Free the buffer. - LocalFree( lpMsgBuf ); + DisplayErrorMessage(); #endif exitProc = TRUE; break; @@ -226,7 +216,14 @@ extern "C" int _tmain(int argc, TCHAR* argv[]) { } CloseHandle(pi.hProcess); - } + } else { +#ifdef DEBUG_MONITOR + _stprintf(buffer, _T("Cannot start: %s\n"), szCmdLine); + OutputDebugStringW(buffer); + + DisplayErrorMessage(); +#endif + } CloseHandle(waitEvent); CloseHandle(h[0]); @@ -245,7 +242,7 @@ extern "C" int _tmain(int argc, TCHAR* argv[]) { // availSpace - size of the target buffer // Return :number of bytes used in target, or -1 in case of error ///////////////////////////////////////////////////////////////////////////////////// -int copyTo(LPTSTR target, LPCTSTR source, int cpyLength, int availSpace) +int copyTo(_TCHAR * target, const _TCHAR * source, int cpyLength, int availSpace) { BOOL bSlash = FALSE; int i = 0, j = 0; @@ -314,5 +311,23 @@ int copyTo(LPTSTR target, LPCTSTR source, int cpyLength, int availSpace) } +void DisplayErrorMessage() { + char * lpMsgBuf; + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (char *) &lpMsgBuf, + 0, + NULL + ); + OutputDebugString(lpMsgBuf); + // Free the buffer. + LocalFree( lpMsgBuf ); +} + //////////////////////////////// End of File ////////////////////////////////// diff --git a/core/org.eclipse.cdt.core.win32/os/win32/x86/spawner.dll b/core/org.eclipse.cdt.core.win32/os/win32/x86/spawner.dll index 07fa17c03edf4ff6b3cced12fe8ba305eea0243c..a654506805eccc29b313dbe895861e191e761b87 100644 GIT binary patch delta 20767 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 diff --git a/core/org.eclipse.cdt.core.win32/os/win32/x86/starter.exe b/core/org.eclipse.cdt.core.win32/os/win32/x86/starter.exe index a51e76dc846a5a774ad8cf9c4280e0097e6ea806..8161d7fece3b4b877ddd351aecc52b3d2aca074e 100644 GIT binary patch literal 16384 zcmeHNZEO?g9sm2K#e{@dRoq2_u19u}K!qsGK~ziF%wp3poZ&ZOvSql&KF4;QvwJ=R z(=rCS1j)L3>Le!ZLstpyOQlNtRB36|O)YYNgLAhSpVn${__0p?!(z0{@RP=AR;HoFo0N5LKUMwgx7kz6Xva{qbKP=F|CbI^0Y z{hqJsTcLK_2HT@VZde4%`auWyecflt&>0?VHMt20i^F1gnSrK`ZPmWYOz#T<(SRxa zmp9Zs^(iHLROy5Y|8^YHoQn;$b}*;{(X%~DI;kd!zRV5-!vhQ;uPz^MgB~l4#%wV5 zf>}K3*69cDFtyHlXURaQ2m69~mB>;3I9` zl{oSZZ~g11=UL*M_wApu7tz<*d$hM+dsF;_9m4HQ^{n_lr2Z=?%Bp<$>dE2Sw>tH8 zZ`fQ!Pc245hGziv^mc9DSv#w)AUG6`G;V@x^X}>T!PP=~-b z8;g3h6^am9bsCG%M18O$bl(7h+-8M7!?P8&^aDjI1WxS+XyLuqEwd zgvD4`5MkB~;ZKA`5Ozm15VjLx`VIjN^0vHf#JJ2@)M9btvc6+8TqF70#^vdH`;-IG z(fmi2avKff`M+AqH7GSqjF!F-YsNmdJfZy^92FSmagTMfV*0KQFuh?cMvcWduG6F_ zOy5*1`VKejtSJx(!5$QQ^(R_ks|Llbc>{;u%IY|PV}mN~tcBrmSvl7~7*aP6Rkl4a zq6)%sBRUar-L1#W;oRYf;SphhyBAGZ|DY&_!B9Q|<`=iK=6=zQN1^#3V8+e*nAmyU z$)wdIG!K9{?Yz+pHJ`iY7Dk);{c^qXsSsWDl84J!VP!~<#Joy|>)2Y8( zb3UKZTQb_;#>_0YS#LM=uF5tIc-tx)rr%RPTN^g|f3JQ9IqvCSRoeSiQB-%M)EMp4 z>UK0>k0F_60rdtmRhKqvXTJU`lP_Zk0b^}q{>qvY#l+5inFYUcuZ#3wG7v}S?&GnC zeFKG?#HDnczQ*JoY@4>3_VSIV&g=8jHvNyfOZPcLbBFXBc_VuY2xNuFeUv`O#tEgX z-HdBDgy=}TDm66eF77qMQ$pOR))v}{r$uXvF=luQFzRhVC{>r?$(q`bshvwRg?@Ax zT4SCS+|vt@Dy`X#Xl8hxW%U~0hbP;L=Qr!Z);I`R4y5ntBoUnHwn01(04(vfL;U5f-Zrsf`&jXT|`|Vw!Q-XMNkZM1e67x z1f2n$1-%6NF{lo@09pav0@3I2e*usH>I1Q5VExYHqd$Sp3#Q53dRaX5yP)P$VC!3> zH|>o7ug|f;_Kc(kPUO@<{J|ll6jM^UO!TrnCMgp+IjKId&CoNFEGaMz7UgoWAPuTY zA#hBR@w5E}dpwy__Z5}lN-wDc@NBeg61I5bu8z_*kAG z&LhJcgEflNC+Rr!ZPc>n0@~KdT;vFF1ULd50geDifFr;W;0SO8I0762j=;l$z&`+v CfPjer literal 16384 zcmeHNZA@F&8GdcNjL+h1SVAgUZpdYWjW9YBsVYQs1}30EV;l34j?OXo65BG@-t~3X zNnT52kmg=2@gv%=wOX|PTQ_A@q|q&k*g!0us69Fh6nhS5MHjinos~ z+6LY}7L3NyQc6o+(8ANwWLQ;`x-_9kT1J&(s?>9KNSaPYl(w3hO1YH!*Wc*Rv*Tad z+?9o{6Pq7E&wjmS^J9z)UB@>+GVNd7+`{-uSI6dKj2}{~X%ECEqdazZr9LmwfUS(G zD!=U6#kQ!{R%JUx6r?p>rO1+Z|0JxE~tl$#gVzbS1nrnAUlTsLP!F zhdboWeoD$VU3o!={my65@dfS5ff$MCe47>t>tUicz8L`f9AI8*9z6aw%Z=7J)(+wM z_;{dsh?WkhVk#IA3-7>wb zKVx?<{nkMXyct2+acTRt3OMY1c4&BH^!rW5tb851QSOhPZ}$*$JuP`Cw^APZ_Vezg zZ(Um9&dbK@rqi2bCvq#a%0W#%QoO4Ur9~$%WB8rsVH;^N@>{y-c;8~?! zPv>v)fU9XhSy=7>cAvk87Ck6qcK>{XMW>8<|n#f z$gR{Hj|!LN0Tdn`iS~iQ0DBKRE6mEXSPQULU_J|*mx~tW1m?G}pj?kl)mOuSQQ{j2 z#3^0|u>mk|=}~|)$QXguI3=SlU(Eg7$Eqgl(CImkutTs1ap;JG57x5r#JLvTJ}L? zfqQ_t9Pqg3#8KgktMmDpO9BFOJBsl7cqe=qklv3WD7RY0>u@CY4n$U#jD*~9&wxn*NqZb0Jtna;+{;hAg| zYs^&QEocB|bk7}^hM3EP)#8B8Em;;jw;bj^n9!=18gFoCRFY9intSU--^-4pUE`*= z)6DbLuExyqTozd~RdY3HY7M)hyv`uw2awADAl&(5Sf%C11{55mQ?n+p87GS zl&Oy1Kr!YT=lP14VTo455H079FG0O>4YR!WcENkw$4*{_Qt)p13f^}i@B5f5h`^|W zhY$}LKnQdBc(uVTtRl0;GVij?`^BH_FqT_s&wKA6Xn@(2DXk7JqJ-CFGF5~T!q|#tV4Prk06H{iM{~gtq0??kY^xc5EXI}G7Fi9{0Q_DoI~}vqE`44^v4IV31A%uba?Ew|K>ibY-beR z`$A0b#>WjlEjg*A(?qY@gNimCQ^Wc`wn%3bRnY)-C)IQ^p>*q7!h2Cs@vr+e`)D|( z_a?Q$OhS*P63W?$xH73DlVTr2e#`4g>P{rnN?%xwBoykQZcW)Qa2nqTaNi+4QgR@b z>z2~5P9?SJupUdQ;IS0h8%rps=`{B`up}!$qrceBrWDmIjojb#2A=f}xWCpGNhFBg zu%}a6Ox368rai4|dJ@>H_7X&6w$SuMdNQif;Lu2SAZW#GP)Gq!)JLJQ$&`-bx}s6P z-2^E@p-?Im3dPizuBaDj4EhB{pALgW?Lrz~ahN8AOj8cFw4!IyP{Mjt(KMo0C=`yw zGig0E6^UKse=;!hO(v)LS0_YCOP{i|OIC(ZIF$ov|D`Ra?wf|w;S0($Qd3%L4n{Rak@{6!)?#{iBB7Y~O6#hbZjqY1 zaZkg&Yapg7!Q@aX{9U!B694NGO)wxB5DW+g1OtKr!GK^uFd!HZ38nmw|r( DPZMEG