Merge remote-tracking branch 'upstream/master-MC1.7.10' into master-MC1.8.9

This commit is contained in:
payonel 2016-10-26 22:20:50 -07:00
commit 3104d723b9

View File

@ -12,120 +12,50 @@ function adv_buf.readNumber(self, readChunk)
len = unicode.len len = unicode.len
sub = unicode.sub sub = unicode.sub
end end
local buffer = "" local buffer = ""
local first = true local white_done
local decimal = false
local last = false local function peek()
local hex = false
local pat = "^[0-9]+"
local minbuf = 3 -- "+0x" (sign + hexadecimal tag)
-- this function is used to read trailing numbers (1e2, 0x1p2, etc)
local function readnum(checksign)
local _buffer = ""
local sign = ""
while true do
if len(self.bufferRead) == 0 then if len(self.bufferRead) == 0 then
local result, reason = readChunk() local result, reason = readChunk()
if not result then if not result then
if reason then return result, reason
return nil, reason
else -- eof
return #_buffer > 0 and (sign .. _buffer) or nil
end end
end end
return sub(self.bufferRead, 1, 1)
end end
if checksign then
local _sign = sub(self.bufferRead, 1, 1) local function pop()
if _sign == "+" or _sign == "-" then local n = sub(self.bufferRead, 1, 1)
-- "eat" the sign (Rio Lua behaviour)
sign = sub(self.bufferRead, 1, 1)
self.bufferRead = sub(self.bufferRead, 2) self.bufferRead = sub(self.bufferRead, 2)
return n
end end
checksign = false
else local function take()
local x,y = string.find(self.bufferRead, pat) buffer = buffer .. pop()
if not x then
break
else
_buffer = _buffer .. sub(self.bufferRead, 1, y)
self.bufferRead = sub(self.bufferRead, y + 1)
end
end
end
return #_buffer > 0 and (sign .. _buffer) or nil
end end
while true do while true do
if len(self.bufferRead) == 0 or len(self.bufferRead) < minbuf then local peeked = peek()
local result, reason = readChunk() if not peeked then
if not result then
if reason then
return nil, reason
else -- eof
return #buffer > 0 and tonumber(buffer) or nil
end
end
end
-- these ifs are here so we run the buffer check above
if first then
local sign = sub(self.bufferRead, 1, 1)
if sign == "+" or sign == "-" then
-- "eat" the sign (Rio Lua behaviour)
buffer = buffer .. sub(self.bufferRead, 1, 1)
self.bufferRead = sub(self.bufferRead, 2)
end
local hextag = sub(self.bufferRead, 1, 2)
if hextag == "0x" or hextag == "0X" then
pat = "^[0-9A-Fa-f]+"
-- "eat" the 0x, see https://gist.github.com/SoniEx2/570a363d81b743353151
buffer = buffer .. sub(self.bufferRead, 1, 2)
self.bufferRead = sub(self.bufferRead, 3)
hex = true
end
minbuf = 0
first = false
elseif decimal then
local sep = sub(self.bufferRead, 1, 1)
if sep == "." then
buffer = buffer .. sep
self.bufferRead = sub(self.bufferRead, 2)
local temp = readnum(false) -- no sign
if temp then
buffer = buffer .. temp
end
end
if not tonumber(buffer) then break end
decimal = false
last = true
minbuf = 1
elseif last then
local tag = sub(self.bufferRead, 1, 1)
if hex and (tag == "p" or tag == "P") then
local temp = sub(self.bufferRead, 1, 1)
self.bufferRead = sub(self.bufferRead, 2)
local temp2 = readnum(true) -- this eats the next sign if any
if temp2 then
buffer = buffer .. temp .. temp2
end
elseif tag == "e" or tag == "E" then
local temp = sub(self.bufferRead, 1, 1)
self.bufferRead = sub(self.bufferRead, 2)
local temp2 = readnum(true) -- this eats the next sign if any
if temp2 then
buffer = buffer .. temp .. temp2
end
end
break break
end
if peeked:match("[%s]") then
if white_done then
break
end
pop()
else else
local x,y = string.find(self.bufferRead, pat) white_done = true
if not x then if not tonumber(buffer .. peeked .. "0") then
minbuf = 1 break
decimal = true end
else take() -- add pop to buffer
buffer = buffer .. sub(self.bufferRead, 1, y)
self.bufferRead = sub(self.bufferRead, y + 1)
end
end end
end end
return tonumber(buffer) return tonumber(buffer)
end end