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;
|
||||
}
|
||||
|
||||
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
|
|
@ -10,7 +10,7 @@ enum runtime_returned_state
|
|||
rt_exit_without_error
|
||||
};
|
||||
|
||||
#define BUILTIN_FUNC_NUM 6
|
||||
#define BUILTIN_FUNC_NUM 8
|
||||
std::string builtin_func_name[BUILTIN_FUNC_NUM]=
|
||||
{
|
||||
"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_system",
|
||||
"nasal_call_builtin_input",
|
||||
"nasal_call_builtin_sleep"
|
||||
"nasal_call_builtin_sleep",
|
||||
"nasal_call_builtin_finput",
|
||||
"nasal_call_builtin_foutput"
|
||||
};
|
||||
|
||||
class nasal_runtime
|
||||
|
@ -83,6 +85,8 @@ private:
|
|||
int builtin_system(int);
|
||||
int builtin_input(int);
|
||||
int builtin_sleep(int);
|
||||
int builtin_finput(int);
|
||||
int builtin_foutput(int);
|
||||
public:
|
||||
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 4:ret_value_addr=builtin_input(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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue