1
0
Fork 0
forked from len0rd/rockbox

Lua add read/write access to global_status, global_settings, audio_current_track

moved items to rb.system
added read access to audio_current_track and audio_next_track

Change-Id: Ia055b8cb3848e540067818f596ffd1058da057fb
This commit is contained in:
William Wilgus 2018-12-15 13:50:00 -06:00
parent c2308bdf40
commit 9d66b5459e
3 changed files with 540 additions and 1 deletions

View file

@ -564,6 +564,137 @@ RB_WRAP(strncasecmp)
return 1;
}
static int mem_read_write(lua_State *L, uintptr_t address, size_t maxsize)
{
intptr_t offset = (intptr_t) luaL_optint(L, 1, 0);
size_t size = (size_t) luaL_optint(L, 2, maxsize);
size_t written;
int type = lua_type(L, 3);
if(offset < 0)
{
/* allows pointer within structure to be calculated offset */
offset = -(address + offset);
size = (size_t) maxsize - offset;
}
luaL_argcheck(L, ((uintptr_t) offset) + size <= maxsize, 2, ERR_IDX_RANGE);
char *mem = (char*) address + ((uintptr_t) offset);
const void *value = NULL;
lua_Integer var_luaint;
#ifdef UINT64_MAX
int64_t var_64;
#endif
int32_t var_32;
int16_t var_16;
int8_t var_8;
bool var_bool;
switch(type)
{
case LUA_TSTRING:
{
size_t len;
const char* str = lua_tolstring (L, 3, &len);
luaL_argcheck(L, len + 1 <= size, 3, ERR_DATA_OVF);
size = len + 1; /* include \0 */
value = str;
break;
}
case LUA_TBOOLEAN:
{
var_bool = (bool) lua_toboolean(L, 3);
value = &var_bool;
break;
}
case LUA_TNUMBER:
{
var_luaint = lua_tointeger(L, 3);
switch(size)
{
case sizeof(var_8):
var_8 = (int8_t) var_luaint;
value = &var_8;
break;
case sizeof(var_16):
var_16 = (int16_t) var_luaint;
value = &var_16;
break;
case sizeof(var_32):
var_32 = (int32_t) var_luaint;
value = &var_32;
break;
#ifdef UINT64_MAX
case sizeof(var_64):
var_64 = (int64_t) var_luaint;
value = &var_64;
break;
#endif
} /* switch size */
break;
}
case LUA_TNIL:
case LUA_TNONE: /* reader */
{
luaL_Buffer b;
luaL_buffinit(L, &b);
while(size > 0)
{
written = MIN(LUAL_BUFFERSIZE, size);
luaL_addlstring (&b, mem, written);
mem += written;
size -= written;
}
luaL_pushresult(&b);
return 1;
}
default:
break;
} /* switch type */
/* writer */
luaL_argcheck(L, value != NULL, 3, "Unknown Type");
rb->memcpy(mem, value, size);
lua_pushinteger(L, 1);
return 1;
}
RB_WRAP(global_status)
{
const uintptr_t address = (uintptr_t) rb->global_status;
const size_t maxsize = sizeof(struct system_status);
return mem_read_write(L, address, maxsize);
}
RB_WRAP(global_settings)
{
const uintptr_t address = (uintptr_t) rb->global_settings;
const size_t maxsize = sizeof(struct user_settings);
return mem_read_write(L, address, maxsize);
}
RB_WRAP(audio_next_track)
{
lua_settop(L, 2); /* no writes allowed */
const uintptr_t address = (uintptr_t) rb->audio_next_track();
const size_t maxsize = sizeof(struct mp3entry);
return mem_read_write(L, address, maxsize);
}
RB_WRAP(audio_current_track)
{
lua_settop(L, 2); /* no writes allowed */
const uintptr_t address = (uintptr_t) rb->audio_current_track();
const size_t maxsize = sizeof(struct mp3entry);
return mem_read_write(L, address, maxsize);
}
#define RB_FUNC(func) {#func, rock_##func}
#define RB_ALIAS(name, func) {name, rock_##func}
static const luaL_Reg rocklib[] =
@ -625,6 +756,12 @@ static const luaL_Reg rocklib[] =
RB_FUNC(utf8encode),
RB_FUNC(strncasecmp),
/* ROCKBOX SETTINGS / INFO */
RB_FUNC(global_status),
RB_FUNC(global_settings),
RB_FUNC(audio_next_track),
RB_FUNC(audio_current_track),
{NULL, NULL}
};
#undef RB_FUNC