This class is a helper class for loading and building scripts, with a basic pre-processor that supports conditional compilation, include directives, and metadata declarations.
class CScriptBuilder { public: // Load and build a script file from disk int BuildScriptFromFile(asIScriptEngine *engine, const char *module, const char *filename); // Build a script file from a memory buffer int BuildScriptFromMemory(asIScriptEngine *engine, const char *module, const char *script, const char *sectionname = ""); // Add a pre-processor define for conditional compilation void DefineWord(const char *word); // Get metadata declared for class types and interfaces const char *GetMetadataStringForType(int typeId); // Get metadata declared for functions const char *GetMetadataStringForFunc(int funcId); // Get metadata declared for global variables const char *GetMetadataStringForVar(int varIdx); };
#include "commonfuncs.as"
void main() { // Call a function from the included file CommonFunc(); }
This is especially useful when scripts are shared between different binaries, for example, in a client/server application.
Example script with conditional compilation:
class CObject { void Process() { #if SERVER // Do some server specific processing #endif
#if CLIENT // Do some client specific processing #endif
// Do some common processing } }
Exactly what the metadata looks like is up to the application. The builder class doesn't impose any rules, except that the metadata should be added between brackets []. After the script has been built the application can obtain the metadata strings and interpret them as it sees fit.
Example script with metadata:
[factory func = CreateOgre, editable: myPosition, editable: myStrength [10, 100]] class COgre { vector3 myPosition; int myStrength; }
[factory] COgre @CreateOgre() { return @COgre(); }
Example usage:
CScriptBuilder builder; int r = builder.BuildScriptFromMemory(engine, "my module", script); if( r >= 0 ) { // Find global variables that have been marked as editable by user int count = engine->GetGlobalVarCount("my module"); for( int n = 0; n < count; n++ ) { string metadata = builder.GetMetadataStringForVar(n); if( metadata == "editable" ) { // Show the global variable in a GUI ... } } }