first impl of builtin member methods (thus far, string.size implemented. more to...
[aqualang.git] / src / stdlib.file.cpp
blob76158c2d95b03c76e18350847349d38c2bcefc0c
2 #include "private.h"
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)
10 // laaaaazy
11 if(str == "r")
13 dest = std::ios::in;
17 void rt_file_read(Interpreter& ip, std::vector<Interpreter::Value>& stack)
19 std::fstream* fh;
20 char* buffer;
21 size_t bufsize;
22 size_t realsize;
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)));
30 delete[] buffer;
31 return;
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();
38 delete fh;
41 void rt_file_constructor(Interpreter& ip, std::vector<Interpreter::Value>& stack)
43 std::fstream* fh;
44 std::string path;
45 std::string mode;
46 std::ios_base::openmode realmode;
47 realmode = std::ios::in;
48 Table<Interpreter::Value> self;
49 if(stack.empty())
51 std::cerr << "File() expects 2 arguments" << std::endl;
52 return;
54 path = stack[1].string();
55 mode = stack[2].string();
56 make_mode(mode, realmode);
57 fh = new std::fstream(path, realmode);
58 if(fh->good())
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);
67 return;
69 else
71 std::cerr << "fopen('" << path << "', '" << mode << "') failed" << std::endl;
72 stack.clear();
73 return;