ArrayDim now works with type members

This commit is contained in:
n00b87
2024-04-22 17:26:52 -05:00
parent a84cceb938
commit 53c3ce4483
7 changed files with 3883 additions and 168 deletions

View File

@@ -1961,155 +1961,7 @@ bool pre_parse(int start_token = 0, int end_token = -1, int pp_flags, bool eval_
int resolve_id2 = -1;
int arg_index = -1;
if(StringToLower(id[expr_id].name).compare("arraydim")==0)
{
//cout << "HERES JOHNNY" << endl;
resolve_index = getResolveReg(args[0]);
if(resolve_index < 0)
{
rc_setError("Expected Identifier in ArrayDim argument: " + args[0]);
return false;
}
switch(resolveID_id_type[resolve_index])
{
case ID_TYPE_ARR_NUM:
case ID_TYPE_BYREF_NUM:
case ID_TYPE_NUM:
expr_id = getIDInScope_ByIndex("NumberArrayDim");
break;
case ID_TYPE_ARR_STR:
case ID_TYPE_BYREF_STR:
case ID_TYPE_STR:
expr_id = getIDInScope_ByIndex("StringArrayDim");
break;
}
if(expr_id < 0)
{
rc_setError("ArrayDim Syntax Error");
return false;
}
}
else if(StringToLower(id[expr_id].name).compare("arraysize")==0)
{
//cout << "HERES JOHNNY" << endl;
resolve_index = getResolveReg(args[0]);
if(resolve_index < 0)
{
rc_setError("Expected Identifier in ArraySize argument: " +args[0]);
return false;
}
switch(resolveID_id_type[resolve_index])
{
case ID_TYPE_ARR_NUM:
case ID_TYPE_BYREF_NUM:
case ID_TYPE_NUM:
expr_id = getIDInScope_ByIndex("NumberArraySize");
break;
case ID_TYPE_ARR_STR:
case ID_TYPE_BYREF_STR:
case ID_TYPE_STR:
expr_id = getIDInScope_ByIndex("StringArraySize");
break;
}
if(expr_id < 0)
{
rc_setError("ArraySize Syntax Error");
return false;
}
}
else if(StringToLower(id[expr_id].name).compare("arraycopy")==0)
{
//cout << "HERES JOHNNY" << endl;
if(num_args != 2)
{
rc_setError("ArrayCopy expects 2 arguments");
return false;
}
resolve_index = getResolveReg(args[0]);
resolve_index2 = getResolveReg(args[1]);
if(resolve_index < 0 || resolve_index2 < 0)
{
rc_setError("Expected Identifier in ArrayCopy argument: " +args[0]);
return false;
}
resolve_id = resolveID_id_vec_pos[resolve_index];
resolve_id2 = resolveID_id_vec_pos[resolve_index2];
switch(resolveID_id_type[resolve_index])
{
case ID_TYPE_ARR_NUM:
case ID_TYPE_BYREF_NUM:
case ID_TYPE_NUM:
expr_id = getIDInScope_ByIndex("NumberArrayCopy");
if(resolveID_id_type[resolve_index2] != ID_TYPE_ARR_NUM &&
resolveID_id_type[resolve_index2] != ID_TYPE_BYREF_NUM &&
resolveID_id_type[resolve_index2] != ID_TYPE_NUM)
{
rc_setError("ArrayCopy argument types don't match");
return false;
}
if(id[resolve_id].num_args != id[resolve_id2].num_args)
{
rc_setError("ArrayCopy dimensions don't match");
return false;
}
break;
case ID_TYPE_ARR_STR:
case ID_TYPE_BYREF_STR:
case ID_TYPE_STR:
expr_id = getIDInScope_ByIndex("StringArrayCopy");
if(resolveID_id_type[resolve_index2] != ID_TYPE_ARR_STR &&
resolveID_id_type[resolve_index2] != ID_TYPE_BYREF_STR &&
resolveID_id_type[resolve_index2] != ID_TYPE_STR)
{
rc_setError("ArrayCopy argument types don't match");
return false;
}
if(id[resolve_id].num_args != id[resolve_id2].num_args)
{
rc_setError("ArrayCopy dimensions don't match");
return false;
}
break;
}
if(expr_id < 0)
{
rc_setError("ArrayCopy Syntax Error");
return false;
}
}
else if(StringToLower(id[expr_id].name).compare("arrayfill")==0)
{
//cout << "HERES JOHNNY" << endl;
resolve_index = getResolveReg(args[0]);
if(resolve_index < 0)
{
rc_setError("Expected Identifier in ArrayFill argument: " + args[0]);
return false;
}
switch(resolveID_id_type[resolve_index])
{
case ID_TYPE_ARR_NUM:
case ID_TYPE_BYREF_NUM:
case ID_TYPE_NUM:
expr_id = getIDInScope_ByIndex("NumberArrayFill");
break;
case ID_TYPE_ARR_STR:
case ID_TYPE_BYREF_STR:
case ID_TYPE_STR:
expr_id = getIDInScope_ByIndex("StringArrayFill");
break;
}
if(expr_id < 0)
{
rc_setError("ArrayFill Syntax Error");
return false;
}
}
bool local_state_is_pushed = false; //this variable checks will be set to true if the following function call is recursive
if(block_state.size() > 0)
@@ -2232,13 +2084,48 @@ bool pre_parse(int start_token = 0, int end_token = -1, int pp_flags, bool eval_
return false;
}*/
//Array Functions
string tmp_fn_name = StringToLower(id[expr_id].name);
if(tmp_fn_name.compare("arraydim")==0)
{
int tmp_id_type = -1;
if(args[n].substr(0,4).compare("<id>")==0)
{
int tmp_id = getIDInScope_ByIndex(args[n].substr(4));
if(tmp_id >= 0)
tmp_id_type = id[tmp_id].type;
}
if(args[n].substr(0,1).compare("n")==0 || tmp_id_type == ID_TYPE_NUM || tmp_id_type == ID_TYPE_ARR_NUM || tmp_id_type == ID_TYPE_BYREF_NUM)
expr_id = getIDInScope_ByIndex("numberarraydim");
else if(args[n].substr(0,1).compare("s")==0 || tmp_id_type == ID_TYPE_STR || tmp_id_type == ID_TYPE_ARR_STR || tmp_id_type == ID_TYPE_BYREF_STR)
expr_id = getIDInScope_ByIndex("stringarraydim");
else if(args[n].substr(0,1).compare("u")==0)
expr_id = getIDInScope_ByIndex("typearraydim");
else
{
rc_setError("Expected valid array identifier: " + args[n]);
expr_id = -1;
}
if(expr_id < 0)
{
rc_setError("ArrayDim macro function does not exists for variable type");
return false;
}
}
//--------------------------------
if(type_exception_found)
switch(id[expr_id].fn_arg_type[n])
{
case ID_TYPE_BYREF_NUM:
if(args[n].substr(0,1).compare("n")!=0)
{
rc_setError("Expected number identifier for argument");
rc_setError("Expected number identifier for argument in " + id[expr_id].name);
return false;
}
vm_asm.push_back("ptr !" + rc_intToString(id[expr_id].fn_arg_vec[n]) + " " + args[n]);