forked from Mirrors/openclonk
Add --check/-c parameter to c4script for syntax checking
parent
3aaf216582
commit
61962fe70a
|
@ -23,6 +23,9 @@ extern "C" {
|
||||||
int c4s_runfile(const char *filename);
|
int c4s_runfile(const char *filename);
|
||||||
int c4s_runstring(const char *script);
|
int c4s_runstring(const char *script);
|
||||||
|
|
||||||
|
int c4s_checkfile(const char *filename);
|
||||||
|
int c4s_checkstring(const char *script);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
|
||||||
int usage(const char *argv0)
|
int usage(const char *argv0)
|
||||||
{
|
{
|
||||||
|
@ -26,21 +27,55 @@ int usage(const char *argv0)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, const char * argv[])
|
int main(int argc, char *const argv[])
|
||||||
{
|
{
|
||||||
if (argc < 2)
|
if (argc < 2)
|
||||||
return usage(argv[0]);
|
return usage(argv[0]);
|
||||||
|
|
||||||
if (strcmp(argv[1], "-e") == 0)
|
bool check = false;
|
||||||
|
char *runstring = nullptr;
|
||||||
|
|
||||||
|
while (1)
|
||||||
{
|
{
|
||||||
if (argc != 3)
|
static option long_options[] =
|
||||||
|
{
|
||||||
|
{"check", no_argument, 0, 'c'},
|
||||||
|
{"execute", required_argument, 0, 'e'},
|
||||||
|
{0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
int option_index;
|
||||||
|
int c = getopt_long(argc, argv, "ce:", long_options, &option_index);
|
||||||
|
if (c == -1) break;
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
case 'c':
|
||||||
|
check = true;
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
runstring = optarg;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
return usage(argv[0]);
|
return usage(argv[0]);
|
||||||
return c4s_runstring(argv[2]);
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (runstring)
|
||||||
|
{
|
||||||
|
if (argc - optind != 0)
|
||||||
|
return usage(argv[0]);
|
||||||
|
if (check)
|
||||||
|
return c4s_checkstring(runstring);
|
||||||
|
else
|
||||||
|
return c4s_runstring(runstring);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (argc != 2)
|
if (argc - optind != 1)
|
||||||
return usage(argv[0]);
|
return usage(argv[0]);
|
||||||
return c4s_runfile(argv[1]);
|
if (check)
|
||||||
|
return c4s_checkfile(argv[optind]);
|
||||||
|
else
|
||||||
|
return c4s_runfile(argv[optind]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ void C4DefList::SortByPriority() {}
|
||||||
void C4DefList::CallEveryDefinition() {}
|
void C4DefList::CallEveryDefinition() {}
|
||||||
void C4DefList::ResetIncludeDependencies() {}
|
void C4DefList::ResetIncludeDependencies() {}
|
||||||
|
|
||||||
void InitializeC4Script()
|
static void InitializeC4Script()
|
||||||
{
|
{
|
||||||
InitCoreFunctionMap(&ScriptEngine);
|
InitCoreFunctionMap(&ScriptEngine);
|
||||||
|
|
||||||
|
@ -39,18 +39,22 @@ void InitializeC4Script()
|
||||||
FixedRandom(time(nullptr));
|
FixedRandom(time(nullptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
C4Value RunLoadedC4Script()
|
static void ClearC4Script()
|
||||||
|
{
|
||||||
|
GameScript.Clear();
|
||||||
|
ScriptEngine.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
static C4Value RunLoadedC4Script()
|
||||||
{
|
{
|
||||||
// Link script engine (resolve includes/appends, generate code)
|
// Link script engine (resolve includes/appends, generate code)
|
||||||
ScriptEngine.Link(nullptr);
|
ScriptEngine.Link(nullptr);
|
||||||
|
|
||||||
C4Value result = GameScript.Call("Main");
|
C4Value result = GameScript.Call("Main");
|
||||||
GameScript.Clear();
|
|
||||||
ScriptEngine.Clear();
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
int c4s_runfile(const char * filename)
|
static int RunFile(const char * filename, bool checkOnly)
|
||||||
{
|
{
|
||||||
C4Group File;
|
C4Group File;
|
||||||
if (!File.Open(GetWorkingDirectory()))
|
if (!File.Open(GetWorkingDirectory()))
|
||||||
|
@ -70,14 +74,25 @@ int c4s_runfile(const char * filename)
|
||||||
|
|
||||||
InitializeC4Script();
|
InitializeC4Script();
|
||||||
GameScript.Load(File, fn.getData(), nullptr, nullptr);
|
GameScript.Load(File, fn.getData(), nullptr, nullptr);
|
||||||
RunLoadedC4Script();
|
if (!checkOnly)
|
||||||
return 0;
|
RunLoadedC4Script();
|
||||||
|
ClearC4Script();
|
||||||
|
return ScriptEngine.errCnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
int c4s_runstring(const char *script)
|
static int RunString(const char *script, bool checkOnly)
|
||||||
{
|
{
|
||||||
InitializeC4Script();
|
InitializeC4Script();
|
||||||
GameScript.LoadData("<memory>", script, nullptr);
|
GameScript.LoadData("<memory>", script, nullptr);
|
||||||
RunLoadedC4Script();
|
if (!checkOnly)
|
||||||
return 0;
|
RunLoadedC4Script();
|
||||||
|
ClearC4Script();
|
||||||
|
return ScriptEngine.errCnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int c4s_runfile(const char *filename) { return RunFile(filename, false); }
|
||||||
|
int c4s_runstring(const char *script) { return RunString(script, false); }
|
||||||
|
|
||||||
|
int c4s_checkfile(const char *filename) { return RunFile(filename, true); }
|
||||||
|
int c4s_checkstring(const char *script) { return RunString(script, true); }
|
||||||
|
|
Loading…
Reference in New Issue