/* * EnterExMode - start Ex emulation mode */ vi_rc EnterExMode( void ) { int i; window_id wid; char *st; char *prompt; vi_rc rc; bool ret; if( EditFlags.InputKeyMapMode ) { return( ERR_NO_ERR ); } i = EditVars.WindMaxHeight - 1; exwInfo.area.y1 = exwInfo.area.y2 = i; exwInfo.area.x2 = EditVars.WindMaxWidth - 1; SetPosToMessageLine(); EditFlags.ExMode = true; EditFlags.LineDisplay = true; EditFlags.ClockActive = false; MyPrintf( "\nEntering EX mode (type vi to return)\n" ); rc = NewWindow2( &wid, &exwInfo ); if( rc != ERR_NO_ERR ) { return( rc ); } st = MemAlloc( EditVars.MaxLine ); for( ;; ) { if( EditFlags.Appending ) { prompt = ""; } else { prompt = ":"; } ret = ReadStringInWindow( wid, 1, prompt, st, EditVars.MaxLine, &EditVars.CLHist ); MyPrintf( "\n" ); if( !ret ) { continue; } ScreenPage( 1 ); if( EditFlags.Appending ) { AppendAnother( st ); ScreenPage( -1 ); continue; } rc = RunCommandLine( st ); if( !EditFlags.ExMode ) { break; } if( rc > ERR_NO_ERR ) { Error( GetErrorMsg( rc ) ); } ScreenPage( -1 ); } MemFree( st ); return( ERR_NO_ERR ); } /* EnterExMode */
/* * ScreenInit - get screen info */ void ScreenInit( void ) { unsigned short solvb; struct _VIOCONFIGINFO config; struct _VIOMODEINFO vioMode; void * SEG16 ptr; vioMode.cb = sizeof( vioMode ); if( VioGetMode( &vioMode, 0 ) != 0 ) { FatalError( ERR_WIND_INVALID ); } EditVars.WindMaxWidth = vioMode.col; EditVars.WindMaxHeight = vioMode.row; config.cb = sizeof( config ); if( VioGetConfig( 0, &config, 0 ) != 0 ) { FatalError( ERR_WIND_INVALID ); } if( config.display == 3 ) { EditFlags.BlackAndWhite = TRUE; } else { if( config.adapter == 0 ) { EditFlags.Monocolor = TRUE; } else { EditFlags.Color = TRUE; } } VioGetBuf( (PULONG) &ptr, (PUSHORT) &solvb, 0); Scrn = ptr; ScreenPage( 0 ); } /* ScreenInit */
/* * ScreenInit - get screen info */ void ScreenInit( void ) { CONSOLE_SCREEN_BUFFER_INFO sbi; char tmp[256]; InputHandle = CreateFile( "CONIN$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL ); SetConsoleMode( InputHandle, ENABLE_MOUSE_INPUT | ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_EXTENDED_FLAGS ); OutputHandle = CreateConsoleScreenBuffer( GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL ); SetConsoleMode( OutputHandle, 0 ); // SetConsoleActiveScreenBuffer( OutputHandle ); GetConsoleScreenBufferInfo( OutputHandle, &sbi ); EditVars.WindMaxWidth = sbi.dwMaximumWindowSize.X; EditVars.WindMaxHeight = sbi.dwMaximumWindowSize.Y; BSize.X = EditVars.WindMaxWidth; BSize.Y = EditVars.WindMaxHeight; EditFlags.Color = true; Scrn = malloc( EditVars.WindMaxWidth * EditVars.WindMaxHeight * sizeof( char_info ) ); ScreenPage( 0 ); tmp[0] = '\0'; GetConsoleTitle( tmp, sizeof( tmp ) ); oldConTitle = DupString( tmp ); if( !EditFlags.Quiet ) { SetConsoleTitle( "Open Watcom vi" ); } } /* ScreenInit */
/* * QuitEditor - quit the editor */ void QuitEditor( vi_rc rc ) { #ifndef __WIN__ ScreenPage( -1000 ); EditFlags.NoSetCursor = false; SetPosToMessageLine(); #endif ExitEditor( ( rc == ERR_NO_ERR ) ? 0 : -1 ); } /* QuitEditor */
/* * ScreenInit - get screen info */ void ScreenInit( void ) { struct _osinfo info; int rows, cols; unsigned size; unsigned seg; vi_rc rc; QNXCon = console_open( QNXConHandle, O_WRONLY ); if( QNXCon == NULL ) { // FatalError( ERR_WIND_NO_MORE_WINDOWS ); ChangeDirectory( HomeDirectory ); exit( 0 ); } if( console_size( QNXCon, QNXConsole, 0, 0, &rows, &cols ) != 0 ) { console_close( QNXCon ); FatalError( ERR_WIND_NO_MORE_WINDOWS ); } rc = BIOSKeyboardInit(); if( rc != ERR_NO_ERR ) { console_close( QNXCon ); FatalError( rc ); } EditVars.WindMaxWidth = cols; EditVars.WindMaxHeight = rows; qnx_osinfo( 0, &info ); switch( info.primary_monitor ) { case _MONITOR_PGS: case _MONITOR_CGA: case _MONITOR_PS30_COLOR: case _MONITOR_EGA_COLOR: case _MONITOR_VGA_COLOR: EditFlags.Color = TRUE; break; case _MONITOR_EGA_MONO: case _MONITOR_VGA_MONO: case _MONITOR_PS30_MONO: EditFlags.BlackAndWhite = TRUE; break; default: EditFlags.Monocolor = TRUE; break; } size = cols * rows * sizeof( char_info ); seg = qnx_segment_alloc( size ); Scrn = MK_FP( seg, 0 ); ScreenPage( 0 ); } /* ScreenInit */
/* * ScreenInit - get screen info */ void ScreenInit( void ) { unsigned short solvb; struct _VIOCONFIGINFO config; struct _VIOMODEINFO vioMode; void * SEG16 ptr; /* Set the cb member of VIOMODEINFO/VIOCONFIGINFO to smaller values * in order to be backward compatible with old OS/2 versions. */ vioMode.cb = offsetof( VIOMODEINFO, buf_addr ); if( VioGetMode( &vioMode, 0 ) != 0 ) { StartupError( ERR_WIND_INVALID ); } WindMaxWidth = vioMode.col; WindMaxHeight = vioMode.row; config.cb = offsetof( VIOCONFIGINFO, Configuration ); if( VioGetConfig( 0, &config, 0 ) != 0 ) { StartupError( ERR_WIND_INVALID ); } if( config.display == 3 ) { EditFlags.BlackAndWhite = TRUE; } else { if( config.adapter == 0 ) { EditFlags.Monocolor = TRUE; } else { EditFlags.Color = TRUE; } } VioGetBuf( (PULONG) &ptr, (PUSHORT) &solvb, 0); Scrn = ptr; ScreenPage( 0 ); } /* ScreenInit */
/* * NewFile - load up a new file */ vi_rc NewFile( char *name, bool same_file ) { vi_rc rc; bool dup; status_type oldstatus; dup = EditFlags.DuplicateFile; EditFlags.DuplicateFile = false; oldstatus = UpdateCurrentStatus( CSTATUS_READING ); ScreenPage( 1 ); #ifdef __WIN__ EditFlags.ResizeableWindow = true; #endif rc = createNewFile( name, same_file ); if( rc != ERR_NO_ERR && rc != NEW_FILE ) { ScreenPage( -1 ); if( !EditFlags.Starting ) { MoveWindowToFrontDammit( MessageWindow, true ); MoveWindowToFrontDammit( CurrentWindow, true ); } UpdateCurrentStatus( oldstatus ); return( rc ); } GoToLineNoRelCurs( 1 ); GoToColumnOnCurrentLine( 1 ); FileSPVAR(); SaveCurrentInfo(); if( !same_file ) { inReadHook++; rc = SourceHook( SRC_HOOK_READ, rc ); inReadHook--; } /* * back from hook, so all loadings are done * (who should have priority - hook or fts commands?) */ #if 0 rc = FTSRunCmds( CurrentFile->name ); FTSRunCmds( CurrentFile->name ); #endif /* * reset the screen to the display page, display everything */ ScreenPage( -1 ); MoveWindowToFrontDammit( CurrentWindow, true ); UpdateStatusWindow(); SetWindowCursor(); DCDisplayAllLines(); EditFlags.DuplicateFile = dup; DisplayFileStatus(); SaveCurrentInfo(); ActiveWindow( CurrentWindow ); VarAddRandC(); SetModifiedVar( false ); UpdateCurrentStatus( oldstatus ); if( !same_file && !inReadHook ) { UpdateLastFileList( CurrentFile->name ); } #ifdef __WIN__ DCUpdateAll(); ResetEditWindowCursor( CurrentWindow ); SetWindowCursorForReal(); GotoFile( CurrentWindow ); #endif return( rc ); } /* NewFile */
/* * ProcessEx - process an ex command */ vi_rc ProcessEx( linenum n1, linenum n2, bool n2f, int tkn, const char *data ) { vi_rc rc = ERR_INVALID_COMMAND, i; char word[MAX_STR]; linenum addr, tlines; fcb *cfcb; line *cline; fcb_list fcblist; GetNextWord1( data, word ); data = word; if( GetAddress( &data, &addr ) != ERR_NO_ERR ) { addr = -1; } tlines = n2 - n1 + 1; switch( tkn ) { case EX_T_APPEND: if( !EditFlags.ExMode ) { return( ERR_ONLY_VALID_IN_EX_MODE ); } if( !n2f ) { rc = Append( n1, true ); } break; case EX_T_CHANGE: if( !EditFlags.ExMode ) { return( ERR_ONLY_VALID_IN_EX_MODE ); } StartUndoGroup( UndoStack ); rc = DeleteLineRange( n1, n2, 0 ); if( rc != ERR_NO_ERR ) { EndUndoGroup( UndoStack ); break; } rc = Append( n1 - 1, false ); if( rc != ERR_NO_ERR ) { EndUndoGroup( UndoStack ); break; } break; case EX_T_COPY: if( addr < 0 || IsPastLastLine( addr ) ) { return( ERR_INVALID_ADDRESS ); } i = GetCopyOfLineRange( n1, n2, &fcblist ); if( i ) { break; } rc = InsertLines( addr, &fcblist, UndoStack ); GoToLineNoRelCurs( addr ); if( rc == ERR_NO_ERR ) { Message1( strCmmsg, tlines, "copied", addr ); } break; case EX_T_INSERT: if( !EditFlags.ExMode ) { return( ERR_ONLY_VALID_IN_EX_MODE ); } if( !n2f ) { rc = Append( n1 - 1, true ); } break; case EX_T_JOIN: if( SaveAndResetFilePos( n1 ) != ERR_NO_ERR ) { rc = ERR_NO_SUCH_LINE; break; } if( tlines == 1 ) { n2 = n1 + 1; tlines = 2; } SetRepeatCount( tlines - 1 ); rc = JoinCurrentLineToNext(); RestoreCurrentFilePos(); GoToLineNoRelCurs( n1 ); if( rc == ERR_NO_ERR ) { Message1( "lines %l to %l joined", n1, n2 ); } break; case EX_T_LIST: if( !EditFlags.ExMode ) { return( ERR_ONLY_VALID_IN_EX_MODE ); } for( rc = CGimmeLinePtr( n1, &cfcb, &cline ); rc == ERR_NO_ERR; rc = CGimmeNextLinePtr( &cfcb, &cline ) ) { if( EditFlags.LineNumbers ) { MyPrintf( "%M %s\n", n1, cline->data ); } else { MyPrintf( "%s\n", cline->data ); } if( n1 >= n2 ) { break; } n1++; } break; case EX_T_MARK: rc = SetGenericMark( n1, 1, C2VIKEY( word[0] ) ); break; case EX_T_MOVE: if( addr < 0 || IsPastLastLine( addr ) ) { return( ERR_INVALID_ADDRESS ); } SavebufNumber = WORK_SAVEBUF; StartUndoGroup( UndoStack ); rc = DeleteLineRange( n1, n2, SAVEBUF_FLAG ); if( SavebufNumber != WORK_SAVEBUF ) { /* if this changes, the command will fail * this could be caused by checking out a read-only file * so fix the deleted text and give an error message */ DoUndo(); return( ERR_INVALID_COMMAND ); } if( rc != ERR_NO_ERR ) { EndUndoGroup( UndoStack ); break; } if( addr > n2 ) { addr -= tlines; } else if( addr >= n1 && addr <= n2 ) { addr = n1; } rc = InsertLines( addr, &WorkSavebuf->u.fcbs, UndoStack ); EndUndoGroup( UndoStack ); GoToLineNoRelCurs( addr ); if( rc == ERR_NO_ERR ) { Message1( strCmmsg, tlines, "moved", addr ); } break; case EX_T_UNDO: rc = DoUndo(); break; case EX_T_UNDO_DMT: rc = DoUndoUndo(); break; case EX_T_EQUALS: Message1( "%l", n1 ); rc = ERR_NO_ERR; break; case EX_T_VERSION: rc = DoVersion(); break; case EX_T_VISUAL: case EX_T_VISUAL_DMT: if( EditFlags.LineDisplay ) { ScreenPage( -1 ); EditFlags.ExMode = false; EditFlags.LineDisplay = false; EditFlags.ClockActive = true; ReDisplayScreen(); DoVersion(); } if( word[0] != '\0' ) { rc = EditFile( word, ( tkn == EX_T_VISUAL_DMT ) ); } else { rc = ERR_NO_ERR; } break; } return( rc ); } /* ProcessEx */