/* * LoadHistory - load history from file */ void LoadHistory( const char *cmd ) { FILE *f; char str[MAX_INPUT_LINE]; int cnt; read_state rs; int i; historyLoaded = true; while( EditVars.HistoryFile != NULL ) { f = fopen( EditVars.HistoryFile, "rt" ); if( f == NULL ) { break; } cnt = 0; rs = READ_NONE; while( fgets( str, MAX_INPUT_LINE, f ) != NULL ) { for( i = strlen( str ); i && isWSorCtrlZ( str[i - 1 ]); --i ) { str[i - 1] = '\0'; } if( cnt == 0 ) { cnt = atoi( str ); rs++; if( rs >= READ_LAST ) { break; } continue; } switch( rs ) { case READ_CMD: updateHist( &EditVars.CLHist, str ); break; case READ_FIND: updateHist( &EditVars.FindHist, str ); break; case READ_FILTER: updateHist( &EditVars.FilterHist, str ); break; case READ_LASTFILES: updateHist( &EditVars.LastFilesHist, str ); break; } cnt--; } fclose( f ); break; } if( cmd != NULL ) { ReplaceString( &EditVars.CLHist.data[EditVars.CLHist.curr % EditVars.CLHist.max], cmd ); EditVars.CLHist.curr++; } } /* LoadHistory */
char *my_fgets( char *buf, int n, FILE *fp ) /******************************************/ { char *rc; size_t i; if( (rc = fgets( buf, n, fp )) != NULL ) { for( i = strlen( buf ); i && isWSorCtrlZ( buf[ i - 1] ); --i ) { buf[ i - 1 ] = '\0'; } } return( rc ); }
/* * SpecialFgets - get from either file or exe */ bool SpecialFgets( char *buff, int max, GENERIC_FILE *gf ) { size_t len; vi_rc rc; switch( gf->type ) { case GF_FILE: if( fgets( buff, max, gf->data.f ) == NULL ) { return( true ); } for( len = strlen( buff ); len > 0 && isWSorCtrlZ( buff[len - 1] ); --len ) { buff[len - 1] = '\0'; } break; case GF_BOUND: if( gf->gf.a.currline >= gf->gf.a.maxlines ) { return( true ); } gf->gf.a.currline++; if( BndMemory == NULL ) { read( gf->data.handle, buff, gf->gf.a.length + 1 ); } else { memcpy( buff, gf->data.pos, gf->gf.a.length + 1 ); gf->data.pos += gf->gf.a.length + 1; } len = gf->gf.a.length; gf->gf.a.length = (unsigned char)buff[len]; buff[len] = '\0'; break; default: if( gf->data.cfile == NULL ) { return( true ); } memcpy( buff, gf->gf.b.cline->data, gf->gf.b.cline->len + 1 ); rc = GimmeNextLinePtr( gf->data.cfile, &(gf->gf.b.cfcb), &(gf->gf.b.cline) ); if( rc != ERR_NO_ERR ) { gf->data.cfile = NULL; } break; } return( false ); } /* SpecialFgets */
static char *get_line( char *buf, FILE *file ) /********************************************/ { char *ret; int i; for( ; (ret = fgets( buf, MAX_LINE_LEN, file )) != NULL; ) { for( i = strlen( buf ); i && isWSorCtrlZ( buf[i - 1] ); --i ) { buf[i - 1] = '\0'; } ++Line; ret += strspn( ret, White_space ); if( ret[0] != '#' && ret[0] != '\0' ) { break; } } return( ret ); }
/* * RemoveFromAutoSaveList - take a file that we are quitting out of the list */ void RemoveFromAutoSaveList( void ) { FILE *f, *f2; char as_path[FILENAME_MAX]; char as2_path[FILENAME_MAX]; char path[FILENAME_MAX]; char path2[FILENAME_MAX]; char data[FILENAME_MAX]; // bool found; int i; if( EditVars.AutoSaveInterval == 0 ) { return; } if( CurrentFile == NULL ) { return; } if( !CurrentFile->been_autosaved ) { return; } MakeTmpPath( as_path, checkFileName ); MakeTmpPath( as2_path, checkFileTmpName ); GetCurrentFilePath( path ); // found = FALSE; f = fopen( as_path, "r" ); if( f == NULL ) { return; } f2 = fopen( as2_path, "w" ); if( f2 == NULL ) { fclose( f ); return; } while( fgets( path2, FILENAME_MAX, f ) != NULL ) { for( i = strlen( path2 ); i && isWSorCtrlZ( path2[i - 1] ); --i ) { path2[i - 1] = '\0'; } NextWord1( path2, data ); RemoveLeadingSpaces( path2 ); if( !strcmp( path, path2 ) ) { MakeTmpPath( path2, CurrentFile->as_name ); if( !strcmp( data, path2 ) ) { // found = TRUE; remove( path2 ); while( fgets( data, FILENAME_MAX, f ) != NULL ) { for( i = strlen( data ); i && isWSorCtrlZ( data[i - 1] ); --i ) { data[i - 1] = '\0'; } MyFprintf( f2, "%s\n", data ); } break; } } MyFprintf( f2, "%s %s\n", data, path2 ); } fclose( f ); fclose( f2 ); remove( as_path ); rename( as2_path, as_path ); } /* RemoveFromAutoSaveList */
/* * 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 */
int main( int argc, char *argv[] ) { char *buff = NULL; char *buff2, *buff3; char *buffn, *buffs; char *ptr; int i, bytes, j, k, sl; FILE *f; struct stat fs; char drive[_MAX_DRIVE], dir[_MAX_DIR]; char fname[_MAX_FNAME], ext[_MAX_EXT]; char path[_MAX_PATH]; char tmppath[_MAX_PATH]; char tmpfname[_MAX_FNAME], tmpext[_MAX_EXT]; unsigned cnt; unsigned lines; bind_size *index; bind_size *entries; for( j = argc - 1; j > 0; --j ) { if( argv[j][0] == '/' || argv[j][0] == '-' ) { sl = strlen( argv[j] ); for( i = 1; i < sl; i++ ) { switch( argv[j][i] ) { case 's': sflag = true; break; case 'q': qflag = true; break; case 'd': bindfile = &argv[j][i + 1]; i = sl; break; case '?': Banner(); Usage( NULL ); default: Banner(); Usage( "Invalid option" ); } } for( i = j; i < argc; i++ ) { argv[i]= argv[i + 1]; } argc--; } } Banner(); /* * now, check for null file name */ if( argc < 2 ) { Usage( "No executable to bind" ); } _splitpath( argv[1], drive, dir, fname, ext ); if( ext[0] == 0 ) { _makepath( path, drive, dir, fname, ".exe" ); } else { strcpy( path, argv[1] ); } if( stat( path, &fs ) == -1 ) { Abort( "Could not find executable \"%s\"", path ); } cnt = 0; if( !sflag ) { buff = MyAlloc( 65000 ); buff2 = MyAlloc( 32000 ); buff3 = MyAlloc( MAX_LINE_LEN ); /* * read in all data files */ MyPrintf( "Getting data files from" ); f = GetFromEnvAndOpen( bindfile ); MyPrintf( "\n" ); if( f == NULL ) { Abort( "Could not open %s", bindfile ); } while( (ptr = fgets( buff3, MAX_LINE_LEN, f )) != NULL ) { for( i = strlen( ptr ); i && isWSorCtrlZ( ptr[i - 1] ); --i ) { ptr[i - 1] = '\0'; } if( ptr[0] == '\0' ) { continue; } ptr = SkipLeadingSpaces( ptr ); if( ptr[0] == '#' ) { continue; } dats[FileCount] = MyAlloc( strlen( ptr ) + 1 ); strcpy( dats[FileCount], ptr ); FileCount++; if( FileCount >= MAX_DATA_FILES ) { Abort( "Too many files to bind!" ); } } fclose( f ); index = MyAlloc( FileCount * sizeof( bind_size ) ); entries = MyAlloc( FileCount * sizeof( bind_size ) ); buffn = buff; *(bind_size *)buffn = FileCount; buffn += sizeof( bind_size ); cnt += sizeof( bind_size ); buffs = buffn; buffn += sizeof( bind_size ); cnt += sizeof( bind_size ); k = 0; for( i = 0; i < FileCount; i++ ) { // j = strlen( dats[i] ) + 1; // memcpy( buffn, dats[i], j ); _splitpath( dats[i], NULL, NULL, tmpfname, tmpext ); _makepath( tmppath, NULL, NULL, tmpfname, tmpext ); j = strlen( tmppath ) + 1; memcpy( buffn, tmppath, j ); buffn += j; cnt += j; k += j; } *(bind_size *)buffs = k + 1; /* size of token list */ *buffn = 0; /* trailing zero */ buffn++; cnt++; buffs = buffn; buffn += FileCount * ( sizeof( bind_size ) + sizeof( bind_size ) ); cnt += FileCount * ( sizeof( bind_size ) + sizeof( bind_size ) ); for( j = 0; j < FileCount; j++ ) { MyPrintf( "Loading" ); f = GetFromEnvAndOpen( dats[j] ); if( f == NULL ) { Abort( "\nLoad of %s failed!", dats[j] ); } setvbuf( f, buff2, _IOFBF, 32000 ); bytes = lines = 0; index[j] = cnt; while( (ptr = fgets( buff3, MAX_LINE_LEN, f )) != NULL ) { unsigned len; for( len = strlen( ptr ); len && isWSorCtrlZ( ptr[len - 1] ); --len ) ptr[len - 1] = '\0'; if( ptr[0] == '\0' ) { continue; } ptr = SkipLeadingSpaces( ptr ); if( ptr[0] == '#' ) { continue; } len = strlen( ptr ); *buffn = (char)len; buffn++; memcpy( buffn, ptr, len ); buffn += len; cnt += len + 1; lines++; bytes += len; } fclose( f ); entries[j] = lines; MyPrintf( "Added %d lines (%d bytes)\n", lines, bytes ); } memcpy( buffs, index, FileCount * sizeof( bind_size ) ); buffs += FileCount * sizeof( bind_size ); memcpy( buffs, entries, FileCount * sizeof( bind_size ) ); } AddDataToEXE( path, buff, cnt, fs.st_size ); if( !sflag ) { MyPrintf( "Added %d bytes to \"%s\"\n", cnt, path ); } else { MyPrintf( "\"%s\" has been stripped of configuration information\n", path ); } return( 0 ); } /* main */