This commit is contained in:
Valk Richard Li 2020-09-14 04:18:24 -07:00 committed by GitHub
parent 2859467d71
commit 94f23bb30b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 109 additions and 2 deletions

41
version3.0/lib.nas Normal file
View File

@ -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;
}
};

View File

@ -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

View File

@ -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;
}