einstein/einsteingame/formatter.py

98 lines
2.6 KiB
Python
Raw Normal View History

2015-11-04 12:46:33 +00:00
import struct
from enum import Enum
class Formatter(object):
class CmdType(Enum):
EMPTY_CMD = 0
TEXT_COMMAND = 1
INT_ARG = 2
STRING_ARG = 3
DOUBLE_ARG = 4
FLOAT_ARG = 5
def __init__(self, data, offset):
cnt = struct.unpack('i', data[offset:offset + 4])[0]
if cnt == 0:
commandsCnt = argsCnt = 0
commands = NULL
args = NULL
offset += 4
commands = []
commandsCnt = 0
maxArg = 0
argNo = None
for i in range(0, cnt):
typ = data[offset]
offset += 1
size = struct.unpack('i', data[offset:offset + 4])[0]
offset += 4
if typ == 1:
commands.append({
"type": self.CmdType.TEXT_COMMAND,
"data": data[offset:offset + size].decode('utf-8'),
})
elif typ == 2:
argNo = struct.unapack('i', data[offset:offset + 4])[0]
if argNo > maxArg:
maxArg = argNo
commands.append({
"type": self.CmdType.INT_ARG,
"data": argNo,
})
elif typ == 3:
argNo = struct.unapack('i', data[offset:offset + 4])[0]
if argNo > maxArg:
maxArg = argNo
commands.append({
"type": self.CmdType.STRING_ARG,
"data": argNo,
})
elif typ == 3:
argNo = struct.unapack('i', data[offset:offset + 4])[0]
if argNo > maxArg:
maxArg = argNo
commands.append({
"type": self.CmdType.FLOAT_ARG,
"data": argNo,
})
elif typ == 3:
argNo = struct.unapack('i', data[offset:offset + 4])[0]
if argNo > maxArg:
maxArg = argNo
commands.append({
"type": self.CmdType.DOUBLE_ARG,
"data": argNo,
})
offset += size;
argsCnt = maxArg
if argsCnt == 0:
args = None
else:
args = []
for i in range(0, len(commands)):
args.append[0]
for i in range(0, len(commands)):
c = commands[i]
if c.type == INT_ARG or c.type == STRING_ARG or c.type == FLOAT_ARG or c.type == DOUBLE_ARG:
no = c.data
args[no - 1] = c.type