about summary refs log tree commit diff
path: root/datasrc/datatypes.py
diff options
context:
space:
mode:
authorMagnus Auvinen <magnus.auvinen@gmail.com>2008-04-27 05:59:38 +0000
committerMagnus Auvinen <magnus.auvinen@gmail.com>2008-04-27 05:59:38 +0000
commitac18c6a3bd9b1e497cd97c52fd77f256961b48e6 (patch)
tree1bd22746e07876a8d39dd7dafad392539a2cdc2d /datasrc/datatypes.py
parenta7cb36877cb1d2c79dfbff1e373e9dd7d4a4913d (diff)
downloadzcatch-ac18c6a3bd9b1e497cd97c52fd77f256961b48e6.tar.gz
zcatch-ac18c6a3bd9b1e497cd97c52fd77f256961b48e6.zip
more stuff :)
Diffstat (limited to 'datasrc/datatypes.py')
-rw-r--r--datasrc/datatypes.py86
1 files changed, 86 insertions, 0 deletions
diff --git a/datasrc/datatypes.py b/datasrc/datatypes.py
new file mode 100644
index 00000000..9050b451
--- /dev/null
+++ b/datasrc/datatypes.py
@@ -0,0 +1,86 @@
+
+class Object:
+	pass
+
+class Enum():
+	def __init__(self, name, values):
+		self.name = name
+		self.values = values
+
+class NetObject:
+	def __init__(self, name, variables):
+		l = name.split(":")
+		self.name = l[0].lower()
+		self.base = ""
+		if len(l) > 1:
+			self.base = l[1]
+		self.base_struct_name = "NETOBJ_%s" % self.base.upper()
+		self.struct_name = "NETOBJ_%s" % self.name.upper()
+		self.enum_name = "NETOBJTYPE_%s" % self.name.upper()
+		self.variables = variables
+	def emit_declaration(self):
+		if self.base:
+			lines = ["struct %s : public %s"%(self.struct_name,self.base_struct_name), "{"]
+		else:
+			lines = ["struct %s"%self.struct_name, "{"]
+		for v in self.variables:
+			lines += ["\t"+line for line in v.emit_declaration()]
+		lines += ["};"]
+		return lines
+	def emit_validate(self):
+		lines = ["static int validate_%s(void *data, int size)" % self.name]
+		lines += ["{"]
+		lines += ["\t%s *obj = (%s *)data;"%(self.struct_name, self.struct_name)]
+		lines += ["\tif(sizeof(*obj) != size) return -1;"]
+		for v in self.variables:
+			lines += ["\t"+line for line in v.emit_validate()]
+		lines += ["\treturn 0;"]
+		lines += ["}"]
+		return lines
+		
+
+class NetEvent(NetObject):
+	def __init__(self, name, variables):
+		NetObject.__init__(self, name, variables)
+		self.base_struct_name = "NETEVENT_%s" % self.base.upper()
+		self.struct_name = "NETEVENT_%s" % self.name.upper()
+		self.enum_name = "NETEVENTTYPE_%s" % self.name.upper()
+
+class NetMessage(NetObject):
+	def __init__(self, name, variables):
+		NetObject.__init__(self, name, variables)
+		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()
+
+class NetVariable:
+	def __init__(self, name):
+		self.name = name
+	def emit_declaration(self):
+		return []
+	def emit_validate(self):
+		return []
+
+class NetString(NetVariable):
+	def emit_declaration(self):
+		return ["const char *%s;"%self.name]
+
+class NetIntAny(NetVariable):
+	def emit_declaration(self):
+		return ["int %s;"%self.name]
+
+class NetIntRange(NetIntAny):
+	def __init__(self, name, min, max):
+		NetIntAny.__init__(self,name)
+		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)]
+
+class NetBool(NetIntRange):
+	def __init__(self, name):
+		NetIntRange.__init__(self,name,0,1)
+
+class NetTick(NetIntRange):
+	def __init__(self, name):
+		NetIntRange.__init__(self,name,0,'max_int')