generated from Jaysyn/ModuleTemplate
Initial upload
Initial upload.
This commit is contained in:
509
_module/nss/fcb_inc_parser.nss
Normal file
509
_module/nss/fcb_inc_parser.nss
Normal file
@@ -0,0 +1,509 @@
|
||||
#include "fcb_inc_prot"
|
||||
|
||||
//==========================================/
|
||||
int get_char_valid_num(string s)
|
||||
//==========================================/
|
||||
{
|
||||
string valid = "0123456789";
|
||||
|
||||
return FindSubString(valid, s) + 1;
|
||||
}
|
||||
|
||||
//==========================================/
|
||||
int get_char_valid_letter(string s)
|
||||
//==========================================/
|
||||
{
|
||||
string valid = "abcdefghijklmnopqrstuvwxyz_";
|
||||
|
||||
return FindSubString(valid, s) + 1;
|
||||
}
|
||||
|
||||
//==========================================/
|
||||
int get_char_valid_name(string s)
|
||||
//==========================================/
|
||||
{
|
||||
string valid = "abcdefghijklmnopqrstuvwxyz_0123456789";
|
||||
|
||||
return FindSubString(valid, s) + 1;
|
||||
}
|
||||
|
||||
//==========================================/
|
||||
int get_is_number(string num)
|
||||
//==========================================/
|
||||
{
|
||||
return (num == IntToString(StringToInt(num)));
|
||||
}
|
||||
|
||||
//==========================================/
|
||||
void store_arg(string function_arg, int exe_index)
|
||||
//==========================================/
|
||||
{
|
||||
int args_index = GetLocalInt(FCB_HOST, CMD_ARGS_INDEX_ + IntToHexString(exe_index)) + 1;
|
||||
SetLocalInt(FCB_HOST, CMD_ARGS_INDEX_ + IntToHexString(exe_index), args_index);
|
||||
|
||||
SetLocalString(FCB_HOST, CMD_ARGS_ + IntToHexString(exe_index | args_index), function_arg);
|
||||
}
|
||||
|
||||
//==========================================/
|
||||
string retrieve_arg(int args_index)
|
||||
//==========================================/
|
||||
{
|
||||
int exe_index = GetLocalInt(FCB_HOST, CMD_EXE_REF_INDEX);
|
||||
|
||||
int args_index_max = GetLocalInt(FCB_HOST, CMD_ARGS_INDEX_ + IntToHexString(exe_index));
|
||||
if(args_index_max >= args_index)
|
||||
{
|
||||
return GetLocalString(FCB_HOST, CMD_ARGS_ + IntToHexString(exe_index | args_index));
|
||||
}
|
||||
|
||||
return CMD_ERROR_STRING;
|
||||
}
|
||||
|
||||
//==========================================/
|
||||
void set_function_result(string result)
|
||||
//==========================================/
|
||||
{
|
||||
int exe_index = GetLocalInt(FCB_HOST, CMD_EXE_REF_INDEX);
|
||||
|
||||
SetLocalString(FCB_HOST, CMD_FUNCTION_RESULT_ + IntToHexString(exe_index), result);
|
||||
}
|
||||
|
||||
//==========================================/
|
||||
string get_function_result(int exe_index)
|
||||
//==========================================/
|
||||
{
|
||||
return GetLocalString(FCB_HOST, CMD_FUNCTION_RESULT_ + IntToHexString(exe_index));
|
||||
}
|
||||
|
||||
//==========================================/
|
||||
void set_function_result_valid()
|
||||
//==========================================/
|
||||
{
|
||||
int exe_index = GetLocalInt(FCB_HOST, CMD_EXE_REF_INDEX);
|
||||
|
||||
SetLocalInt(FCB_HOST, CMD_FUNCTION_RESP_VALID_ + IntToHexString(exe_index), CMD_VALID_BIT);
|
||||
}
|
||||
|
||||
//==========================================/
|
||||
int get_function_result_valid(int exe_index)
|
||||
//==========================================/
|
||||
{
|
||||
int valid = CMD_VALID_BIT & GetLocalInt(FCB_HOST, CMD_FUNCTION_RESP_VALID_ + IntToHexString(exe_index));
|
||||
DeleteLocalInt(FCB_HOST, CMD_FUNCTION_RESP_VALID_ + IntToHexString(exe_index));
|
||||
|
||||
return valid;
|
||||
}
|
||||
|
||||
//==========================================/
|
||||
string parse_init(string input)
|
||||
//==========================================/
|
||||
{
|
||||
object user = GetLocalObject(FCB_HOST, USER);
|
||||
|
||||
int parse_state = INPUT_PARSE_STATE_INIT;
|
||||
|
||||
int cmd_str_len = GetStringLength(input);
|
||||
int cmd_str_pos = 0;
|
||||
|
||||
//kill end spaces
|
||||
string s = GetSubString(input, cmd_str_len-1, 1);
|
||||
while(cmd_str_len >= 0 && s == CMD_TXT_SPACE)
|
||||
{
|
||||
cmd_str_len--;
|
||||
s = GetSubString(input, cmd_str_len-1, 1);
|
||||
}
|
||||
|
||||
s = GetSubString(input, cmd_str_pos, 1);
|
||||
while(cmd_str_pos <= cmd_str_len)
|
||||
{
|
||||
switch(parse_state)
|
||||
{
|
||||
//--------------------------------------/
|
||||
case INPUT_PARSE_STATE_INIT:
|
||||
{
|
||||
if(s == CMD_TXT_CMDSTART)
|
||||
{
|
||||
parse_state = INPUT_PARSE_STATE_CMD;
|
||||
}
|
||||
|
||||
else if(s != CMD_TXT_SPACE)
|
||||
{
|
||||
return input;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
//--------------------------------------/
|
||||
case INPUT_PARSE_STATE_CMD:
|
||||
{
|
||||
DeleteLocalInt(FCB_HOST, CMD_EXE_INDEX);
|
||||
string parsed_cmd = parse_var(GetStringRight(input, cmd_str_len - cmd_str_pos), user);
|
||||
|
||||
SendMessageToPC(user, parsed_cmd);
|
||||
return parsed_cmd;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
cmd_str_pos++;
|
||||
s = GetSubString(input, cmd_str_pos, 1);
|
||||
}
|
||||
|
||||
return input;
|
||||
}
|
||||
|
||||
//==========================================/
|
||||
string parse_var(string cmd, object user)
|
||||
//==========================================/
|
||||
{
|
||||
string CMD_TXT_QUOTE = GetLocalString(FCB_HOST, CMD_QUOTE);
|
||||
|
||||
string arg = "";
|
||||
|
||||
int bracket_cnt = 0;
|
||||
|
||||
int parse_state = VAR_PARSE_STATE_INIT;
|
||||
|
||||
int cmd_str_len = GetStringLength(cmd);
|
||||
int cmd_str_pos = 0;
|
||||
|
||||
//kill end spaces
|
||||
string s = GetSubString(cmd, cmd_str_len-1, 1);
|
||||
while(cmd_str_len >= 0 && s == CMD_TXT_SPACE)
|
||||
{
|
||||
cmd_str_len--;
|
||||
s = GetSubString(cmd, cmd_str_len-1, 1);
|
||||
}
|
||||
|
||||
//begin
|
||||
//begin
|
||||
s = GetSubString(cmd, cmd_str_pos, 1);
|
||||
while(cmd_str_pos <= cmd_str_len)
|
||||
{
|
||||
//--------------------------------------/
|
||||
if(s == CMD_TXT_BRACKET_START)
|
||||
{
|
||||
bracket_cnt++;
|
||||
}
|
||||
else if(s == CMD_TXT_BRACKET_END)
|
||||
{
|
||||
bracket_cnt--;
|
||||
}
|
||||
if(bracket_cnt < 0)
|
||||
{
|
||||
parse_state = VAR_PARSE_STATE_ERROR;
|
||||
}
|
||||
|
||||
//--------------------------------------/
|
||||
switch(parse_state)
|
||||
{
|
||||
//--------------------------------------/
|
||||
case VAR_PARSE_STATE_INIT:
|
||||
{
|
||||
if(s == CMD_TXT_QUOTE)
|
||||
{
|
||||
parse_state = VAR_PARSE_STATE_STRING;
|
||||
}
|
||||
|
||||
else if(get_char_valid_letter(s))
|
||||
{
|
||||
arg += s;
|
||||
|
||||
parse_state = VAR_PARSE_STATE_FUNCTION;
|
||||
}
|
||||
|
||||
else if(get_char_valid_num(s))
|
||||
{
|
||||
arg += s;
|
||||
|
||||
if(cmd_str_pos == cmd_str_len-1)
|
||||
{
|
||||
return arg;
|
||||
}
|
||||
else
|
||||
{
|
||||
parse_state = VAR_PARSE_STATE_NUM;
|
||||
}
|
||||
}
|
||||
|
||||
else if(s != CMD_TXT_SPACE)
|
||||
{
|
||||
parse_state = VAR_PARSE_STATE_ERROR;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
//--------------------------------------/
|
||||
case VAR_PARSE_STATE_STRING:
|
||||
{
|
||||
if(s == CMD_TXT_QUOTE)
|
||||
{
|
||||
if(cmd_str_pos == cmd_str_len-1)
|
||||
{
|
||||
return arg;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
parse_state = VAR_PARSE_STATE_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
arg += s;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
//--------------------------------------/
|
||||
case VAR_PARSE_STATE_FUNCTION:
|
||||
{
|
||||
if(s == CMD_TXT_BRACKET_START)
|
||||
{
|
||||
return parse_function_arg(arg, GetStringRight(cmd, cmd_str_len - cmd_str_pos-1), user);
|
||||
}
|
||||
|
||||
else if(get_char_valid_name(s))
|
||||
{
|
||||
arg += s;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
parse_state = VAR_PARSE_STATE_ERROR;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
//--------------------------------------/
|
||||
case VAR_PARSE_STATE_NUM:
|
||||
{
|
||||
if(get_char_valid_num(s))
|
||||
{
|
||||
arg += s;
|
||||
|
||||
if(cmd_str_pos == cmd_str_len-1)
|
||||
{
|
||||
return arg;
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
parse_state = VAR_PARSE_STATE_ERROR;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
//--------------------------------------/
|
||||
case VAR_PARSE_STATE_ERROR:
|
||||
{
|
||||
SendMessageToPC(user, "var: " + CMD_ERROR_MSG);
|
||||
return CMD_ERROR_STRING;
|
||||
}
|
||||
}
|
||||
|
||||
cmd_str_pos++;
|
||||
s = GetSubString(cmd, cmd_str_pos, 1);
|
||||
}
|
||||
|
||||
////
|
||||
SendMessageToPC(user, "var: " + CMD_ERROR_MSG);
|
||||
return CMD_ERROR_STRING;
|
||||
}
|
||||
|
||||
//==========================================/
|
||||
string parse_function_arg(string function_name, string cmd, object user)
|
||||
//==========================================/
|
||||
{
|
||||
string CMD_TXT_QUOTE = GetLocalString(FCB_HOST, CMD_QUOTE);
|
||||
//function_name( a, b, c, d, ...)
|
||||
//**************X <- begin here
|
||||
|
||||
int exe_index = GetLocalInt(FCB_HOST, CMD_EXE_INDEX) + INCR_F10;
|
||||
SetLocalInt(FCB_HOST, CMD_EXE_INDEX, exe_index);
|
||||
|
||||
string function_arg = "";
|
||||
|
||||
int bracket_cnt = 1;
|
||||
int quote_state = 0;
|
||||
|
||||
int parse_state = CMD_PARSE_STATE_INIT;
|
||||
|
||||
int cmd_str_len = GetStringLength(cmd);
|
||||
int cmd_str_pos = 0;
|
||||
|
||||
//kill end spaces
|
||||
string s = GetSubString(cmd, cmd_str_len-1, 1);
|
||||
while(cmd_str_len >= 0 && s == CMD_TXT_SPACE)
|
||||
{
|
||||
cmd_str_len--;
|
||||
s = GetSubString(cmd, cmd_str_len-1, 1);
|
||||
}
|
||||
|
||||
//begin
|
||||
s = GetSubString(cmd, cmd_str_pos, 1);
|
||||
while(cmd_str_pos <= cmd_str_len)
|
||||
{
|
||||
//--------------------------------------/
|
||||
if(s == CMD_TXT_BRACKET_START)
|
||||
{
|
||||
bracket_cnt++;
|
||||
}
|
||||
else if(s == CMD_TXT_BRACKET_END)
|
||||
{
|
||||
bracket_cnt--;
|
||||
}
|
||||
if(bracket_cnt < 0)
|
||||
{
|
||||
parse_state = CMD_PARSE_STATE_ERROR;
|
||||
}
|
||||
|
||||
//--------------------------------------/
|
||||
if(s == CMD_TXT_QUOTE)
|
||||
{
|
||||
quote_state = !quote_state;
|
||||
}
|
||||
|
||||
/////
|
||||
//SpeakString("state: " + IntToString(parse_state));
|
||||
//SpeakString("arg: " + function_arg);
|
||||
|
||||
//--------------------------------------/
|
||||
switch(parse_state)
|
||||
{
|
||||
//--------------------------------------/
|
||||
case CMD_PARSE_STATE_INIT:
|
||||
{
|
||||
if(s == CMD_TXT_BRACKET_END)
|
||||
{
|
||||
if(cmd_str_pos == cmd_str_len-1)
|
||||
{
|
||||
parse_state = CMD_PARSE_STATE_END;
|
||||
}
|
||||
else
|
||||
{
|
||||
parse_state = CMD_PARSE_STATE_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
else if(s != CMD_TXT_SPACE)
|
||||
{
|
||||
function_arg += s;
|
||||
|
||||
parse_state = CMD_PARSE_STATE_ARG;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
//--------------------------------------/
|
||||
case CMD_PARSE_STATE_ARG:
|
||||
{
|
||||
if(s == CMD_TXT_COMMA && bracket_cnt == 1 && !quote_state)
|
||||
{
|
||||
if(function_arg != CMD_TXT_BLANK)
|
||||
{
|
||||
string arg = parse_var(function_arg, user);
|
||||
|
||||
if(arg != CMD_ERROR_STRING)
|
||||
{
|
||||
store_arg(arg, exe_index);
|
||||
function_arg = CMD_TXT_BLANK;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
parse_state = CMD_PARSE_STATE_ERROR;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
parse_state = CMD_PARSE_STATE_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
else if(s == CMD_TXT_BRACKET_END && bracket_cnt == 0 && !quote_state)
|
||||
{
|
||||
if(function_arg != CMD_TXT_BLANK)
|
||||
{
|
||||
string arg = parse_var(function_arg, user);
|
||||
|
||||
if(arg != CMD_ERROR_STRING)
|
||||
{
|
||||
store_arg(arg, exe_index);
|
||||
|
||||
if(cmd_str_pos == cmd_str_len-1)
|
||||
{
|
||||
parse_state = CMD_PARSE_STATE_END;
|
||||
}
|
||||
else
|
||||
{
|
||||
parse_state = CMD_PARSE_STATE_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
parse_state = CMD_PARSE_STATE_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
parse_state = CMD_PARSE_STATE_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
function_arg += s;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
//--------------------------------------/
|
||||
case CMD_PARSE_STATE_END:
|
||||
{
|
||||
SetLocalInt(FCB_HOST, CMD_EXE_REF_INDEX, exe_index);
|
||||
ExecuteScript(CMD_SCRIPT_PREFIX + function_name, FCB_HOST);
|
||||
|
||||
DeleteLocalInt(FCB_HOST, CMD_EXE_REF_INDEX);
|
||||
DeleteLocalInt(FCB_HOST, CMD_ARGS_INDEX_ + IntToHexString(exe_index));
|
||||
|
||||
if(get_function_result_valid(exe_index))
|
||||
{
|
||||
return get_function_result(exe_index);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
//--------------------------------------/
|
||||
case CMD_PARSE_STATE_ERROR:
|
||||
{
|
||||
SendMessageToPC(user, "function: " + CMD_ERROR_MSG);
|
||||
|
||||
DeleteLocalInt(FCB_HOST, CMD_ARGS_INDEX_ + IntToHexString(exe_index));
|
||||
return CMD_ERROR_STRING;
|
||||
}
|
||||
}
|
||||
|
||||
cmd_str_pos++;
|
||||
s = GetSubString(cmd, cmd_str_pos, 1);
|
||||
}
|
||||
|
||||
////
|
||||
SendMessageToPC(user, "function: " + CMD_ERROR_MSG);
|
||||
|
||||
DeleteLocalInt(FCB_HOST, CMD_ARGS_INDEX_ + IntToHexString(exe_index));
|
||||
return CMD_ERROR_STRING;
|
||||
}
|
||||
Reference in New Issue
Block a user