/* * GetErrorMsg - return pointer to message */ char *GetErrorMsg( vi_rc err ) { char *msg; if( !readMsgData ) { readErrorMsgData(); } LastError = err; if( EditFlags.InputKeyMapMode ) { DoneInputKeyMap(); EditFlags.NoInputWindow = false; EditFlags.Dotable = false; } if( err < 0 || err > errCnt ) { MySprintf( strBuff, "Err no. %d (no msg)", err ); return( strBuff ); } msg = GetTokenString( errorList, (int)err ); if( msg == NULL ) { MySprintf( strBuff, "Err no. %d (no msg)", err ); return( strBuff ); } return( msg ); } /* GetErrorMsg */
/* * FileExitOptionSaveChanges - exit file, giving option to save if modified */ bool FileExitOptionSaveChanges( file *f ) { bool aborted = FALSE; char buffer[MAX_STR]; #ifdef __WIN__ int resp; vi_rc rc; MySprintf( buffer, "\"%s\" has been modified - save changes?", f->name ); resp = MessageBox( Root, buffer, EditorName, MB_YESNOCANCEL | MB_TASKMODAL ); if( resp == IDYES ) { rc = SaveFile( NULL, -1, -1, FALSE ); if( rc != ERR_NO_ERR ) { MySprintf( buffer, "Error saving \"%s\"", f->name ); MessageBox( Root, buffer, EditorName, MB_OK | MB_TASKMODAL ); aborted = TRUE; } else { NextFileDammit(); } } else if( resp == IDCANCEL ) { aborted = TRUE; } else { NextFileDammit(); } #else char response[MAX_SRC_LINE]; MySprintf( buffer, "\"%s\" has been modified - save changes (yes|no|cancel)?", f->name ); if( GetResponse( buffer, response ) == GOT_RESPONSE ) { switch( response[0] ) { case 0: // if the user hit ENTER then the buffer will be // a string of 0 chars so act as if y had been hit case 'y': case 'Y': SaveAndExit( NULL ); break; case 'n': case 'N': NextFileDammit(); break; case 'c': case 'C': default: aborted = TRUE; // return( FALSE ); } } else { aborted = TRUE; } #endif return aborted; } /* FileOptionExitSaveChanges */
/* * FilePromptForSaveChanges - give option to save file if modified */ bool FilePromptForSaveChanges( file *f ) { char buffer[MAX_STR]; vi_rc rc; #ifdef __WIN__ MySprintf( buffer, "\"%s\" has been modified - save changes?", f->name ); BringWindowToTop( Root ); SetWindowPos( Root, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE ); if( MessageBox( Root, buffer, EditorName, MB_YESNO | MB_TASKMODAL ) == IDYES ) { rc = SaveFile( NULL, -1, -1, FALSE ); if( rc != ERR_NO_ERR ) { MySprintf( buffer, "Error saving \"%s\"", f->name ); MessageBox( Root, buffer, EditorName, MB_OK | MB_TASKMODAL ); } else { Modified( FALSE ); } } SetWindowPos( Root, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE ); SetWindowPos( Root, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE ); #else char response[MAX_SRC_LINE]; // MySprintf( buffer, "\"%s\" has been modified - save changes (yes|no|cancel)?", MySprintf( buffer, "\"%s\" has been modified - save changes (yes|no)?", f->name ); if( GetResponse( buffer, response ) == GOT_RESPONSE ) { switch( response[0] ) { case 0: // if the user hit ENTER then the buffer will be // a string of 0 chars so act as if y had been hit case 'y': case 'Y': rc = SaveFile( NULL, -1, -1, FALSE ); if( rc != ERR_NO_ERR ) { MySprintf( buffer, "Error saving \"%s\"", f->name ); Message1( buffer ); } else { Modified( FALSE ); } break; } } #endif /* would return TRUE if we supported a CANCEL option * the same as the FileExitOptionSaveChanges function below */ return( FALSE ); } /* FilePromptForSaveChanges */
/* * DDECallback - callback routine for DDE */ WINEXPORT HDDEDATA CALLBACK DDECallback( UINT type, UINT fmt, HCONV hconv, HSZ topicstrh, HSZ itemstrh, HDDEDATA hmem, DWORD data1, DWORD data2 ) { char tmp[64]; vi_rc rc; fmt = fmt; data1 = data1; data2 = data2; switch( type ) { case XTYP_CONNECT: case XTYP_CONNECT_CONFIRM: case XTYP_DISCONNECT: case XTYP_REQUEST: case XTYP_POKE: MySprintf( tmp, "%u %U %U %U %U", type, (DWORD) hconv, (DWORD) topicstrh, (DWORD) itemstrh, (DWORD) hmem ); DDERet = 0; rc = SourceHookData( SRC_HOOK_DDE, tmp ); if( rc != ERR_NO_ERR ) { DDERet = (DWORD)DdeCreateDataHandle( (DWORD)DDEInstId, (LPBYTE)"err", (DWORD)4, (DWORD)0, (HSZ)itemstrh, (UINT)fmt, (UINT)0 ); } else { DDERet = (DWORD)DdeCreateDataHandle( DDEInstId, (LPBYTE)"ok", 3, 0, itemstrh, fmt, 0 ); } return( (HDDEDATA) DDERet ); } return( (HDDEDATA) NULL ); } /* DDECallback */
/* * writeProfileRect - write a rectangle to the profile */ static void writeProfileRect( const char *key, RECT *r ) { char str[MAX_STR]; MySprintf( str, "%d %d %d %d", r->left, r->top, r->right, r->bottom ); writeProfileString( key, str ); } /* writeProfileRect */
/* * writeProfileLong - write a long integer to the profile */ static void writeProfileLong( const char *key, long value ) { char str[MAX_STR]; MySprintf( str, "%l", value ); writeProfileString( key, str ); } /* writeProfileLong */
/* * InvokeMenuHook - invoke the menu hook */ vi_rc InvokeMenuHook( int menunum, int line ) { char tmp[16]; vi_rc rc; MySprintf( tmp, "%d %d", menunum, line ); rc = SourceHookData( SRC_HOOK_MENU, tmp ); return( rc ); } /* InvokeMenuHook */
/* * findHook - look for a hook routine */ static vars *findHook( char *which ) { char foo[64]; vars *v; MySprintf( foo, "%shook", which ); v = VarFind( foo, NULL ); return( v ); } /* findHook */
/* * NewLabel - generate a new unique label */ label NewLabel( void ) { char buff[MAX_NUM_STR]; label tmp; MySprintf( buff, "_l_%l", CurrentSrcLabel++ ); AddString( &tmp, buff ); return( tmp ); } /* NewLabel */
/* * InvokeColSelHook - invoke column hook with specified data */ vi_rc InvokeColSelHook( int sc, int ec ) { int j, i; char wordbuff[MAX_STR]; char data[MAX_STR + 32]; int lne; #ifndef __WIN__ int x1; int has_bord; #endif #ifndef __WIN__ has_bord = WindowAuxInfo( CurrentWindow, WIND_INFO_HAS_BORDER ); x1 = WindowAuxInfo( CurrentWindow, WIND_INFO_X1 ); if( LastEvent != VI_KEY( MOUSEEVENT ) ) { lne = WindowAuxInfo( CurrentWindow, WIND_INFO_Y1 ) + CurrentPos.line - LeftTopPos.line; if( has_bord ) { ++lne; } } else { lne = MouseRow; } #else if( LastEvent != VI_KEY( FAKEMOUSE ) ) { lne = (CurrentPos.line - LeftTopPos.line) * FontHeight( WIN_FONT( &EditWindow ) ); } else { lne = MouseY; } #endif j = 0; if( ec - sc >= MAX_STR ) { ec = sc + MAX_STR - 2; } for( i = sc - 1; i <= ec - 1; i++ ) { wordbuff[j++] = CurrentLine->data[i]; } wordbuff[j] = 0; #ifndef __WIN__ sc = x1 + VirtualColumnOnCurrentLine( sc ) - LeftTopPos.column; ec = x1 + VirtualColumnOnCurrentLine( ec ) - LeftTopPos.column; if( !has_bord ) { sc--; ec--; } #else sc = MyTextExtent( CurrentWindow, WIN_STYLE( &EditWindow ), &CurrentLine->data[0], sc ); ec = MyTextExtent( CurrentWindow, WIN_STYLE( &EditWindow ), &CurrentLine->data[0], ec ); #endif MySprintf( data, "\"%s\" %d %d %d %d", wordbuff, lne, sc, ec, ec - sc + 1 ); return( SourceHookData( SRC_HOOK_MOUSE_CHARSEL, data ) ); } /* InvokeColSelHook */
WINEXPORT BOOL CALLBACK GrepListProc( HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam ) { static char **fileList; static int fileCount; HWND list_box; char tmp[MAX_STR]; WORD cmd; switch( msg ) { case WM_INITDIALOG: list_box = GetDlgItem( dlg, ID_FILE_LIST ); SendMessage( list_box, WM_SETFONT, (WPARAM)FontHandle( dirw_info.text.font ), 0L ); MySprintf( tmp, "Files Containing \"%s\"", sString ); SetWindowText( dlg, tmp ); fileList = (char **)MemAlloc( sizeof( char * ) * MAX_FILES ); fileCount = initList( list_box, (char *)lparam, fileList ); if( fileCount == 0 ) { /* tell him that there are no matches and close down? */ Message1( "String \"%s\" not found", sString ); EndDialog( dlg, DO_NOT_CLEAR_MESSAGE_WINDOW ); } else { SendMessage( list_box, LB_SETCURSEL, 0, 0L ); BringWindowToTop( dlg ); SetFocus( dlg ); } break; case WM_COMMAND: cmd = LOWORD( wparam ); switch( cmd ) { case ID_FILE_LIST: if( GET_WM_COMMAND_CMD( wparam, lparam ) == LBN_DBLCLK ) { getOneFile( dlg, fileList, &fileCount, TRUE ); } break; case ID_EDIT: case ID_GOTO: getOneFile( dlg, fileList, &fileCount, cmd == ID_GOTO ); break; case ID_GETALL: getAllFiles( dlg, fileList, &fileCount ); break; case IDCANCEL: EndDialog( dlg, ERR_NO_ERR ); return( TRUE ); } break; case WM_DESTROY: MemFreeList( fileCount, fileList ); break; } return( FALSE ); } /* GrepListProc */
/* * PickATag - pick a tag */ int PickATag( int clist, char **list, char *tagname ) { window_info tw; int i; bool show_lineno; selectitem si; vi_rc rc; char title[MAX_STR]; memcpy( &tw, &dirw_info, sizeof( window_info ) ); tw.x1 = 12; tw.x2 = EditVars.WindMaxWidth - 12; i = tw.y2 - tw.y1 + 1; if( tw.has_border ) { i -= 2; } if( clist < i ) { tw.y2 -= i - clist; } if( clist > i ) { show_lineno = TRUE; } else { show_lineno = FALSE; } MySprintf( title, "Pick A File For Tag \"%s\"", tagname ); memset( &si, 0, sizeof( si ) ); si.wi = &tw; si.title = title; si.list = list; si.maxlist = clist; si.num = 0; si.retevents = NULL; si.event = VI_KEY( DUMMY ); si.show_lineno = show_lineno; si.cln = 1; si.eiw = NO_WINDOW; rc = SelectItem( &si ); if( rc != ERR_NO_ERR ) { return( -1 ); } return( si.num ); } /* PickATag */
/* * readConfigFile - get the name of the config file that we are to read */ static void readConfigFile( void ) { char cname[FILENAME_MAX]; //char str[MAX_STR]; // not used if not prompting for new cfg files char *cfgname; struct stat cfg; int rc; DWORD new_cfgtime = 0; cfgTime = getProfileLong( keyCfgTime ); cfgname = GetConfigFileName(); GetFromEnv( cfgname, cname ); if( cname[0] != '\0' ) { stat( cname, &cfg ); new_cfgtime = cfg.st_mtime; if( cfgTime == 0 ) { cfgTime = new_cfgtime; } } if( access( cfgFile, R_OK ) != -1 ) { rc = IDNO; #if 0 // don't prompt for newer config files if( new_cfgtime > cfgTime ) { MySprintf( str, "The configuration file \"%s\" is newer than your .INI file, do you wish to use the new configuration?", cname ); rc = MessageBox( NO_WINDOW, str, EditorName, MB_YESNO | MB_TASKMODAL ); if( rc == IDYES ) { cfgTime = new_cfgtime; } } #endif if( rc == IDNO ) { SetConfigFileName( cfgFile ); } } else { cfgTime = new_cfgtime; } saveConfig = getProfileLong( keySaveConfig ); } /* readConfigFile */
/* * IDEGetKeys - try to get keys from the IDE */ void IDEGetKeys( void ) { char buff[MAX_STR]; char path[FILENAME_MAX]; if( !EditFlags.UseIDE ) { return; } if( !VxDPutPending() ) { return; } VxDGet( buff, sizeof( buff ) ); KeyAddString( buff ); GetCurrentFilePath( path ); MySprintf( buff, "(%ld, %d) %s\r\n", CurrentLineNumber, CurrentColumn, path ); VxDPut( buff, strlen( buff ) + 1 ); VxDPut( TERMINATE_COMMAND_STR, sizeof( TERMINATE_COMMAND_STR ) ); } /* IDEGetKeys */
/* * readOnlyCheck - check if writing read-only file okay */ static int readOnlyCheck( void ) { char tmp[MAX_STR]; #ifndef __WIN__ char st[MAX_STR]; #endif MySprintf( tmp, "\"%s\" is read-only, overwrite?", CurrentFile->name ); #ifdef __WIN__ if( MessageBox( Root, tmp, EditorName, MB_YESNO | MB_TASKMODAL ) == IDYES ) { return( ERR_NO_ERR ); } return( ERR_READ_ONLY_FILE ); #else if( GetResponse( tmp, st ) == GOT_RESPONSE && st[0] == 'y' ) { return( ERR_NO_ERR ); } return( ERR_READ_ONLY_FILE ); #endif } /* readOnlyCheck */
/* * InvokeLineSelHook - invoke the mouse selection */ vi_rc InvokeLineSelHook( linenum s, linenum e ) { char tmp[32]; int lne, col; #ifndef __WIN__ int has_bord; #endif #ifndef __WIN__ if( LastEvent != VI_KEY( MOUSEEVENT ) ) { has_bord = WindowAuxInfo( CurrentWindow, WIND_INFO_HAS_BORDER ); lne = WindowAuxInfo( CurrentWindow, WIND_INFO_Y1 ) + CurrentPos.line - LeftTopPos.line; col = WindowAuxInfo( CurrentWindow, WIND_INFO_X1 ) + VirtualColumnOnCurrentLine( CurrentPos.column ) - LeftTopPos.column - 1; if( has_bord ) { ++lne; ++col; } if( col < 0 ) { col = 0; } } else { col = MouseCol; lne = MouseRow; } #else if( LastEvent != VI_KEY( FAKEMOUSE ) ) { /* assume we're not in insert mode *ouch* */ col = PixelFromColumnOnCurrentLine( CurrentPos.column ); lne = (CurrentPos.line - LeftTopPos.line) * FontHeight( WIN_FONT( &EditWindow ) ); } else { col = MouseX; lne = MouseY; } #endif MySprintf( tmp, "%d %d %l %l", lne, col, s, e ); return( SourceHookData( SRC_HOOK_MOUSE_LINESEL, tmp ) ); } /* InvokeLineSelHook */
/* * RunCommandLine - run a command line command */ vi_rc RunCommandLine( const char *cmdl ) { int i, x, y, x2, y2; bool n1f, n2f; int tkn, flag; bool test1; linenum n1, n2; char st[FILENAME_MAX]; info *cinfo; long val; jmp_buf jmpaddr; vi_rc rc; const char *data; /* * parse command string */ tkn = TOK_INVALID; rc = ParseCommandLine( cmdl, &n1, &n1f, &n2, &n2f, &tkn, &data ); if( rc != ERR_NO_ERR ) { return( rc ); } if( !n2f ) { if( !n1f ) { n1 = n2 = CurrentPos.line; } else { n2 = n1; } } /* * process tokens */ rc = ERR_INVALID_COMMAND; test1 = n1f || n2f; switch( tkn ) { case PCL_T_ABOUT: rc = DoAboutBox(); break; case PCL_T_PUSH: rc = PushFileStackAndMsg(); break; case PCL_T_POP: rc = PopFileStack(); break; case PCL_T_EXECUTE: data = SkipLeadingSpaces( data ); if( *data != '\0' ) { key_map scr; rc = AddKeyMap( &scr, data ); if( rc != ERR_NO_ERR ) { break; } rc = RunKeyMap( &scr, 1L ); MemFree( scr.data ); } break; case PCL_T_DELETEMENU: rc = DoMenuDelete( data ); break; case PCL_T_DELETEMENUITEM: rc = DoItemDelete( data ); break; case PCL_T_ADDMENUITEM: rc = AddMenuItem( data ); break; case PCL_T_MAXIMIZE: rc = MaximizeCurrentWindow(); break; case PCL_T_MINIMIZE: rc = MinimizeCurrentWindow(); break; case PCL_T_EXITFILESONLY: if( !ExitWithPrompt( false, false ) ) { rc = ERR_EXIT_ABORTED; } else { rc = ERR_NO_ERR; } break; case PCL_T_EXITALL: if( !ExitWithPrompt( true, false ) ) { rc = ERR_EXIT_ABORTED; } else { rc = ERR_NO_ERR; } break; case PCL_T_QUITALL: ExitWithVerify(); rc = ERR_NO_ERR; break; case PCL_T_KEYADD: data = SkipLeadingSpaces( data ); KeyAddString( data ); rc = ERR_NO_ERR; break; case PCL_T_UNALIAS: rc = UnAlias( data ); break; case PCL_T_UNABBREV: rc = UnAbbrev( data ); break; case PCL_T_UNMAP: case PCL_T_UNMAP_DMT: flag = MAPFLAG_MESSAGE + MAPFLAG_UNMAP; if( tkn == PCL_T_UNMAP_DMT ) { flag |= MAPFLAG_DAMMIT; } rc = MapKey( flag, data ); break; case PCL_T_EVAL: data = Expand( dataBuff, data, NULL ); i = setjmp( jmpaddr ); if( i != 0 ) { rc = (vi_rc)i; } else { StartExprParse( data, jmpaddr ); val = GetConstExpr(); ltoa( val, st, EditVars.Radix ); Message1( "%s", st ); rc = ERR_NO_ERR; } break; case PCL_T_COMPILE: case PCL_T_SOURCE: case PCL_T_LOAD: { char *tstr; srcline sline; data = GetNextWord1( data, st ); if( *st == '\0' ) { rc = ERR_NO_FILE_SPECIFIED; break; } if( tkn == PCL_T_COMPILE ) { EditFlags.CompileScript = true; if( st[0] == '-' ) { if( st[1] == 'a' || st[1] == 'A' ) { EditFlags.CompileAssignments = true; if( st[1] == 'A' ) { EditFlags.CompileAssignmentsDammit = true; } data = GetNextWord1( data, st); if( *st == '\0' ) { rc = ERR_NO_FILE_SPECIFIED; break; } } } } if( tkn == PCL_T_LOAD ) { EditFlags.LoadResidentScript = true; } sline = 0; rc = Source( st, data, &sline ); EditFlags.LoadResidentScript = false; EditFlags.CompileScript = false; EditFlags.CompileAssignments = false; EditFlags.CompileAssignmentsDammit = false; if( EditFlags.SourceScriptActive ) { LastError = rc; } if( rc > ERR_NO_ERR ) { Error( "%s on line %u of \"%s\"", GetErrorMsg( rc ), sline, st ); } else { if( rc != DO_NOT_CLEAR_MESSAGE_WINDOW ) { if( tkn != PCL_T_SOURCE ) { if( tkn == PCL_T_LOAD ) { tstr = strLoad; } else { tstr = strCompile; } Message1( "Script \"%s\" %s, %u lines generated, %d errors", st, tstr, sline, SourceErrCount ); rc = DO_NOT_CLEAR_MESSAGE_WINDOW; } } } break; } case PCL_T_GENCONFIG: #ifndef __WIN__ data = GetNextWord1( data,st ); if( *st != '\0' ) { rc = GenerateConfiguration( st, true ); } else { rc = GenerateConfiguration( NULL, true ); } #else { bool temp = EditFlags.SaveConfig; EditFlags.SaveConfig = true; WriteProfile(); EditFlags.SaveConfig = temp; rc = ERR_NO_ERR; } #endif break; case PCL_T_COMPRESS: rc = CompressWhiteSpace(); break; case PCL_T_EXPAND: rc = ExpandWhiteSpace(); break; case PCL_T_SHOVE: rc = Shift( n1, n2, '>', true ); break; case PCL_T_SUCK: rc = Shift( n1, n2, '<', true ); break; case PCL_T_FILES: if( EditFlags.LineDisplay ) { rc = DisplayFileStatus(); } else { rc = EditFileFromList(); } break; case PCL_T_NEXT: rc = RotateFileForward(); break; case PCL_T_PREV: rc = RotateFileBackwards(); break; case PCL_T_HELP: rc = DoHelp( data ); break; case PCL_T_VIEW: case PCL_T_VIEW_DMT: EditFlags.ViewOnly = true; case PCL_T_EDIT: case PCL_T_EDIT_DMT: rc = EditFile( data, ( tkn == PCL_T_VIEW_DMT || tkn == PCL_T_EDIT_DMT ) ); EditFlags.ViewOnly = false; break; case PCL_T_OPEN: rc = OpenWindowOnFile( data ); break; case PCL_T_HIDE: case PCL_T_HIDE_DMT: rc = HideLineRange( n1, n2, ( tkn == PCL_T_HIDE_DMT ) ); break; case PCL_T_DELETE: rc = SetSavebufNumber( data ); if( rc != ERR_NO_ERR ) { break; } if( SelRgn.selected && !EditFlags.LineBased ) { AddSelRgnToSavebufAndDelete(); rc = ERR_NO_ERR; // @ may have turned this on - it is now definitely off SelRgn.selected = false; } else { rc = DeleteLineRange( n1, n2, SAVEBUF_FLAG ); } if( rc == ERR_NO_ERR ) { DCDisplayAllLines(); LineDeleteMessage( n1, n2 ); } break; case PCL_T_SAVEANDEXIT: data = GetNextWord1( data, st ); if( *st == '\0' ) { rc = SaveAndExit( st ); } else { rc = SaveAndExit( NULL ); } break; case PCL_T_PUT: case PCL_T_PUT_DMT: rc = SetSavebufNumber( data ); if( rc != ERR_NO_ERR ) { break; } rc = SaveAndResetFilePos( n1 ); if( rc == ERR_NO_ERR ) { if( tkn == PCL_T_PUT ) { rc = InsertSavebufAfter(); } else { rc = InsertSavebufBefore(); } RestoreCurrentFilePos(); } break; case PCL_T_YANK: rc = SetSavebufNumber( data ); if( rc != ERR_NO_ERR ) { break; } if( SelRgn.selected && !EditFlags.LineBased ) { rc = YankSelectedRegion(); // @ may have turned this on - it is now definitely off SelRgn.selected = false; } else { rc = YankLineRange( n1, n2 ); } break; case PCL_T_SUBSTITUTE: rc = Substitute( n1, n2, data ); break; case PCL_T_GLOBAL: case PCL_T_GLOBAL_DMT: if( !test1 ) { n1 = 1; rc = CFindLastLine( &n2 ); if( rc != ERR_NO_ERR ) { break; } } rc = Global( n1,n2, data, ( tkn == PCL_T_GLOBAL_DMT ) ); break; case PCL_T_WRITEQUIT: if( CurrentFile == NULL ) { rc = NextFile(); } else { CurrentFile->modified = true; data = GetNextWord1( data, st ); if( *st != '\0' ) { rc = SaveAndExit( st ); } else { rc = SaveAndExit( NULL ); } } break; case PCL_T_WRITE: case PCL_T_WRITE_DMT: data = GetNextWord1( data, st ); if( test1 ) { if( *st == '\0' ) { rc = ERR_NO_FILE_SPECIFIED; } else { rc = SaveFile( st, n1, n2, ( tkn == PCL_T_WRITE_DMT ) ); } } else { if( st[0] != '\0' ) { #ifdef __WIN__ if( st[0] == '?' && st[1] == '\0' ) { rc = SaveFileAs(); break; } else { rc = SaveFile( st, -1, -1, ( tkn == PCL_T_WRITE_DMT ) ); } #else rc = SaveFile( st, -1, -1, ( tkn == PCL_T_WRITE_DMT ) ); #endif } else { rc = SaveFile( NULL, -1, -1, ( tkn == PCL_T_WRITE_DMT ) ); if( rc == ERR_NO_ERR ) { Modified( false ); } } } break; case PCL_T_READ: rc = ReadAFile( n1, data ); break; case PCL_T_QUIT: #ifdef __WIN__ rc = CurFileExitOptionSaveChanges(); #else rc = NextFile(); #endif break; case PCL_T_QUIT_DMT: rc = NextFileDammit(); break; case PCL_T_DATE: GetDateTimeString( st ); Message1( st ); rc = DO_NOT_CLEAR_MESSAGE_WINDOW; break; case PCL_T_CD: data = GetNextWord1( data, st ); if( *st != '\0' ) { rc = SetCWD( st ); } else { rc = ERR_NO_ERR; } if( rc == ERR_NO_ERR ) { Message1( "Current directory is %s",CurrentDirectory ); } break; case PCL_T_SHELL: EVIL_SHELL: { #if defined( __NT__ ) && !defined( __WIN__ ) ExecCmd( NULL, NULL, NULL ); #else char foo[FILENAME_MAX]; strcpy( foo, Comspec ); ExecCmd( NULL, NULL, foo ); #endif DoVersion(); rc = ERR_NO_ERR; } break; case PCL_T_SYSTEM: if( n1f && n2f ) { rc = DoGenericFilter( n1, n2, data ); } else { data = SkipLeadingSpaces( data ); if( *data == '\0' ) { goto EVIL_SHELL; } ExecCmd( NULL, NULL, data ); rc = ERR_NO_ERR; } break; case PCL_T_RESIZE: rc = ResizeCurrentWindowWithKeys(); break; case PCL_T_TILE: data = GetNextWord1( data, st ); if( st[0] != '\0' ) { if( st[0] == 'v' ) { y = 1; for( x = 0, cinfo = InfoHead; cinfo != NULL; cinfo = cinfo->next ) { x++; } } else if( st[0] == 'h' ) { x = 1; for( y = 0, cinfo = InfoHead; cinfo != NULL; cinfo = cinfo->next ) { y++; } } else { x = atoi( st ); data = GetNextWord1( data, st ); if( *st == '\0' ) { break; } else { y = atoi( st ); } } } else { x = EditVars.MaxWindowTileX; y = EditVars.MaxWindowTileY; } if( x > 0 && y > 0) { rc = WindowTile( x, y ); } break; case PCL_T_CASCADE: rc = WindowCascade(); break; case PCL_T_MOVEWIN: rc = MoveCurrentWindowWithKeys(); break; case PCL_T_TAG: data = GetNextWord1( data, st ); if( *st != '\0' ) { rc = TagHunt( st ); } break; case PCL_T_FGREP: { bool ci; data = SkipLeadingSpaces( data ); ci = EditFlags.CaseIgnore; if( data[0] == '-' ) { if( data[1] == 'c' ) { ci = false; data += 2; data = SkipLeadingSpaces( data ); rc = GetStringWithPossibleQuote( &data, st ); } else if( data[1] == 'i' ) { ci = true; data += 2; data = SkipLeadingSpaces( data ); rc = GetStringWithPossibleQuote( &data, st ); } else if( data[1] == 'f' ) { data += 2; data = SkipLeadingSpaces( data ); #ifdef __WIN__ // call fancy grep window { fancy_find *ff; /* ff will be set to point at a static fancy find struct * in the snoop module */ char snoopbuf[FILENAME_MAX]; if( !GetSnoopStringDialog( &ff ) ) { return( ERR_NO_ERR ); } strcpy( snoopbuf, ff->path ); /* assume no string means current directory */ if( strlen( snoopbuf ) && snoopbuf[strlen( snoopbuf ) - 1] != '\\' ){ strcat( snoopbuf, "\\" ); } MySprintf( st, "%s", ff->find ); strcat( snoopbuf, ff->ext ); ci = ff->case_ignore; if( !ff->use_regexp ) { //MakeExpressionNonRegular( st ); rc = DoFGREP( snoopbuf, st, ci ); } else { rc = DoEGREP( snoopbuf, st ); } break; } #endif } } else { rc = GetStringWithPossibleQuote( &data, st ); } if( rc != ERR_NO_STRING ) { rc = DoFGREP( data, st, ci ); } } break; case PCL_T_EGREP: rc = GetStringWithPossibleQuote( &data, st ); if( rc != ERR_NO_STRING ) { rc = DoEGREP( data, st ); } break; case PCL_T_SIZE: data = GetNextWord1( data, st ); if( *st == '\0' ) { break; } x = atoi( st ); data = GetNextWord1( data, st ); if( *st == '\0' ) { break; } y = atoi( st ); data = GetNextWord1( data, st ); if( *st == '\0' ) { break; } x2 = atoi( st ); data = GetNextWord1( data, st ); if( *st == '\0' ) { break; } y2 = atoi( st ); rc = CurrentWindowResize( x, y, x2, y2 ); break; case PCL_T_ECHO: data = GetNextWord1( data, st ); if( *st == '\0' ) { break; } rc = ERR_NO_ERR; if( !stricmp( st, "on" ) ) { EditFlags.EchoOn = true; break; } else if( !stricmp( st, "off" ) ) { EditFlags.EchoOn = false; break; } x = atoi( st ); data = SkipLeadingSpaces( data ); /* * FIXME: This is not good - I will definately have to * fix this code up. But right now I have to get the * editor ready for tomorrow. Brad. */ if( data[0] == '"' || data[0] == '/' ) { GetStringWithPossibleQuote( &data, st ); if( x > 2 ) { /* this is obviously a sick individual */ Error( "Invalid Echo" ); } else if( x == 1 ) { Message1( st ); } else if( x == 2 ) { Message2( st ); } // DisplayLineInWindow( MessageWindow, x, st ); } else { if( x > 2 ) { /* this is obviously a sick individual */ Error( "Invalid Echo" ); } else if( x == 1 ) { Message1( data ); } else if( x == 2 ) { Message2( data ); } // DisplayLineInWindow( MessageWindow, x, data ); } break; #ifdef VI_RCS case PCL_T_CHECKOUT: rc = ERR_NO_ERR; #ifdef __WINDOWS__ if( isOS2() ) break; // OS/2 shell returns before checkout finishes #endif if( CurrentFile != NULL ) { rc = ViRCSCheckout( rc ); } break; case PCL_T_CHECKIN: if( CurrentFile != NULL ) { rc = ViRCSCheckin( rc ); } break; #endif default: if( tkn >= 1000 ) { rc = ProcessEx( n1, n2, n2f, tkn - 1000, data ); break; } rc = TryCompileableToken( tkn, data, true ); if( rc != NOT_COMPILEABLE_TOKEN ) { break; } rc = ProcessWindow( tkn, data ); if( rc >= ERR_NO_ERR ) { break; } case TOK_INVALID: if( n1f && !n2f ) { if( !n1 ) { n1 = 1; } MemorizeCurrentContext(); rc = GoToLineNoRelCurs( n1 ); if( rc == ERR_NO_ERR ) { GoToColumnOnCurrentLine( 1 ); if( EditFlags.LineDisplay ) { MyPrintf( "%s\n", CurrentLine->data ); } } return( rc ); } rc = ERR_INVALID_COMMAND; break; } if( rc == ERR_NO_ERR ) { rc = DO_NOT_CLEAR_MESSAGE_WINDOW; } return( rc ); } /* RunCommandLine */
/* * MapKey - set up a key mapping */ vi_rc MapKey( int flag, char *data ) { char keystr[MAX_STR]; key_map *maps; int j; vi_key key; vi_rc rc; #ifndef VICOMP if( !EditFlags.ScriptIsCompiled || (flag & MAPFLAG_UNMAP) ) { #endif rc = readKeyData(); if( rc != ERR_NO_ERR ) { return( rc ); } #ifndef VICOMP } #endif /* * get if it is an input/regular key mapping */ if( flag & MAPFLAG_DAMMIT ) { maps = InputKeyMaps; } else { maps = KeyMaps; } if( NextWord1( data, keystr ) <= 0 ) { return( ERR_INVALID_MAP ); } RemoveLeadingSpaces( data ); /* * get key we are using */ #ifndef VICOMP if( !EditFlags.ScriptIsCompiled || (flag & MAPFLAG_UNMAP) ) { #endif j = Tokenize( charTokens, keystr, TRUE ); if( j == TOK_INVALID ) { key = (unsigned char)keystr[0]; } else { key = keyVals[j]; } if( key >= MAX_EVENTS ) { return( ERR_INVALID_KEY ); } #ifndef VICOMP } else { long keyl; keyl = atol( keystr ); if( keyl < 0 || keyl >= MAX_EVENTS ) { return( ERR_INVALID_KEY ); } key = (vi_key)keyl; } #endif #ifndef VICOMP if( EditFlags.CompileScript ) { #endif if( !(flag & MAPFLAG_UNMAP) ) { key_map scr; rc = AddKeyMap( &scr, data ); if( rc == ERR_NO_ERR ) { if( scr.no_input_window ) { MySprintf( WorkLine->data, "%d \\x%s", key, scr.data ); } else { MySprintf( WorkLine->data, "%d %s", key, scr.data ); } } MemFree( scr.data ); return( rc ); } else { MySprintf( WorkLine->data, "%d %s", key, data ); return( ERR_NO_ERR ); } #ifndef VICOMP } maps[key].inuse = FALSE; maps[key].is_base = FALSE; MemFree( maps[key].data ); maps[key].data = NULL; if( !(flag & MAPFLAG_UNMAP ) ) { if( flag & MAPFLAG_BASE ) { maps[key].is_base = TRUE; } return( AddKeyMap( &maps[key], data ) ); } return( ERR_NO_ERR ); #endif } /* MapKey */
/* * SelectLineInFile - select a line in a given file */ vi_rc SelectLineInFile( selflinedata *sfd ) { int i, winflag; int leftcol = 0, key2; bool done = FALSE, redraw = TRUE; bool hiflag = FALSE, drawbord = FALSE; int farx, text_lines; linenum pagetop = 1, lln = 1; char tmp[MAX_STR]; hilst *ptr; linenum cln; linenum endline; vi_rc rc; vi_key key; /* * create the window */ cln = sfd->cln; endline = sfd->f->fcbs.tail->end_line; farx = sfd->wi->x2; if( sfd->show_lineno ) { farx++; } if( sfd->hilite != NULL ) { hiflag = TRUE; } rc = NewWindow2( &cWin, sfd->wi ); if( rc != ERR_NO_ERR ) { return( rc ); } if( !sfd->is_menu ) { WindowAuxUpdate( cWin, WIND_INFO_HAS_SCROLL_GADGETS, TRUE ); DrawBorder( cWin ); } oWin = sfd->eiw; isMenu = sfd->is_menu; PushMouseEventHandler( SelectLineMouseHandler ); KillCursor(); text_lines = WindowAuxInfo( cWin, WIND_INFO_TEXT_LINES ); sfd->sl = -1; if( sfd->title != NULL ) { WindowTitle( cWin, sfd->title ); } pagetop = text_lines * (cln / text_lines); if( cln % text_lines != 0 ) { pagetop++; } key = 0; if( LastEvent == VI_KEY( MOUSEEVENT ) ) { DisplayMouse( TRUE ); } /* * now, allow free scrolling and selection */ while( !done ) { if( redraw ) { if( sfd->show_lineno ) { MySprintf(tmp, "%l/%l", cln, endline ); i = sfd->wi->x2 - sfd->wi->x1; WindowBorderData( cWin, tmp, i - strlen( tmp ) ); drawbord = TRUE; } if( hiflag ) { ptr = sfd->hilite; ptr += cln - 1; if( ptr->_char == (char)-1 ) { if( cln > lln ) { cln++; } else if( cln < lln ) { cln--; } } } if( drawbord ) { DrawBorder( cWin ); } displayGenericLines( sfd->f, pagetop, leftcol, cln, &(sfd->wi->hilight), sfd->hilite, sfd->vals, sfd->valoff ); } lln = cln; redraw = TRUE; drawbord = FALSE; mouseLine = -1; rlMenu = FALSE; if( key == VI_KEY( MOUSEEVENT ) ) { DisplayMouse( TRUE ); } key = GetNextEvent( TRUE ); if( hiflag && ((key >= VI_KEY( ALT_A ) && key <= VI_KEY( ALT_Z )) || (key >='a' && key <= 'z') || (key >= 'A' && key <= 'Z') || (key >= '1' && key <= '9')) ) { i = 0; if( key >= VI_KEY( ALT_A ) && key <= VI_KEY( ALT_Z ) ) { key2 = key - VI_KEY( ALT_A ) + 'A'; } else if( key >= 'a' && key <= 'z' ) { key2 = key - 'a' + 'A'; } else { key2 = key; } ptr = sfd->hilite; while( ptr->_char != '\0' ) { if( toupper( ptr->_char ) == key2 ) { cln = i + 1; key = VI_KEY( ENTER ); break; } ++i; ++ptr; } } /* * check if a return-event has been selected */ if( sfd->retevents != NULL ) { i = 0; if( key == VI_KEY( MOUSEEVENT ) ) { if( mouseWin == oWin && LastMouseEvent == MOUSE_PRESS ) { DisplayMouse( FALSE ); sfd->event = sfd->retevents[mouseLine]; key = VI_KEY( ENTER ); } } else { while( sfd->retevents[i] != 0 ) { if( key == sfd->retevents[i] ) { sfd->event = key; key = VI_KEY( ENTER ); break; } i++; } } } /* * process key stroke */ switch( key ) { case VI_KEY( MOUSEEVENT ): DisplayMouse( FALSE ); if( hiflag ) { ptr = sfd->hilite; ptr += mouseLine; if( ptr->_char == (char) -1 ) { break; } } if( rlMenu && sfd->allow_rl != NULL ) { *(sfd->allow_rl) = rlMenuNum; done = TRUE; break; } if( mouseScroll != MS_NONE ) { switch( mouseScroll ) { case MS_UP: goto evil_up; case MS_DOWN: goto evil_down; case MS_PAGEUP: goto evil_pageup; case MS_PAGEDOWN: goto evil_pagedown; case MS_EXPOSEDOWN: adjustCLN( &cln, &pagetop, pagetop + text_lines - cln - 1, endline, text_lines ); adjustCLN( &cln, &pagetop, 1, endline, text_lines ); drawbord = TRUE; break; case MS_EXPOSEUP: adjustCLN( &cln, &pagetop, pagetop - cln, endline, text_lines ); adjustCLN( &cln, &pagetop, -1, endline, text_lines ); drawbord = TRUE; break; } break; } switch( LastMouseEvent ) { case MOUSE_DRAG: if( mouseWin != cWin ) { break; } cln = mouseLine + pagetop; break; case MOUSE_RELEASE: if( !sfd->is_menu ) { break; } if( mouseWin == cWin ) { cln = mouseLine + pagetop; if( cln <= endline ) { goto evil_enter; } } break; case MOUSE_DCLICK: if( mouseWin != cWin ) { AddCurrentMouseEvent(); done = TRUE; } else { cln = mouseLine + pagetop; if( cln <= endline ) { goto evil_enter; } } break; case MOUSE_PRESS_R: if( mouseWin != cWin ) { AddCurrentMouseEvent(); done = TRUE; } break; case MOUSE_PRESS: if( mouseWin != cWin ) { AddCurrentMouseEvent(); done = TRUE; } else { cln = mouseLine + pagetop; } break; } break; case VI_KEY( ESC ): done = TRUE; break; evil_enter: case VI_KEY( ENTER ): case ' ': /* * see if we need to do a callback for this */ if( sfd->checkres != NULL ) { line *cline; fcb *cfcb; char data[64]; i = cln - 1; GimmeLinePtr( cln, sfd->f, &cfcb, &cline ); strcpy( data, cline->data ); RemoveLeadingSpaces( data ); winflag = FALSE; strcpy( tmp, sfd->vals[i] ); rc = sfd->checkres( data, tmp, &winflag ); if( winflag ) { if( winflag == 2 ) { winflag = TRUE; } else { winflag = FALSE; } } if( winflag ) { MoveWindowToFront( cWin ); } if( rc == ERR_NO_ERR ) { AddString2( &(sfd->vals[i]), tmp ); redraw = TRUE; } break; /* * no value window, so just return line selected */ } else { if( isMenu && InvokeMenuHook( CurrentMenuNumber, cln ) == -1 ) { break; } sfd->sl = cln; done = TRUE; } break; case VI_KEY( LEFT ): case 'h': if( sfd->allow_rl != NULL ) { *(sfd->allow_rl) = -1; done = TRUE; } break; case VI_KEY( RIGHT ): case 'l': if( sfd->allow_rl != NULL ) { *(sfd->allow_rl) = 1; done = TRUE; } break; evil_up: case VI_KEY( UP ): case 'k': drawbord = adjustCLN( &cln, &pagetop, -1, endline, text_lines ); break; evil_down: case VI_KEY( DOWN ): case 'j': drawbord = adjustCLN( &cln, &pagetop, 1, endline, text_lines ); break; case VI_KEY( CTRL_PAGEUP ): drawbord = adjustCLN( &cln, &pagetop, -cln + 1, endline, text_lines ); break; case VI_KEY( CTRL_PAGEDOWN ): drawbord = adjustCLN( &cln, &pagetop, endline - cln, endline, text_lines ); break; evil_pageup: case VI_KEY( PAGEUP ): case VI_KEY( CTRL_B ): drawbord = adjustCLN( &cln, &pagetop, -text_lines, endline, text_lines ); break; evil_pagedown: case VI_KEY( PAGEDOWN ): case VI_KEY( CTRL_F ): drawbord = adjustCLN( &cln, &pagetop, text_lines, endline, text_lines ); break; case VI_KEY( HOME ): drawbord = TRUE; cln = 1; pagetop = 1; break; case VI_KEY( END ): drawbord = TRUE; cln = endline; pagetop = endline - text_lines + 1; if( pagetop < 1 ) { pagetop = 1; } break; default: redraw = FALSE; break; } } PopMouseEventHandler(); CloseAWindow( cWin ); RestoreCursor(); SetWindowCursor(); return( rc ); } /* SelectLineInFile */
WINEXPORT BOOL CALLBACK GrepListProc95( HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam ) { static char **fileList; static int fileCount; HWND list_box; char tmp[MAX_STR]; WORD cmd; LVCOLUMN lvc; LVITEM lvi; RECT rc; switch( msg ) { case WM_INITDIALOG: list_box = GetDlgItem( dlg, ID_FILE_LIST ); SendMessage( list_box, WM_SETFONT, (WPARAM)FontHandle( dirw_info.text.font ), 0L ); MySprintf( tmp, "Files Containing \"%s\"", sString ); SetWindowText( dlg, tmp ); rc.left = 0; rc.right = 70; MapDialogRect( dlg, &rc ); lvc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvc.cx = rc.right; lvc.pszText = "File Name"; lvc.iSubItem = 0; SendMessage( list_box, LVM_INSERTCOLUMN, 0, (LPARAM)&lvc ); lvc.cx = rc.right * 3; lvc.pszText = "Line"; lvc.iSubItem = 1; SendMessage( list_box, LVM_INSERTCOLUMN, 1, (LPARAM)&lvc ); fileList = (char **)MemAlloc( sizeof( char * ) * MAX_FILES ); fileCount = initList( list_box, (char *)lparam, fileList ); if( fileCount == 0 ) { Message1( "String \"%s\" not found", sString ); EndDialog( dlg, DO_NOT_CLEAR_MESSAGE_WINDOW ); } else { lvi.stateMask = LVIS_SELECTED; lvi.state = LVIS_SELECTED; SendMessage( list_box, LVM_SETITEMSTATE, 0, (LPARAM)&lvi ); BringWindowToTop( dlg ); SetFocus( dlg ); } break; case WM_COMMAND: cmd = LOWORD( wparam ); switch( cmd ) { case ID_EDIT: case ID_GOTO: getOneFile( dlg, fileList, &fileCount, cmd == ID_GOTO ); break; case ID_GETALL: getAllFiles( dlg, fileList, &fileCount ); break; case IDCANCEL: EndDialog( dlg, ERR_NO_ERR ); return( TRUE ); } break; case WM_NOTIFY: if( ((NMHDR *)lparam)->code == NM_DBLCLK ) { getOneFile( dlg, fileList, &fileCount, TRUE ); } break; case WM_DESTROY: MemFreeList( fileCount, fileList ); break; } return( FALSE ); } /* GrepListProc95 */
/* * getOneSetVal - get a single set value */ static char *getOneSetVal( int token, bool isnonbool, char *tmpstr, bool want_boolstr ) { char *str, *fign; cursor_type ct; int i, j; tmpstr[0] = 0; if( !isnonbool ) { j = (int) ((bool *)&EditFlags)[token]; if( want_boolstr ) { str = BoolStr[j]; } else { str = tmpstr; itoa( j, tmpstr, 10 ); } } else { switch( token ) { case SET1_T_STATUSSECTIONS: str = tmpstr; *str = 0; for( i = 0; i < EditVars.NumStatusSections; i++ ) { char buff[16]; itoa( EditVars.StatusSections[i], buff, 10 ); strcat( str, buff ); strcat( str, " " ); } break; case SET1_T_FILEENDSTRING: str = EditVars.FileEndString; break; case SET1_T_STATUSSTRING: str = EditVars.StatusString; break; case SET1_T_TILECOLOR: str = tmpstr; break; case SET1_T_FIGNORE: fign = EditVars.FIgnore; str = tmpstr; for( j = 0; j < EditVars.CurrFIgnore; j++ ) { strcat( str, fign ); fign += EXTENSION_LENGTH; } break; case SET1_T_GADGETSTRING: str = EditVars.GadgetString; break; case SET1_T_SHELLPROMPT: str = EditVars.SpawnPrompt; break; case SET1_T_GREPDEFAULT: str = EditVars.GrepDefault; break; case SET1_T_TMPDIR: str = EditVars.TmpDir; break; case SET1_T_WORD: str = EditVars.WordDefn; break; case SET1_T_WORDALT: str = EditVars.WordAltDefn; break; case SET1_T_FILENAME: if( CurrentFile == NULL ) { str = ""; } else { str = CurrentFile->name; } break; case SET1_T_HISTORYFILE: str = EditVars.HistoryFile; break; case SET1_T_TAGFILENAME: str = EditVars.TagFileName; break; case SET1_T_MAGICSTRING: str = EditVars.Majick; break; case SET1_T_COMMANDCURSORTYPE: case SET1_T_OVERSTRIKECURSORTYPE: case SET1_T_INSERTCURSORTYPE: if( token == SET1_T_COMMANDCURSORTYPE ) { ct = EditVars.NormalCursorType; } else if( token == SET1_T_OVERSTRIKECURSORTYPE ) { ct = EditVars.OverstrikeCursorType; } else { ct = EditVars.InsertCursorType; } str = tmpstr; MySprintf( tmpstr, "%d %d", ct.height, ct.width ); break; default: switch( token ) { case SET1_T_WRAPMARGIN: j = EditVars.WrapMargin; break; case SET1_T_CURSORBLINKRATE: j = EditVars.CursorBlinkRate; break; case SET1_T_MAXPUSH: j = EditVars.MaxPush; break; case SET1_T_RADIX: j = EditVars.Radix; break; case SET1_T_AUTOSAVEINTERVAL: j = EditVars.AutoSaveInterval; break; case SET1_T_LANGUAGE: if( CurrentInfo == NULL ) { j = LANG_NONE; } else { j = CurrentInfo->fsi.Language; } break; case SET1_T_MOUSEDCLICKSPEED: j = EditVars.MouseDoubleClickSpeed; break; case SET1_T_MOUSESPEED: j = EditVars.MouseSpeed; break; case SET1_T_MOUSEREPEATDELAY: j = EditVars.MouseRepeatDelay; break; case SET1_T_CURRENTSTATUSCOLUMN: j = EditVars.CurrentStatusColumn; break; case SET1_T_ENDOFLINECHAR: j = EditVars.EndOfLineChar; break; case SET1_T_EXITATTR: j = EditVars.ExitAttr; break; case SET1_T_MAXSWAPK: j = EditVars.MaxSwapBlocks; j *= (MAX_IO_BUFFER / 1024); break; case SET1_T_MAXEMSK: #ifndef NOEMS j = EditVars.MaxEMSBlocks; j *= (MAX_IO_BUFFER / 1024); #else j = 0; #endif break; case SET1_T_MAXXMSK: #ifndef NOXMS j = EditVars.MaxXMSBlocks; j *= (MAX_IO_BUFFER / 1024); #else j = 0; #endif break; case SET1_T_RESIZECOLOR: j = EditVars.ResizeColor; break; case SET1_T_MOVECOLOR: j = EditVars.MoveColor; break; case SET1_T_INACTIVEWINDOWCOLOR: j = EditVars.InactiveWindowColor; break; case SET1_T_MAXTILECOLORS: j = EditVars.MaxTileColors; break; case SET1_T_MAXWINDOWTILEX: j = EditVars.MaxWindowTileX; break; case SET1_T_MAXWINDOWTILEY: j = EditVars.MaxWindowTileY; break; case SET1_T_HARDTAB: j = EditVars.HardTab; break; case SET1_T_TABAMOUNT: j = EditVars.TabAmount; break; case SET1_T_SHIFTWIDTH: j = EditVars.ShiftWidth; break; case SET1_T_STACKK: j = EditVars.StackK; break; case SET1_T_LINENUMWINWIDTH: j = EditVars.LineNumWinWidth; break; case SET1_T_CLOCKX: j = EditVars.ClockX; break; case SET1_T_CLOCKY: j = EditVars.ClockY; break; case SET1_T_SPINX: j = EditVars.SpinX; break; case SET1_T_SPINY: j = EditVars.SpinY; break; case SET1_T_MAXCLHISTORY: j = EditVars.CLHist.max; break; case SET1_T_MAXFILTERHISTORY: j = EditVars.FilterHist.max; break; case SET1_T_MAXFINDHISTORY: j = EditVars.FindHist.max; break; case SET1_T_MAXLASTFILESHISTORY: j = EditVars.LastFilesHist.max; break; case SET1_T_MAXLINELEN: j = EditVars.MaxLine; break; case SET1_T_PAGELINESEXPOSED: j = EditVars.PageLinesExposed; break; case SET1_T_TOOLBARBUTTONHEIGHT: j = EditVars.ToolBarButtonHeight; break; case SET1_T_TOOLBARBUTTONWIDTH: j = EditVars.ToolBarButtonWidth; break; case SET1_T_TOOLBARCOLOR: j = EditVars.ToolBarColor; break; } itoa( j, tmpstr, 10 ); str = tmpstr; break; } } if( str == NULL ) { return( "" ); } return( str ); } /* getOneSetVal */
/* * processSetToken - set value for set token */ static vi_rc processSetToken( int j, char *value, int *winflag, bool isnonbool ) { char fn[MAX_STR], str[MAX_STR]; #ifndef VICOMP char tmp[3]; char settokstr[TOK_MAX_LEN + 1]; char save[MAX_STR]; vi_rc rc = ERR_NO_ERR; int i, clr, k; bool newset; bool set1, toggle, *ptr; jmp_buf jmpaddr; cursor_type ct; char *name; command_rtn fptr; event_bits eb; bool redisplay = FALSE; #endif bool bvalue; #ifdef VICOMP winflag = winflag; isnonbool = isnonbool; #endif /* * set up value for boolean set commands */ if( j < 0 ) { j *= -1; bvalue = FALSE; } else { bvalue = TRUE; } #ifndef VICOMP if( !(*winflag) ) { toggle = TRUE; set1 = isnonbool; } else { toggle = FALSE; #endif if( j >= SET1_T_ ) { #ifndef VICOMP if( EditFlags.CompileScript ) { #endif if( !bvalue ) { j *= -1; } itoa( j, str, 10 ); StrMerge( 2, WorkLine->data, str, SingleBlank ); return( ERR_NO_ERR ); #ifndef VICOMP } set1 = FALSE; j -= SET1_T_; } else { set1 = TRUE; #endif } #ifndef VICOMP } *winflag = FALSE; /* * process boolean settings */ if( !set1 ) { if( j >= SET2_T_ ) { return( ERR_INVALID_SET_COMMAND ); } ptr = &(((bool *)&EditFlags)[j]); newset = bvalue; if( toggle ) { newset = !(*ptr); } switch( j ) { case SET2_T_MODELESS: if( (newset && !EditFlags.Modeless) || (!newset && EditFlags.Modeless) ) { for( k = 0; k < MAX_EVENTS; k++ ) { fptr = EventList[k].rtn; eb = EventList[k].b; EventList[k].rtn = EventList[k].alt_rtn; EventList[k].alt_rtn = fptr; EventList[k].b = EventList[k].alt_b; EventList[k].alt_b = eb; } if( !EditFlags.Modeless ) { if( MenuWindow != NO_WINDOW ) { UpdateCurrentStatus( CSTATUS_INSERT ); } EditFlags.WasOverstrike = FALSE; NewCursor( CurrentWindow, EditVars.InsertCursorType ); } else { if( MenuWindow != NO_WINDOW ) { UpdateCurrentStatus( CSTATUS_COMMAND ); } NewCursor( CurrentWindow, EditVars.NormalCursorType ); // nomodeless must be line based or it dies! EditFlags.LineBased = TRUE; } /* re-position cursor in window */ SetWindowCursor(); } EditFlags.Modeless = newset; break; case SET2_T_UNDO: if( EditFlags.Undo && !newset ) { FreeAllUndos(); } EditFlags.Undo = newset; break; case SET2_T_STATUSINFO: EditFlags.StatusInfo = newset; #ifdef __WIN__ ResizeRoot(); #endif rc = NewStatusWindow(); break; case SET2_T_WINDOWGADGETS: EditFlags.WindowGadgets = newset; ResetAllWindows(); *winflag = TRUE; redisplay = TRUE; break; case SET2_T_REALTABS: EditFlags.RealTabs = newset; redisplay = TRUE; break; case SET2_T_CLOCK: EditFlags.Clock = newset; redisplay = TRUE; break; case SET2_T_TOOLBAR: EditFlags.Toolbar = newset; #ifdef __WIN__ ResizeRoot(); #endif break; case SET2_T_COLORBAR: EditFlags.Colorbar = newset; #ifdef __WIN__ if( Root == NULL ) { EditFlags.Colorbar = FALSE; } else { RefreshColorbar(); } #endif break; case SET2_T_SSBAR: EditFlags.SSbar = newset; #ifdef __WIN__ if( Root == NULL ) { EditFlags.SSbar = FALSE; } else { RefreshSSbar(); } #endif break; case SET2_T_FONTBAR: EditFlags.Fontbar = newset; #ifdef __WIN__ if( Root == NULL ) { EditFlags.Fontbar = FALSE; } else { RefreshFontbar(); } #endif break; case SET2_T_MARKLONGLINES: EditFlags.MarkLongLines = newset; break; case SET2_T_MENUS: EditFlags.Menus = newset; InitMenu(); break; case SET2_T_LINENUMBERS: if( toggle ) { newset = !EditFlags.LineNumbers; } if( newset != EditFlags.LineNumbers ) { EditFlags.LineNumbers = newset; rc = LineNumbersSetup(); *winflag = TRUE; } break; case SET2_T_CURRENTSTATUS: EditFlags.CurrentStatus = newset; InitMenu(); break; case SET2_T_DISPLAYSECONDS: EditFlags.DisplaySeconds = newset; redisplay = TRUE; break; case SET2_T_PPKEYWORDONLY: EditFlags.PPKeywordOnly = newset; redisplay = TRUE; break; case SET2_T_LASTEOL: #ifndef __WIN__ *ptr = TRUE; toggle = FALSE; break; #endif default: *ptr = newset; break; } if( msgFlag ) { if( !newset ) { tmp[0] = 'n'; tmp[1] = 'o'; tmp[2] = 0; } else { tmp[0] = 0; } MySprintf( fn, "%s%s set", tmp, GetTokenStringCVT( SetTokens2, j, settokstr, TRUE ) ); } if( toggle ) { strcpy( save, BoolStr[(int) newset] ); (*winflag) += 1; } /* * process value settings */ } else { if( toggle ) { rc = GetNewValueDialog( value ); if( rc != ERR_NO_ERR ) { return( rc ); } strcpy( save, value ); } #endif /* VICOMP */ RemoveLeadingSpaces( value ); if( value[0] == '"' ) { NextWord( value, fn, "\"" ); EliminateFirstN( value, 1 ); } else { NextWord1( value, fn ); } #ifndef VICOMP if( EditFlags.CompileScript ) { #endif itoa( j, str, 10 ); strcat( WorkLine->data, str ); if( fn[0] == '\0' ) return( ERR_NO_ERR ); switch( j ) { case SET1_T_STATUSSTRING: case SET1_T_FILEENDSTRING: case SET1_T_HISTORYFILE: case SET1_T_TMPDIR: case SET1_T_TAGFILENAME: StrMerge( 4, WorkLine->data, SingleBlank, SingleQuote, fn, SingleQuote ); break; case SET1_T_COMMANDCURSORTYPE: case SET1_T_OVERSTRIKECURSORTYPE: case SET1_T_INSERTCURSORTYPE: StrMerge( 2, WorkLine->data, SingleBlank, fn ); if( NextWord1( value, fn ) <= 0 ) { break; } StrMerge( 2, WorkLine->data, SingleBlank, fn ); break; case SET1_T_TILECOLOR: StrMerge( 2, WorkLine->data, SingleBlank, fn ); if( NextWord1( value, fn ) <= 0 ) { return( ERR_INVALID_SET_COMMAND ); } if( NextWord1( value, str ) <= 0 ) { return( ERR_INVALID_SET_COMMAND ); } StrMerge( 4, WorkLine->data, fn, SingleBlank, str, SingleBlank ); break; case SET1_T_STATUSSECTIONS: StrMerge( 2, WorkLine->data, SingleBlank, fn ); while( NextWord1( value, fn ) > 0 ) { #ifdef VICOMP int k; #endif k = atoi( fn ); if( k <= 0 ) { break; } StrMerge( 2, WorkLine->data, SingleBlank, fn ); } break; default: StrMerge( 2, WorkLine->data, SingleBlank, fn ); break; } return( ERR_NO_ERR ); #ifndef VICOMP } switch( j ) { case SET1_T_STATUSSECTIONS: if( EditVars.StatusSections != NULL ) { MemFree( EditVars.StatusSections ); EditVars.StatusSections = NULL; EditVars.NumStatusSections = 0; } for( ;; ) { k = atoi( fn ); if( k <= 0 ) { break; } EditVars.StatusSections = MemReAlloc( EditVars.StatusSections, sizeof( short ) * (EditVars.NumStatusSections + 1) ); EditVars.StatusSections[EditVars.NumStatusSections] = k; EditVars.NumStatusSections++; if( NextWord1( value, fn ) <= 0 ) { break; } } if( EditVars.StatusSections == NULL ) { MySprintf( fn, "statussections turned off" ); } else { MySprintf( fn, "statussections set" ); } break; case SET1_T_FILEENDSTRING: AddString2( &EditVars.FileEndString, fn ); ResetAllWindows(); redisplay = TRUE; break; case SET1_T_STATUSSTRING: AddString2( &EditVars.StatusString, fn ); if( StatusWindow != NO_WINDOW ) { ClearWindow( StatusWindow ); UpdateStatusWindow(); } if( msgFlag ) { MySprintf( fn, "statusstring set to %s", EditVars.StatusString ); } break; case SET1_T_GREPDEFAULT: AddString2( &EditVars.GrepDefault, fn ); break; case SET1_T_TILECOLOR: if( EditVars.TileColors == NULL ) { EditVars.TileColors = (type_style *) MemAlloc( sizeof( type_style ) * ( EditVars.MaxTileColors + 1 ) ); for( i = 0; i <= EditVars.MaxTileColors; ++i ) { EditVars.TileColors[i].foreground = -1; EditVars.TileColors[i].background = -1; EditVars.TileColors[i].font = -1; } } clr = atoi( fn ); if( clr > EditVars.MaxTileColors ) { return( ERR_INVALID_SET_COMMAND ); } if( NextWord1( value, fn ) <= 0 ) { return( ERR_INVALID_SET_COMMAND ); } EditVars.TileColors[clr].foreground = atoi( fn ); if( NextWord1( value, fn ) <= 0 ) { return( ERR_INVALID_SET_COMMAND ); } EditVars.TileColors[clr].background = atoi( fn ); EditVars.TileColors[clr].font = FONT_DEFAULT; if( msgFlag ) { MySprintf( fn, "tilecolor %d set", clr ); } break; case SET1_T_GADGETSTRING: SetGadgetString( fn ); if( msgFlag ) { MySprintf( fn, "gadget string set to %s", EditVars.GadgetString ); } ResetAllWindows(); break; case SET1_T_SHELLPROMPT: AddString2( &EditVars.SpawnPrompt, fn ); if( msgFlag ) { MySprintf( fn, "prompt string set to %s", EditVars.SpawnPrompt ); } break; case SET1_T_FIGNORE: if( fn[0] == 0 ) { MemFreePtr( (void **)&EditVars.FIgnore ); EditVars.CurrFIgnore = 0; if( msgFlag ) { MySprintf( fn, "fignore reset" ); } } else { EditVars.FIgnore = MemReAlloc( EditVars.FIgnore, EXTENSION_LENGTH * (EditVars.CurrFIgnore + 1) ); str[0] = '.'; str[1] = 0; strcat( str, fn ); str[EXTENSION_LENGTH - 1] = 0; strcpy( &EditVars.FIgnore[EXTENSION_LENGTH * EditVars.CurrFIgnore], str ); EditVars.CurrFIgnore++; if( msgFlag ) { MySprintf( fn, "%s added to fignore", str ); } } break; case SET1_T_HISTORYFILE: AddString2( &EditVars.HistoryFile, fn ); if( msgFlag ) { MySprintf( fn, "history file set to %s", EditVars.HistoryFile ); } break; case SET1_T_TAGFILENAME: AddString2( &EditVars.TagFileName, fn ); if( msgFlag ) { MySprintf( fn, "tag file name set to %s", EditVars.TagFileName ); } break; case SET1_T_FILENAME: if( CurrentFile != NULL ) { AddString2( &(CurrentFile->name), fn ); SetFileWindowTitle( CurrentWindow, CurrentInfo, TRUE ); if( msgFlag ) { MySprintf( fn, "filename set to %s", CurrentFile->name ); } FileSPVAR(); } break; case SET1_T_TMPDIR: AddString2( &EditVars.TmpDir, fn ); VerifyTmpDir(); if( msgFlag ) { MySprintf( fn, "tmpdir set to %s", EditVars.TmpDir ); } break; case SET1_T_WORD: AddString2( &EditVars.WordDefn, fn ); InitWordSearch( EditVars.WordDefn ); if( msgFlag ) { MySprintf( fn, "word set to %s", EditVars.WordDefn ); } break; case SET1_T_WORDALT: AddString2( &EditVars.WordAltDefn, fn ); if( msgFlag ) { MySprintf( fn, "wordalt set to %s", EditVars.WordAltDefn ); } break; case SET1_T_MAGICSTRING: AddString2( &EditVars.Majick, fn ); if( msgFlag ) { MySprintf( fn, "magicstring set to %s", EditVars.Majick ); } break; case SET1_T_COMMANDCURSORTYPE: case SET1_T_OVERSTRIKECURSORTYPE: case SET1_T_INSERTCURSORTYPE: i = setjmp( jmpaddr ); if( i != 0 ) { return( ERR_INVALID_SET_COMMAND ); } StartExprParse( fn, jmpaddr ); ct.height = GetConstExpr(); if( NextWord1( value, fn ) <= 0 ) { ct.width = 100; } else { i = setjmp( jmpaddr ); if( i != 0 ) { return( ERR_INVALID_SET_COMMAND ); } StartExprParse( fn, jmpaddr ); ct.width = GetConstExpr(); } if( j == SET1_T_COMMANDCURSORTYPE ) { EditVars.NormalCursorType = ct; name = "command"; } else if( j == SET1_T_OVERSTRIKECURSORTYPE ) { EditVars.OverstrikeCursorType = ct; name = "overstrike"; } else { EditVars.InsertCursorType = ct; name = "insert"; } if( msgFlag ) { MySprintf( fn, "%s cursor type set to %d,%d", name, ct.height, ct.width ); } break; default: i = setjmp( jmpaddr ); if( i != 0 ) { return( ERR_INVALID_SET_COMMAND ); } StartExprParse( fn, jmpaddr ); i = GetConstExpr(); if( i < 0 ) { i = 0; } switch( j ) { case SET1_T_WRAPMARGIN: EditVars.WrapMargin = i; break; case SET1_T_CURSORBLINKRATE: SetCursorBlinkRate( i ); break; case SET1_T_MAXPUSH: EditVars.MaxPush = i; if( EditVars.MaxPush < 1 ) { EditVars.MaxPush = 1; } InitFileStack(); break; case SET1_T_RADIX: EditVars.Radix = i; break; case SET1_T_AUTOSAVEINTERVAL: EditVars.AutoSaveInterval = i; SetNextAutoSaveTime(); break; case SET1_T_LANGUAGE: if( i < LANG_NONE || i >= LANG_MAX ) { return( ERR_INVALID_SET_COMMAND ); } if( CurrentInfo != NULL ) { LangFini( CurrentInfo->fsi.Language ); LangInit( i ); redisplay = TRUE; } break; case SET1_T_MOVECOLOR: EditVars.MoveColor = i; break; case SET1_T_RESIZECOLOR: EditVars.ResizeColor = i; break; case SET1_T_MOUSEDCLICKSPEED: EditVars.MouseDoubleClickSpeed = i; break; case SET1_T_MOUSESPEED: SetMouseSpeed( i ); break; case SET1_T_MOUSEREPEATDELAY: EditVars.MouseRepeatDelay = i; break; case SET1_T_CURRENTSTATUSCOLUMN: EditVars.CurrentStatusColumn = i; InitMenu(); break; case SET1_T_ENDOFLINECHAR: EditVars.EndOfLineChar = i; break; case SET1_T_EXITATTR: EditVars.ExitAttr = (char) i; break; case SET1_T_INACTIVEWINDOWCOLOR: EditVars.InactiveWindowColor = i; break; case SET1_T_TABAMOUNT: EditVars.TabAmount = i; break; case SET1_T_SHIFTWIDTH: EditVars.ShiftWidth = i; break; case SET1_T_PAGELINESEXPOSED: EditVars.PageLinesExposed = i; break; case SET1_T_HARDTAB: EditVars.HardTab = i; redisplay = TRUE; break; case SET1_T_STACKK: if( EditFlags.Starting ) { EditVars.StackK = i; } break; case SET1_T_LINENUMWINWIDTH: EditVars.LineNumWinWidth = i; break; case SET1_T_MAXWINDOWTILEX: EditVars.MaxWindowTileX = i; break; case SET1_T_MAXWINDOWTILEY: EditVars.MaxWindowTileY = i; break; case SET1_T_MAXSWAPK: SwapBlockInit( i ); break; case SET1_T_MAXEMSK: #ifndef NOEMS EMSBlockInit( i ); #endif break; case SET1_T_MAXXMSK: #ifndef NOXMS XMSBlockInit( i ); #endif break; case SET1_T_MAXFILTERHISTORY: FilterHistInit( i ); break; case SET1_T_MAXCLHISTORY: CLHistInit( i ); break; case SET1_T_MAXFINDHISTORY: FindHistInit( i ); break; case SET1_T_MAXLASTFILESHISTORY: LastFilesHistInit( i ); break; case SET1_T_MAXTILECOLORS: k = (EditVars.TileColors == NULL) ? 0 : EditVars.MaxTileColors + 1; EditVars.MaxTileColors = i; EditVars.TileColors = MemReAlloc( EditVars.TileColors, sizeof( type_style ) * ( EditVars.MaxTileColors + 1 ) ); for( ; k <= EditVars.MaxTileColors; ++k ) { EditVars.TileColors[k].foreground = -1; EditVars.TileColors[k].background = -1; EditVars.TileColors[k].font = -1; } break; case SET1_T_CLOCKX: EditVars.ClockX = i; GetClockStart(); break; case SET1_T_CLOCKY: EditVars.ClockY = i; GetClockStart(); break; case SET1_T_SPINX: EditVars.SpinX = i; GetSpinStart(); break; case SET1_T_SPINY: EditVars.SpinY = i; GetSpinStart(); break; case SET1_T_MAXLINELEN: /* file save fails if 1 line is > MAX_IO_BUFFER */ i = __min( i, MAX_IO_BUFFER ); EditVars.MaxLine = i; StaticStart(); WorkLine = MemReAlloc( WorkLine, sizeof( line ) + EditVars.MaxLine + 2 ); break; case SET1_T_TOOLBARBUTTONHEIGHT: EditVars.ToolBarButtonHeight = i; #ifdef __WIN__ ResizeRoot(); #endif break; case SET1_T_TOOLBARBUTTONWIDTH: EditVars.ToolBarButtonWidth = i; #ifdef __WIN__ ResizeRoot(); #endif break; case SET1_T_TOOLBARCOLOR: EditVars.ToolBarColor = i; #ifdef __WIN__ if( GetToolbarWindow() != NULL ) { InvalidateRect( GetToolbarWindow(), NULL, TRUE ); UpdateWindow( GetToolbarWindow() ); } #endif break; default: return( ERR_INVALID_SET_COMMAND ); } if( msgFlag ) { MySprintf( fn, "%s set to %d", GetTokenStringCVT( SetTokens1, j, settokstr, TRUE ), i ); } break; } } if( msgFlag && rc == ERR_NO_ERR && !EditFlags.Quiet ) { setMessage( fn, redisplay ); rc = DO_NOT_CLEAR_MESSAGE_WINDOW; } if( rc == ERR_NO_ERR && toggle ) { strcpy( value, save ); } return( rc ); #endif /* VICOMP */ } /* processSetToken */
/* * fileGrep - search a single dir and build list of files */ static void fileGrep( char *dir, char **list, int *clist, window_id wn ) { char fn[FILENAME_MAX], data[FILENAME_MAX], ts[FILENAME_MAX]; char path[FILENAME_MAX]; char drive[_MAX_DRIVE], directory[_MAX_DIR], name[_MAX_FNAME]; char ext[_MAX_EXT]; int i; #if defined( __WIN__ ) && defined( __NT__ ) LVITEM lvi; #endif vi_rc rc; /* * get file path prefix */ _splitpath( dir, drive, directory, name, ext ); strcpy( path, drive ); strcat( path, directory ); // _makepath( path, drive, directory, NULL,NULL ); /* * run through each entry and search it; building a list of matches */ rc = GetSortDir( dir, FALSE ); if( rc != ERR_NO_ERR ) { return; } for( i = 0; i < DirFileCount; i++ ) { if( !(DirFiles[i]->attr & _A_SUBDIR ) ) { strcpy( fn, path ); strcat( fn, DirFiles[i]->name ); #ifdef __WIN__ EditFlags.BreakPressed = SetGrepDialogFile( fn ); #else DisplayLineInWindow( wn, 1, fn ); #endif if( EditFlags.BreakPressed ) { return; } if( isFgrep ) { rc = fSearch( fn, ts ); } else { rc = eSearch( fn, ts ); } if( rc == FGREP_FOUND_STRING ) { ExpandTabsInABuffer( ts, strlen( ts ), data, MAX_DISP ); strcpy( ts, data ); MySprintf( data, "%X \"%s\"", fn, ts ); #ifdef __WIN__ /* * for windows - the handle passed in is the list box * and the entire string is added to it but only the file * name is added to the list */ #ifdef __NT__ if( IsCommCtrlLoaded() ) { lvi.mask = LVIF_TEXT; lvi.iItem = SendMessage( wn, LVM_GETITEMCOUNT, 0, 0L ); lvi.iSubItem = 0; lvi.pszText = fn; SendMessage( wn, LVM_INSERTITEM, 0, (LPARAM)&lvi ); lvi.iSubItem = 1; lvi.pszText = ts; SendMessage( wn, LVM_SETITEM, 0, (LPARAM)&lvi ); } else { #endif SendMessage( wn, LB_ADDSTRING, 0, (LPARAM)data ); MySprintf( data, "%X", fn ); #ifdef __NT__ } #endif #endif AddString( &(list[*clist]), data ); (*clist)++; } else if( rc != ERR_NO_ERR ) { return; } } } } /* fileGrep */
/* * FormatFileEntry - print a file entry */ void FormatFileEntry( direct_ent *file, char *res ) { char *tmp; char buff[11]; long size; struct tm *tm; time_t tt; size_t size1; size1 = strlen( file->name ) + 4; if( size1 < NAMEWIDTH + 1 ) size1 = NAMEWIDTH + 1; tmp = malloc( size1 ); strcpy( buff, "----------" ); size = file->fsize; if( file->attr & _A_SUBDIR ) { MySprintf( tmp, " " FILE_SEP_STR "%S", file->name ); buff[0] = 'd'; size = 0; } else { if( !IsTextFile( file->name ) ) { MySprintf( tmp, " *%S", file->name ); } else { MySprintf( tmp, " %S", file->name ); } } /* * build attributes */ if( file->st_mode & S_IWUSR ) { buff[1] = 'r'; } if( file->st_mode & S_IRUSR ) { buff[2] = 'w'; } if( file->st_mode & S_IXUSR ) { tmp[1] = '*'; buff[3] = 'x'; } if( file->st_mode & S_IWGRP ) { buff[4] = 'r'; } if( file->st_mode & S_IRGRP ) { buff[5] = 'w'; } if( file->st_mode & S_IXGRP ) { tmp[1] = '*'; buff[6] = 'x'; } if( file->st_mode & S_IWOTH ) { buff[7] = 'r'; } if( file->st_mode & S_IROTH ) { buff[8] = 'w'; } if( file->st_mode & S_IXOTH ) { tmp[1] = '*'; buff[9] = 'x'; } tmp[NAMEWIDTH] = '\0'; tt = file->time; tm = localtime( &tt ); MySprintf( res, "%s %s %L %D/%D/%d %D:%D", tmp, buff, size, (int)tm->tm_mon + 1, (int)tm->tm_mday, (int)tm->tm_year + 1900, (int)tm->tm_hour, (int)tm->tm_min ); } /* FormatFileEntry */
/* * EditFileFromList - edit from file in current active list */ vi_rc EditFileFromList( void ) { int i, tmp, j, n = 0, fcnt; window_id optwin; bool repeat = true; info *cinfo; char **list, modchar; vi_key evlist[4] = { VI_KEY( F1 ), VI_KEY( F2 ), VI_KEY( F3 ), VI_KEY( DUMMY ) }; bool show_lineno; window_info wi; selectitem si; vi_rc rc; /* * set up options for file list */ memcpy( &wi, &extraw_info, sizeof( window_info ) ); wi.x1 = 2; wi.x2 = 19; rc = DisplayExtraInfo( &wi, &optwin, fileOpts, NUM_OPTS ); if( rc != ERR_NO_ERR ) { return( rc ); } while( repeat ) { /* * set up for this pass */ repeat = false; MoveWindowToFrontDammit( optwin, false ); SaveCurrentInfo(); /* * allocate a buffer for strings, add strings */ list = (char **) MemAlloc( GimmeFileCount() * sizeof( char * ) ); for( j = 0, cinfo = InfoHead; cinfo != NULL; cinfo = cinfo->next, ++j ) { list[j] = MemAlloc( strlen( cinfo->CurrentFile->name ) + 3 ); if( cinfo->CurrentFile->modified ) { modchar = '*'; } else { modchar = ' '; } MySprintf( list[j], "%c %s", modchar, cinfo->CurrentFile->name ); } fcnt = j; tmp = filelistw_info.y2; i = filelistw_info.y2 - filelistw_info.y1 + 1; if( filelistw_info.has_border ) { i -= 2; } if( j < i ) { filelistw_info.y2 -= ( i - j ); } show_lineno = true; /* * get file */ if( n + 1 > j ) { n = j - 1; } memset( &si, 0, sizeof( si ) ); si.wi = &filelistw_info; si.title = "Current Files"; si.list = list; si.maxlist = j; si.num = n; si.retevents = evlist; si.event = VI_KEY( DUMMY ); si.show_lineno = show_lineno; si.cln = n + 1; si.eiw = optwin; rc = SelectItem( &si ); n = si.num; if( rc == ERR_NO_ERR ) { if( n >= 0 ) { cinfo = InfoHead; for( j = 0; j < n; ++j ) { cinfo = cinfo->next; } BringUpFile( cinfo, true ); switch( si.event ) { case VI_KEY( DUMMY ): case VI_KEY( F1 ): break; case VI_KEY( F2 ): rc = NextFile(); if( rc <= ERR_NO_ERR ) { repeat = true; } break; case VI_KEY( F3 ): rc = SaveAndExit( NULL ); if( rc <= ERR_NO_ERR ) { repeat = true; } break; } } } filelistw_info.y2 = tmp; MemFreeList( fcnt, list ); } /* * get rid of option stuff */ CloseAWindow( optwin ); return( rc ); } /* EditFileFromList */
/* * EditFile - read a file into text */ vi_rc EditFile( const char *name, bool dammit ) { char *fn, **list, *currfn; int i, cnt, ocnt; int j, len; window_id wid = NO_WINDOW; char cdir[FILENAME_MAX]; info *ci, *il; bool usedir = false; char mask[FILENAME_MAX]; bool reset_dir; int index; #ifdef __WIN__ char *altname = NULL; #endif vi_rc rc; fn = MemAlloc( FILENAME_MAX ); /* * get file name */ strcpy( cdir, CurrentDirectory ); reset_dir = false; name = SkipLeadingSpaces( name ); if( name[0] == '$' ) { ++name; usedir = true; } fn[0] = '\0'; // if( NextWord1FN( name, fn ) <= 0 ) if( GetStringWithPossibleQuote2( &name, fn, false ) != ERR_NO_ERR ) { usedir = true; mask[0] = '*'; mask[1] = '\0'; } if( usedir ) { if( EditFlags.ExMode ) { MemFree( fn ); return( ERR_INVALID_IN_EX_MODE ); } len = strlen( fn ); if( len > 0 ) { strcpy( mask, fn ); cnt = 0; for( i = len; i-- > 0; ) { if( fn[i] == FILE_SEP ) { for( j = i + 1; j <= len; j++ ) { mask[j - (i + 1)] = fn[j]; } cnt = i; break; } } fn[cnt] = '\0'; } if( fn[0] != '\0' ) { rc = SelectFileOpen( fn, &fn, mask, true ); } else { #ifdef __WIN__ if( name[0] == '\0' ) { altname = MemAlloc( 1000 ); rc = SelectFileOpen( CurrentDirectory, &altname, mask, true ); name = GetNextFileName( altname, fn ); // if multiple, kill path if( isMultipleFiles( name ) ) { name = GetNextFileName( name, fn ); // get 1st name } } else { rc = SelectFileOpen( CurrentDirectory, &fn, mask, true ); } #else rc = SelectFileOpen( CurrentDirectory, &fn, mask, true ); #endif } if( rc != ERR_NO_ERR || fn[0] == '\0' ) { MemFree( fn ); SetCWD( cdir ); return( rc ); } } /* * loop through all files */ rc = ERR_NO_ERR; EditFlags.WatchForBreak = true; #ifdef __WIN__ ToggleHourglass( true ); #endif do { if( IsDirectory( fn ) ) { if( EditFlags.ExMode ) { rc = ERR_INVALID_IN_EX_MODE; reset_dir = true; break; } rc = SelectFileOpen( fn, &fn, "*", false ); if( rc != ERR_NO_ERR ) { reset_dir = true; break; } if( fn[0] == '\0' ) { reset_dir = true; rc = ERR_NO_ERR; break; } } currfn = fn; ocnt = cnt = ExpandFileNames( currfn, &list ); if( !cnt ) { cnt = 1; } else { currfn = list[0]; } /* * loop through all expanded files */ index = 1; while( cnt > 0 ) { cnt--; /* * quit current file if ! specified, else just save current state */ if( dammit ) { ci = InfoHead; if( CurrentInfo == ci ) { ci = ci->next; } RemoveFromAutoSaveList(); #ifdef __WIN__ CloseAChildWindow( current_window_id ); #else CloseAWindow( current_window_id ); #endif FreeUndoStacks(); FreeMarkList(); FreeEntireFile( CurrentFile ); MemFree( DeleteLLItem( (ss **)&InfoHead, (ss **)&InfoTail, (ss *)CurrentInfo ) ); CurrentInfo = NULL; current_window_id = NO_WINDOW; } else { ci = CurrentInfo; SaveCurrentInfo(); wid = current_window_id; } /* * see if new file is already being edited */ SaveCurrentInfo(); for( il = InfoHead; il != NULL; il = il->next ) { if( SameFile( il->CurrentFile->name, currfn ) ) { break; } if( strcmp( CurrentDirectory, il->CurrentFile->home ) ) { /* directory has changed -- check with full path * note that this will fail if an absolute path * was specified thus we do the regular check first */ char path[FILENAME_MAX]; char drive[_MAX_DRIVE]; char dir[_MAX_DIR]; char fname[_MAX_FNAME]; char ext[_MAX_EXT]; size_t path_len; _splitpath( il->CurrentFile->name, drive, dir, fname, ext ); if( drive[0] == '\0' ) { _splitpath( il->CurrentFile->home, drive, NULL, NULL, NULL ); } strcpy( path, il->CurrentFile->home ); path_len = strlen( path ); if( path_len-- > 0 ) { #ifdef __UNIX__ if( path[path_len] != FILE_SEP ) { #else if( path[path_len] != DRV_SEP && path[path_len] != FILE_SEP ) { #endif strcat( path, FILE_SEP_STR ); } } if( dir[0] == '\0' ) { _splitpath( path, NULL, dir, NULL, NULL ); } else if( dir[0] != FILE_SEP ) { char dir2[_MAX_DIR]; _splitpath( path, NULL, dir2, NULL, NULL ); strcat( dir2, dir ); strcpy( dir, dir2 ); } _makepath( path, drive, dir, fname, ext ); if( SameFile( path, currfn ) ) { break; } } } if( il != NULL ) { BringUpFile( il, true ); } else { /* * file not edited, go get it */ rc = NewFile( currfn, false ); if( rc != ERR_NO_ERR && rc != NEW_FILE ) { RestoreInfo( ci ); DCDisplayAllLines(); break; } if( !dammit ) { InactiveWindow( wid ); } if( EditFlags.BreakPressed ) { break; } } if( cnt > 0 ) { currfn = list[index]; index++; } } if( ocnt > 0 ) { MemFreeList( ocnt, list ); } if( EditFlags.BreakPressed ) { ClearBreak(); break; } name = GetNextFileName( name, fn ); } while( *fn != '\0' ); #ifdef __WIN__ if( altname != NULL ) { MemFree( altname ); } #endif MemFree( fn ); #ifdef __WIN__ ToggleHourglass( false ); #endif EditFlags.WatchForBreak = false; if( reset_dir ) { SetCWD( cdir ); } return( rc ); } /* EditFile */ #ifndef __WIN__ static const char *fileOpts[] = { (const char *)"<F1> Go To", (const char *)"<F2> Quit", (const char *)"<F3> Save & Quit" }; static const vi_key fileopts_evlist[] = { VI_KEY( F1 ), VI_KEY( F2 ), VI_KEY( F3 ), VI_KEY( DUMMY ) }; /* * EditFileFromList - edit from file in current active list */ vi_rc EditFileFromList( void ) { int i, tmp, j, n = 0, fcnt; window_id wid; bool repeat = true; info *cinfo; char **list, modchar; bool show_lineno; window_info wi; selectitem si; vi_rc rc; /* * set up options for file list */ memcpy( &wi, &extraw_info, sizeof( window_info ) ); wi.area.x1 = 2; wi.area.x2 = 19; rc = DisplayExtraInfo( &wi, &wid, fileOpts, sizeof( fileOpts ) / sizeof( fileOpts[0] ) ); if( rc != ERR_NO_ERR ) { return( rc ); } while( repeat > 0 ) { /* * set up for this pass */ repeat = false; MoveWindowToFrontDammit( wid, false ); SaveCurrentInfo(); /* * allocate a buffer for strings, add strings */ list = (char **) MemAlloc( GimmeFileCount() * sizeof( char * ) ); for( j = 0, cinfo = InfoHead; cinfo != NULL; cinfo = cinfo->next, ++j ) { list[j] = MemAlloc( strlen( cinfo->CurrentFile->name ) + 3 ); if( cinfo->CurrentFile->modified ) { modchar = '*'; } else { modchar = ' '; } MySprintf( list[j], "%c %s", modchar, cinfo->CurrentFile->name ); } fcnt = j; tmp = filelistw_info.area.y2; i = filelistw_info.area.y2 - filelistw_info.area.y1 + 1; if( filelistw_info.has_border ) { i -= 2; } if( j < i ) { filelistw_info.area.y2 -= ( i - j ); } show_lineno = true; /* * get file */ if( n + 1 > j ) { n = j - 1; } memset( &si, 0, sizeof( si ) ); si.wi = &filelistw_info; si.title = "Current Files"; si.list = list; si.maxlist = j; si.num = n; si.retevents = fileopts_evlist; si.event = VI_KEY( DUMMY ); si.show_lineno = show_lineno; si.cln = n + 1; si.eiw = wid; rc = SelectItem( &si ); n = si.num; if( rc == ERR_NO_ERR ) { if( n >= 0 ) { cinfo = InfoHead; for( j = 0; j < n; ++j ) { cinfo = cinfo->next; } BringUpFile( cinfo, true ); switch( si.event ) { case VI_KEY( DUMMY ): case VI_KEY( F1 ): break; case VI_KEY( F2 ): rc = NextFile(); if( rc <= ERR_NO_ERR ) { repeat = true; } break; case VI_KEY( F3 ): rc = SaveAndExit( NULL ); if( rc <= ERR_NO_ERR ) { repeat = true; } break; } } } filelistw_info.area.y2 = tmp; MemFreeList( fcnt, list ); } /* * get rid of option stuff */ CloseAWindow( wid ); return( rc ); } /* EditFileFromList */