static int io_popen (lua_State *L) { const char *filename = luaL_checkstring(L, 1); const char *mode = luaL_optstring(L, 2, "r"); int *pf = newfile(L); *pf = lua_popen(L, filename, fs_mode2flag(mode)); return (*pf == FS_OPEN_OK - 1) ? pushresult(L, 0, filename) : 1; }
// Lua: compile(filename) -- compile lua file into lua bytecode, and save to .lc static int node_compile( lua_State* L ) { Proto* f; int file_fd = FS_OPEN_OK - 1; size_t len; const char *fname = luaL_checklstring( L, 1, &len ); if ( len > FS_NAME_MAX_LENGTH ) return luaL_error(L, "filename too long"); char output[FS_NAME_MAX_LENGTH]; c_strcpy(output, fname); // check here that filename end with ".lua". if (len < 4 || (c_strcmp( output + len - 4, ".lua") != 0) ) return luaL_error(L, "not a .lua file"); output[c_strlen(output) - 2] = 'c'; output[c_strlen(output) - 1] = '\0'; NODE_DBG(output); NODE_DBG("\n"); if (luaL_loadfsfile(L, fname) != 0) { return luaL_error(L, lua_tostring(L, -1)); } f = toproto(L, -1); int stripping = 1; /* strip debug information? */ file_fd = fs_open(output, fs_mode2flag("w+")); if (file_fd < FS_OPEN_OK) { return luaL_error(L, "cannot open/write to file"); } lua_lock(L); int result = luaU_dump(L, f, writer, &file_fd, stripping); lua_unlock(L); if (fs_flush(file_fd) < 0) { // result codes aren't propagated by flash_fs.h // overwrite Lua error, like writer() does in case of a file io error result = 1; } fs_close(file_fd); file_fd = FS_OPEN_OK - 1; if (result == LUA_ERR_CC_INTOVERFLOW) { return luaL_error(L, "value too big or small for target integer type"); } if (result == LUA_ERR_CC_NOTINTEGER) { return luaL_error(L, "target lua_Number is integral but fractional value found"); } if (result == 1) { // result status generated by writer() or fs_flush() fail return luaL_error(L, "writing to file failed"); } return 0; }
static int g_iofile (lua_State *L, int f, const char *mode) { if (!lua_isnoneornil(L, 1)) { const char *filename = lua_tostring(L, 1); if (filename) { int *pf = newfile(L); *pf = fs_open(filename, fs_mode2flag(mode)); if (*pf == FS_OPEN_OK - 1) fileerror(L, 1, filename); } else { tofile(L); /* check that it's a valid file handle */ lua_pushvalue(L, 1); } LUA_IO_SETFIELD(f); } /* return current value */ LUA_IO_GETFIELD(f); return 1; }
// Lua: open(filename, mode) static int file_open( lua_State* L ) { size_t len; if((FS_OPEN_OK - 1)!=file_fd){ fs_close(file_fd); file_fd = FS_OPEN_OK - 1; } const char *fname = luaL_checklstring( L, 1, &len ); if( len > FS_NAME_MAX_LENGTH ) return luaL_error(L, "filename too long"); const char *mode = luaL_optstring(L, 2, "r"); file_fd = fs_open(fname, fs_mode2flag(mode)); if(file_fd < FS_OPEN_OK){ file_fd = FS_OPEN_OK - 1; lua_pushnil(L); } else { lua_pushboolean(L, 1); } return 1; }