~arcachofo/simulide/1.1.0

« back to all changes in this revision

Viewing changes to src/microsim/modules/scriptmodule.cpp

  • Committer: arcachofo
  • Date: 2024-10-12 01:45:13 UTC
  • Revision ID: arcachofo@simulide.com-20241012014513-q9ui3iunywy5w47r
ScriptModule: add support for #includes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
8
8
#include "scriptmodule.h"
9
9
#include "scriptstdstring.h"
10
10
#include "scriptarray.h"
 
11
#include "mainwindow.h"
11
12
#include "editorwindow.h"
12
13
#include "utils.h"
13
14
 
36
37
{
37
38
    m_aEngine = NULL;
38
39
    m_context = NULL;
 
40
    m_aEngine = NULL;
39
41
 
40
42
    m_aEngine = asCreateScriptEngine();
41
43
    if( m_aEngine == 0 ) { qDebug() << "Failed to create script engine."; return; }
69
71
 
70
72
void ScriptModule::setScriptFile( QString scriptFile, bool )
71
73
{
72
 
    m_script = fileToString( scriptFile, "ScriptModule::setScriptFile" );
 
74
    m_scriptFile = scriptFile;
 
75
    m_scriptFolder = QFileInfo( scriptFile ).absolutePath();
 
76
    setScript( fileToString( scriptFile, "ScriptBase::setScriptFile" ) );
73
77
}
74
78
 
75
79
void ScriptModule::setScript( QString script )
81
85
{
82
86
    if( !m_aEngine ) return -1;
83
87
 
84
 
    std::string script = m_script.toStdString();
85
 
    int len = m_script.size();
86
 
 
87
88
    m_aEngine->GarbageCollect( asGC_FULL_CYCLE );
88
 
 
89
 
    asIScriptModule* mod = m_aEngine->GetModule( 0, asGM_ALWAYS_CREATE );
90
 
    int r = mod->AddScriptSection("script", &script[0], len );
91
 
    if( r < 0 ) { qDebug() << "\nScriptModule::compileScript: AddScriptSection() failed\n"; return -1; }
92
 
 
93
 
    r = mod->Build();
94
 
    if( r < 0 ) { qDebug() << endl << m_elmId+" ScriptModule::compileScript Error"<< endl; return -1; }
95
 
 
96
 
    //qDebug() << "\nScriptModule::compileScript: Build() Success\n";
 
89
    m_asModule = m_aEngine->GetModule( 0, asGM_ALWAYS_CREATE );
 
90
 
 
91
    int r = compileSection( m_scriptFile, m_script );
 
92
    if( r < 0 ) return -1;
 
93
 
 
94
    r = m_asModule->Build();
 
95
    if( r < 0 ) { qDebug() << endl << m_elmId+" ScriptBase::compileScript Error"<< endl; return -1; }
 
96
 
 
97
    //qDebug() << "\nScriptBase::compileScript: Build() Success\n";
97
98
    return 0;
98
99
}
99
100
 
 
101
int ScriptModule::compileSection( QString sriptFile, QString text )
 
102
{
 
103
    int ok = 0;
 
104
 
 
105
    QStringList lines = text.split("\n");
 
106
    text.clear();
 
107
    for( QString line : lines )                // Get includes
 
108
    {
 
109
        if( line.contains("#include") )
 
110
        {
 
111
            QString file = line.remove("#include").remove(" ");
 
112
            while( file.startsWith(" ") ) file = file.right( file.length()-1 );
 
113
 
 
114
            if( file.startsWith("\"") )
 
115
            {
 
116
                file = file.right( file.length()-1 );
 
117
                file = file.split("\"").first();
 
118
                file.prepend( m_scriptFolder+"/" );
 
119
            }
 
120
            else if( file.startsWith("<") )
 
121
            {
 
122
                file = file.remove("<").split(">").first();
 
123
                file.prepend( MainWindow::self()->getDataFilePath("scriptlib")+"/" );
 
124
            }
 
125
            line = fileToString( file, "ScriptBase::compileScript" );
 
126
            int r = compileSection( file, line );
 
127
            if( r < 0 ) ok = r;
 
128
            line.clear();
 
129
        }
 
130
        text.append( line+"\n");
 
131
    }
 
132
    std::string script = text.toStdString();
 
133
 
 
134
    int r = m_asModule->AddScriptSection( sriptFile.toLocal8Bit().data(), &script[0], script.size() );
 
135
    if( r < 0 ) { qDebug() << "\nScriptBase::compileSection: AddScriptSection() failed\n"; return -1; }
 
136
 
 
137
    return ok;
 
138
}
 
139
 
100
140
/*int ScriptModule::SaveBytecode(asIScriptEngine *engine, const char *outputFile)
101
141
{
102
142
    CBytecodeStream stream;