Fixed ArrayCopy and ArrayFill functions when handling numbers and strings

This commit is contained in:
n00b87
2024-04-25 16:33:47 -05:00
parent 863decff5d
commit 6587dc2898
3 changed files with 185 additions and 488 deletions

View File

@@ -167,354 +167,7 @@ bool rc_preprocessor()
return true; return true;
} }
bool Array_Macros(int tmp_start_token)
{
//returning true is just saying there were no syntax errors found
if(tmp_token[tmp_start_token].length() < 5)
return true;
if(StringToLower(tmp_token[tmp_start_token].substr(4)).compare("arraydim")!=0 && StringToLower(tmp_token[tmp_start_token].substr(4)).compare("arraysize")!=0 &&
StringToLower(tmp_token[tmp_start_token].substr(4)).compare("arraycopy")!=0 && StringToLower(tmp_token[tmp_start_token].substr(4)).compare("arrayfill")!=0)
return true;
int64_t arr_id = 0;
vector<string> tmp_macro_token;
vector<string> tmp_current_token;
//int ArrayDim_id = getIDInScope_ByIndex("ArrayDim");
for(int i = tmp_start_token; i < tmp_token.size(); i++)
{
if(tmp_token[i].substr(0,4).compare("<id>")==0)
{
if(StringToLower(tmp_token[i].substr(4)).compare("arraydim")==0)
{
if(tmp_token[i+1].compare("<par>")!=0)
{
rc_setError("Invalid use of ArrayDim");
return false;
}
if(tmp_token[i+2].substr(0,4).compare("<id>")==0)
{
arr_id = getIDInScope_ByIndex(tmp_token[i+2].substr(4));
if(arr_id < 0)
{
rc_setError("Identifier must be declared before call to ArrayDim");
return false;
}
id[arr_id].isArrayArg = true;
}
else
{
rc_setError("Expected Identifier in ArrayDim");
return false;
}
int end_token = i+2;
int expr_scope = 1;
for(end_token; end_token < tmp_token.size(); end_token++)
{
if(tmp_token[end_token].compare("<par>")==0 || tmp_token[end_token].compare("<square>")==0)
expr_scope++;
else if(tmp_token[end_token].compare("</par>")==0 || tmp_token[end_token].compare("</square>")==0)
expr_scope--;
if(expr_scope==0 && tmp_token[end_token].compare("</par>")==0)
break;
}
tmp_macro_token.clear();
for(int n = i; n <= end_token; n++)
tmp_macro_token.push_back(tmp_token[n]);
//cout << "<---- DEBUG ---->" << i << endl;
//for(int n = 0; n < token.size(); n++)
// cout <<"token[" << n << "] = " << token[n] << endl;
tmp_current_token.clear();
for(int n = 0; n < token.size(); n++)
tmp_current_token.push_back(token[n]);
token.clear();
for(int n = 0; n < tmp_macro_token.size(); n++)
token.push_back(tmp_macro_token[n]);
//for(int n = 0; n < token.size(); n++)
// cout <<"new token[" << n << "] = " << token[n] << endl;
if(!eval_expression())
{
rc_setError("Could not evaluate ArrayDim");
return false;
}
for(int n = i; n <= end_token; n++)
tmp_token[n] = token[n-i];
token.clear();
for(int n = 0; n < tmp_current_token.size(); n++)
token.push_back(tmp_current_token[n]);
//for(int n = 0; n < token.size(); n++)
// cout <<"final token[" << n << "] = " << token[n] << endl;
return true;
}
else if(StringToLower(tmp_token[i].substr(4)).compare("arraysize")==0)
{
if(tmp_token[i+1].compare("<par>")!=0)
{
rc_setError("Invalid use of ArraySize");
return false;
}
if(tmp_token[i+2].substr(0,4).compare("<id>")==0)
{
arr_id = getIDInScope_ByIndex(tmp_token[i+2].substr(4));
if(arr_id < 0)
{
rc_setError("Identifier must be declared before call to ArraySize");
return false;
}
id[arr_id].isArrayArg = true;
}
else
{
rc_setError("Expected Identifier in ArraySize");
return false;
}
int end_token = i+2;
int expr_scope = 1;
for(end_token; end_token < tmp_token.size(); end_token++)
{
if(tmp_token[end_token].compare("<par>")==0 || tmp_token[end_token].compare("<square>")==0)
expr_scope++;
else if(tmp_token[end_token].compare("</par>")==0 || tmp_token[end_token].compare("</square>")==0)
expr_scope--;
if(expr_scope==0 && tmp_token[end_token].compare("</par>")==0)
break;
}
tmp_macro_token.clear();
for(int n = i; n <= end_token; n++)
tmp_macro_token.push_back(tmp_token[n]);
tmp_current_token.clear();
for(int n = 0; n < token.size(); n++)
tmp_current_token.push_back(token[n]);
token.clear();
for(int n = 0; n < tmp_macro_token.size(); n++)
token.push_back(tmp_macro_token[n]);
if(!eval_expression(0, token.size()-1, true))//i, end_token))
{
rc_setError("Could not evaluate ArraySize expression");
//for(int n = 0; n < token.size(); n++)
// cout << "token["<< n << "] = " << token[n] << endl;
return false;
}
for(int n = i; n <= end_token; n++)
tmp_token[n] = token[n-i];
token.clear();
for(int n = 0; n < tmp_current_token.size(); n++)
token.push_back(tmp_current_token[n]);
return true;
}
else if(StringToLower(tmp_token[i].substr(4)).compare("arraycopy")==0)
{
if(tmp_token.size() < 5)
{
rc_setError("Ivalid use of ArrayCopy");
return false;
}
if(tmp_token[i+1].compare("<par>")!=0)
{
rc_setError("Invalid use of ArrayCopy");
return false;
}
if(tmp_token[i+2].substr(0,4).compare("<id>")==0)
{
arr_id = getIDInScope_ByIndex(tmp_token[i+2].substr(4));
if(arr_id < 0)
{
rc_setError("Identifier must be declared before call to ArrayCopy");
return false;
}
id[arr_id].isArrayArg = true;
}
else
{
rc_setError("Expected Identifier in ArrayCopy");
return false;
}
if(!tmp_token[i+3].substr(0,7).compare("<comma>")==0)
{
rc_setError("Expected comma in ArrayCopy");
return false;
}
if(tmp_token[i+4].substr(0,4).compare("<id>")==0)
{
arr_id = getIDInScope_ByIndex(tmp_token[i+4].substr(4));
if(arr_id < 0)
{
rc_setError("Identifier must be declared before call to ArrayCopy");
return false;
}
id[arr_id].isArrayArg = true;
}
else
{
rc_setError("Expected Identifier in ArrayCopy");
return false;
}
int end_token = i+4;
int expr_scope = 1;
for(end_token; end_token < tmp_token.size(); end_token++)
{
if(tmp_token[end_token].compare("<par>")==0 || tmp_token[end_token].compare("<square>")==0)
expr_scope++;
else if(tmp_token[end_token].compare("</par>")==0 || tmp_token[end_token].compare("</square>")==0)
expr_scope--;
if(expr_scope==0 && tmp_token[end_token].compare("</par>")==0)
break;
}
tmp_macro_token.clear();
for(int n = i; n <= end_token; n++)
tmp_macro_token.push_back(tmp_token[n]);
//cout << "<---- DEBUG ---->" << i << endl;
//for(int n = 0; n < token.size(); n++)
// cout <<"token[" << n << "] = " << token[n] << endl;
tmp_current_token.clear();
for(int n = 0; n < token.size(); n++)
tmp_current_token.push_back(token[n]);
token.clear();
for(int n = 0; n < tmp_macro_token.size(); n++)
token.push_back(tmp_macro_token[n]);
//for(int n = 0; n < token.size(); n++)
// cout <<"new token[" << n << "] = " << token[n] << endl;
if(!eval_expression())
{
rc_setError("Could not evaluate ArrayCopy");
return false;
}
for(int n = i; n <= end_token; n++)
tmp_token[n] = token[n-i];
token.clear();
for(int n = 0; n < tmp_current_token.size(); n++)
token.push_back(tmp_current_token[n]);
//for(int n = 0; n < token.size(); n++)
// cout <<"final token[" << n << "] = " << token[n] << endl;
return true;
}
else if(StringToLower(tmp_token[i].substr(4)).compare("arrayfill")==0)
{
if(tmp_token[i+1].compare("<par>")!=0)
{
rc_setError("Invalid use of ArrayFill");
return false;
}
if(tmp_token[i+2].substr(0,4).compare("<id>")==0)
{
arr_id = getIDInScope_ByIndex(tmp_token[i+2].substr(4));
if(arr_id < 0)
{
rc_setError("Identifier must be declared before call to ArrayFill");
return false;
}
id[arr_id].isArrayArg = true;
}
else
{
rc_setError("Expected Identifier in ArrayFill");
return false;
}
int end_token = i+2;
int expr_scope = 1;
for(end_token; end_token < tmp_token.size(); end_token++)
{
if(tmp_token[end_token].compare("<par>")==0 || tmp_token[end_token].compare("<square>")==0)
expr_scope++;
else if(tmp_token[end_token].compare("</par>")==0 || tmp_token[end_token].compare("</square>")==0)
expr_scope--;
if(expr_scope==0 && tmp_token[end_token].compare("</par>")==0)
break;
}
tmp_macro_token.clear();
for(int n = i; n <= end_token; n++)
tmp_macro_token.push_back(tmp_token[n]);
//cout << "<---- DEBUG ---->" << i << endl;
//for(int n = 0; n < token.size(); n++)
// cout <<"token[" << n << "] = " << token[n] << endl;
tmp_current_token.clear();
for(int n = 0; n < token.size(); n++)
tmp_current_token.push_back(token[n]);
token.clear();
for(int n = 0; n < tmp_macro_token.size(); n++)
token.push_back(tmp_macro_token[n]);
//for(int n = 0; n < token.size(); n++)
// cout <<"new token[" << n << "] = " << token[n] << endl;
if(!eval_expression())
{
rc_setError("Could not evaluate ArrayFill");
return false;
}
for(int n = i; n <= end_token; n++)
tmp_token[n] = token[n-i];
token.clear();
for(int n = 0; n < tmp_current_token.size(); n++)
token.push_back(tmp_current_token[n]);
//for(int n = 0; n < token.size(); n++)
// cout <<"final token[" << n << "] = " << token[n] << endl;
return true;
}
}
}
return false;
}
bool rc_eval(string line) bool rc_eval(string line)
{ {

View File

@@ -38,6 +38,7 @@ struct type_error_exception
string error_log; string error_log;
string tk_reg; string tk_reg;
string resolve_reg; string resolve_reg;
int num_args;
}; };
vector<type_error_exception> byref_type_exception; //This will store the error that might be generated if a user type var is in an expression without its dimensions expressed vector<type_error_exception> byref_type_exception; //This will store the error that might be generated if a user type var is in an expression without its dimensions expressed
@@ -1133,7 +1134,7 @@ bool pre_parse(int start_token = 0, int end_token = -1, int pp_flags, bool eval_
} }
else if( (id[expr_id].type == ID_TYPE_BYREF_NUM || id[expr_id].type == ID_TYPE_BYREF_STR) && pp_flags == PP_FLAG_ARRAY) else if( (id[expr_id].type == ID_TYPE_BYREF_NUM || id[expr_id].type == ID_TYPE_BYREF_STR) && pp_flags == PP_FLAG_ARRAY)
{ {
cout << "found array: " << id[expr_id].name << endl << endl; //cout << "found array: " << id[expr_id].name << endl << endl;
int s_scope = 0; int s_scope = 0;
int arr_token_start = i; int arr_token_start = i;
int arr_token_end = i; int arr_token_end = i;
@@ -1425,7 +1426,10 @@ bool pre_parse(int start_token = 0, int end_token = -1, int pp_flags, bool eval_
else if(!type_delete_flag) else if(!type_delete_flag)
{ {
if(arg_count != 0) if(arg_count != 0)
{
rc_setError("[0]Expected " + rc_intToString(id[tmp_id].num_args) + " dimension in " + id[tmp_id].name); rc_setError("[0]Expected " + rc_intToString(id[tmp_id].num_args) + " dimension in " + id[tmp_id].name);
return false;
}
//cout << "ID_TYPE = " << id[tmp_id].type << ", " << arg_count << ", " << (has_child ? "true" : "false") << endl; //cout << "ID_TYPE = " << id[tmp_id].type << ", " << arg_count << ", " << (has_child ? "true" : "false") << endl;
@@ -1675,7 +1679,8 @@ bool pre_parse(int start_token = 0, int end_token = -1, int pp_flags, bool eval_
type_error_exception tx; type_error_exception tx;
tx.error_log = "[0]Expected " + rc_intToString(id[tmp_id].num_args) + " dimension in " + id[tmp_id].name; tx.error_log = "[0]Expected " + rc_intToString(id[tmp_id].num_args) + " dimension in " + id[tmp_id].name;
tx.tk_reg = token[i]; tx.tk_reg = token[i];
//cout << "store = " << tx.tk_reg << endl; tx.num_args = id[tmp_id].num_args;
//cout << "store = " << id[tmp_id].name << " = " << tx.tk_reg << " arg_count = " << arg_count << ", expected = " << id[tmp_id].num_args << endl;
byref_type_exception.push_back(tx); byref_type_exception.push_back(tx);
byref_type_flag = false; byref_type_flag = false;
} }
@@ -2253,6 +2258,8 @@ bool pre_parse(int start_token = 0, int end_token = -1, int pp_flags, bool eval_
expr_id = -1; expr_id = -1;
} }
//cout << "dbg data: " << expr_id << " arg = " << args[0] << " type = " << tmp_id_type << " name = " << id[expr_id].name << endl;
if(expr_id < 0) if(expr_id < 0)
{ {
rc_setError("ArrayFill macro function does not exists for variable type"); rc_setError("ArrayFill macro function does not exists for variable type");
@@ -5610,8 +5617,13 @@ bool check_rule()
} }
if(expr_result.substr(0,1).compare("n")==0) if(expr_result.substr(0,1).compare("n")==0)
vm_asm.push_back("print " + expr_result); vm_asm.push_back("print " + expr_result);
else else if(expr_result.substr(0,1).compare("s")==0)
vm_asm.push_back("print$ " + expr_result); vm_asm.push_back("print$ " + expr_result);
else
{
rc_setError("Invalid expression in PRINT");
return false;
}
start_token = i; start_token = i;
} }
} }
@@ -5624,8 +5636,13 @@ bool check_rule()
} }
if(expr_result.substr(0,1).compare("n")==0) if(expr_result.substr(0,1).compare("n")==0)
vm_asm.push_back("print " + expr_result); vm_asm.push_back("print " + expr_result);
else else if(expr_result.substr(0,1).compare("s")==0)
vm_asm.push_back("print$ " + expr_result); vm_asm.push_back("print$ " + expr_result);
else
{
rc_setError("Invalid expression in PRINT");
return false;
}
} }
if(last_token.compare("<semi>")!=0) if(last_token.compare("<semi>")!=0)
vm_asm.push_back("println"); vm_asm.push_back("println");

View File

@@ -2219,32 +2219,32 @@ void rc_push_str(string s_val)
//current_s_stack_count++; //current_s_stack_count++;
} }
uint64_t rc_string_array_dim(rc_strId s_var) uint64_t rc_string_array_dim(rc_strId* s_var)
{ {
rc_strId* s = (rc_strId*)s_var.sid_value.ref_parent; rc_strId* s = (rc_strId*)s_var->sid_value.ref_parent;
return s->dimensions; return s->dimensions;
} }
uint64_t rc_string_array_size(rc_strId s_var, int d_num) uint64_t rc_string_array_size(rc_strId* s_var, int d_num)
{ {
switch(d_num) switch(d_num)
{ {
case 1: case 1:
return s_var.dim[0]; return s_var->dim[0];
break; break;
case 2: case 2:
return s_var.dim[1]; return s_var->dim[1];
break; break;
case 3: case 3:
return s_var.dim[2]; return s_var->dim[2];
break; break;
} }
return 0; return 0;
} }
uint64_t rc_number_array_dim(rc_numId n_var) uint64_t rc_number_array_dim(rc_numId* n_var)
{ {
rc_numId* n = (rc_numId*)n_var.nid_value.ref_parent; rc_numId* n = (rc_numId*)n_var->nid_value.ref_parent;
return n->dimensions; return n->dimensions;
} }
@@ -2364,118 +2364,172 @@ void rc_type_array_fill(rc_usrId* src, rc_usrId* fdata)
} }
uint64_t rc_number_array_size(rc_numId n_var, int d_num) uint64_t rc_number_array_size(rc_numId* n_var, int d_num)
{ {
switch(d_num) switch(d_num)
{ {
case 1: case 1:
return n_var.dim[0]; return n_var->dim[0];
break; break;
case 2: case 2:
return n_var.dim[1]; return n_var->dim[1];
break; break;
case 3: case 3:
return n_var.dim[2]; return n_var->dim[2];
break; break;
} }
return 0; return 0;
} }
void rc_number_array_copy(uint64_t src_ref_id, uint64_t dst_ref_id) void rc_number_array_copy(rc_numId* n_var, rc_numId* d_var)
{
uint64_t src_dim, src_dim_size[3];
rc_numId* src = (rc_numId*)n_var->nid_value.ref_parent;
src_dim = rc_number_array_dim( src );
src_dim_size[0] = rc_number_array_size( src, 1);
src_dim_size[1] = rc_number_array_size( src, 2);
src_dim_size[2] = rc_number_array_size( src, 3);
rc_numId* dst = (rc_numId*)d_var->nid_value.ref_parent;
uint64_t total_size = 0;
switch(src_dim)
{
case 1:
total_size = src_dim_size[0];
dst->nref[0].value.resize(total_size);
//dst->dimensions = 1;
dst->dim[0] = src_dim_size[0];
dst->dim[1] = 0;
dst->dim[2] = 0;
break;
case 2:
total_size = src_dim_size[0] * src_dim_size[1];
dst->nref[0].value.resize(total_size);
//dst->dimensions = 2;
dst->dim[0] = src_dim_size[0];
dst->dim[1] = src_dim_size[1];
dst->dim[2] = 0;
break;
case 3:
total_size = src_dim_size[0] * src_dim_size[1] * src_dim_size[2];
dst->nref[0].value.resize(total_size);
//dst->dimensions = 3;
dst->dim[0] = src_dim_size[0];
dst->dim[1] = src_dim_size[1];
dst->dim[2] = src_dim_size[2];
break;
}
int si = n_var->byref_offset;
int di = d_var->byref_offset;
//cout << "debug: " << si << ", " << di << endl;
for(; di < total_size; di++)
{
dst->nref[0].value[di] = src->nref[0].value[si];
si++;
}
}
void rc_string_array_copy(rc_strId* s_var, rc_strId* d_var)
{ {
uint64_t src_dim, src_dim_size[3]; uint64_t src_dim, src_dim_size[3];
src_dim = rc_number_array_dim( num_var[src_ref_id] ); rc_strId* src = (rc_strId*)s_var->sid_value.ref_parent;
src_dim_size[0] = rc_number_array_size( num_var[src_ref_id], 1); src_dim = rc_string_array_dim( src );
src_dim_size[1] = rc_number_array_size( num_var[src_ref_id], 2); src_dim_size[0] = rc_string_array_size( src, 1);
src_dim_size[2] = rc_number_array_size( num_var[src_ref_id], 3); src_dim_size[1] = rc_string_array_size( src, 2);
src_dim_size[2] = rc_string_array_size( src, 3);
rc_strId* dst = (rc_strId*)d_var->sid_value.ref_parent;
uint64_t total_size = 0; uint64_t total_size = 0;
switch(src_dim) switch(src_dim)
{ {
case 1: case 1:
total_size = src_dim_size[0]; total_size = src_dim_size[0];
num_var[dst_ref_id].nref[0].value.resize(total_size); dst->sref[0].value.resize(total_size);
num_var[dst_ref_id].dimensions = 1; //dst->dimensions = 1;
num_var[dst_ref_id].dim[0] = src_dim_size[0]; dst->dim[0] = src_dim_size[0];
num_var[dst_ref_id].dim[1] = 0; dst->dim[1] = 0;
num_var[dst_ref_id].dim[2] = 0; dst->dim[2] = 0;
break; break;
case 2: case 2:
total_size = src_dim_size[0] * src_dim_size[1]; total_size = src_dim_size[0] * src_dim_size[1];
num_var[dst_ref_id].nref[0].value.resize(total_size); dst->sref[0].value.resize(total_size);
num_var[dst_ref_id].dimensions = 2; //dst->dimensions = 2;
num_var[dst_ref_id].dim[0] = src_dim_size[0]; dst->dim[0] = src_dim_size[0];
num_var[dst_ref_id].dim[1] = src_dim_size[1]; dst->dim[1] = src_dim_size[1];
num_var[dst_ref_id].dim[2] = 0; dst->dim[2] = 0;
break; break;
case 3: case 3:
total_size = src_dim_size[0] * src_dim_size[1] * src_dim_size[2]; total_size = src_dim_size[0] * src_dim_size[1] * src_dim_size[2];
num_var[dst_ref_id].nref[0].value.resize(total_size); dst->sref[0].value.resize(total_size);
num_var[dst_ref_id].dimensions = 3; //dst->dimensions = 3;
num_var[dst_ref_id].dim[0] = src_dim_size[0]; dst->dim[0] = src_dim_size[0];
num_var[dst_ref_id].dim[1] = src_dim_size[1]; dst->dim[1] = src_dim_size[1];
num_var[dst_ref_id].dim[2] = src_dim_size[2]; dst->dim[2] = src_dim_size[2];
break; break;
} }
for(int i = 0; i < total_size; i++) int si = s_var->byref_offset;
int di = d_var->byref_offset;
//cout << "debug: " << si << ", " << di << endl;
for(; di < total_size; di++)
{ {
num_var[dst_ref_id].nref[0].value[i] = num_var[src_ref_id].nref[0].value[i]; dst->sref[0].value[di] = src->sref[0].value[si];
si++;
} }
} }
void rc_string_array_copy(uint64_t src_ref_id, uint64_t dst_ref_id) void rc_number_array_fill(rc_numId* n_var, double n)
{
uint64_t src_dim, src_dim_size[3];
rc_numId* src = (rc_numId*)n_var->nid_value.ref_parent;
src_dim = rc_number_array_dim( src );
src_dim_size[0] = rc_number_array_size( src, 1);
src_dim_size[1] = rc_number_array_size( src, 2);
src_dim_size[2] = rc_number_array_size( src, 3);
uint64_t total_size = 0;
switch(src_dim)
{
case 1:
total_size = src_dim_size[0];
break;
case 2:
total_size = src_dim_size[0] * src_dim_size[1];
break;
case 3:
total_size = src_dim_size[0] * src_dim_size[1] * src_dim_size[2];
break;
}
//cout << "cp 1: " << src->sid_value.value.size() << " " << s_var->byref_offset << endl;
for(int i = n_var->byref_offset; i < total_size; i++)
{
src->nref[0].value[i] = n;
}
}
void rc_string_array_fill(rc_strId* s_var, string s)
{ {
uint64_t src_dim, src_dim_size[3]; uint64_t src_dim, src_dim_size[3];
src_dim = rc_string_array_dim( str_var[src_ref_id] ); rc_strId* src = (rc_strId*)s_var->sid_value.ref_parent;
src_dim_size[0] = rc_string_array_size( str_var[src_ref_id], 1); src_dim = rc_string_array_dim( src );
src_dim_size[1] = rc_string_array_size( str_var[src_ref_id], 2); src_dim_size[0] = rc_string_array_size( src, 1);
src_dim_size[2] = rc_string_array_size( str_var[src_ref_id], 3); src_dim_size[1] = rc_string_array_size( src, 2);
src_dim_size[2] = rc_string_array_size( src, 3);
uint64_t total_size = 0;
switch(src_dim)
{
case 1:
total_size = src_dim_size[0];
str_var[dst_ref_id].sref[0].value.resize(total_size);
str_var[dst_ref_id].dimensions = 1;
str_var[dst_ref_id].dim[0] = src_dim_size[0];
str_var[dst_ref_id].dim[1] = 0;
str_var[dst_ref_id].dim[2] = 0;
break;
case 2:
total_size = src_dim_size[0] * src_dim_size[1];
str_var[dst_ref_id].sref[0].value.resize(total_size);
str_var[dst_ref_id].dimensions = 2;
str_var[dst_ref_id].dim[0] = src_dim_size[0];
str_var[dst_ref_id].dim[1] = src_dim_size[1];
str_var[dst_ref_id].dim[2] = 0;
break;
case 3:
total_size = src_dim_size[0] * src_dim_size[1] * src_dim_size[2];
str_var[dst_ref_id].sref[0].value.resize(total_size);
str_var[dst_ref_id].dimensions = 3;
str_var[dst_ref_id].dim[0] = src_dim_size[0];
str_var[dst_ref_id].dim[1] = src_dim_size[1];
str_var[dst_ref_id].dim[2] = src_dim_size[2];
break;
}
for(int i = 0; i < total_size; i++)
{
str_var[dst_ref_id].sref[0].value[i] = str_var[src_ref_id].sref[0].value[i];
}
}
void rc_number_array_fill(uint64_t src_ref_id, double n)
{
uint64_t src_dim, src_dim_size[3];
src_dim = rc_number_array_dim( num_var[src_ref_id] );
src_dim_size[0] = rc_number_array_size( num_var[src_ref_id], 1);
src_dim_size[1] = rc_number_array_size( num_var[src_ref_id], 2);
src_dim_size[2] = rc_number_array_size( num_var[src_ref_id], 3);
uint64_t total_size = 0; uint64_t total_size = 0;
@@ -2490,40 +2544,13 @@ void rc_number_array_fill(uint64_t src_ref_id, double n)
case 3: case 3:
total_size = src_dim_size[0] * src_dim_size[1] * src_dim_size[2]; total_size = src_dim_size[0] * src_dim_size[1] * src_dim_size[2];
break; break;
} }
//cout << "cp 1: " << src->sid_value.value.size() << " " << s_var->byref_offset << endl;
for(int i = 0; i < total_size; i++) for(int i = s_var->byref_offset; i < total_size; i++)
{ {
num_var[src_ref_id].nref[0].value[i] = n; src->sref[0].value[i] = s;
}
}
void rc_string_array_fill(uint64_t src_ref_id, string s)
{
uint64_t src_dim, src_dim_size[3];
src_dim = rc_string_array_dim( str_var[src_ref_id] );
src_dim_size[0] = rc_string_array_size( str_var[src_ref_id], 1);
src_dim_size[1] = rc_string_array_size( str_var[src_ref_id], 2);
src_dim_size[2] = rc_string_array_size( str_var[src_ref_id], 3);
uint64_t total_size = 0;
switch(src_dim)
{
case 1:
total_size = src_dim_size[0];
break;
case 2:
total_size = src_dim_size[0] * src_dim_size[1];
break;
case 3:
total_size = src_dim_size[0] * src_dim_size[1] * src_dim_size[2];
break;
}
for(int i = 0; i < total_size; i++)
{
str_var[src_ref_id].sref[0].value[i] = s;
} }
} }
@@ -2542,19 +2569,19 @@ void func_130(uint64_t fn)
rc_push_str( rc_input(INPUT$_PROMPT$) ); rc_push_str( rc_input(INPUT$_PROMPT$) );
break; break;
case FN_StringArrayDim: case FN_StringArrayDim:
rc_push_num( rc_string_array_dim( str_var[0] ) ); rc_push_num( rc_string_array_dim( (rc_strId*) str_var[0].sid_value.ref_parent ) );
arr_ref_id.clear(); arr_ref_id.clear();
break; break;
case FN_NumberArrayDim: case FN_NumberArrayDim:
rc_push_num( rc_number_array_dim( num_var[0] ) ); rc_push_num( rc_number_array_dim( (rc_numId*)num_var[0].nid_value.ref_parent ) );
arr_ref_id.clear(); arr_ref_id.clear();
break; break;
case FN_StringArraySize: case FN_StringArraySize:
rc_push_num( rc_string_array_size( str_var[0], STRINGARRAYSIZE_ARRAY_DIM)); rc_push_num( rc_string_array_size( (rc_strId*) str_var[0].sid_value.ref_parent, STRINGARRAYSIZE_ARRAY_DIM));
arr_ref_id.clear(); arr_ref_id.clear();
break; break;
case FN_NumberArraySize: case FN_NumberArraySize:
rc_push_num( rc_number_array_size( num_var[0], NUMBERARRAYSIZE_ARRAY_DIM)); rc_push_num( rc_number_array_size( (rc_numId*)num_var[0].nid_value.ref_parent, NUMBERARRAYSIZE_ARRAY_DIM));
arr_ref_id.clear(); arr_ref_id.clear();
break; break;
case FN_Abs: case FN_Abs:
@@ -3725,19 +3752,19 @@ void func_130(uint64_t fn)
rc_push_num( rc_media_messageBox(MESSAGEBOX_TITLE$, MESSAGEBOX_MSG$)); rc_push_num( rc_media_messageBox(MESSAGEBOX_TITLE$, MESSAGEBOX_MSG$));
break; break;
case FN_NumberArrayCopy: //Sub Procedure case FN_NumberArrayCopy: //Sub Procedure
rc_number_array_copy(arr_ref_id[0], arr_ref_id[1]); rc_number_array_copy( &num_var[0], &num_var[1]);
arr_ref_id.clear(); arr_ref_id.clear();
break; break;
case FN_StringArrayCopy: //Sub Procedure case FN_StringArrayCopy: //Sub Procedure
rc_string_array_copy(arr_ref_id[0], arr_ref_id[1]); rc_string_array_copy( &str_var[0], &str_var[1]);
arr_ref_id.clear(); arr_ref_id.clear();
break; break;
case FN_NumberArrayFill: //Sub Procedure case FN_NumberArrayFill: //Sub Procedure
rc_number_array_fill(arr_ref_id[0], NUMBERARRAYFILL_FDATA); rc_number_array_fill( &num_var[0], NUMBERARRAYFILL_FDATA);
arr_ref_id.clear(); arr_ref_id.clear();
break; break;
case FN_StringArrayFill: //Sub Procedure case FN_StringArrayFill: //Sub Procedure
rc_string_array_fill(arr_ref_id[0], STRINGARRAYFILL_FDATA$); rc_string_array_fill( &str_var[0], STRINGARRAYFILL_FDATA$);
arr_ref_id.clear(); arr_ref_id.clear();
break; break;
case FN_Runtime$: //String Function case FN_Runtime$: //String Function