mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
1. When executed in the emulator the viewer will crash if you press Right on any zip file in the filechooser. This is because the assertion on "df /mnt/us | tail -1" will fail as "/mnt/us" is normally non-existent. 2. The proper (faster, reliable, portable) way of obtaining the number of total and free bytes on a filesystem is by using the statvfs(2) system call via util.df Lua interface, see util.c. 3. Removed the "used" field in the function's return as unused and unneeded.
96 lines
2.4 KiB
C
96 lines
2.4 KiB
C
/*
|
|
KindlePDFViewer: miscellaneous utility functions for Lua
|
|
Copyright (C) 2011 Hans-Werner Hilse <hilse@web.de>
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include <sys/time.h>
|
|
#include <sys/statvfs.h>
|
|
#include <unistd.h>
|
|
|
|
#include "util.h"
|
|
|
|
static int gettime(lua_State *L) {
|
|
struct timeval tv;
|
|
gettimeofday(&tv, NULL);
|
|
lua_pushinteger(L, tv.tv_sec);
|
|
lua_pushinteger(L, tv.tv_usec);
|
|
return 2;
|
|
}
|
|
|
|
static int util_sleep(lua_State *L) {
|
|
unsigned int seconds = luaL_optint(L, 1, 0);
|
|
sleep(seconds);
|
|
return 0;
|
|
}
|
|
|
|
static int util_usleep(lua_State *L) {
|
|
useconds_t useconds = luaL_optint(L, 1, 0);
|
|
usleep(useconds);
|
|
return 0;
|
|
}
|
|
|
|
static int util_df(lua_State *L) {
|
|
char *path = luaL_checkstring(L, 1);
|
|
struct statvfs vfs;
|
|
statvfs(path, &vfs);
|
|
lua_pushnumber(L, (double)vfs.f_blocks * (double)vfs.f_bsize);
|
|
lua_pushnumber(L, (double)vfs.f_bfree * (double)vfs.f_bsize);
|
|
return 2;
|
|
}
|
|
|
|
/* Turn UTF-8 char code to Unicode */
|
|
static int utf8charcode(lua_State *L) {
|
|
size_t len;
|
|
const char *utf8char = luaL_checklstring(L, 1, &len);
|
|
int c;
|
|
if(len == 1) {
|
|
c = utf8char[0] & 0x7F; /* should not be needed */
|
|
} else if(len == 2) {
|
|
c = ((utf8char[0] & 0x1F) << 6) | (utf8char[1] & 0x3F);
|
|
} else if(len == 3) {
|
|
c = ((utf8char[0] & 0x0F) << 12) | ((utf8char[1] & 0x3F) << 6) | (utf8char[2] & 0x3F);
|
|
} else {
|
|
// 4, 5, 6 byte cases still missing
|
|
return 0;
|
|
}
|
|
lua_pushinteger(L, c);
|
|
return 1;
|
|
}
|
|
|
|
static int isEmulated(lua_State *L) {
|
|
#ifdef EMULATE_READER
|
|
lua_pushinteger(L, 1);
|
|
#else
|
|
lua_pushinteger(L, 0);
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
static const struct luaL_Reg util_func[] = {
|
|
{"gettime", gettime},
|
|
{"sleep", util_sleep},
|
|
{"usleep", util_usleep},
|
|
{"utf8charcode", utf8charcode},
|
|
{"isEmulated", isEmulated},
|
|
{"df", util_df},
|
|
{NULL, NULL}
|
|
};
|
|
|
|
int luaopen_util(lua_State *L) {
|
|
luaL_register(L, "util", util_func);
|
|
return 1;
|
|
}
|