Merge pull request #138 from thegrb93/newcodec2

Codec improvement
This commit is contained in:
thegrb93 2018-11-21 01:44:22 -05:00 committed by GitHub
commit 58f9acb723
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -8,19 +8,7 @@
Version: 2.0
]]
local REVISION = 4
local hasModule = false
if(SERVER)then
if(system.IsWindows())then
hasModule = file.Exists("lua/bin/gmsv_ad2filestream_win32.dll", "GAME")
print(hasModule)
if(!hasModule)then
print("[AdvDupe2Notify]\tMODULE NOT INSTALLED CORRECTLY. SAVING WILL BE SLOW.")
else
require("ad2filestream")
end
end
end
local REVISION = 5
include "sh_codec_legacy.lua"
AddCSLuaFile "sh_codec_legacy.lua"
@ -100,126 +88,65 @@ end
local len
local tables,tablesLookup
if(not system.IsWindows() or not hasModule)then
enc[TYPE_TABLE] = function(obj) --table
tables = tables + 1
if not tablesLookup[obj] then
tablesLookup[obj] = tables
else
buff:WriteByte(247)
buff:WriteShort(tablesLookup[obj])
return
enc[TYPE_TABLE] = function(obj) --table
tables = tables + 1
if not tablesLookup[obj] then
tablesLookup[obj] = tables
else
buff:WriteByte(247)
buff:WriteShort(tablesLookup[obj])
return
end
if isArray(obj) then
buff:WriteByte(254)
for i,v in pairs(obj) do
write(v)
end
if isArray(obj) then
buff:WriteByte(254)
for i,v in pairs(obj) do
else
buff:WriteByte(255)
for k,v in pairs(obj) do
if(enc[TypeID(k)]!=noserializer and enc[TypeID(v)]!=noserializer)then
write(k)
write(v)
end
else
buff:WriteByte(255)
for k,v in pairs(obj) do
if(enc[TypeID(k)]!=noserializer and enc[TypeID(v)]!=noserializer)then
write(k)
write(v)
end
end
end
buff:WriteByte(0)
end
enc[TYPE_BOOL] = function(obj) --boolean
buff:WriteByte(obj and 253 or 252)
end
enc[TYPE_NUMBER] = function(obj) --number
buff:WriteByte(251)
buff:WriteDouble(obj)
end
enc[TYPE_VECTOR] = function(obj) --vector
buff:WriteByte(250)
buff:WriteDouble(obj.x)
buff:WriteDouble(obj.y)
buff:WriteDouble(obj.z)
end
enc[TYPE_ANGLE] = function(obj) --angle
buff:WriteByte(249)
buff:WriteDouble(obj.p)
buff:WriteDouble(obj.y)
buff:WriteDouble(obj.r)
end
enc[TYPE_STRING] = function(obj) --string
len = #obj
if len > 0 and len < 247 then
buff:WriteByte(len)
buff:Write(obj)
else
buff:WriteByte(248)
buff:Write(obj)
buff:WriteByte(0)
end
end
else
enc[TYPE_TABLE] = function(obj) --table
tables = tables + 1
if not tablesLookup[obj] then
tablesLookup[obj] = tables
else
AdvDupe2_WriteByte(247)
AdvDupe2_WriteShort(tablesLookup[obj])
return
end
if isArray(obj) then
AdvDupe2_WriteByte(254)
for i,v in pairs(obj) do
write(v)
end
else
AdvDupe2_WriteByte(255)
for k,v in pairs(obj) do
if(enc[TypeID(k)]!=noserializer and enc[TypeID(v)]!=noserializer)then
write(k)
write(v)
end
end
end
AdvDupe2_WriteByte(0)
end
enc[TYPE_BOOL] = function(obj) --boolean
AdvDupe2_WriteByte(obj and 253 or 252)
end
enc[TYPE_NUMBER] = function(obj) --number
AdvDupe2_WriteByte(251)
AdvDupe2_WriteDouble(obj)
end
enc[TYPE_VECTOR] = function(obj) --vector
AdvDupe2_WriteByte(250)
AdvDupe2_WriteDouble(obj.x)
AdvDupe2_WriteDouble(obj.y)
AdvDupe2_WriteDouble(obj.z)
end
enc[TYPE_ANGLE] = function(obj) --angle
AdvDupe2_WriteByte(249)
AdvDupe2_WriteDouble(obj.p)
AdvDupe2_WriteDouble(obj.y)
AdvDupe2_WriteDouble(obj.r)
end
enc[TYPE_STRING] = function(obj) --string
len = #obj
if len > 0 and len < 247 then
AdvDupe2_WriteByte(len)
AdvDupe2_WriteString(obj)
else
AdvDupe2_WriteByte(248)
AdvDupe2_WriteString(obj)
AdvDupe2_WriteByte(0)
end
buff:WriteByte(246)
end
enc[TYPE_BOOL] = function(obj) --boolean
buff:WriteByte(obj and 253 or 252)
end
enc[TYPE_NUMBER] = function(obj) --number
buff:WriteByte(251)
buff:WriteDouble(obj)
end
enc[TYPE_VECTOR] = function(obj) --vector
buff:WriteByte(250)
buff:WriteDouble(obj.x)
buff:WriteDouble(obj.y)
buff:WriteDouble(obj.z)
end
enc[TYPE_ANGLE] = function(obj) --angle
buff:WriteByte(249)
buff:WriteDouble(obj.p)
buff:WriteDouble(obj.y)
buff:WriteDouble(obj.r)
end
enc[TYPE_STRING] = function(obj) --string
len = #obj
if len < 246 then
buff:WriteByte(len)
buff:Write(obj)
else
buff:WriteByte(248)
buff:WriteULong(len)
buff:Write(obj)
end
end
local function error_nodeserializer()
@ -227,131 +154,174 @@ local function error_nodeserializer()
error(format("couldn't find deserializer for type {typeid:%d}", buff:ReadByte()))
end
local dec = {}
local reference = 0
for i=1,255 do dec[i] = error_nodeserializer end
local read4, read5
local function read()
local tt = buff:ReadByte()
if not tt then
error("expected value, got EOF")
local reference = 0
do --Version 4
local dec = {}
for i=1,255 do dec[i] = error_nodeserializer end
local function read()
local tt = buff:ReadByte()
if not tt then
error("expected value, got EOF")
end
if tt == 0 then
return nil
end
return dec[tt]()
end
if tt == 0 then
return nil
read4 = read
dec[255] = function() --table
local t = {}
local k
reference = reference + 1
local ref = reference
repeat
k = read()
if k ~= nil then
t[k] = read()
end
until (k == nil)
tables[ref] = t
return t
end
return dec[tt]()
dec[254] = function() --array
local t = {}
local k,v = 0
reference = reference + 1
local ref = reference
repeat
k = k + 1
v = read()
if(v != nil) then
t[k] = v
end
until (v == nil)
tables[ref] = t
return t
end
dec[253] = function()
return true
end
dec[252] = function()
return false
end
dec[251] = function()
return buff:ReadDouble()
end
dec[250] = function()
return Vector(buff:ReadDouble(),buff:ReadDouble(),buff:ReadDouble())
end
dec[249] = function()
return Angle(buff:ReadDouble(),buff:ReadDouble(),buff:ReadDouble())
end
dec[248] = function() --null-terminated string
local start = buff:Tell()
local slen = 0
while buff:ReadByte() != 0 do
slen = slen + 1
end
buff:Seek(start)
local retv = buff:Read(slen)
if(not retv)then retv="" end
buff:ReadByte()
return retv
end
dec[247] = function() --table reference
reference = reference + 1
return tables[buff:ReadShort()]
end
for i=1,246 do dec[i] = function() return buff:Read(i) end end
end
dec[255] = function() --table
local t = {}
local k
reference = reference + 1
local ref = reference
do --Version 5
local dec = {}
for i=1,255 do dec[i] = error_nodeserializer end
repeat
k = read()
if k ~= nil then
local function read()
local tt = buff:ReadByte()
if not tt then
error("expected value, got EOF")
end
return dec[tt]()
end
read5 = read
dec[255] = function() --table
local t = {}
reference = reference + 1
tables[reference] = t
for k in read do
t[k] = read()
end
until (k == nil)
tables[ref] = t
return t
end
dec[254] = function() --array
local t = {}
local k,v = 0
reference = reference + 1
local ref = reference
repeat
k = k + 1
v = read()
if(v != nil) then
t[k] = v
end
until (v == nil)
tables[ref] = t
return t
end
dec[253] = function()
return true
end
dec[252] = function()
return false
end
dec[251] = function()
return buff:ReadDouble()
end
dec[250] = function()
return Vector(buff:ReadDouble(),buff:ReadDouble(),buff:ReadDouble())
end
dec[249] = function()
return Angle(buff:ReadDouble(),buff:ReadDouble(),buff:ReadDouble())
end
dec[248] = function() --null-terminated string
local start = buff:Tell()
local slen = 0
while buff:ReadByte() != 0 do
slen = slen + 1
return t
end
buff:Seek(start)
local retv = buff:Read(slen)
if(not retv)then retv="" end
buff:ReadByte()
return retv
end
dec[247] = function() --table reference
reference = reference + 1
return tables[buff:ReadShort()]
end
dec[254] = function() --array
local t = {}
reference = reference + 1
tables[reference] = t
local function vsr()
buff:Seek(buff:Tell() - 1)
slen = buff:ReadByte()
return buff:Read(slen)
end
local k = 1
for v in read do
t[k] = v
k = k + 1
end
for i=1,246 do dec[i] = vsr end
return t
end
dec[253] = function()
return true
end
dec[252] = function()
return false
end
dec[251] = function()
return buff:ReadDouble()
end
dec[250] = function()
return Vector(buff:ReadDouble(),buff:ReadDouble(),buff:ReadDouble())
end
dec[249] = function()
return Angle(buff:ReadDouble(),buff:ReadDouble(),buff:ReadDouble())
end
dec[248] = function() -- Length>246 string
local slen = buff:ReadULong()
local retv = buff:Read(slen)
if(not retv)then retv="" end
return retv
end
dec[247] = function() --table reference
return tables[buff:ReadShort()]
end
dec[246] = function() --nil
return
end
for i=1,245 do dec[i] = function() return buff:Read(i) end end
dec[0] = function() return "" end
end
local function serialize(tbl)
tables = 0
tablesLookup = {}
if(not system.IsWindows() or not hasModule)then
buff = file.Open("ad2temp.txt", "wb", "DATA")
write(tbl)
buff:Close()
else
if(not AdvDupe2_OpenStream)then print("[AdvDupe2Notify]\tMODULE NOT INSTALLED CORRECTLY. YOU WILL NOT BE ABLE TO SAVE.") return "" end
if(not AdvDupe2_OpenStream())then error("Filestream could not be opened.") return "" end
write(tbl)
AdvDupe2_CloseStream()
end
buff = file.Open("ad2temp.txt", "wb", "DATA")
write(tbl)
buff:Close()
buff = file.Open("ad2temp.txt","rb","DATA")
local ret = buff:Read(buff:Size())
@ -360,7 +330,7 @@ local function serialize(tbl)
end
local function deserialize(str)
local function deserialize(str, read)
if(str==nil)then
error("File could not be decompressed.")
@ -439,9 +409,12 @@ end
versions[4] = function(encodedDupe)
local info, dupestring = getInfo(encodedDupe:sub(7))
return deserialize(
decompress(dupestring)
), info
return deserialize(decompress(dupestring), read4), info
end
versions[5] = function(encodedDupe)
local info, dupestring = getInfo(encodedDupe:sub(7))
return deserialize(decompress(dupestring), read5), info
end
--[[
@ -477,7 +450,7 @@ function AdvDupe2.Decode(encodedDupe, callback, ...)
error("unknown duplication format")
end
elseif rev > REVISION then
error(format("this install lacks the codec version to parse the dupe (have rev %u, need rev %u)",REVISION,rev))
error(format("Newer codec needed. (have rev %u, need rev %u) Update Advdupe2.",REVISION,rev))
elseif rev < 1 then
error(format("attempt to use an invalid format revision (rev %d)", rev))
else