33 #define DBG_LUA LOG_STREAM(debug, log_scripting_lua) 34 #define LOG_LUA LOG_STREAM(info, log_scripting_lua) 35 #define WRN_LUA LOG_STREAM(warn, log_scripting_lua) 36 #define ERR_LUA LOG_STREAM(err, log_scripting_lua) 41 std::string currentdir;
46 std::string calling_file(ar.
source + 1);
47 for(
int stack_pos = 2; calling_file ==
"lua/package.lua"; stack_pos++) {
53 calling_file.assign(ar.
source + 1);
65 static bool canonical_path(std::string& filename,
const std::string& currentdir)
67 if(filename.size() < 2) {
70 if(filename[0] ==
'.' && filename[1] ==
'/') {
71 filename = currentdir + filename.substr(1);
73 if(std::find(filename.begin(), filename.end(),
'\\') != filename.end()) {
78 std::size_t pos = filename.find(
"/./");
79 if(pos == std::string::npos) {
82 filename = filename.replace(pos, 2,
"");
86 std::size_t pos = filename.find(
"//");
87 if(pos == std::string::npos) {
90 filename = filename.replace(pos, 1,
"");
94 std::size_t pos = filename.find(
"/..");
95 if(pos == std::string::npos) {
98 std::size_t pos2 = filename.find_last_of(
'/', pos - 1);
99 if(pos2 == std::string::npos || pos2 >= pos) {
102 filename = filename.replace(pos2, pos- pos2 + 3,
"");
104 if(filename.find(
"..") != std::string::npos) {
114 static bool resolve_filename(std::string& filename,
const std::string& currentdir, std::string* rel =
nullptr)
173 std::vector<std::string> files, dirs;
176 std::size_t ndirs = dirs.size();
177 std::copy(files.begin(), files.end(), std::back_inserter(dirs));
184 fs->exceptions(std::ios_base::goodbit);
185 std::size_t
size = 0;
186 fs->seekg(0, std::ios::end);
188 return luaL_error(L,
"Error when reading file");
191 fs->seekg(0, std::ios::beg);
193 return luaL_error(L,
"Error when reading file");
226 ERR_LUA <<
"read bytes from " << startpos <<
" to " << newpos <<
" in total " *size <<
" from steam\n";
227 ERR_LUA <<
"streamstate being " 229 <<
" endoffile:" << lfs->
pistream_->eof()
231 <<
" failbit:" << lfs->
pistream_->fail() <<
"\n";
240 std::string chunkname =
'@' + relativename;
241 LOG_LUA <<
"starting to read from " << fname <<
"\n";
269 catch(
const std::exception & ex)
#define luaL_addsize(B, s)
int intf_read_file(lua_State *L)
Reads a file into a string, or a directory into a list of files therein.
int intf_have_file(lua_State *L)
Checks if a file exists (not necessarily a Lua script).
LUALIB_API char * luaL_prepbuffsize(luaL_Buffer *B, size_t sz)
int intf_canonical_path(lua_State *L)
lua_filestream(const std::string &fname)
LUA_API void lua_pushboolean(lua_State *L, int b)
const std::unique_ptr< std::istream > pistream_
LUALIB_API void luaL_pushresult(luaL_Buffer *B)
filesystem::scoped_istream istream_file(const std::string &fname, bool treat_failure_as_error)
#define lua_remove(L, idx)
LUA_API int lua_getstack(lua_State *L, int level, lua_Debug *ar)
void lua_push(lua_State *L, const T &val)
static const char * lua_read_data(lua_State *, void *data, std::size_t *size)
void remove_blacklisted_files_and_dirs(std::vector< std::string > &files, std::vector< std::string > &directories) const
static bool canonical_path(std::string &filename, const std::string ¤tdir)
resolves filename to an absolute path
LUALIB_API int luaL_argerror(lua_State *L, int arg, const char *extramsg)
std::size_t size(const std::string &str)
Length in characters of a UTF-8 string.
bool luaW_toboolean(lua_State *L, int n)
void get_files_in_dir(const std::string &dir, std::vector< std::string > *files, std::vector< std::string > *dirs, name_mode mode, filter_mode filter, reorder_mode reorder, file_tree_checksum *checksum)
Populates 'files' with all the files and 'dirs' with all the directories in dir.
LUALIB_API void luaL_buffinit(lua_State *L, luaL_Buffer *B)
bool is_directory(const std::string &fname)
Returns true if the given file is a directory.
LUA_API void lua_pushnumber(lua_State *L, lua_Number n)
static int lua_loadfile(lua_State *L, const std::string &fname, const std::string &relativename)
std::string get_wml_location(const std::string &filename, const std::string ¤t_dir)
Returns a complete path to the actual WML file or directory or an empty string if the file isn't pres...
LUA_API int lua_getinfo(lua_State *L, const char *what, lua_Debug *ar)
LUA_API int lua_load(lua_State *L, lua_Reader reader, void *data, const char *chunkname, const char *mode)
Declarations for File-IO.
int load_file(lua_State *L)
Loads a Lua file and pushes the contents on the stack.
static lg::log_domain log_scripting_lua("scripting/lua")
LUALIB_API int luaL_error(lua_State *L, const char *fmt,...)
static std::string get_calling_file(lua_State *L)
LUA_API int lua_error(lua_State *L)
Standard logging facilities (interface).
static bool resolve_filename(std::string &filename, const std::string ¤tdir, std::string *rel=nullptr)
resolves filename to an absolute path
LUA_API void lua_setfield(lua_State *L, int idx, const char *k)
std::string directory_name(const std::string &file)
Returns the directory name of a file, with filename stripped.
char buff_[LUAL_BUFFERSIZE]
static const blacklist_pattern_list default_blacklist
#define luaL_checkstring(L, n)