update
This commit is contained in:
parent
2859467d71
commit
94f23bb30b
|
@ -0,0 +1,41 @@
|
||||||
|
var print=func(elements...)
|
||||||
|
{
|
||||||
|
nasal_call_builtin_std_cout(elements);
|
||||||
|
return nil;
|
||||||
|
};
|
||||||
|
var append=func(vector,elements...)
|
||||||
|
{
|
||||||
|
nasal_call_builtin_push_back(vector,elements);
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
var setsize=func(vector,size)
|
||||||
|
{
|
||||||
|
nasal_call_builtin_set_size(vector,size);
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
var system=func(str)
|
||||||
|
{
|
||||||
|
nasal_call_builtin_system(str);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var input=func()
|
||||||
|
{
|
||||||
|
return nasal_call_builtin_input();
|
||||||
|
}
|
||||||
|
var sleep=func(duration)
|
||||||
|
{
|
||||||
|
nasal_call_builtin_sleep(duration);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var io=
|
||||||
|
{
|
||||||
|
fin:func(filename)
|
||||||
|
{
|
||||||
|
return nasal_call_builtin_finput(filename);
|
||||||
|
},
|
||||||
|
fout:func(filename,str)
|
||||||
|
{
|
||||||
|
nasal_call_builtin_foutput(filename,str);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
|
@ -198,4 +198,64 @@ int nasal_runtime::builtin_sleep(int local_scope_addr)
|
||||||
return ret_addr;
|
return ret_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nasal_runtime::builtin_finput(int local_scope_addr)
|
||||||
|
{
|
||||||
|
int value_addr=-1;
|
||||||
|
if(local_scope_addr>=0)
|
||||||
|
value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("filename");
|
||||||
|
if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_string)
|
||||||
|
{
|
||||||
|
std::cout<<">> [runtime] builtin_finput: cannot find values or wrong value type(must be string)."<<std::endl;
|
||||||
|
++error;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
std::string filename=nasal_vm.gc_get(value_addr).get_string();
|
||||||
|
std::ifstream fin(filename);
|
||||||
|
std::string file_content="";
|
||||||
|
if(!fin.fail())
|
||||||
|
while(!fin.eof())
|
||||||
|
{
|
||||||
|
file_content.push_back(fin.get());
|
||||||
|
if(fin.eof())
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
file_content="cannot open file named \'"+filename+"\'.";
|
||||||
|
fin.close();
|
||||||
|
int ret_addr=nasal_vm.gc_alloc();
|
||||||
|
nasal_vm.gc_get(ret_addr).set_type(vm_string);
|
||||||
|
nasal_vm.gc_get(ret_addr).set_string(file_content);
|
||||||
|
return ret_addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
int nasal_runtime::builtin_foutput(int local_scope_addr)
|
||||||
|
{
|
||||||
|
int value_addr=-1;
|
||||||
|
if(local_scope_addr>=0)
|
||||||
|
value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("filename");
|
||||||
|
if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_string)
|
||||||
|
{
|
||||||
|
std::cout<<">> [runtime] builtin_foutput: cannot find values or wrong value type(filename must be string)."<<std::endl;
|
||||||
|
++error;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int str_value_addr=-1;
|
||||||
|
if(local_scope_addr>=0)
|
||||||
|
str_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("str");
|
||||||
|
if(str_value_addr<0 || nasal_vm.gc_get(str_value_addr).get_type()!=vm_string)
|
||||||
|
{
|
||||||
|
std::cout<<">> [runtime] builtin_foutput: cannot find values or wrong value type(file's content must be string)."<<std::endl;
|
||||||
|
++error;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
std::string filename=nasal_vm.gc_get(value_addr).get_string();
|
||||||
|
std::string file_content=nasal_vm.gc_get(str_value_addr).get_string();
|
||||||
|
std::ofstream fout(filename);
|
||||||
|
fout<<file_content;
|
||||||
|
fout.close();
|
||||||
|
int ret_addr=nasal_vm.gc_alloc();
|
||||||
|
nasal_vm.gc_get(ret_addr).set_type(vm_nil);
|
||||||
|
return ret_addr;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -10,7 +10,7 @@ enum runtime_returned_state
|
||||||
rt_exit_without_error
|
rt_exit_without_error
|
||||||
};
|
};
|
||||||
|
|
||||||
#define BUILTIN_FUNC_NUM 6
|
#define BUILTIN_FUNC_NUM 8
|
||||||
std::string builtin_func_name[BUILTIN_FUNC_NUM]=
|
std::string builtin_func_name[BUILTIN_FUNC_NUM]=
|
||||||
{
|
{
|
||||||
"nasal_call_builtin_std_cout",
|
"nasal_call_builtin_std_cout",
|
||||||
|
@ -18,7 +18,9 @@ std::string builtin_func_name[BUILTIN_FUNC_NUM]=
|
||||||
"nasal_call_builtin_set_size",
|
"nasal_call_builtin_set_size",
|
||||||
"nasal_call_builtin_system",
|
"nasal_call_builtin_system",
|
||||||
"nasal_call_builtin_input",
|
"nasal_call_builtin_input",
|
||||||
"nasal_call_builtin_sleep"
|
"nasal_call_builtin_sleep",
|
||||||
|
"nasal_call_builtin_finput",
|
||||||
|
"nasal_call_builtin_foutput"
|
||||||
};
|
};
|
||||||
|
|
||||||
class nasal_runtime
|
class nasal_runtime
|
||||||
|
@ -83,6 +85,8 @@ private:
|
||||||
int builtin_system(int);
|
int builtin_system(int);
|
||||||
int builtin_input(int);
|
int builtin_input(int);
|
||||||
int builtin_sleep(int);
|
int builtin_sleep(int);
|
||||||
|
int builtin_finput(int);
|
||||||
|
int builtin_foutput(int);
|
||||||
public:
|
public:
|
||||||
nasal_runtime();
|
nasal_runtime();
|
||||||
~nasal_runtime();
|
~nasal_runtime();
|
||||||
|
@ -1073,6 +1077,8 @@ int nasal_runtime::call_builtin_function(nasal_ast& node,int local_scope_addr)
|
||||||
case 3:ret_value_addr=builtin_system(local_scope_addr);break;
|
case 3:ret_value_addr=builtin_system(local_scope_addr);break;
|
||||||
case 4:ret_value_addr=builtin_input(local_scope_addr);break;
|
case 4:ret_value_addr=builtin_input(local_scope_addr);break;
|
||||||
case 5:ret_value_addr=builtin_sleep(local_scope_addr);break;
|
case 5:ret_value_addr=builtin_sleep(local_scope_addr);break;
|
||||||
|
case 6:ret_value_addr=builtin_finput(local_scope_addr);break;
|
||||||
|
case 7:ret_value_addr=builtin_foutput(local_scope_addr);break;
|
||||||
}
|
}
|
||||||
return ret_value_addr;
|
return ret_value_addr;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue