MRI: rewrite script eval (was: Question about $0) #24
|
@ -171,12 +171,13 @@ RB_METHOD(mriDataDirectory)
|
||||||
return pathStr;
|
return pathStr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE newStringUTF8(const char *string)
|
static VALUE newStringUTF8(const char *string, long length)
|
||||||
{
|
{
|
||||||
return rb_enc_str_new(string, strlen(string), rb_utf8_encoding());
|
return rb_enc_str_new(string, length, rb_utf8_encoding());
|
||||||
}
|
}
|
||||||
|
|
||||||
struct evalArg {
|
struct evalArg
|
||||||
|
{
|
||||||
VALUE string;
|
VALUE string;
|
||||||
VALUE filename;
|
VALUE filename;
|
||||||
};
|
};
|
||||||
|
@ -193,22 +194,18 @@ static VALUE evalString(VALUE string, VALUE filename, int *state)
|
||||||
return rb_protect((VALUE (*)(VALUE))evalHelper, (VALUE)&arg, state);
|
return rb_protect((VALUE (*)(VALUE))evalHelper, (VALUE)&arg, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE evalCString(const char *string, const char *filename, int *state)
|
static void runCustomScript(const std::string &filename)
|
||||||
{
|
|
||||||
return evalString(newStringUTF8(string), newStringUTF8(filename), state);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void runCustomScript(const char *filename)
|
|
||||||
{
|
{
|
||||||
std::string scriptData;
|
std::string scriptData;
|
||||||
|
|
||||||
if (!readFile(filename, scriptData))
|
if (!readFile(filename.c_str(), scriptData))
|
||||||
{
|
{
|
||||||
showMsg(std::string("Unable to open '") + filename + "'");
|
showMsg(std::string("Unable to open '") + filename + "'");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
evalCString(scriptData.c_str(), "Section000", NULL);
|
evalString(newStringUTF8(scriptData.c_str(), scriptData.size()),
|
||||||
|
newStringUTF8(filename.c_str(), filename.size()), NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
VALUE kernelLoadDataInt(const char *filename);
|
VALUE kernelLoadDataInt(const char *filename);
|
||||||
|
@ -295,13 +292,14 @@ static void runRMXPScripts()
|
||||||
{
|
{
|
||||||
VALUE script = rb_ary_entry(scriptArray, i);
|
VALUE script = rb_ary_entry(scriptArray, i);
|
||||||
VALUE scriptDecoded = rb_ary_entry(script, 3);
|
VALUE scriptDecoded = rb_ary_entry(script, 3);
|
||||||
const char *string = StringValueCStr(scriptDecoded);
|
VALUE string = newStringUTF8(RSTRING_PTR(scriptDecoded),
|
||||||
|
RSTRING_LEN(scriptDecoded));
|
||||||
|
|
||||||
char fname[32];
|
char fname[32];
|
||||||
snprintf(fname, sizeof(fname), "Section%03ld", i);
|
int len = snprintf(fname, sizeof(fname), "Section%03ld", i);
|
||||||
|
|
||||||
int state;
|
int state;
|
||||||
evalCString(string, fname, &state);
|
evalString(string, newStringUTF8(fname, len), &state);
|
||||||
if (state)
|
if (state)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -319,7 +317,7 @@ static void mriBindingExecute()
|
||||||
|
|
||||||
std::string &customScript = shState->rtData().config.customScript;
|
std::string &customScript = shState->rtData().config.customScript;
|
||||||
if (!customScript.empty())
|
if (!customScript.empty())
|
||||||
runCustomScript(customScript.c_str());
|
runCustomScript(customScript);
|
||||||
else
|
else
|
||||||
runRMXPScripts();
|
runRMXPScripts();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue