897 lines
38 KiB
Plaintext
897 lines
38 KiB
Plaintext
key E = "00000000-0000-0000-0000-000000000000";
|
||
key gC = "00000000-0000-0000-0000-000000000000";
|
||
key K = "00000000-0000-0000-0000-000000000000";
|
||
string LslUserScript = "program";
|
||
integer g_;
|
||
string H = "!!";
|
||
|
||
string A(key llJsonValueType)
|
||
{
|
||
string loc_spipe = "p:" + (string)llJsonValueType;
|
||
string loc_buffer = llLinksetDataRead(loc_spipe);
|
||
integer loc_eor = llSubStringIndex(loc_buffer, "");
|
||
if (~loc_eor)
|
||
{
|
||
if (loc_eor ^ ~-llStringLength(loc_buffer))
|
||
llLinksetDataWrite(loc_spipe, llDeleteSubString(loc_buffer, 0, loc_eor));
|
||
else
|
||
llLinksetDataDelete(loc_spipe);
|
||
loc_buffer = llDeleteSubString(loc_buffer, loc_eor, ((integer)-1));
|
||
}
|
||
else
|
||
{
|
||
llLinksetDataDelete(loc_spipe);
|
||
}
|
||
return loc_buffer;
|
||
}
|
||
|
||
string System = "{}";
|
||
list UThreadStackFrame;
|
||
list gB;
|
||
list gA;
|
||
key D;
|
||
key I;
|
||
key L;
|
||
|
||
list C(list llJsonValueType)
|
||
{
|
||
string loc_prog;
|
||
list loc_ix;
|
||
integer loc_parent;
|
||
string loc_local_vars;
|
||
integer loc_return_mode;
|
||
integer loc_last_symbol;
|
||
{
|
||
string loc_frame = llList2String(llJsonValueType, ((integer)-1));
|
||
llJsonValueType = llDeleteSubList(llJsonValueType, ((integer)-1), ((integer)-1));
|
||
loc_prog = llJsonGetValue(loc_frame, (list)"c");
|
||
loc_ix = llJson2List(llJsonGetValue(loc_frame, (list)"i"));
|
||
loc_parent = (integer)llJsonGetValue(loc_frame, (list)"p");
|
||
loc_local_vars = llJsonGetValue(loc_frame, (list)"v");
|
||
loc_return_mode = (integer)llJsonGetValue(loc_frame, (list)"r");
|
||
loc_last_symbol = (integer)llJsonGetValue(loc_frame, (list)"sp");
|
||
}
|
||
if (D)
|
||
{
|
||
D = "";
|
||
}
|
||
if (loc_prog == "")
|
||
return llJsonValueType;
|
||
integer loc_descending;
|
||
integer loc_backtrack;
|
||
if (loc_ix == [])
|
||
{
|
||
loc_ix = (list)((integer)-1);
|
||
loc_descending = 1;
|
||
}
|
||
while (1)
|
||
{
|
||
@J_autoGen00001;
|
||
loc_ix = llListReplaceList(loc_ix, (list)(-~llList2Integer(loc_ix, ((integer)-1))), ((integer)-1), ((integer)-1));
|
||
if (llJsonValueType(loc_prog, loc_ix) == "")
|
||
{
|
||
if (!~-(loc_ix != []))
|
||
{
|
||
if (~loc_parent)
|
||
{
|
||
integer loc_previous_return_mode = loc_return_mode;
|
||
string loc_frame = llList2String(llJsonValueType, loc_parent);
|
||
if (!(llGetSubString(loc_frame, 0, 0) == "{"))
|
||
{
|
||
llOwnerSay(">> No frame at " + (string)loc_parent + " in: " + llList2Json("", llJsonValueType));
|
||
return [];
|
||
}
|
||
llJsonValueType = llDeleteSubList(llJsonValueType, loc_parent, loc_parent);
|
||
loc_prog = llJsonGetValue(loc_frame, (list)"c");
|
||
loc_ix = llJson2List(llJsonGetValue(loc_frame, (list)"i"));
|
||
loc_parent = (integer)llJsonGetValue(loc_frame, (list)"p");
|
||
loc_local_vars = llJsonGetValue(loc_frame, (list)"v");
|
||
loc_return_mode = (integer)llJsonGetValue(loc_frame, (list)"r");
|
||
loc_last_symbol = (integer)llJsonGetValue(loc_frame, (list)"sp");
|
||
string loc_structure = llJsonGetValue(loc_prog, loc_ix);
|
||
list loc_step_again = loc_ix;
|
||
if (~-loc_previous_return_mode)
|
||
{
|
||
if (loc_previous_return_mode == 2)
|
||
{
|
||
llJsonValueType = llJsonValueType + loc_frame;
|
||
loc_prog = "[" + llJsonGetValue(loc_prog, llListReplaceList(loc_step_again, (list)1, ((integer)-1), ((integer)-1))) + "]";
|
||
loc_return_mode = 1;
|
||
loc_local_vars = "{}";
|
||
loc_parent = ~-(llJsonValueType != []);
|
||
loc_ix = (list)((integer)-1);
|
||
loc_last_symbol = ((integer)-1);
|
||
loc_descending = 1;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
integer loc_retval = (integer)llList2String(llJsonValueType, ((integer)-1));
|
||
llJsonValueType = llDeleteSubList(llJsonValueType, ((integer)-1), ((integer)-1));
|
||
loc_ix = llDeleteSubList(loc_ix, ((integer)-1), ((integer)-1));
|
||
if (loc_structure == "if")
|
||
{
|
||
string loc_next_frame = llJsonSetValue(loc_frame, (list)"i", llList2Json("", loc_ix));
|
||
list loc_subix = loc_ix;
|
||
if (loc_retval)
|
||
{
|
||
loc_subix = loc_subix + 2;
|
||
}
|
||
else if (llJsonValueType(loc_prog, loc_ix + 3) == "")
|
||
{
|
||
loc_subix = loc_subix + 3;
|
||
}
|
||
else
|
||
{
|
||
jump J_autoGen00001;
|
||
}
|
||
loc_prog = "[" + llJsonGetValue(loc_prog, loc_subix) + "]";
|
||
llJsonValueType = llJsonValueType + loc_next_frame;
|
||
loc_return_mode = 0;
|
||
}
|
||
else if (loc_structure == "while")
|
||
{
|
||
if (loc_retval)
|
||
{
|
||
llJsonValueType = llJsonValueType + loc_frame;
|
||
loc_prog = "[" + llJsonGetValue(loc_prog, loc_ix + 2) + "]";
|
||
loc_descending = 1;
|
||
loc_return_mode = 2;
|
||
}
|
||
else
|
||
{
|
||
jump J_autoGen00001;
|
||
}
|
||
}
|
||
loc_local_vars = "{}";
|
||
loc_parent = ~-(llJsonValueType != []);
|
||
loc_last_symbol = ((integer)-1);
|
||
loc_ix = (list)((integer)-1);
|
||
}
|
||
jump J_autoGen00001;
|
||
}
|
||
else
|
||
{
|
||
return llJsonValueType;
|
||
}
|
||
}
|
||
loc_backtrack = 1;
|
||
loc_ix = llDeleteSubList(loc_ix, ((integer)-1), ((integer)-1));
|
||
}
|
||
else
|
||
while (llJsonValueType(loc_prog, loc_ix) == "")
|
||
{
|
||
loc_ix = loc_ix + 0;
|
||
loc_descending = 1;
|
||
}
|
||
string loc_type = llJsonValueType(loc_prog, loc_ix);
|
||
if (loc_type == "")
|
||
{
|
||
llJsonValueType = llJsonValueType + (float)llJsonGetValue(loc_prog, loc_ix);
|
||
}
|
||
else if (loc_descending)
|
||
{
|
||
string loc_verb = llJsonGetValue(loc_prog, loc_ix);
|
||
if (loc_verb == "if" | loc_verb == "while")
|
||
{
|
||
llJsonValueType = llJsonValueType + ("{\"c\":" + loc_prog + ",\"i\":" + llList2Json("", loc_ix) + ",\"sp\":" + (string)loc_last_symbol + ",\"p\":" + (string)loc_parent + ",\"v\":" + loc_local_vars + ",\"r\":" + (string)loc_return_mode + ",\"t\":0}");
|
||
loc_prog = "[" + llJsonGetValue(loc_prog, llDeleteSubList(loc_ix, ((integer)-1), ((integer)-1)) + 1) + "]";
|
||
loc_return_mode = 1;
|
||
loc_local_vars = "{}";
|
||
loc_parent = ~-(llJsonValueType != []);
|
||
loc_ix = (list)((integer)-1);
|
||
loc_last_symbol = ((integer)-1);
|
||
loc_descending = 1;
|
||
jump J_autoGen00001;
|
||
}
|
||
else if (loc_verb == "lambda")
|
||
{
|
||
loc_ix = llDeleteSubList(loc_ix, ((integer)-1), ((integer)-1));
|
||
string loc_arglist = llDumpList2String(llJson2List(llJsonGetValue(loc_prog, loc_ix + 1)), " ");
|
||
string loc_code = llJsonGetValue(loc_prog, loc_ix + 2);
|
||
loc_descending = loc_backtrack = 0;
|
||
llJsonValueType = llJsonValueType + ("{\"c\":" + loc_code + ",\"t\":2,\"a\":\"" + loc_arglist + "\"}");
|
||
jump J_autoGen00001;
|
||
}
|
||
else
|
||
{
|
||
llJsonValueType = llJsonValueType + ("{\"s\":\"" + loc_verb + "\"" + ",\"t\":1,\"sp\":" + (string)loc_last_symbol + "}");
|
||
loc_last_symbol = ~-(llJsonValueType != []);
|
||
}
|
||
}
|
||
else if (loc_type == "")
|
||
{
|
||
string loc_s = llJsonGetValue(loc_prog, loc_ix);
|
||
if (loc_s == "\\\"\\\"")
|
||
{
|
||
llJsonValueType = llJsonValueType + "";
|
||
}
|
||
else if (llGetSubString(loc_s, 0, 1) == "\\\"")
|
||
{
|
||
llJsonValueType = llJsonValueType + llGetSubString(loc_s, 2, ((integer)-3));
|
||
}
|
||
else if (llGetSubString(loc_s, 0, 0) == "$")
|
||
{
|
||
string loc_name = llDeleteSubString(loc_s, 0, 0);
|
||
string loc_local_type = llJsonValueType(loc_local_vars, (list)loc_name);
|
||
integer loc_temp_parent = loc_parent;
|
||
string loc_value;
|
||
if (loc_local_type == "")
|
||
while (loc_local_type == "")
|
||
{
|
||
if (~loc_temp_parent)
|
||
{
|
||
string loc_fr = llList2String(llJsonValueType, loc_temp_parent);
|
||
loc_local_type = llJsonValueType(loc_fr, (list)"v" + loc_name);
|
||
loc_value = llJsonGetValue(loc_fr, (list)"v" + loc_name);
|
||
loc_temp_parent = (integer)llJsonGetValue(loc_fr, (list)"p");
|
||
}
|
||
else
|
||
{
|
||
integer loc_si = llListFindList(UThreadStackFrame, (list)loc_name);
|
||
if (~loc_si)
|
||
{
|
||
integer loc_global_type = llGetListEntryType(gB, loc_si);
|
||
if (loc_global_type ^ 2)
|
||
if (~-loc_global_type)
|
||
llJsonValueType = llJsonValueType + llList2String(gB, loc_si);
|
||
else
|
||
llJsonValueType = llJsonValueType + llList2Integer(gB, loc_si);
|
||
else
|
||
llJsonValueType = llJsonValueType + llList2Float(gB, loc_si);
|
||
jump J_autoGen00001;
|
||
}
|
||
else
|
||
{
|
||
llOwnerSay(">> uninitialized variable: " + loc_s);
|
||
return [];
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
loc_value = llJsonGetValue(loc_local_vars, (list)loc_name);
|
||
}
|
||
if (loc_local_type == "")
|
||
{
|
||
if (llFabs((float)loc_value + -(float)((integer)(0.5 + (float)loc_value))) < 7.6293945e-06)
|
||
llJsonValueType = llJsonValueType + (integer)loc_value;
|
||
else
|
||
llJsonValueType = llJsonValueType + (float)loc_value;
|
||
}
|
||
else
|
||
{
|
||
llJsonValueType = llJsonValueType + loc_value;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
llJsonValueType = llJsonValueType + loc_s;
|
||
}
|
||
}
|
||
else if (loc_backtrack)
|
||
{
|
||
string loc_verbf = llList2String(llJsonValueType, loc_last_symbol);
|
||
string loc_verb = llJsonGetValue(loc_verbf, (list)"s");
|
||
if (loc_verb == "")
|
||
{
|
||
loc_last_symbol = (integer)llJsonGetValue(loc_verbf, (list)"sp");
|
||
loc_backtrack = loc_descending = 0;
|
||
jump J_autoGen00001;
|
||
}
|
||
integer loc_c;
|
||
list loc_params;
|
||
{
|
||
integer loc_scount = (llJsonValueType != []) + -loc_last_symbol;
|
||
loc_c = ~-loc_scount;
|
||
if (loc_c)
|
||
loc_params = llList2List(llJsonValueType, -~loc_last_symbol, ((integer)-1));
|
||
}
|
||
llJsonValueType = llDeleteSubList(llJsonValueType, loc_last_symbol, ((integer)-1));
|
||
loc_last_symbol = (integer)llJsonGetValue(loc_verbf, (list)"sp");
|
||
if (loc_verb == "list")
|
||
{
|
||
llJsonValueType = llJsonValueType + llList2Json("", loc_params);
|
||
}
|
||
else if (loc_verb == "print")
|
||
{
|
||
{
|
||
llLinksetDataWrite("p:" + (string)L, llLinksetDataRead("p:" + (string)L) + (string)loc_params + "");
|
||
llRegionSayTo(gC, 2046828547, "%1" + H + (string)L + " " + (string)I);
|
||
}
|
||
}
|
||
else if (loc_verb == "global")
|
||
{
|
||
string loc_name = llList2String(loc_params, 0);
|
||
string loc_data;
|
||
if (2 < loc_c)
|
||
loc_data = llList2Json("", llList2List(loc_params, 1, ((integer)-1)));
|
||
else if (loc_c == 2)
|
||
loc_data = llList2String(loc_params, 1);
|
||
integer loc_si = llListFindList(UThreadStackFrame, (list)loc_name);
|
||
if (~loc_si)
|
||
{
|
||
gB = llListReplaceList(gB, (list)loc_data, loc_si, loc_si);
|
||
}
|
||
else
|
||
{
|
||
UThreadStackFrame = UThreadStackFrame + loc_name;
|
||
gB = gB + loc_data;
|
||
}
|
||
}
|
||
else if (loc_verb == "set")
|
||
{
|
||
if (loc_c < 2)
|
||
{
|
||
llOwnerSay(">> unary set.");
|
||
return [];
|
||
}
|
||
string loc_name = llList2String(loc_params, 0);
|
||
list loc_data = llList2List(loc_params, 1, ((integer)-1));
|
||
string loc_local_type = llJsonValueType(loc_local_vars, (list)loc_name);
|
||
integer loc_old_parent = ((integer)-1);
|
||
integer loc_temp_parent = loc_parent;
|
||
string loc_fr;
|
||
while (loc_local_type == "")
|
||
{
|
||
if (~loc_temp_parent)
|
||
{
|
||
loc_fr = llList2String(llJsonValueType, loc_temp_parent);
|
||
loc_local_type = llJsonValueType(loc_fr, (list)"v" + loc_name);
|
||
loc_old_parent = loc_temp_parent;
|
||
loc_temp_parent = (integer)llJsonGetValue(loc_fr, (list)"p");
|
||
}
|
||
else
|
||
{
|
||
integer loc_si = llListFindList(UThreadStackFrame, (list)loc_name);
|
||
if (~loc_si)
|
||
{
|
||
gB = llListReplaceList(gB, loc_data, loc_si, loc_si);
|
||
}
|
||
else
|
||
{
|
||
loc_local_vars = llJsonSetValue(loc_local_vars, (list)loc_name, (string)loc_data);
|
||
}
|
||
jump J_autoGen00002;
|
||
}
|
||
}
|
||
if (~loc_old_parent)
|
||
llJsonValueType = llListReplaceList(llJsonValueType, (list)llJsonSetValue(loc_fr, (list)"v" + loc_name, (string)loc_data), loc_old_parent, loc_old_parent);
|
||
else
|
||
loc_local_vars = llJsonSetValue(loc_local_vars, (list)loc_name, (string)loc_data);
|
||
@J_autoGen00002;
|
||
}
|
||
else if (loc_verb == "+")
|
||
{
|
||
float loc_out = 0;
|
||
while (loc_c--)
|
||
loc_out = loc_out + llList2Float(loc_params, loc_c);
|
||
llJsonValueType = llJsonValueType + loc_out;
|
||
}
|
||
else if (loc_verb == "*")
|
||
{
|
||
float loc_out = 1;
|
||
while (loc_c--)
|
||
loc_out = loc_out * llList2Float(loc_params, loc_c);
|
||
llJsonValueType = llJsonValueType + loc_out;
|
||
}
|
||
else if (loc_verb == "==")
|
||
{
|
||
if (llGetListEntryType(loc_params, 0) ^ 3)
|
||
if (~-llGetListEntryType(loc_params, 0))
|
||
llJsonValueType = llJsonValueType + (llList2Float(loc_params, 0) == llList2Float(loc_params, 1));
|
||
else
|
||
llJsonValueType = llJsonValueType + (llList2Integer(loc_params, 0) == llList2Integer(loc_params, 1));
|
||
else
|
||
llJsonValueType = llJsonValueType + (llList2String(loc_params, 0) == llList2String(loc_params, 1));
|
||
}
|
||
else if (loc_verb == "!=")
|
||
{
|
||
if (llGetListEntryType(loc_params, 0) ^ 3)
|
||
if (~-llGetListEntryType(loc_params, 0))
|
||
llJsonValueType = llJsonValueType + !(llList2Float(loc_params, 0) == llList2Float(loc_params, 1));
|
||
else
|
||
llJsonValueType = llJsonValueType + (llList2Integer(loc_params, 0) ^ llList2Integer(loc_params, 1));
|
||
else
|
||
llJsonValueType = llJsonValueType + !(llList2String(loc_params, 0) == llList2String(loc_params, 1));
|
||
}
|
||
else if (loc_verb == "<")
|
||
{
|
||
llJsonValueType = llJsonValueType + (llList2Float(loc_params, 0) < llList2Float(loc_params, 1));
|
||
}
|
||
else if (loc_verb == ">")
|
||
{
|
||
llJsonValueType = llJsonValueType + (llList2Float(loc_params, 1) < llList2Float(loc_params, 0));
|
||
}
|
||
else if (loc_verb == "<=")
|
||
{
|
||
llJsonValueType = llJsonValueType + !(llList2Float(loc_params, 1) < llList2Float(loc_params, 0));
|
||
}
|
||
else if (loc_verb == ">=")
|
||
{
|
||
llJsonValueType = llJsonValueType + !(llList2Float(loc_params, 0) < llList2Float(loc_params, 1));
|
||
}
|
||
else if (loc_verb == "and")
|
||
{
|
||
integer loc_out = 1;
|
||
while (loc_c--)
|
||
loc_out = loc_out & llList2Integer(loc_params, loc_c);
|
||
llJsonValueType = llJsonValueType + loc_out;
|
||
}
|
||
else if (loc_verb == "or")
|
||
{
|
||
integer loc_out;
|
||
while (loc_c--)
|
||
loc_out = loc_out | llList2Integer(loc_params, loc_c);
|
||
llJsonValueType = llJsonValueType + loc_out;
|
||
}
|
||
else if (loc_verb == "not" | loc_verb == "!")
|
||
{
|
||
llJsonValueType = llJsonValueType + !llList2Integer(loc_params, 0);
|
||
}
|
||
else if (loc_verb == "-")
|
||
{
|
||
if (1 < loc_c)
|
||
{
|
||
float loc_out = llList2Float(loc_params, 0);
|
||
--loc_c;
|
||
while (loc_c--)
|
||
{
|
||
loc_out = loc_out + -llList2Float(loc_params, -~loc_c);
|
||
}
|
||
llJsonValueType = llJsonValueType + loc_out;
|
||
}
|
||
else
|
||
{
|
||
llJsonValueType = llJsonValueType + -llList2Float(loc_params, 0);
|
||
}
|
||
}
|
||
else if (loc_verb == "/")
|
||
{
|
||
if (1 < loc_c)
|
||
{
|
||
float loc_out = llList2Float(loc_params, 0);
|
||
--loc_c;
|
||
while (loc_c--)
|
||
{
|
||
float loc_newv = llList2Float(loc_params, -~loc_c);
|
||
if (loc_newv == 0)
|
||
{
|
||
llOwnerSay(">> Division by zero.");
|
||
return [];
|
||
}
|
||
else
|
||
loc_out = loc_out / loc_newv;
|
||
}
|
||
llJsonValueType = llJsonValueType + loc_out;
|
||
}
|
||
else
|
||
{
|
||
float loc_out = llList2Float(loc_params, 0);
|
||
if (loc_out == 0)
|
||
{
|
||
llOwnerSay(">> Division by zero.");
|
||
return [];
|
||
}
|
||
else
|
||
llJsonValueType = llJsonValueType + ((float)1) / loc_out;
|
||
}
|
||
}
|
||
else if (loc_verb == "apply")
|
||
{
|
||
llJsonValueType = llJsonValueType + ("{\"c\":" + loc_prog + ",\"i\":" + llList2Json("", loc_ix) + ",\"sp\":" + (string)loc_last_symbol + ",\"p\":" + (string)loc_parent + ",\"v\":" + loc_local_vars + ",\"r\":" + (string)loc_return_mode + ",\"t\":0}");
|
||
loc_local_vars = "{}";
|
||
loc_ix = (list)((integer)-1);
|
||
loc_parent = ~-(llJsonValueType != []);
|
||
{
|
||
string loc_func = llList2String(loc_params, 0);
|
||
list loc_arg_names = llParseString2List(llJsonGetValue(loc_func, (list)"a"), (list)" ", []);
|
||
integer loc_an = loc_arg_names != [];
|
||
while (loc_an--)
|
||
{
|
||
loc_local_vars = llJsonSetValue(loc_local_vars, (list)llList2String(loc_arg_names, loc_an), llList2String(loc_params, -~loc_an));
|
||
}
|
||
loc_prog = "[" + llJsonGetValue(loc_func, (list)"c") + "]";
|
||
}
|
||
loc_descending = loc_backtrack = 0;
|
||
jump J_autoGen00001;
|
||
}
|
||
else if (loc_verb == "concat")
|
||
{
|
||
llJsonValueType = llJsonValueType + llDumpList2String(llJson2List(llList2String(loc_params, 1)), llList2String(loc_params, 0));
|
||
}
|
||
else if (loc_verb == "split")
|
||
{
|
||
llJsonValueType = llJsonValueType + llList2Json("", llParseString2List(llList2String(loc_params, 1), (list)llList2String(loc_params, 0), []));
|
||
}
|
||
else if (loc_verb == "get")
|
||
{
|
||
llJsonValueType = llJsonValueType + llJsonGetValue(llList2String(loc_params, 0), llJson2List(llList2String(loc_params, 1)));
|
||
}
|
||
else if (loc_verb == "index")
|
||
{
|
||
llJsonValueType = llJsonValueType + llListFindList(llJson2List(llList2String(loc_params, 0)), (list)llList2String(loc_params, 1));
|
||
}
|
||
else if (loc_verb == "count")
|
||
{
|
||
llJsonValueType = llJsonValueType + (llJson2List(llList2String(loc_params, 0)) != []);
|
||
}
|
||
else if (loc_verb == "put")
|
||
{
|
||
llJsonValueType = llJsonValueType + llJsonSetValue(llList2String(loc_params, 0), llJson2List(llList2String(loc_params, 1)), llList2String(loc_params, 2));
|
||
}
|
||
else if (loc_verb == "char")
|
||
{
|
||
integer loc_p = llList2Integer(loc_params, 1);
|
||
llJsonValueType = llJsonValueType + llGetSubString(llList2String(loc_params, 0), loc_p, loc_p);
|
||
}
|
||
else if (loc_verb == "substr")
|
||
{
|
||
llJsonValueType = llJsonValueType + llGetSubString(llList2String(loc_params, 0), llList2Integer(loc_params, 1), llList2Integer(loc_params, 2));
|
||
}
|
||
else if (loc_verb == "strpos")
|
||
{
|
||
llJsonValueType = llJsonValueType + llSubStringIndex(llList2String(loc_params, 0), llList2String(loc_params, 1));
|
||
}
|
||
else if (loc_verb == "rand")
|
||
{
|
||
llJsonValueType = llJsonValueType + llFrand(1);
|
||
}
|
||
else if (loc_verb == "int")
|
||
{
|
||
llJsonValueType = llJsonValueType + (integer)llList2String(loc_params, 0);
|
||
}
|
||
else if (loc_verb == "getd")
|
||
{
|
||
llJsonValueType = llJsonValueType + llJsonGetValue(llLinksetDataRead(llList2String(loc_params, 0)), llParseStringKeepNulls(llList2String(loc_params, 1), (list)".", []));
|
||
}
|
||
else if (loc_verb == "setd")
|
||
{
|
||
llLinksetDataWrite(llList2String(loc_params, 0), llJsonSetValue(llLinksetDataRead(llList2String(loc_params, 0)), llParseStringKeepNulls(llList2String(loc_params, 1), (list)".", []), llList2String(loc_params, 2)));
|
||
}
|
||
else if (loc_verb == "deleted")
|
||
{
|
||
llLinksetDataWrite(llList2String(loc_params, 0), llJsonSetValue(llLinksetDataRead(llList2String(loc_params, 0)), llParseStringKeepNulls(llList2String(loc_params, 1), (list)".", []), ""));
|
||
}
|
||
else if (llGetSubString(loc_verb, 0, 0) == "@")
|
||
{
|
||
llMessageLinked(1, 0, "!!" + H + (string)L + " " + "00000000-0000-0000-0000-000000000000" + " " + (string)I + " " + llDeleteSubString(loc_verb, 0, 0) + " " + (string)loc_params, "");
|
||
}
|
||
else if (llGetSubString(loc_verb, 0, 0) == "#")
|
||
{
|
||
llMessageLinked(((integer)-4), (integer)llDeleteSubString(loc_verb, 0, 0), (string)loc_params, I);
|
||
}
|
||
else if (loc_verb == "")
|
||
{
|
||
llJsonValueType = llJsonValueType + "[]";
|
||
}
|
||
else if (loc_verb == "")
|
||
{
|
||
if (loc_c)
|
||
llJsonValueType = llJsonValueType + llList2List(loc_params, ((integer)-1), ((integer)-1));
|
||
}
|
||
else
|
||
{
|
||
llOwnerSay(">> unknown verb: " + loc_verb);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
llOwnerSay(">> unknown data type: " + loc_type);
|
||
}
|
||
loc_descending = loc_backtrack = 0;
|
||
}
|
||
return llJsonValueType;
|
||
}
|
||
|
||
string _(list llJsonValueType)
|
||
{
|
||
list loc_opens;
|
||
integer loc_tcount = llJsonValueType != [];
|
||
integer loc_open_quote = ((integer)-1);
|
||
integer loc_comment_start = ((integer)-1);
|
||
integer loc_i;
|
||
for (; loc_i < loc_tcount; ++loc_i)
|
||
{
|
||
string loc_t = llList2String(llJsonValueType, loc_i);
|
||
if (~loc_comment_start)
|
||
{
|
||
if (loc_t == "\n")
|
||
{
|
||
llJsonValueType = llDeleteSubList(llJsonValueType, loc_comment_start, loc_i);
|
||
loc_tcount = loc_tcount + ~(loc_i + -loc_comment_start);
|
||
loc_i = loc_comment_start;
|
||
loc_comment_start = ((integer)-1);
|
||
}
|
||
}
|
||
else if (~loc_open_quote)
|
||
{
|
||
if (loc_t == "\"")
|
||
{
|
||
string loc_str;
|
||
if (-~loc_open_quote ^ loc_i)
|
||
loc_str = "\\\"" + llDumpList2String(llList2List(llJsonValueType, -~loc_open_quote, ~-loc_i), " ") + "\\\"";
|
||
else
|
||
loc_str = "";
|
||
llJsonValueType = llListReplaceList(llJsonValueType, (list)loc_str, loc_open_quote, loc_i);
|
||
loc_i = loc_open_quote;
|
||
loc_open_quote = ((integer)-1);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (loc_t == "")
|
||
{
|
||
llJsonValueType = llDeleteSubList(llJsonValueType, loc_i, loc_i);
|
||
--loc_i;
|
||
--loc_tcount;
|
||
}
|
||
else if (loc_t == "\"")
|
||
{
|
||
loc_open_quote = loc_i;
|
||
}
|
||
else if (loc_t == "(")
|
||
{
|
||
loc_opens = loc_opens + loc_i;
|
||
}
|
||
else if (loc_t == ";")
|
||
{
|
||
loc_comment_start = loc_i;
|
||
}
|
||
else if (loc_t == "\n")
|
||
{
|
||
llJsonValueType = llDeleteSubList(llJsonValueType, loc_i, loc_i);
|
||
--loc_i;
|
||
--loc_tcount;
|
||
}
|
||
else if (loc_t == ")")
|
||
{
|
||
if (loc_opens == [])
|
||
{
|
||
llOwnerSay("++ Excess closing parens at " + (string)loc_i + ".");
|
||
return "";
|
||
}
|
||
integer loc_L = llList2Integer(loc_opens, ((integer)-1));
|
||
loc_opens = llDeleteSubList(loc_opens, ((integer)-1), ((integer)-1));
|
||
string loc_frag;
|
||
if (-~loc_L ^ loc_i)
|
||
loc_frag = llList2Json("", llList2List(llJsonValueType, -~loc_L, ~-loc_i));
|
||
else
|
||
loc_frag = "[]";
|
||
if (llJsonValueType(loc_frag, (list)0) == "")
|
||
loc_frag = llList2Json("", "" + llList2List(llJsonValueType, -~loc_L, ~-loc_i));
|
||
llJsonValueType = llListReplaceList(llJsonValueType, (list)loc_frag, loc_L, loc_i);
|
||
loc_tcount = llJsonValueType != [];
|
||
loc_i = loc_L;
|
||
}
|
||
}
|
||
}
|
||
if (~loc_open_quote)
|
||
{
|
||
llOwnerSay("++ unclosed quote following: " + llDumpList2String(llList2List(llJsonValueType, ~-~-loc_open_quote, 4 + loc_open_quote), " "));
|
||
return "";
|
||
}
|
||
else if (loc_opens != [])
|
||
{
|
||
llOwnerSay("++ imbalanced parens (" + (string)(loc_opens != []) + ").");
|
||
return "";
|
||
}
|
||
else
|
||
{
|
||
return llList2Json("", llJsonValueType);
|
||
}
|
||
}
|
||
|
||
integer F;
|
||
integer J;
|
||
key Pop;
|
||
key edefaultchat;
|
||
key LslLibrary;
|
||
string edefaultstate_entry;
|
||
string ResumeVoid;
|
||
|
||
B(integer llJsonValueType, integer llGetListEntryType, string llFrand, key llList2String, key llSubStringIndex, key llListen)
|
||
{
|
||
if (llGetListEntryType)
|
||
if (llGetListEntryType ^ 275)
|
||
{
|
||
if (llGetListEntryType ^ 4093)
|
||
if (llGetListEntryType ^ 3850)
|
||
{
|
||
llOwnerSay("[" + LslUserScript + "] unimplemented signal " + (string)llGetListEntryType + ": " + llFrand);
|
||
}
|
||
else
|
||
{
|
||
llOwnerSay("[" + LslUserScript + "] failed to run '" + llFrand + "' (kernel could not find the program specified)");
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (llFrand == LslUserScript + " file")
|
||
{
|
||
if (llSubStringIndex == LslLibrary)
|
||
{
|
||
string loc_file_buffer;
|
||
{
|
||
loc_file_buffer = A(LslLibrary);
|
||
}
|
||
integer loc_read_length = 10;
|
||
if (ResumeVoid == "b")
|
||
loc_read_length = loc_read_length * 1024;
|
||
if (~J)
|
||
{
|
||
F = F + loc_read_length;
|
||
}
|
||
else
|
||
{
|
||
list loc_stat = llParseString2List(loc_file_buffer, (list)" ", []);
|
||
J = (integer)llList2String(loc_stat, 0);
|
||
ResumeVoid = llList2String(loc_stat, 1);
|
||
F = 0;
|
||
}
|
||
if (J < loc_read_length + F)
|
||
loc_read_length = J + -F;
|
||
if (F)
|
||
{
|
||
gA = gA + ("\n" + llParseStringKeepNulls(loc_file_buffer, (list)" ", (list)"(" + ")" + "\""));
|
||
if (F < J)
|
||
{
|
||
llRegionSayTo(gC, 2046828547, "%!" + H + (string)LslLibrary + " " + LslUserScript + " " + edefaultstate_entry + " " + ((string)F + " " + (string)loc_read_length));
|
||
}
|
||
else
|
||
{
|
||
llRegionSayTo(gC, 2046828547, "%3" + H + "[\"" + (string)LslLibrary + "\"]");
|
||
I = edefaultchat;
|
||
L = Pop;
|
||
string loc_prog = _(gA);
|
||
list loc_output = C((list)("{\"c\":" + loc_prog + ",\"i\":" + "[]" + ",\"sp\":" + "-1" + ",\"p\":" + "-1" + ",\"v\":" + "{}" + ",\"r\":" + "0" + ",\"t\":0}"));
|
||
string loc_msg;
|
||
if (D)
|
||
{
|
||
loc_msg = "-- Interrupted!";
|
||
}
|
||
else
|
||
{
|
||
loc_msg = llDumpList2String(loc_output, " ");
|
||
}
|
||
{
|
||
llLinksetDataWrite("p:" + (string)edefaultchat, llLinksetDataRead("p:" + (string)edefaultchat) + loc_msg + "");
|
||
llRegionSayTo(gC, 2046828547, "%1" + H + (string)edefaultchat + " " + (string)Pop);
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (0 < J)
|
||
{
|
||
llRegionSayTo(gC, 2046828547, "%!" + H + (string)LslLibrary + " " + LslUserScript + " " + edefaultstate_entry + " " + ((string)F + " " + (string)loc_read_length));
|
||
}
|
||
else
|
||
{
|
||
{
|
||
llLinksetDataWrite("p:" + (string)edefaultchat, llLinksetDataRead("p:" + (string)edefaultchat) + "No file: " + edefaultstate_entry + "");
|
||
llRegionSayTo(gC, 2046828547, "%1" + H + (string)edefaultchat + " " + (string)edefaultchat);
|
||
}
|
||
llRegionSayTo(gC, 2046828547, "%3" + H + "[\"" + (string)LslLibrary + "\"]");
|
||
System = llJsonSetValue(System, (list)LslLibrary, "");
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
llOwnerSay("[" + LslUserScript + "] file data offered via unexpected pipe: " + (string)llSubStringIndex);
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
list loc_argv = llParseString2List(llFrand, (list)" ", []);
|
||
integer loc_argc = loc_argv != [];
|
||
if (~-loc_argc)
|
||
{
|
||
Pop = llList2String;
|
||
edefaultchat = llListen;
|
||
gA = UThreadStackFrame = gB = [];
|
||
D = "";
|
||
edefaultstate_entry = llList2String(loc_argv, 1);
|
||
ResumeVoid = "";
|
||
F = J = ((integer)-1);
|
||
llRegionSayTo(gC, 2046828547, "%!" + H + (string)(LslLibrary = llGenerateKey()) + " " + LslUserScript + " " + edefaultstate_entry + " " + "-1");
|
||
{
|
||
System = llJsonSetValue(System, (list)LslLibrary, edefaultstate_entry);
|
||
llMessageLinked(1, 3859, LslUserScript + "," + (string)(G = G | 1), "");
|
||
}
|
||
}
|
||
else
|
||
{
|
||
{
|
||
llLinksetDataWrite("p:" + (string)llList2String, llLinksetDataRead("p:" + (string)llList2String) + "Syntax: @" + LslUserScript + " <filename>" + "");
|
||
llRegionSayTo(gC, 2046828547, "%1" + H + (string)llList2String + " " + (string)llListen);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
integer edefaultrez;
|
||
integer UThread;
|
||
key IsRestoring;
|
||
key Library;
|
||
key IsSaveDue;
|
||
integer G;
|
||
|
||
default
|
||
{
|
||
state_entry()
|
||
{
|
||
E = llGetLinkKey(1);
|
||
gC = llGetLinkKey(2);
|
||
K = llGetLinkKey(3);
|
||
LslUserScript = llGetScriptName();
|
||
edefaultrez = llListen(2046820352, "", E, "");
|
||
llMessageLinked(1, 3840, LslUserScript + "\n" + "0.2.5" + " " + "lang " + "0.2.3", "");
|
||
}
|
||
|
||
on_rez(integer llJsonValueType)
|
||
{
|
||
llResetScript();
|
||
}
|
||
|
||
listen(integer llListen, string llFrand, key llGetListEntryType, string llJsonValueType)
|
||
{
|
||
integer loc_n = (((integer)-33) + llOrd(llJsonValueType, 0)) * 64 + (((integer)-33) + llOrd(llJsonValueType, 1));
|
||
if (llListen ^ 2046820352)
|
||
{
|
||
IsRestoring = "00000000-0000-0000-0000-000000000000";
|
||
Library = "00000000-0000-0000-0000-000000000000";
|
||
string loc_remainder = llDeleteSubString(llJsonValueType, 0, 1);
|
||
if (loc_n & -!(loc_n == 275))
|
||
{
|
||
B(UThread = 0, loc_n, loc_remainder, "00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000000");
|
||
}
|
||
else
|
||
{
|
||
Library = llGetSubString(loc_remainder, 2, 37);
|
||
IsRestoring = llGetSubString(loc_remainder, 39, 74);
|
||
IsSaveDue = llGetSubString(loc_remainder, 76, 111);
|
||
B(UThread = (((integer)-33) + llOrd(loc_remainder, 0)) * 64 + (((integer)-33) + llOrd(loc_remainder, 1)), loc_n, llDeleteSubString(loc_remainder, 0, 112), Library, IsRestoring, IsSaveDue);
|
||
}
|
||
if (UThread & -(llJsonGetValue(System, (list)((string)IsRestoring)) == ""))
|
||
llRegionSayTo(gC, 2046828547, "%3" + H + "V" + llList2Json("", (list)IsRestoring));
|
||
if (llList2ListStrided(llJson2List(System), 0, ((integer)-1), 2) == [])
|
||
{
|
||
{
|
||
if (UThread)
|
||
llMessageLinked(1, 4, llChar(33 + ((UThread & 4032) >> 6)) + llChar(33 + (UThread & 63)) + (string)IsRestoring + " " + LslUserScript, "");
|
||
llMessageLinked(1, 3849, LslUserScript, "");
|
||
G = G & ((integer)-2);
|
||
llSetScriptState(LslUserScript, 0);
|
||
llSleep(0.022);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (UThread)
|
||
llMessageLinked(1, 4, llChar(33 + ((UThread & 4032) >> 6)) + llChar(33 + (UThread & 63)) + (string)IsRestoring + " " + LslUserScript, "");
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (loc_n == 3841)
|
||
{
|
||
string loc_expected_program_name = llDeleteSubString(llJsonValueType, 0, 3);
|
||
if (loc_expected_program_name == LslUserScript)
|
||
{
|
||
llListenRemove(edefaultrez);
|
||
H = llGetSubString(llJsonValueType, 2, 3);
|
||
g_ = (((integer)-33) + llOrd(H, 0)) * 64 + (((integer)-33) + llOrd(H, 1));
|
||
integer loc_C = 2046832640 + g_;
|
||
edefaultrez = llListen(loc_C, "", E, "");
|
||
llMessageLinked(1, 3859, LslUserScript + "," + (string)G, "");
|
||
B(UThread = 0, 4093, "", "00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000000");
|
||
llMessageLinked(1, 3860, LslUserScript, "");
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|