static void filldlgData( dlg_data *data, char *match, info *useInfo ) { // setup default values memset( useInfo, 0, sizeof( info ) ); dlgDataDefault( data ); dlgDataToGlobal( data ); // run ftype commands (the wildcard should match itself ok!) FTSRunCmds( match ); // copy environment globalTodlgData( data, useInfo ); }
/* * AutoSaveInit - initialize for auto-save */ void AutoSaveInit( void ) { char path[FILENAME_MAX]; char path2[FILENAME_MAX]; char as_path[FILENAME_MAX]; char asl_path[FILENAME_MAX]; int len; int cnt; FILE *f; int pid; int ch; int handle; int off; // int old_len; int i; /* * initialize tmpname */ #ifdef __UNIX__ strcpy( currTmpName,"aaaaaaaaaaaa.tmp" ); #else strcpy( currTmpName,"aaaaaaaa.tmp" ); #endif pid = getpid(); itoa( pid, path, 36 ); len = strlen( path ); memcpy( &currTmpName[TMP_FNAME_LEN - len], path, len ); #ifdef __QNX__ { int len2, len3; int nid, uid; nid = getnid(); itoa( nid, path, 36 ); len2 = strlen( path ); memcpy( &currTmpName[TMP_FNAME_LEN - len - len2], path, len2 ); uid = getuid(); itoa( uid, path, 36 ); len3 = strlen( path ); memcpy( &currTmpName[TMP_FNAME_LEN - len - len2 - len3], path, len3 ); memcpy( &checkFileName[EXTRA_EXT_OFF], path, len3 ); memcpy( &checkFileTmpName[EXTRA_EXT_OFF], path, len3 ); memcpy( &lockFileName[EXTRA_EXT_OFF], path, len3 ); } #endif /* * check if we need to recover lost files */ if( EditFlags.RecoverLostFiles ) { cnt = 0; MakeTmpPath( as_path, checkFileName ); MakeTmpPath( asl_path, lockFileName ); off = strlen( as_path ) - 5; for( ch = START_CHAR; ch <= END_CHAR; ch++ ) { as_path[off] = ch; asl_path[off] = ch; handle = sopen3( as_path, O_RDONLY | O_TEXT, SH_DENYRW ); if( handle < 0 ) { continue; } f = fdopen( handle, "r" ); if( f != NULL ) { while( fgets( path2, FILENAME_MAX, f ) != NULL ) { for( i = strlen( path2 ); i && isWSorCtrlZ( path2[i - 1] ); --i ) { path2[i - 1] = '\0'; } NextWord1( path2, path ); RemoveLeadingSpaces( path2 ); NewFile( path, FALSE ); AddString2( &(CurrentFile->name), path2 ); SetFileWindowTitle( CurrentWindow, CurrentInfo, TRUE ); FileSPVAR(); CurrentFile->modified = TRUE; CurrentFile->check_readonly = TRUE; FTSRunCmds( path2 ); cnt++; } fclose( f ); remove( as_path ); } else { close( handle ); } remove( asl_path ); } if( cnt == 0 ) { MyPrintf( "No files recovered!\n" ); ExitEditor( -1 ); } Message1( "%d files recovered", cnt ); } if( EditVars.AutoSaveInterval == 0 ) { return; } // old_len = strlen( lockFileName ); MakeTmpPath( path, lockFileName ); len = strlen( path ) - strlen( lockFileName ); off = len + CHAR_OFF; for( ch = START_CHAR; ch <= END_CHAR; ch++ ) { path[off] = ch; lockFileHandle = sopen4( path, O_CREAT | O_TRUNC | O_RDWR | O_TEXT, SH_DENYRW, PMODE_RW ); if( lockFileHandle > 0 ) { break; } } if( lockFileHandle < 0 ) { // MyPrintf( "Too many editors running!\n" ); MyPrintf( "Error opening temp file - '%s'\n", strerror( errno ) ); ExitEditor( -1 ); } lockFileName[CHAR_OFF] = ch; checkFileName[CHAR_OFF] = ch; checkFileTmpName[CHAR_OFF] = ch; } /* AutoSaveInit */
/* * createNewFile - create new file entry */ static vi_rc createNewFile( char *name, bool same_file ) { int height; window_id cw; info *tmp; vi_rc rc; /* * test that we can create this file */ tmp = NULL; if( !same_file ) { rc = FileExists( name ); if( !(rc == ERR_READ_ONLY_FILE || rc == ERR_NO_ERR || rc == ERR_FILE_EXISTS) ) { return( rc ); } } else { if( name != NULL ) { for( tmp = InfoHead; tmp != NULL; tmp = tmp->next ) { if( !strcmp( tmp->CurrentFile->name, name ) ) { break; } } } if( tmp == NULL ) { return( ERR_FILE_NOT_FOUND ); } if( tmp->CurrentFile->dup_count > MAX_DUPLICATE_FILES ) { return( ERR_WIND_NO_MORE_WINDOWS ); } } /* * get new window */ rc = NewWindow2( &cw, &editw_info ); if( rc != ERR_NO_ERR ) { return( rc ); } #ifdef __WIN__ if( !strncmp( name, "untitled", 8 ) ) { // better yet, pass normal/maximize flag to NewWindow2... ShowWindow( cw, SW_SHOWMAXIMIZED ); } #endif SetBorderGadgets( cw, EditFlags.WindowGadgets ); /* * get new file entry, and read the data */ if( same_file ) { CurrentFile = tmp->CurrentFile; CurrentFile->dup_count++; SetFileWindowTitle( CurrentWindow, CurrentInfo, true ); tmp = CurrentInfo; CurrentInfo = MemAlloc( sizeof( *CurrentInfo ) ); FTSRunCmds( name ); rc = ERR_NO_ERR; } else { bool crlf_reached; crlf_reached = false; tmp = CurrentInfo; CurrentInfo = MemAlloc( sizeof( *CurrentInfo ) ); FTSRunCmds( name ); height = editw_info.y2 - editw_info.y1 + 1; CurrentFile = FileAlloc( name ); rc = OpenFcbData( CurrentFile ); for( ; rc == ERR_NO_ERR; ) { rc = ReadFcbData( CurrentFile, &crlf_reached ); if( rc == ERR_NO_ERR && !CurrentFile->is_stdio ) { if( EditFlags.BreakPressed || !EditFlags.ReadEntireFile ) { if( CurrentFile->fcbs.tail->end_line > height ) { break; } } } } if( rc != ERR_NO_ERR && rc != ERR_FILE_NOT_FOUND && rc != END_OF_FILE ) { MemFree( CurrentInfo ); CurrentInfo = tmp; FileFree( CurrentFile ); CloseAWindow( cw ); return( rc ); } if( rc == ERR_FILE_NOT_FOUND ) { rc = NEW_FILE; EditFlags.NewFile = true; CurrentFile->write_crlf = FileSysNeedsCR( CurrentFile->handle ); #ifdef __UNIX__ CurrentFile->attr = PMODE_RW; #endif } else { rc = ERR_NO_ERR; CurrentFile->write_crlf = crlf_reached; EditFlags.NewFile = false; #ifdef __UNIX__ { struct stat sb; stat( name, &sb ); CurrentFile->attr = sb.st_mode & ~S_IFMT; } #endif } CurrentFile->check_readonly = true; } /* * create info entry */ CurrentPos.line = 0; CurrentPos.column = 1; VirtualColumnDesired = 1; LeftTopPos.line = 1; LeftTopPos.column = 0; if( !same_file ) { AllocateUndoStacks(); } AllocateMarkList(); CurrentWindow = cw; CurrentInfo->DuplicateID = CurrentFile->dup_count; CurrentInfo->CurrentWindow = cw; LangInit( CurrentInfo->fsi.Language ); #ifdef __WIN__ { window_data *wd; wd = DATA_FROM_ID( cw ); wd->info = CurrentInfo; } #endif DCCreate(); SetFileWindowTitle( CurrentWindow, CurrentInfo, true ); /* * set current file info */ CurrentFcb = CurrentFile->fcbs.head; CurrentLine = CurrentFcb->lines.head; if( EditFlags.LineNumbers ) { LineNumbersSetup(); } if( tmp != NULL ) { InsertLLItemAfter( (ss **)&InfoTail, (ss *)tmp, (ss *)CurrentInfo ); } else { AddLLItemAtEnd( (ss **)&InfoHead, (ss **)&InfoTail, (ss *)CurrentInfo ); } return( rc ); } /* createNewFile */
/* * 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 */