diff options
Diffstat (limited to 'datasrc/datatypes.py')
| -rw-r--r-- | datasrc/datatypes.py | 205 |
1 files changed, 204 insertions, 1 deletions
diff --git a/datasrc/datatypes.py b/datasrc/datatypes.py index 9050b451..88678646 100644 --- a/datasrc/datatypes.py +++ b/datasrc/datatypes.py @@ -1,4 +1,164 @@ + +GlobalIdCounter = 0 +def GetID(): + global GlobalIdCounter + GlobalIdCounter += 1 + return GlobalIdCounter +def GetUID(): + return "x%d"%GetID() + +class BaseType: + def __init__(self, type_name): + self._type_name = type_name + self._target_name = "INVALID" + self._id = GetID() # this is used to remeber what order the members have in structures etc + + def Identifyer(self): return "x"+str(self._id) + def TargetName(self): return self._target_name + def TypeName(self): return self._type_name + def ID(self): return self._id; + + def EmitDeclaration(self, name): + return ["%s %s;"%(self.TypeName(), name)] + def EmitPreDefinition(self, target_name): + self._target_name = target_name + return [] + def EmitDefinition(self, name): + return [] + +class MemberType: + def __init__(self, name, var): + self.name = name + self.var = var + +class Struct(BaseType): + def __init__(self, type_name): + BaseType.__init__(self, type_name) + def Members(self): + def sorter(a,b): + return a.var.ID()-b.var.ID() + m = [] + for name in self.__dict__: + if name[0] == "_": + continue + m += [MemberType(name, self.__dict__[name])] + try: + m.sort(sorter) + except: + for v in m: + print v.name, v.var + sys.exit(-1) + return m + + def EmitTypeDeclaration(self, name): + lines = [] + lines += ["struct " + self.TypeName()] + lines += ["{"] + for member in self.Members(): + lines += ["\t"+l for l in member.var.EmitDeclaration(member.name)] + lines += ["};"] + return lines + + def EmitPreDefinition(self, target_name): + BaseType.EmitPreDefinition(self, target_name) + lines = [] + for member in self.Members(): + lines += member.var.EmitPreDefinition(target_name+"."+member.name) + return lines + def EmitDefinition(self, name): + lines = ["/* %s */ {" % self.TargetName()] + for member in self.Members(): + lines += ["\t" + " ".join(member.var.EmitDefinition("")) + ","] + lines += ["}"] + return lines + +class Array(BaseType): + def __init__(self, type): + BaseType.__init__(self, type.TypeName()) + self.type = type + self.items = [] + def Add(self, instance): + if instance.TypeName() != self.type.TypeName(): + error("bah") + self.items += [instance] + def EmitDeclaration(self, name): + return ["int num_%s;"%(name), + "%s *%s;"%(self.TypeName(), name)] + def EmitPreDefinition(self, target_name): + BaseType.EmitPreDefinition(self, target_name) + + lines = [] + i = 0 + for item in self.items: + lines += item.EmitPreDefinition("%s[%d]"%(self.Identifyer(), i)) + i += 1 + + lines += ["static %s %s[] = {"%(self.TypeName(), self.Identifyer())] + for item in self.items: + itemlines = item.EmitDefinition("") + lines += ["\t" + " ".join(itemlines).replace("\t", " ") + ","] + lines += ["};"] + return lines + def EmitDefinition(self, name): + return [str(len(self.items))+","+self.Identifyer()] + +# Basic Types + +class Int(BaseType): + def __init__(self, value): + BaseType.__init__(self, "int") + self.value = value + def Set(self, value): + self.value = value + def EmitDefinition(self, name): + return ["%d"%self.value] + #return ["%d /* %s */"%(self.value, self._target_name)] + +class Float(BaseType): + def __init__(self, value): + BaseType.__init__(self, "float") + self.value = value + def Set(self, value): + self.value = value + def EmitDefinition(self, name): + return ["%f"%self.value] + #return ["%d /* %s */"%(self.value, self._target_name)] + +class String(BaseType): + def __init__(self, value): + BaseType.__init__(self, "const char*") + self.value = value + def Set(self, value): + self.value = value + def EmitDefinition(self, name): + return ['"'+self.value+'"'] + +class Pointer(BaseType): + def __init__(self, type, target): + BaseType.__init__(self, "%s*"%type().TypeName()) + self.target = target + def Set(self, target): + self.target = target + def EmitDefinition(self, name): + return ["&"+self.target.TargetName()] + +# helper functions + +def EmitTypeDeclaration(root): + for l in root().EmitTypeDeclaration(""): + print l + +def EmitDefinition(root, name): + for l in root.EmitPreDefinition(name): + print l + print "%s %s = " % (root.TypeName(), name) + for l in root.EmitDefinition(name): + print l + print ";" + +# Network stuff after this + class Object: pass @@ -52,6 +212,33 @@ class NetMessage(NetObject): self.base_struct_name = "NETMSG_%s" % self.base.upper() self.struct_name = "NETMSG_%s" % self.name.upper() self.enum_name = "NETMSGTYPE_%s" % self.name.upper() + def emit_unpack(self): + lines = [] + lines += ["static void *secure_unpack_%s()" % self.name] + lines += ["{"] + lines += ["\tstatic %s msg;" % self.struct_name] + for v in self.variables: + lines += ["\t"+line for line in v.emit_unpack()] + for v in self.variables: + lines += ["\t"+line for line in v.emit_unpack_check()] + lines += ["\treturn &msg;"] + lines += ["}"] + return lines + def emit_declaration(self): + extra = [] + extra += ["\tvoid pack(int flags)"] + extra += ["\t{"] + extra += ["\t\tmsg_pack_start(%s, flags);"%self.enum_name] + for v in self.variables: + extra += ["\t\t"+line for line in v.emit_pack()] + extra += ["\t\tmsg_pack_end();"] + extra += ["\t}"] + + + lines = NetObject.emit_declaration(self) + lines = lines[:-1] + extra + lines[-1:] + return lines + class NetVariable: def __init__(self, name): @@ -60,14 +247,28 @@ class NetVariable: return [] def emit_validate(self): return [] + def emit_pack(self): + return [] + def emit_unpack(self): + return [] + def emit_unpack_check(self): + return [] class NetString(NetVariable): def emit_declaration(self): return ["const char *%s;"%self.name] + def emit_unpack(self): + return ["msg.%s = msg_unpack_string();" % self.name] + def emit_pack(self): + return ["msg_pack_string(%s, -1);" % self.name] class NetIntAny(NetVariable): def emit_declaration(self): return ["int %s;"%self.name] + def emit_unpack(self): + return ["msg.%s = msg_unpack_int();" % self.name] + def emit_pack(self): + return ["msg_pack_int(%s);" % self.name] class NetIntRange(NetIntAny): def __init__(self, name, min, max): @@ -75,7 +276,9 @@ class NetIntRange(NetIntAny): self.min = str(min) self.max = str(max) def emit_validate(self): - return ["netobj_clamp_int(obj->%s, %s %s)"%(self.name, self.min, self.max)] + return ["netobj_clamp_int(\"%s\", obj->%s, %s, %s);"%(self.name,self.name, self.min, self.max)] + def emit_unpack_check(self): + return ["if(msg.%s < %s || msg.%s > %s) { msg_failed_on = \"%s\"; return 0; }" % (self.name, self.min, self.name, self.max, self.name)] class NetBool(NetIntRange): def __init__(self, name): |