================= idDeclLocal::ReplaceSourceFileText ================= */
| 1955 | ================= |
| 1956 | */ |
| 1957 | bool idDeclLocal::ReplaceSourceFileText( void ) { |
| 1958 | int oldFileLength, newFileLength; |
| 1959 | char *buffer; |
| 1960 | idFile *file; |
| 1961 | |
| 1962 | common->Printf( "Writing \'%s\' to \'%s\'...\n", GetName(), GetFileName() ); |
| 1963 | |
| 1964 | if ( sourceFile == &declManagerLocal.implicitDecls ) { |
| 1965 | common->Warning( "Can't save implicit declaration %s.", GetName() ); |
| 1966 | return false; |
| 1967 | } |
| 1968 | |
| 1969 | // get length and allocate buffer to hold the file |
| 1970 | oldFileLength = sourceFile->fileSize; |
| 1971 | newFileLength = oldFileLength - sourceTextLength + textLength; |
| 1972 | buffer = (char *) Mem_Alloc( Max( newFileLength, oldFileLength ) ); |
| 1973 | |
| 1974 | // read original file |
| 1975 | if ( sourceFile->fileSize ) { |
| 1976 | |
| 1977 | file = fileSystem->OpenFileRead( GetFileName() ); |
| 1978 | if ( !file ) { |
| 1979 | Mem_Free( buffer ); |
| 1980 | common->Warning( "Couldn't open %s for reading.", GetFileName() ); |
| 1981 | return false; |
| 1982 | } |
| 1983 | |
| 1984 | if ( file->Length() != sourceFile->fileSize || file->Timestamp() != sourceFile->timestamp ) { |
| 1985 | Mem_Free( buffer ); |
| 1986 | common->Warning( "The file %s has been modified outside of the engine.", GetFileName() ); |
| 1987 | return false; |
| 1988 | } |
| 1989 | |
| 1990 | file->Read( buffer, oldFileLength ); |
| 1991 | fileSystem->CloseFile( file ); |
| 1992 | |
| 1993 | if ( MD5_BlockChecksum( buffer, oldFileLength ) != sourceFile->checksum ) { |
| 1994 | Mem_Free( buffer ); |
| 1995 | common->Warning( "The file %s has been modified outside of the engine.", GetFileName() ); |
| 1996 | return false; |
| 1997 | } |
| 1998 | } |
| 1999 | |
| 2000 | // insert new text |
| 2001 | char *declText = (char *) _alloca( textLength + 1 ); |
| 2002 | GetText( declText ); |
| 2003 | memmove( buffer + sourceTextOffset + textLength, buffer + sourceTextOffset + sourceTextLength, oldFileLength - sourceTextOffset - sourceTextLength ); |
| 2004 | memcpy( buffer + sourceTextOffset, declText, textLength ); |
| 2005 | |
| 2006 | // write out new file |
| 2007 | file = fileSystem->OpenFileWrite( GetFileName(), "fs_devpath" ); |
| 2008 | if ( !file ) { |
| 2009 | Mem_Free( buffer ); |
| 2010 | common->Warning( "Couldn't open %s for writing.", GetFileName() ); |
| 2011 | return false; |
| 2012 | } |
| 2013 | file->Write( buffer, newFileLength ); |
| 2014 | fileSystem->CloseFile( file ); |
no test coverage detected