/* ** MEP Party extension ** ** History: ** 17-Oct-1991 Ported to NT ** */ #define _CTYPE_DISABLE_MACROS #include #include #include #include "zext.h" #include #ifndef TRUE #define TRUE -1 #define FALSE 0 #endif HWND hwndSelf; flagType iconizeOnExit = TRUE; flagType pascal DoCaseLine( PFILE CurFile, LINE y, COL x, COL maxX, flagType LowerCase ) { flagType Modified; int cb; char buf[ BUFLEN ], *s; cb = GetLine( y, buf, CurFile ); s = &buf[ x ]; if (maxX != 0) { if (maxX - x < cb) { cb = maxX - x + 1; } } else { cb -= x; } Modified = FALSE; while (cb--) { if (LowerCase) { if (*s >= 'A' && *s <= 'Z') { *s -= 'A' - 'a'; Modified = TRUE; } } else { if (*s >= 'a' && *s <= 'z') { *s += 'A' - 'a'; Modified = TRUE; } } s++; } if (Modified) { PutLine( y, buf, CurFile ); } return( TRUE ); } flagType pascal EXTERNAL Case( CMDDATA argData, ARG far *pArg, flagType fMeta ) { int i; PFILE CurFile; CurFile = FileNameToHandle("",NULL); switch( pArg->argType ) { case NOARG: return( DoCaseLine( CurFile, pArg->arg.noarg.y, 0, 0, fMeta ) ); break; case NULLARG: return( DoCaseLine( CurFile, pArg->arg.nullarg.y, pArg->arg.nullarg.x, 0, fMeta ) ); break; case LINEARG: for (i=pArg->arg.linearg.yStart; i<=pArg->arg.linearg.yEnd; i++) { if (!DoCaseLine( CurFile, (LINE)i, 0, 0, fMeta )) { return( FALSE ); } } return( TRUE ); break; case BOXARG: for (i=pArg->arg.boxarg.yTop; i<=pArg->arg.boxarg.yBottom; i++) { if (!DoCaseLine( CurFile, (LINE)i, pArg->arg.boxarg.xLeft, pArg->arg.boxarg.xRight, fMeta ) ) { return( FALSE ); } } return( TRUE ); break; default: BadArg(); return( FALSE ); } argData; } int CountMsgFiles; int MsgFileIndex; HANDLE MsgFiles[ 2 ]; int MsgFileOffsetIndex; LONG MsgFileOffsets[ 3 ]; char GetHexDigit( ULONG value, int index ) { int digit; if (index < 4) { index <<= 2; digit = (int)((value >> index) & 0xF); } else { digit = 0; } if (digit <= 9) { return( (char)(digit+'0') ); } else { return( (char)((digit-10)+'A') ); } } void MyFormatMessage( char *buf, char *msg, long value1, long value2 ); void MyFormatMessage( char *buf, char *msg, long value1, long value2 ) { char c, *src, *dst; long value; src = msg; dst = buf; while (c = *src++) { if (c == '%' && src[1] == 'x') { if (*src == '1') { value = value1; } else { value = value2; } *dst++ = GetHexDigit( value, 3 ); *dst++ = GetHexDigit( value, 2 ); *dst++ = GetHexDigit( value, 1 ); *dst++ = GetHexDigit( value, 0 ); src++; src++; } else { *dst++ = c; } } *dst = '\0'; DoMessage( buf ); } flagType pascal EXTERNAL ShowBuildMessage( CMDDATA argData, ARG far *pArg, flagType fMeta ) { int i, BytesRead, BytesScanned, linenum; ULONG NewOffset; char LineBuffer[ 256 ], *s, *s1; if (!fMeta && CountMsgFiles == 0) { MsgFileIndex = 0; MsgFiles[ MsgFileIndex ] = CreateFile( "build.wrn", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL ); if (MsgFiles[ MsgFileIndex ] != INVALID_HANDLE_VALUE) { CountMsgFiles++; MsgFileIndex++; } MsgFiles[ MsgFileIndex ] = CreateFile( "build.err", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL ); if (MsgFiles[ MsgFileIndex ] != INVALID_HANDLE_VALUE) { CountMsgFiles++; MsgFileIndex++; } MsgFileIndex = 0; MsgFileOffsetIndex = 0; MsgFileOffsets[ 0 ] = 0L; MsgFileOffsets[ 1 ] = 0L; MsgFileOffsets[ 2 ] = 0L; } else if (fMeta && CountMsgFiles != 0) { for (i=0; iargType ) { case NULLARG: if (MsgFileOffsetIndex-- == 0) { MsgFileOffsetIndex = 2; } // // fall through // case NOARG: retrymsgfile: NewOffset = SetFilePointer( MsgFiles[ MsgFileIndex ], MsgFileOffsets[ MsgFileOffsetIndex ], NULL, FILE_BEGIN ); if (NewOffset == -1) { MyFormatMessage( LineBuffer, "SetFilePointer( %1x ) failed - rc == %2x", MsgFileOffsets[ MsgFileOffsetIndex ], GetLastError() ); DoMessage( LineBuffer ); return( FALSE ); } if (!ReadFile( MsgFiles[ MsgFileIndex ], LineBuffer, sizeof( LineBuffer ), ( LPDWORD )&BytesRead, NULL ) ) { MyFormatMessage( LineBuffer, "ReadFile( %1x ) failed - rc == %2x", (ULONG)BytesRead, GetLastError() ); DoMessage( LineBuffer ); return( FALSE ); } s = LineBuffer; BytesScanned = 0; while (BytesScanned < BytesRead) { BytesScanned++; if (*s == '\n') { *s = '\0'; break; } else if (*s == '\r' && s[1] == '\n') { *s = '\0'; BytesScanned++; break; } else { s++; } } if (BytesScanned == 0) { if (++MsgFileIndex == CountMsgFiles) { for (i=0; i LineBuffer && s1[-1] == ' ') { *--s1 = '\0'; } s1 = s; while (*s && isdigit( *s )) { s++; } *s++ = '\0'; linenum = atoi( s1 ); while (*s) { if (*s++ == ':') { PFILE pOldFile; DWORD fOldFileFlags; // // Switch to correct file for message. If we change to // a different file and the old one was modified, write // it out. // pOldFile = FileNameToHandle( "", NULL ); fOldFileFlags = 0; GetEditorObject( 0xFF | RQ_FILE_FLAGS, pOldFile, (PVOID)&fOldFileFlags ); fChangeFile( FALSE, LineBuffer ); if (pOldFile != FileNameToHandle( "", NULL ) && fOldFileFlags & DIRTY) { FileWrite( "", pOldFile ); } MoveCur( 0, (LINE)(linenum-1) ); fExecute( "begline" ); DoMessage( s+1 ); return( TRUE ); } } } else { s++; } } goto retrymsgfile; default: BadArg(); return( FALSE ); } return( TRUE ); argData; } char ErrorText[ 64 ], Arguments[ 64 + MAX_PATH ], PathName[ MAX_PATH ]; flagType pascal EXTERNAL SlmOut( CMDDATA argData, ARG far *pArg, flagType fMeta ) { PFILE pCurFile; char *FileName; DWORD fFileFlags; char OldCurrentDirectory[MAX_PATH]; pCurFile = FileNameToHandle( (char far *)"", (char far *)NULL ); fFileFlags = 0; GetEditorObject( 0xFF | RQ_FILE_FLAGS, pCurFile, (PVOID)&fFileFlags ); GetEditorObject( 0xFF | RQ_FILE_NAME, pCurFile, (PVOID)PathName ); FileName = PathName + strlen( PathName ); while (FileName > PathName) { if (*--FileName == '\\') { *FileName++ = '\0'; break; } } if (FileName == PathName) { DoMessage( "Unable to get directory for file" ); return( FALSE ); } if (GetCurrentDirectory(sizeof(OldCurrentDirectory), OldCurrentDirectory) == 0) { DoMessage( "Unable to save current directory setting" ); return( FALSE ); } if (SetCurrentDirectory(PathName) != 0) { strcpy( Arguments, "arg " ); if (fMeta) { strcpy( Arguments, "cd & in -i " ); } else { strcpy( Arguments, "cd & out -z " ); } strcat( Arguments, FileName ); strcat( Arguments, " & if ERRORLEVEL 1 pause" ); DoSpawn( Arguments, FALSE ); if (!fMeta && fFileFlags & DIRTY) { FileWrite( "", pCurFile ); SetEditorObject( 0xFF | RQ_FILE_MODTIME, pCurFile, (PVOID)NULL ); if (fFileFlags & DIRTY) { DoMessage( "Modified file has been checked out." ); } else { DoMessage( "Current file has been checked out." ); } } else { if (fMeta) { fExecute( "refresh" ); DoMessage( "Changes to current file discarded. No longer checked out." ); } else { SetEditorObject( 0xFF | RQ_FILE_MODTIME, pCurFile, (PVOID)NULL ); DoMessage( "Current file has been checked out." ); } } SetCurrentDirectory(OldCurrentDirectory); return( TRUE ); } else { DoMessage( "Unable to change current directory" ); return( FALSE ); } argData; pArg; fMeta; } HANDLE EditorStartEvent; HANDLE EditorStopEvent; HANDLE EditorSharedMemory; LPSTR EditorMemoryPointer; HWND hPrevWindow = NULL; char CommandLineBuffer[ 256 ]; HWND GetWindowHandleOfEditor( void ); void SwitchToProgram( HWND hwnd ); void SwitchToTaskManager( void ); flagType pascal EXTERNAL StartExt( CMDDATA argData, ARG far *pArg, flagType fMeta ) { PFILE pCurFile; int fFileFlags; if (!fMeta) { pCurFile = FileNameToHandle( "", NULL ); fFileFlags = 0; GetEditorObject( 0xFF | RQ_FILE_FLAGS, pCurFile, (PVOID)&fFileFlags ); if (fFileFlags & DIRTY) FileWrite( "", pCurFile ); } if (hPrevWindow) { SetEvent( EditorStopEvent ); SwitchToProgram( hPrevWindow ); hPrevWindow = NULL; } else { SwitchToTaskManager(); } fExecute( "savetmpfile" ); return TRUE; argData; pArg; } #if _MSC_FULL_VER >= 13008827 #pragma warning(push) #pragma warning(disable:4715) // Not all control paths return (due to infinite loop) #endif DWORD WaitForStartEventThread( PVOID Parameter ) { CHAR szFileName[ 256 ]; LPSTR s, lpName, lpValue, lpNewCmdLine, lpEditorMem; PINPUT_RECORD pEvent, pEvents; DWORD NumberOfEvents, NumberOfEventsWritten; while (TRUE) { WaitForSingleObject( EditorStartEvent, INFINITE ); lpEditorMem = EditorMemoryPointer; hPrevWindow = *(HWND *)lpEditorMem; lpEditorMem += sizeof( hPrevWindow ); SetCurrentDirectory( lpEditorMem ); while( *lpEditorMem++ ) { } lpNewCmdLine = CommandLineBuffer; while( *lpNewCmdLine++ = *lpEditorMem++ ) { } while (*lpEditorMem) { lpName = lpEditorMem; while (*lpEditorMem) { if (*lpEditorMem++ == '=') { lpValue = lpEditorMem; lpValue[ -1 ] = '\0'; while (*lpEditorMem++) { } SetEnvironmentVariableA( lpName, lpValue ); lpValue[ -1 ] = '='; break; } } } s = CommandLineBuffer; while (*s == ' ') s++; if (*s) { NumberOfEvents = 1 + strlen( s ) + 1; pEvents = HeapAlloc( GetProcessHeap(), 0, NumberOfEvents * sizeof( *pEvent ) ); pEvent = pEvents; pEvent->EventType = KEY_EVENT; FuncNameToKeyEvent( "arg", &pEvent->Event.KeyEvent); pEvent += 1; while (*s) { pEvent->EventType = KEY_EVENT; FuncNameToKeyEvent( (char *)(BYTE)*s++, &pEvent->Event.KeyEvent); pEvent += 1; } pEvent->EventType = KEY_EVENT; FuncNameToKeyEvent( "setfile", &pEvent->Event.KeyEvent); pEvent += 1; WriteConsoleInput( GetStdHandle( STD_INPUT_HANDLE ), pEvents, NumberOfEvents, &NumberOfEventsWritten ); HeapFree( GetProcessHeap(), 0, pEvents ); } } return TRUE; } #if _MSC_FULL_VER >= 13008827 #pragma warning(pop) #endif void SwitchToProgram( HWND hwnd ) { if (hwndSelf && iconizeOnExit) { ShowWindow( hwndSelf, SW_MINIMIZE ); } SetForegroundWindow( hwnd ); ShowWindow( hwnd, SW_RESTORE); } void SwitchToTaskManager( void ) { HWND hwnd; wchar_t szTitle[ 256 ]; /* * Search the window list for task manager window. */ hwnd = GetWindow( GetDesktopWindow(), GW_CHILD ); while (hwnd) { /* * Only look at non-visible, non-owned, Top Level Windows. */ if (!IsWindowVisible( hwnd ) && !GetWindow( hwnd, GW_OWNER )) { // // Use internal call to get current Window title that does NOT // use SendMessage to query the title from the window procedure // but instead returns the most recent title displayed. // InternalGetWindowText( hwnd, (LPWSTR)szTitle, sizeof( szTitle ) ); if (!_wcsicmp( L"Task List", szTitle )) { SwitchToProgram( hwnd ); break; } } hwnd = GetWindow( hwnd, GW_HWNDNEXT ); } return; } flagType StartExtLoaded( void ); flagType StartExtLoaded () { HANDLE Thread; DWORD ThreadId; hwndSelf = GetWindowHandleOfEditor(); EditorStartEvent = CreateEvent( NULL, FALSE, FALSE, "EditorStartEvent" ); if (EditorStartEvent == NULL) { DoMessage( "Create of EditorStartEvent failed" ); return FALSE; } EditorStopEvent = CreateEvent( NULL, FALSE, FALSE, "EditorStopEvent" ); if (EditorStopEvent == NULL) { DoMessage( "Create of EditorStopEvent failed" ); CloseHandle( EditorStartEvent ); return FALSE; } EditorSharedMemory = CreateFileMapping( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 8192, "EditorSharedMemory" ); if (EditorSharedMemory == NULL) { DoMessage( "Create of EditorStartMemory failed" ); CloseHandle( EditorStopEvent ); CloseHandle( EditorStartEvent ); return FALSE; } EditorMemoryPointer = MapViewOfFile( EditorSharedMemory, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 8192 ); if (EditorMemoryPointer == NULL) { DoMessage( "MapView of EditorStartMemory failed" ); CloseHandle( EditorStopEvent ); CloseHandle( EditorStartEvent ); CloseHandle( EditorSharedMemory ); return FALSE; } Thread = CreateThread( NULL, 8192, (LPTHREAD_START_ROUTINE)WaitForStartEventThread, 0, 0, &ThreadId ); if (Thread == NULL) { DoMessage( "Can't start environment thread" ); UnmapViewOfFile( EditorMemoryPointer ); CloseHandle( EditorSharedMemory ); CloseHandle( EditorStopEvent ); CloseHandle( EditorStartEvent ); return FALSE; } if (!SetThreadPriority( Thread, THREAD_PRIORITY_ABOVE_NORMAL )) { DoMessage( "Can't set priority of environment thread" ); } CloseHandle( Thread ); return TRUE; } void partyWhenLoaded(void) { if (StartExtLoaded()) { CountMsgFiles = 0; } } HWND GetWindowHandleOfEditor( void ) { #define MY_BUFSIZE 1024 // buffer size for console window titles HWND hwndFound; // this is what we return to the caller char pszNewWindowTitle[ MY_BUFSIZE ]; // contains fabricated WindowTitle char pszOldWindowTitle[ MY_BUFSIZE ] = {0}; // contains original WindowTitle // fetch current window title GetConsoleTitle( pszOldWindowTitle, MY_BUFSIZE ); // format a "unique" NewWindowTitle wsprintf( pszNewWindowTitle, "%d/%d", GetTickCount(), GetCurrentProcessId() ); // change current window title SetConsoleTitle( pszNewWindowTitle ); // insure window title has been updated Sleep(40); // look for NewWindowTitle hwndFound = FindWindow( NULL, pszNewWindowTitle ); // restore original window title SetConsoleTitle( pszOldWindowTitle ); return( hwndFound ); }