123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- /*
- ===========================================================================
- Doom 3 GPL Source Code
- Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
- This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?).
- Doom 3 Source Code is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- Doom 3 Source Code is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with Doom 3 Source Code. If not, see <http://www.gnu.org/licenses/>.
- In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below.
- If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
- ===========================================================================
- */
- #include "../../idlib/precompiled.h"
- #pragma hdrstop
- #include "DebuggerApp.h"
- #include "DebuggerScript.h"
- #include "../../game/script/Script_Program.h"
- #include "../../ui/Window.h"
- #include "../../ui/UserInterfaceLocal.h"
- /*
- ================
- rvDebuggerScript::rvDebuggerScript
- ================
- */
- rvDebuggerScript::rvDebuggerScript ( void )
- {
- mContents = NULL;
- mProgram = NULL;
- mInterface = NULL;
- }
- /*
- ================
- rvDebuggerScript::~rvDebuggerScript
- ================
- */
- rvDebuggerScript::~rvDebuggerScript ( void )
- {
- Unload ( );
- }
- /*
- ================
- rvDebuggerScript::Unload
- Unload the script from memory
- ================
- */
- void rvDebuggerScript::Unload ( void )
- {
- delete[] mContents;
-
- if ( mInterface )
- {
- delete mInterface;
- }
- else
- {
- delete mProgram;
- }
-
- mContents = NULL;
- mProgram = NULL;
- mInterface = NULL;
- }
- /*
- ================
- rvDebuggerScript::Load
- Loads the debugger script and attempts to compile it using the method
- appropriate for the file being loaded. If the script cant be compiled
- the loading of the script fails
- ================
- */
- bool rvDebuggerScript::Load ( const char* filename )
- {
- void* buffer;
- int size;
- // Unload the script before reloading it
- Unload ( );
- // Cache the filename used to load the script
- mFilename = filename;
-
- // Read in the file
- size = fileSystem->ReadFile ( filename, &buffer, &mModifiedTime );
- if ( buffer == NULL )
- {
- return false;
- }
-
- // Copy the buffer over
- mContents = new char [ size + 1 ];
- memcpy ( mContents, buffer, size );
- mContents[size] = 0;
-
- // Cleanup
- fileSystem->FreeFile ( buffer );
- // Now compile the script so we can tell what a valid line is, etc.. If its
- // a gui file then we need to parse it using the userinterface system rather
- // than the normal script compiler.
- try
- {
- // Parse the script using the script compiler
- mProgram = new idProgram;
- mProgram->BeginCompilation ( );
- mProgram->CompileFile ( SCRIPT_DEFAULT );
-
- //BSM Nerve: Loads a game specific main script file
- idStr gamedir = cvarSystem->GetCVarString( "fs_game" );
- if(gamedir.Length() > 0) {
- idStr scriptFile = va("script/%s_main.script", gamedir.c_str());
- if(fileSystem->ReadFile(scriptFile.c_str(), NULL) > 0) {
- mProgram.CompileFile(scriptFile.c_str());
- }
- }
-
- // Make sure the file isnt already compiled before trying to compile it again
- for ( int f = mProgram->NumFilenames() - 1; f >= 0; f -- )
- {
- idStr qpath;
- qpath = fileSystem->OSPathToRelativePath ( mProgram->GetFilename ( f ) );
- qpath.BackSlashesToSlashes ( );
- if ( !qpath.Cmp ( filename ) )
- {
- break;
- }
- }
-
- if ( f < 0 )
- {
- mProgram->CompileText ( filename, mContents, false );
- }
-
- mProgram->FinishCompilation ( );
- }
- catch ( idException& )
- {
- // Failed to parse the script so fail to load the file
- delete mProgram;
- mProgram = NULL;
- delete[] mContents;
- mContents = NULL;
-
- // TODO: Should cache the error for the dialog box
-
- return false;
- }
- return true;
- }
- /*
- ================
- rvDebuggerScript::Reload
- Reload the contents of the script
- ================
- */
- bool rvDebuggerScript::Reload ( void )
- {
- return Load ( mFilename );
- }
- /*
- ================
- rvDebuggerScript::IsValidLine
- Determines whether or not the given line number within the script is a valid line of code
- ================
- */
- bool rvDebuggerScript::IsLineCode ( int linenumber )
- {
- int i;
-
- assert ( mProgram );
- // Run through all the statements in the program and see if any match the
- // linenumber that we are checking.
- for ( i = 0; i < mProgram->NumStatements ( ); i ++ )
- {
- if ( mProgram->GetStatement ( i ).linenumber == linenumber )
- {
- return true;
- }
- }
-
- return false;
- }
- /*
- ================
- rvDebuggerScript::IsFileModified
- Determines whether or not the file loaded for this script has been modified since
- it was loaded.
- ================
- */
- bool rvDebuggerScript::IsFileModified ( bool updateTime )
- {
- ID_TIME_T t;
- bool result = false;
- // Grab the filetime and shut the file down
- fileSystem->ReadFile ( mFilename, NULL, &t );
-
- // Has the file been modified?
- if ( t > mModifiedTime )
- {
- result = true;
- }
- // If updateTime is true then we will update the modified time
- // stored in the script with the files current modified time
- if ( updateTime )
- {
- mModifiedTime = t;
- }
-
- return result;
- }
|