dhewm3/neo/tools/debugger/DebuggerScript.cpp

245 lines
5.7 KiB
C++
Raw Normal View History

2011-11-22 21:28:15 +00:00
/*
===========================================================================
Doom 3 GPL Source Code
Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
2011-11-22 21:28:15 +00:00
2011-12-06 16:14:59 +00:00
This file is part of the Doom 3 GPL Source Code ("Doom 3 Source Code").
2011-11-22 21:28:15 +00:00
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;
2011-11-22 21:28:15 +00:00
if ( mInterface )
{
delete mInterface;
}
else
{
2011-11-22 21:28:15 +00:00
delete mProgram;
}
2011-11-22 21:28:15 +00:00
mContents = NULL;
mProgram = NULL;
mInterface = NULL;
}
2011-11-22 21:28:15 +00:00
/*
================
rvDebuggerScript::Load
Loads the debugger script and attempts to compile it using the method
2011-11-22 21:28:15 +00:00
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;
2011-11-22 21:28:15 +00:00
// Read in the file
size = fileSystem->ReadFile ( filename, &buffer, &mModifiedTime );
2011-11-22 21:28:15 +00:00
if ( buffer == NULL )
{
return false;
}
2011-11-22 21:28:15 +00:00
// Copy the buffer over
mContents = new char [ size + 1 ];
memcpy ( mContents, buffer, size );
mContents[size] = 0;
2011-11-22 21:28:15 +00:00
// Cleanup
fileSystem->FreeFile ( buffer );
// Now compile the script so we can tell what a valid line is, etc.. If its
2011-11-22 21:28:15 +00:00
// 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 );
2011-11-22 21:28:15 +00:00
//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());
}
}
2011-11-22 21:28:15 +00:00
// 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;
}
}
2011-11-22 21:28:15 +00:00
if ( f < 0 )
{
mProgram->CompileText ( filename, mContents, false );
}
2011-11-22 21:28:15 +00:00
mProgram->FinishCompilation ( );
}
catch ( idException& )
{
// Failed to parse the script so fail to load the file
delete mProgram;
mProgram = NULL;
delete[] mContents;
mContents = NULL;
2011-11-22 21:28:15 +00:00
// TODO: Should cache the error for the dialog box
2011-11-22 21:28:15 +00:00
return false;
}
return true;
}
/*
================
rvDebuggerScript::Reload
Reload the contents of the script
================
*/
bool rvDebuggerScript::Reload ( void )
{
2011-11-22 21:28:15 +00:00
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;
2011-11-22 21:28:15 +00:00
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;
}
}
2011-11-22 21:28:15 +00:00
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;
2011-11-22 21:28:15 +00:00
// Grab the filetime and shut the file down
fileSystem->ReadFile ( mFilename, NULL, &t );
2011-11-22 21:28:15 +00:00
// 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;
2011-11-22 21:28:15 +00:00
}