4 //! todo: type checking - maybe add more helper methods in Interpreter
6 #define ID_HANDLE Interpreter::Value(Interpreter::Value::NumberType('h'))
8 static void make_mode(const std::string
& str
, std::ios_base::openmode
& dest
)
17 void rt_file_read(Interpreter
& ip
, std::vector
<Interpreter::Value
>& stack
)
23 auto self
= stack
[0].table();
24 fh
= (std::fstream
*)self
->get(ID_HANDLE
).userptr();
25 bufsize
= size_t(stack
[1].number());
26 buffer
= new char[bufsize
+ 1];
27 fh
->read(buffer
, bufsize
);
28 realsize
= fh
->gcount();
29 stack
.emplace_back(ip
.makeString(std::string(buffer
, realsize
)));
34 void rt_file_close(Interpreter
&, std::vector
<Interpreter::Value
>& stack
)
36 auto self
= stack
[0].table();
37 auto fh
= (std::fstream
*)self
->get(ID_HANDLE
).userptr();
41 void rt_file_constructor(Interpreter
& ip
, std::vector
<Interpreter::Value
>& stack
)
46 std::ios_base::openmode realmode
;
47 realmode
= std::ios::in
;
48 Table
<Interpreter::Value
> self
;
51 std::cerr
<< "File() expects 2 arguments" << std::endl
;
54 path
= stack
[1].string();
55 mode
= stack
[2].string();
56 make_mode(mode
, realmode
);
57 fh
= new std::fstream(path
, realmode
);
60 fprintf(stderr
, "File.constructor: fh=%p\n", fh
);
61 // create "self" object - similar concept as in Javascript
62 auto tb
= ip
.makeTable();
63 tb
->set(ID_HANDLE
, ip
.makeUserPointer(fh
));
64 tb
->set(ip
.makeString("read"), ip
.makeFunction(rt_file_read
));
65 tb
->set(ip
.makeString("close"), ip
.makeFunction(rt_file_close
));
66 stack
.emplace_back(tb
);
71 std::cerr
<< "fopen('" << path
<< "', '" << mode
<< "') failed" << std::endl
;