aboutsummaryrefslogtreecommitdiff
path: root/gamemode/utility/stream.lua
diff options
context:
space:
mode:
Diffstat (limited to 'gamemode/utility/stream.lua')
-rw-r--r--gamemode/utility/stream.lua85
1 files changed, 85 insertions, 0 deletions
diff --git a/gamemode/utility/stream.lua b/gamemode/utility/stream.lua
new file mode 100644
index 0000000..cdf3933
--- /dev/null
+++ b/gamemode/utility/stream.lua
@@ -0,0 +1,85 @@
+--[[
+ A stream object, has the methods:
+ stream:WriteString(string) :: nil
+ stream:WriteInt(num,bytes) :: nil
+
+ stream:ReadString() :: string
+ stream:ReadInt(bytes) :: number
+
+ stream:ToString() :: string
+]]
+
+local ss = {}
+
+local function WriteString(self,string)
+ local buflen = #self.buf
+ for i=1,#string do
+ self.buf[buflen+i] = string.byte(string,i)
+ end
+ self.buf[#self.buf + 1] = 0
+end
+
+local function WriteInt(self,num,bytes)
+ local buflen = #self.buf
+ local byte = 255
+ for i = 1,bytes do
+ --[[
+ pack[i] = (num & byte) >> (i-1)*8
+ byte = 255 << i*8
+ ]]
+ self.buf[buflen + i] = bit.rshift(bit.band(num,byte),(i-1)*8)
+ byte = bit.lshift(255,i*8)
+ end
+end
+
+local function ReadInt(self,len)
+ local tbl = {}
+ for i = 1, len do
+ tbl[i] = self.buf[i]
+ end
+ for i = 1, #self.buf do
+ self.buf[i] = self.buf[i+len]
+ end
+ local byte = 1
+ local num = 0
+ for i = 1, #tbl do
+ num = num + (tbl[i] * byte)
+ byte = 2 ^ (i*8)
+ end
+ return num
+end
+
+local function ReadString(self)
+ local str = {}
+ local strlen = 1
+ while self.buf[strlen] ~= 0 do
+ str[#str + 1] = string.char(self.buf[strlen])
+ strlen = strlen + 1
+ end
+ for i = 1,strlen do
+ self.buf[i] = self.buf[i+strlen]
+ end
+ return table.concat(str)
+end
+
+local function ToString(self)
+ return table.concat(self.buf)
+end
+
+function ss.CreateStream(str)
+ local ns = {}
+ ns.buf = {}
+ if str ~= nil then
+ for i = 1, #str do
+ ns[i] = str[i]
+ end
+ end
+ ns.ReadString = ReadString
+ ns.ReadInt = ReadInt
+ ns.WriteString = WriteString
+ ns.WriteInt = WriteInt
+ ns.ToString = ToString
+ return ns
+end
+
+return ss