LUALIB_API int luaL_loadfsfile (lua_State *L, const char *filename) { LoadFSF lf; int status, readstatus; int c; int fnameindex = lua_gettop(L) + 1; /* index of filename on the stack */ lf.extraline = 0; if (filename == NULL) { return luaL_error(L, "filename is NULL"); } else { lua_pushfstring(L, "@%s", filename); lf.f = fs_open(filename, FS_RDONLY); if (lf.f < FS_OPEN_OK) return errfsfile(L, "open", fnameindex); } // if(fs_size(lf.f)>LUAL_BUFFERSIZE) // return luaL_error(L, "file is too big"); c = fs_getc(lf.f); if (c == '#') { /* Unix exec. file? */ lf.extraline = 1; while ((c = fs_getc(lf.f)) != EOF && c != '\n') ; /* skip first line */ if (c == '\n') c = fs_getc(lf.f); } if (c == LUA_SIGNATURE[0] && filename) { /* binary file? */ fs_close(lf.f); lf.f = fs_open(filename, FS_RDONLY); /* reopen in binary mode */ if (lf.f < FS_OPEN_OK) return errfsfile(L, "reopen", fnameindex); /* skip eventual `#!...' */ while ((c = fs_getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) ; lf.extraline = 0; } fs_ungetc(c, lf.f); status = lua_load(L, getFSF, &lf, lua_tostring(L, -1)); if (filename) fs_close(lf.f); /* close file (even in case of errors) */ lua_remove(L, fnameindex); return status; }
static int test_eof (lua_State *L, int f) { int c = fs_getc(f); fs_ungetc(c, f); lua_pushlstring(L, NULL, 0); return (c != EOF); }