1
0
Fork 0
forked from len0rd/rockbox

Lua replace fscanf

Rocklua was using the full fscanf implementation
to simply read %ld for the file:read("*n") function
wasting 1k on unneeded/unused functionality

Instead, I've implemented a filetol function to duplicate it
without the extra overhead using strtol which as an added bonus
ERANGE errors now resolve to LONG_MIN and LONGMAX instead of
integer overflow

filetol()
   reads long int from an open file, skips preceding
   whitespaces returns -1 if error, 1 on success.
   *num set to LONG_MAX or LONG_MIN on overflow.
   If number of digits is > than LUAI_MAXNUMBER2STR
   filepointer will continue till the next non digit
   but buffer will stop being filled with characters.
   Preceding zero is ignored.

Change-Id: Ia42d0f73c63a894625bca4581e9b7e1cc7387fd2
This commit is contained in:
William Wilgus 2018-10-29 02:54:35 -04:00
parent cc0a4c632a
commit eab73b3dee
6 changed files with 66 additions and 295 deletions

View file

@ -17,6 +17,7 @@
#include "lauxlib.h"
#include "lualib.h"
#include "rocklibc.h"
#include "rocklib.h"
#include "llimits.h"
@ -247,7 +248,7 @@ static int io_lines (lua_State *L) {
static int read_number (lua_State *L, int *f) {
lua_Number d;
if (PREFIX(fscanf)(*f, LUA_NUMBER_SCAN, &d) == 1) {
if (filetol(*f, &d) == 1) { /* was fscanf(f, LUA_NUMBER_SCAN, &d)*/
lua_pushnumber(L, d);
return 1;
}