about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorrajdakin <loic_chevalier@yahoo.fr>2021-06-02 20:54:05 +0200
committerrajdakin <loic_chevalier@yahoo.fr>2021-06-02 21:04:43 +0200
commit8e42412490c3b4013d035492e3f4df1c0fa70556 (patch)
treea4785524400dcbc2eb8969d55d89345d2ab044c0
parent2737180a20388f1f7ac0c8718923b37dbf18c198 (diff)
downloadbox64-8e42412490c3b4013d035492e3f4df1c0fa70556.tar.gz
box64-8e42412490c3b4013d035492e3f4df1c0fa70556.zip
Added types to the Python script, fixed some issues
-rwxr-xr-xrebuild_wrappers.py586
-rw-r--r--src/wrapped/generated/wrappedbz2types.h2
-rw-r--r--src/wrapped/generated/wrappedcryptotypes.h2
-rw-r--r--src/wrapped/generated/wrappedcurltypes.h2
-rw-r--r--src/wrapped/generated/wrappeddbustypes.h2
-rw-r--r--src/wrapped/generated/wrappedexpattypes.h2
-rw-r--r--src/wrapped/generated/wrappedflactypes.h2
-rw-r--r--src/wrapped/generated/wrappedfontconfigtypes.h2
-rw-r--r--src/wrapped/generated/wrappedfreetypetypes.h2
-rw-r--r--src/wrapped/generated/wrappedgnutlstypes.h2
-rw-r--r--src/wrapped/generated/wrappedldlinuxtypes.h2
-rw-r--r--src/wrapped/generated/wrappedlibasoundtypes.h2
-rw-r--r--src/wrapped/generated/wrappedlibctypes.h2
-rw-r--r--src/wrapped/generated/wrappedlibdltypes.h2
-rw-r--r--src/wrapped/generated/wrappedlibgltypes.h2
-rw-r--r--src/wrapped/generated/wrappedlibglutypes.h2
-rw-r--r--src/wrapped/generated/wrappedlibpthreadtypes.h2
-rw-r--r--src/wrapped/generated/wrappedlibrttypes.h2
-rw-r--r--src/wrapped/generated/wrappedlibsmtypes.h2
-rw-r--r--src/wrapped/generated/wrappedlibssltypes.h2
-rw-r--r--src/wrapped/generated/wrappedlibx11types.h2
-rw-r--r--src/wrapped/generated/wrappedlibxexttypes.h2
-rw-r--r--src/wrapped/generated/wrappedlibxtsttypes.h2
-rw-r--r--src/wrapped/generated/wrappedlibxttypes.h2
-rw-r--r--src/wrapped/generated/wrappedlibztypes.h2
-rw-r--r--src/wrapped/generated/wrappedopenaltypes.h2
-rw-r--r--src/wrapped/generated/wrappedpangotypes.h2
-rw-r--r--src/wrapped/generated/wrappedpng16types.h2
-rw-r--r--src/wrapped/generated/wrappedpulsetypes.h2
-rw-r--r--src/wrapped/generated/wrappedsdl1imagetypes.h2
-rw-r--r--src/wrapped/generated/wrappedsdl1mixertypes.h2
-rw-r--r--src/wrapped/generated/wrappedsdl1soundtypes.h2
-rw-r--r--src/wrapped/generated/wrappedsdl1ttftypes.h2
-rw-r--r--src/wrapped/generated/wrappedsdl1types.h2
-rw-r--r--src/wrapped/generated/wrappedsdl2imagetypes.h2
-rw-r--r--src/wrapped/generated/wrappedsdl2mixertypes.h2
-rw-r--r--src/wrapped/generated/wrappedsdl2ttftypes.h2
-rw-r--r--src/wrapped/generated/wrappedsdl2types.h2
-rw-r--r--src/wrapped/generated/wrappedsmpeg2types.h2
-rw-r--r--src/wrapped/generated/wrappedsmpegtypes.h2
-rw-r--r--src/wrapped/generated/wrappedutiltypes.h2
-rw-r--r--src/wrapped/generated/wrappedvorbisfiletypes.h2
-rw-r--r--src/wrapped/generated/wrappedxml2types.h2
-rw-r--r--src/wrapped/generated/wrapper.c2
-rw-r--r--src/wrapped/generated/wrapper.h3
45 files changed, 418 insertions, 257 deletions
diff --git a/rebuild_wrappers.py b/rebuild_wrappers.py
index 7b2f5bc9..39c2698b 100755
--- a/rebuild_wrappers.py
+++ b/rebuild_wrappers.py
@@ -1,11 +1,37 @@
 #!/usr/bin/env python
 
+try:
+	# Python 3.5.2+
+	from typing import Union, List, Sequence, Dict, Tuple, NewType, final
+except ImportError:
+	print("Your Python version does not have the typing module, fallback to empty 'types'")
+	# Stubs
+	class GTStub:
+		def __getitem__(self, t):
+			return None
+	Union = GTStub() # type: ignore
+	List = GTStub() # type: ignore
+	Sequence = GTStub() # type: ignore
+	Dict = GTStub() # type: ignore
+	Tuple = GTStub() # type: ignore
+	def NewType(T, *largs): return largs[0] if len(largs) > 0 else None # type: ignore
+	final = lambda x: x # type: ignore
+
+#FunctionType = NewType('FunctionType', str)
+FunctionType = str
+RedirectType = NewType('RedirectType', FunctionType)
+#DefineType = NewType('DefineType', str)
+DefineType = str
+
+Filename = str
+ClausesStr = str
+
 import os
 import sys
 
-values = ['E', 'e', 'v', 'c', 'w', 'i', 'I', 'C', 'W', 'u', 'U', 'f', 'd', 'D', 'K', 'l', 'L', 'p', 'V', 'O', 'S', 'N', 'M', 'H', 'P']
+values: List[str] = ['E', 'e', 'v', 'c', 'w', 'i', 'I', 'C', 'W', 'u', 'U', 'f', 'd', 'D', 'K', 'l', 'L', 'p', 'V', 'O', 'S', 'N', 'M', 'H', 'P']
 assert(all(c not in values[:i] for i, c in enumerate(values)))
-def splitchar(s):
+def splitchar(s: str) -> List[int]:
 	"""
 	splitchar -- Sorting key function for function signatures
 	
@@ -21,62 +47,142 @@ def splitchar(s):
 	except ValueError as e:
 		raise ValueError("Value is " + s) from e
 
-def value(define):
-	"""
-	value -- Get the tested name of a defined( . )/!defined( . )
-	"""
-	return define[9:-1] if define.startswith("!") else define[8:-1]
+@final
+class Define:
+	name: DefineType
+	inverted_: bool
+	
+	defines: List[DefineType] = []
+	
+	def __init__(self, name: DefineType, inverted_: bool):
+		# All values of "name" are included in defines (throw otherwise)
+		if name not in self.defines:
+			raise KeyError(name)
+		self.name = name
+		self.inverted_ = inverted_
+	def copy(self) -> "Define":
+		return Define(self.name, self.inverted_)
+	
+	def value(self) -> int:
+		return self.defines.index(self.name)*2 + (1 if self.inverted_ else 0)
+	
+	def invert(self) -> None:
+		"""
+		invert -- Transform a `defined()` into a `!defined()` and vice-versa, in place.
+		"""
+		self.inverted_ = not self.inverted_
+	def inverted(self) -> "Define":
+		"""
+		invert -- Transform a `defined()` into a `!defined()` and vice-versa, out-of-place.
+		"""
+		return Define(self.name, not self.inverted_)
+	
+	def __str__(self) -> str:
+		if self.inverted_:
+			return "!defined(" + self.name + ")"
+		else:
+			return "defined(" + self.name + ")"
 
-def splitdef(dnf, defines):
-	"""
-	splitdef -- Sorting key function for #ifdefs
+@final
+class Defines:
+	defines: List[Define]
 	
-	All #if defined(...) are sorted first by the number of clauses, then by the
-	number of '||' in each clause and then by the length of the tested names
-	(left to right, inverted placed after non-inverted).
-	"""
-	cunjs = dnf.split(" || ")
-	clauses = [c.split(" && ") for c in cunjs]
-	
-	ret = [len(cunjs)]
-	
-	for cunj in clauses:
-		ret.append(len(cunj))
-	for cunj in clauses:
-		for c in cunj:
-			# All values of "c" are included in defines (throw otherwise)
-			ret.append(defines.index(value(c)) * 2 + (1 if c.startswith("!") else 0))
-	ret.append(0)
-	return ret
+	def __init__(self, defines: Union[List[Define], str] = []):
+		if isinstance(defines, str):
+			if defines == "":
+				self.defines = []
+			else:
+				self.defines = list(
+					map(
+						lambda x:
+							Define(x[9:-1] if x[0] == '!' else x[8:-1], x[0] == '!')
+						, defines.split(" && ")
+					)
+				)
+		else:
+			self.defines = [d.copy() for d in defines]
+	def copy(self) -> "Defines":
+		return Defines(self.defines)
+	
+	def append(self, define: Define) -> None:
+		self.defines.append(define)
+	def invert_last(self) -> None:
+		self.defines[-1].invert()
+	def pop_last(self) -> None:
+		if len(self.defines) > 0: self.defines.pop()
+	
+	def __str__(self) -> str:
+		return " && ".join(map(str, self.defines))
 
-def invert(define):
+@final
+class Clauses:
 	"""
-	invert -- Transform a `defined()` into a `!defined()` and vice-versa.
+	Represent a list of clauses, aka a list of or-ed together and-ed "defined"
+	conditions
 	"""
-	return define[1:] if define.startswith("!") else ("!" + define)
+	definess: List[Defines]
+	
+	def __init__(self, definess: Union[List[Defines], str] = []):
+		if isinstance(definess, str):
+			if definess == "()":
+				self.definess = []
+			elif ") || (" in definess:
+				self.definess = list(map(Defines, definess[1:-1].split(") || (")))
+			else:
+				self.definess = [Defines(definess)]
+		else:
+			self.definess = definess[:]
+	def copy(self) -> "Clauses":
+		return Clauses(self.definess[:])
+	
+	def add(self, defines: Defines) -> None:
+		self.definess.append(defines)
+	
+	def splitdef(self) -> List[int]:
+		"""
+		splitdef -- Sorting key function for #ifdefs
+		
+		All #if defined(...) are sorted first by the number of clauses, then by the
+		number of '&&' in each clause and then by the "key" of the tested names
+		(left to right, inverted placed after non-inverted).
+		"""
+		
+		ret = [len(self.definess)]
+		for cunj in self.definess:
+			ret.append(len(cunj.defines))
+		for cunj in self.definess:
+			for d in cunj.defines:
+				ret.append(d.value())
+		ret.append(0)
+		return ret
+	
+	def __str__(self) -> ClausesStr:
+		if len(self.definess) == 1:
+			return str(self.definess[0])
+		else:
+			return "(" + ") || (".join(map(str, self.definess)) + ")"
 
-def main(root, defines, files, ver):
+def readFiles(files: Sequence[Filename]) -> \
+		Tuple[Dict[str, List[FunctionType]],
+		      Dict[str,      Dict[RedirectType, FunctionType]],
+		      Dict[Filename, Dict[RedirectType, List[str]]]]:
 	"""
-	main -- The main function
+	readFiles
 	
-	root: the root path (where the CMakeLists.txt is located)
-	defines: which `defined( . )` are allowed
-	files: a list of files to parse (wrapped*.h)
-	ver: version number
+	This function is the one that parses the files.
+	It returns the jumbled (gbl, redirects, mytypedefs) tuple.
 	"""
 	
-	global values
-	
 	# Initialize variables: gbl for all values, redirects for redirections
 	# mytypedefs is a list of all "*FE*" types per filename
-	gbl        = {}
-	redirects  = {}
-	mytypedefs = {}
+	gbl       : Dict[ClausesStr, List[FunctionType]]               = {}
+	redirects : Dict[ClausesStr, Dict[RedirectType, FunctionType]] = {}
+	mytypedefs: Dict[Filename,   Dict[RedirectType, List[str]]]    = {}
 	
 	# First read the files inside the headers
 	for filepath in files:
-		filename = filepath.split("/")[-1]
-		dependants = []
+		filename: str = filepath.split("/")[-1]
+		dependants: Defines = Defines()
 		with open(filepath, 'r') as file:
 			for line in file:
 				ln = line.strip()
@@ -91,18 +197,13 @@ def main(root, defines, files, ver):
 						elif preproc_cmd.startswith("error"):
 							continue #error meh!
 						elif preproc_cmd.startswith("endif"):
-							if dependants != []: # If the previous 2 lines were ignored, skip
-								dependants.pop()
+							dependants.pop_last()
 						elif preproc_cmd.startswith("ifdef"):
-							if preproc_cmd[5:].strip() not in defines:
-								raise KeyError(preproc_cmd[5:].strip())
-							dependants.append("defined(" + preproc_cmd[5:].strip() + ")")
+							dependants.append(Define(preproc_cmd[5:].strip(), False))
 						elif preproc_cmd.startswith("ifndef"):
-							if preproc_cmd[6:].strip() not in defines:
-								raise KeyError(preproc_cmd[6:].strip())
-							dependants.append("!defined(" + preproc_cmd[6:].strip() + ")")
+							dependants.append(Define(preproc_cmd[6:].strip(), True))
 						elif preproc_cmd.startswith("else"):
-							dependants[-1] = invert(dependants[-1])
+							dependants.invert_last()
 						else:
 							raise NotImplementedError("Unknown preprocessor directive: {0} ({1}:{2})".format(
 								preproc_cmd.split(" ")[0], filename, line[:-1]
@@ -110,7 +211,7 @@ def main(root, defines, files, ver):
 					except KeyError as k:
 						raise NotImplementedError("Unknown key: {0} ({1}:{2})".format(
 							k.args[0], filename, line[:-1]
-						), k)
+						)) from k
 				# If the line is a `GO...' line (GO/GOM/GO2/...)...
 				elif ln.startswith("GO"):
 					# ... then look at the second parameter of the line
@@ -135,7 +236,7 @@ def main(root, defines, files, ver):
 						raise NotImplementedError("Bad middle letter {0} ({1}:{2})".format(ln[1], filename, line[:-1]))
 					
 					if any(c not in values for c in ln[2:]) or (('v' in ln[2:]) and (len(ln) > 3)):
-						old = ln
+						old = RedirectType(ln)
 						# This needs more work
 						acceptables = ['v', '0', '1'] + values
 						if any(c not in acceptables for c in ln[2:]):
@@ -146,140 +247,199 @@ def main(root, defines, files, ver):
 							.replace("0", "p")  # 0      -> pointer
 							.replace("1", "i")) # 1      -> integer
 						assert(len(ln) >= 3)
-						redirects.setdefault(" && ".join(dependants), {})
-						redirects[" && ".join(dependants)][old] = ln
+						redirects.setdefault(str(dependants), {})
+						redirects[str(dependants)][old] = ln
 					# Simply append the function type if it's not yet existing
-					gbl.setdefault(" && ".join(dependants), [])
-					if ln not in gbl[" && ".join(dependants)]:
-						gbl[" && ".join(dependants)].append(ln)
+					gbl.setdefault(str(dependants), [])
+					if ln not in gbl[str(dependants)]:
+						gbl[str(dependants)].append(ln)
 					
 					if ln[2] == "E":
 						# filename isn't stored with the '_private.h' part
 						if len(ln) > 3:
-							ln = ln[:2] + ln[3:]
+							funtype = RedirectType(ln[:2] + ln[3:])
 						else:
-							ln = ln[:2] + "v"
+							funtype = RedirectType(ln[:2] + "v")
 						mytypedefs.setdefault(filename[:-10], {})
-						mytypedefs[filename[:-10]].setdefault(ln, [])
-						mytypedefs[filename[:-10]][ln].append(funname)
+						mytypedefs[filename[:-10]].setdefault(funtype, [])
+						mytypedefs[filename[:-10]][funtype].append(funname)
 	
 	if ("" not in gbl) or ("" not in redirects):
 		print("\033[1;31mThere is suspiciously not many types...\033[m")
 		print("Check the CMakeLists.txt file. If you are SURE there is nothing wrong"
-		      " (as a random example, `set()` resets the variable...), then comment out the following return.")
+		      " (as a random example, `set()` resets the variable...), then comment out the following exit.")
 		print("(Also, the program WILL crash later if you proceed.)")
-		return 2 # Check what you did, not proceeding
+		sys.exit(2) # Check what you did, not proceeding
 	
+	return gbl, redirects, mytypedefs
+
+def sortArrays(
+	gbl_tmp   : Dict[str,      List[FunctionType]],
+	red_tmp   : Dict[str,      Dict[RedirectType, FunctionType]],
+	mytypedefs: Dict[Filename, Dict[RedirectType, List[str]]]) -> \
+		Tuple[
+			Tuple[Dict[ClausesStr, List[FunctionType]],
+				List[ClausesStr]],
+			Tuple[Dict[ClausesStr, List[Tuple[RedirectType, FunctionType]]],
+				List[ClausesStr]],
+			Tuple[Dict[Filename, Dict[RedirectType, List[str]]],
+				Dict[Filename, List[RedirectType]]]
+		]:
 	# Now, take all function types, and make a new table gbl_vals
 	# This table contains all #if conditions for when a function type needs to
 	# be generated. There is also a filter to avoid duplicate/opposite clauses.
-	gbl_vals = {}
-	for k in gbl:
-		ks = k.split(" && ")
-		for v in gbl[k]:
-			if k == "":
-				gbl_vals[v] = []
-				continue
-			if v in gbl_vals:
-				if gbl_vals[v] == []:
+	gbl_vals: Dict[FunctionType, Clauses] = {}
+	for k1 in gbl_tmp:
+		ks = Defines(k1)
+		for v in gbl_tmp[k1]:
+			if k1 == "":
+				# Unconditionally define v
+				gbl_vals[v] = Clauses()
+				
+			elif v in gbl_vals:
+				if gbl_vals[v].definess == []:
+					# v already unconditionally defined
 					continue
-				for other_key in gbl_vals[v]:
-					other_key_vals = other_key.split(" && ")
-					for other_key_val in other_key_vals:
-						if other_key_val not in ks:
+				
+				for other_key in gbl_vals[v].definess:
+					for other_key_val in other_key.defines:
+						if other_key_val not in ks.defines:
 							# Not a duplicate or more specific case
 							# (could be a less specific one though)
 							break
 					else:
 						break
 				else:
-					gbl_vals[v].append(k)
+					gbl_vals[v].add(ks)
+				
 			else:
-				gbl_vals[v] = [k]
+				gbl_vals[v] = Clauses([Defines(k1)])
+	
 	for v in gbl_vals:
-		for k in gbl_vals[v]:
-			vs = k.split(" && ")
-			for i in range(len(vs)):
-				if " && ".join(vs[:i] + [invert(vs[i])] + vs[i+1:]) in gbl_vals[v]:
+		strdefines = list(map(str, gbl_vals[v].definess))
+		for k2 in gbl_vals[v].definess:
+			for i in range(len(k2.defines)):
+				if " && ".join(map(str, k2.defines[:i] + [k2.defines[i].inverted()] + k2.defines[i+1:])) in strdefines:
 					# Opposite clauses detected
-					gbl_vals[v] = []
+					gbl_vals[v] = Clauses()
 					break
+			else:
+				continue
+			break
+	
 	# Now create a new gbl and gbl_idxs
 	# gbl will contain the final version of gbl (without duplicates, based on
 	# gbl_vals)
 	# gbl_idxs will contain all #if clauses
-	gbl = {}
-	gbl_idxs = []
-	for k in gbl_vals:
-		if len(gbl_vals[k]) == 1:
-			key = gbl_vals[k][0]
-		else:
-			key = "(" + (") || (".join(gbl_vals[k])) + ")"
-		gbl[key] = gbl.get(key, []) + [k]
-		if (key not in gbl_idxs) and (key != "()"):
+	gbl: Dict[ClausesStr, List[FunctionType]] = {}
+	gbl_idxs: List[ClausesStr] = []
+	for k1 in gbl_vals:
+		clauses = gbl_vals[k1]
+		key = str(clauses)
+		gbl.setdefault(key, [])
+		gbl[key].append(k1)
+		if (key not in gbl_idxs) and (clauses.definess != []):
 			gbl_idxs.append(key)
 	# Sort the #if clauses as defined in `splitdef`
-	gbl_idxs.sort(key=lambda v: splitdef(v, defines))
+	gbl_idxs.sort(key=lambda c: Clauses(c).splitdef())
 	
 	# This map will contain all additional function types that are "redirected"
 	# to an already defined type (with some remapping).
-	redirects_vals = {}
-	for k in redirects:
-		ks = k.split(" && ")
-		for v in redirects[k]:
-			if k == "":
-				redirects_vals[(v, redirects[k][v])] = []
-				continue
-			if (v, redirects[k][v]) in redirects_vals:
-				if redirects_vals[(v, redirects[k][v])] == []:
+	redirects_vals: Dict[Tuple[RedirectType, FunctionType], Clauses] = {}
+	for k1 in red_tmp:
+		ks = Defines(k1)
+		for v in red_tmp[k1]:
+			if k1 == "":
+				# Unconditionally define v
+				redirects_vals[(v, red_tmp[k1][v])] = Clauses()
+			
+			elif (v, red_tmp[k1][v]) in redirects_vals:
+				if redirects_vals[(v, red_tmp[k1][v])].definess == []:
+					# v already unconditionally defined
 					continue
-				for other_key in redirects_vals[(v, redirects[k][v])]:
-					if other_key == "()":
-						break
-					other_key_vals = other_key.split(" && ")
-					for other_key_val in other_key_vals:
-						if other_key_val not in ks:
+				
+				for other_key in redirects_vals[(v, red_tmp[k1][v])].definess:
+					for other_key_val in other_key.defines:
+						if other_key_val not in ks.defines:
+							# Not a duplicate or more specific case
+							# (could be a less specific one though)
 							break
 					else:
 						break
 				else:
-					redirects_vals[(v, redirects[k][v])].append(k)
+					redirects_vals[(v, red_tmp[k1][v])].add(ks)
+			
 			else:
-				redirects_vals[(v, redirects[k][v])] = [k]
+				redirects_vals[(v, red_tmp[k1][v])] = Clauses([Defines(k1)])
 	# Also does the same trick as before (also helps keep the order
 	# in the file deterministic)
-	redirects = {}
-	redirects_idxs = []
-	for k, v in redirects_vals:
-		key = "(" + (") || (".join(redirects_vals[(k, v)])) + ")"
-		if key in redirects:
-			redirects[key].append([k, v])
-		else:
-			redirects[key] = [[k, v]]
-		if (key not in redirects_idxs) and (key != "()"):
+	redirects: Dict[ClausesStr, List[Tuple[RedirectType, FunctionType]]] = {}
+	redirects_idxs: List[ClausesStr] = []
+	for k1, v in redirects_vals:
+		clauses = redirects_vals[(k1, v)]
+		key = str(clauses)
+		redirects.setdefault(key, [])
+		redirects[key].append((k1, v))
+		if (key not in redirects_idxs) and (clauses.definess != []):
 			redirects_idxs.append(key)
-	redirects_idxs.sort(key=lambda v: splitdef(v, defines))
+	redirects_idxs.sort(key=lambda c: Clauses(c).splitdef())
 	
 	# Sort the function types as defined in `splitchar`
-	for k in gbl:
-		gbl[k].sort(key=lambda v: splitchar(v))
+	for k3 in gbl:
+		gbl[k3].sort(key=lambda v: splitchar(v))
+	
+	global values
 	values = values + ['0', '1']
-	for k in redirects:
-		redirects[k].sort(key=lambda v: splitchar(v[0]) + [-1] + splitchar(v[1]))
+	for k3 in redirects:
+		redirects[k3].sort(key=lambda v: splitchar(v[0]) + splitchar(v[1]))
 	values = values[:-2]
-	mytypedefs_vals = dict((fn, sorted(mytypedefs[fn].keys(), key=lambda v: splitchar(v))) for fn in mytypedefs)
+	
+	mytypedefs_vals: Dict[Filename, List[RedirectType]] = dict((fn, sorted(mytypedefs[fn].keys(), key=lambda v: splitchar(v))) for fn in mytypedefs)
 	for fn in mytypedefs:
 		for v in mytypedefs_vals[fn]:
 			mytypedefs[fn][v].sort()
 	
+	return (gbl, gbl_idxs), (redirects, redirects_idxs), (mytypedefs, mytypedefs_vals)
+	
+def main(root: str, files: Sequence[Filename], ver: str):
+	"""
+	main -- The main function
+	
+	root: the root path (where the CMakeLists.txt is located)
+	files: a list of files to parse (wrapped*.h)
+	ver: version number
+	"""
+	
+	# gbl_tmp:
+	#  "defined() && ..." -> [vFv, ...]
+	# red_tmp:
+	#  "defined() && ..." -> [vFEv -> vFv, ...]
+	# tdf_tmp:
+	#  "filename" -> [vFEv -> fopen, ...]
+	gbl_tmp: Dict[str,      List[FunctionType]]
+	red_tmp: Dict[str,      Dict[RedirectType, FunctionType]]
+	tdf_tmp: Dict[Filename, Dict[RedirectType, List[str]]]
+	
+	gbl_tmp, red_tmp, tdf_tmp = readFiles(files)
+	
+	gbl            : Dict[ClausesStr, List[FunctionType]]
+	redirects      : Dict[ClausesStr, List[Tuple[RedirectType, FunctionType]]]
+	mytypedefs     : Dict[Filename, Dict[RedirectType, List[str]]]
+	gbl_idxs       : List[ClausesStr]
+	redirects_idxs : List[ClausesStr]
+	mytypedefs_vals: Dict[Filename, List[RedirectType]]
+	
+	(gbl, gbl_idxs), (redirects, redirects_idxs), (mytypedefs, mytypedefs_vals) = \
+		sortArrays(gbl_tmp, red_tmp, tdf_tmp)
+	
 	# Check if there was any new functions compared to last run
-	functions_list = ""
-	for k in ["()"] + gbl_idxs:
+	functions_list: str = ""
+	for k in [str(Clauses())] + gbl_idxs:
 		for v in gbl[k]:
 			functions_list = functions_list + "#" + k + " " + v + "\n"
-	for k in ["()"] + redirects_idxs:
-		for v in redirects[k]:
-			functions_list = functions_list + "#" + k + " " + v[0] + " -> " + v[1] + "\n"
+	for k in [str(Clauses())] + redirects_idxs:
+		for vr, vf in redirects[k]:
+			functions_list = functions_list + "#" + k + " " + vr + " -> " + vf + "\n"
 	
 	# functions_list is a unique string, compare it with the last run
 	try:
@@ -297,15 +457,15 @@ def main(root, defines, files, ver):
 		pass
 	
 	# Detect simple wrappings
-	simple_wraps = {}
+	simple_wraps: Dict[ClausesStr, List[FunctionType]] = {}
 	
 	# H could be allowed maybe?
-	allowed_simply = "v"
-	allowed_regs = "cCwWiuIUlLp"
-	allowed_fpr = "fd"
+	allowed_simply: str = "v"
+	allowed_regs  : str = "cCwWiuIUlLp"
+	allowed_fpr   : str = "fd"
 	
 	# Sanity checks
-	forbidden_simple = "EeDKVOSNMHP"
+	forbidden_simple: str = "EeDKVOSNMHP"
 	assert(len(allowed_simply) + len(allowed_regs) + len(allowed_fpr) + len(forbidden_simple) == len(values))
 	assert(all(c not in allowed_regs for c in allowed_simply))
 	assert(all(c not in allowed_simply + allowed_regs for c in allowed_fpr))
@@ -313,10 +473,10 @@ def main(root, defines, files, ver):
 	assert(all(c in allowed_simply + allowed_regs + allowed_fpr + forbidden_simple for c in values))
 	
 	# Only search on real wrappers
-	for k in ["()"] + gbl_idxs:
+	for k in [str(Clauses())] + gbl_idxs:
 		for v in gbl[k]:
-			regs_count = 0
-			fpr_count  = 0
+			regs_count: int = 0
+			fpr_count : int = 0
 			
 			if v[0] in forbidden_simple:
 				continue
@@ -335,7 +495,7 @@ def main(root, defines, files, ver):
 					# All checks passed!
 					simple_wraps.setdefault(k, []).append(v)
 	simple_idxs = list(simple_wraps.keys())
-	simple_idxs.sort(key=lambda v: [-1] if v == "()" else splitdef(v, defines))
+	simple_idxs.sort(key=lambda x: Clauses(x).splitdef())
 	
 	# Now the files rebuilding part
 	# File headers and guards
@@ -400,7 +560,6 @@ typedef void (*wrapper_t)(x64emu_t* emu, uintptr_t fnc);
 // W = unsigned short w = short
 // O = libc O_ flags bitfield
 // S = _IO_2_1_stdXXX_ pointer (or FILE*)
-// Q = ...
 // N = ... automatically sending 1 arg
 // M = ... automatically sending 2 args
 // H = Huge 128bits value/struct
@@ -433,7 +592,7 @@ int isSimpleWrapper(wrapper_t fun);
 	}
 	
 	# Rewrite the wrapper.c file:
-	def generate_typedefs(arr, file):
+	def generate_typedefs(arr: Sequence[FunctionType], file) -> None:
 		# i and u should only be 32 bits
 		#         E            e             v       c         w          i          I          C          W           u           U           f        d         D              K         l           L            p        V        O          S        N      M      H                    P
 		types = ["x64emu_t*", "x64emu_t**", "void", "int8_t", "int16_t", "int64_t", "int64_t", "uint8_t", "uint16_t", "uint64_t", "uint64_t", "float", "double", "long double", "double", "intptr_t", "uintptr_t", "void*", "void*", "int32_t", "void*", "...", "...", "unsigned __int128", "void*"]
@@ -448,7 +607,7 @@ int isSimpleWrapper(wrapper_t fun);
 		file.write(files_header["wrapper.c"].format(lbr="{", rbr="}", version=ver))
 		
 		# First part: typedefs
-		generate_typedefs(gbl["()"], file)
+		generate_typedefs(gbl[str(Clauses())], file)
 		for k in gbl_idxs:
 			file.write("\n#if " + k + "\n")
 			generate_typedefs(gbl[k], file)
@@ -459,6 +618,35 @@ int isSimpleWrapper(wrapper_t fun);
 		# Next part: function definitions
 		
 		# Helper variables
+		# Return type template
+		vals = [
+			"\n#error Invalid return type: emulator\n",                # E
+			"\n#error Invalid return type: &emulator\n",               # e
+			"fn({0});",                                                # v
+			"R_RAX=fn({0});",                                          # c
+			"R_RAX=fn({0});",                                          # w
+			"R_RAX=(int64_t)fn({0});",                                 # i  should be int32_t
+			"R_RAX=(int64_t)fn({0});",                                 # I
+			"R_RAX=(unsigned char)fn({0});",                           # C
+			"R_RAX=(unsigned short)fn({0});",                          # W
+			"R_RAX=(uint64_t)fn({0});",                                # u  should be uint32_t
+			"R_RAX=fn({0});",                                          # U
+			"emu->xmm[0].f[0]=fn({0});",                               # f
+			"emu->xmm[0].d[0]=fn({0});",                               # d
+			"long double ld=fn({0}); fpu_do_push(emu); ST0val = ld;",  # D
+			"double db=fn({0}); fpu_do_push(emu); ST0val = db;",       # K
+			"R_RAX=(intptr_t)fn({0});",                                # l
+			"R_RAX=(uintptr_t)fn({0});",                               # L
+			"R_RAX=(uintptr_t)fn({0});",                               # p
+			"\n#error Invalid return type: va_list\n",                 # V
+			"\n#error Invalid return type: at_flags\n",                # O
+			"\n#error Invalid return type: _io_file*\n",               # S
+			"\n#error Invalid return type: ... with 1 arg\n",          # N
+			"\n#error Invalid return type: ... with 2 args\n",         # M
+			"unsigned __int128 u128 = fn({0}); R_RAX=(u128&0xFFFFFFFFFFFFFFFFL); R_RDX=(u128>>64)&0xFFFFFFFFFFFFFFFFL;", # H
+			"\n#error Invalid return type: pointer in the stack\n",    # P
+		]
+		
 		# Name of the registers
 		reg_arg = ["R_RDI", "R_RSI", "R_RDX", "R_RCX", "R_R8", "R_R9"]
 		# vreg: value is in a general register
@@ -473,33 +661,6 @@ int isSimpleWrapper(wrapper_t fun);
 		# vstack: value is on the stack (or out of register)
 		#         E  e  v  c  w  i  I  C  W  u  U  f  d  D  K  l  L  p  V  O  S  N  M  H  P
 		vstack = [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 0, 1, 1, 1, 2, 2, 1]
-		arg_s = [
-			"",                                         # E
-			"",                                         # e
-			"",                                         # v
-			"*(int8_t*)(R_RSP + {p}), ",                # c
-			"*(int16_t*)(R_RSP + {p}), ",               # w
-			"*(int64_t*)(R_RSP + {p}), ",               # i  should be int32_t
-			"*(int64_t*)(R_RSP + {p}), ",               # I
-			"*(uint8_t*)(R_RSP + {p}), ",               # C
-			"*(uint16_t*)(R_RSP + {p}), ",              # W
-			"*(uint64_t*)(R_RSP + {p}), ",              # u  should be uint32_t
-			"*(uint64_t*)(R_RSP + {p}), ",              # U
-			"*(float*)(R_RSP + {p}), ",                 # f
-			"*(double*)(R_RSP + {p}), ",                # d
-			"LD2localLD((void*)(R_RSP + {p})), ",       # D
-			"FromLD((void*)(R_RSP + {p})), ",           # K
-			"*(intptr_t*)(R_RSP + {p}), ",              # l
-			"*(uintptr_t*)(R_RSP + {p}), ",             # L
-			"*(void**)(R_RSP + {p}), ",                 # p
-			"",                                         # V
-			"of_convert(*(int32_t*)(R_RSP + {p})), ",   # O
-			"io_convert(*(void**)(R_RSP + {p})), ",     # S
-			"*(void**)(R_RSP + {p}), ",                 # N
-			"*(void**)(R_RSP + {p}),*(void**)(R_RSP + {p} + 8), ", # M
-			"*(unsigned __int128)(R_RSP + {p}), ",      # H
-			"*(void**)(R_RSP + {p}), ",                 # P
-		]
 		arg_r = [
 			"",                            # E
 			"",                            # e
@@ -581,41 +742,41 @@ int isSimpleWrapper(wrapper_t fun);
 			"",                        # H
 			"",                        # P
 		]
-
-		vals = [
-			"\n#error Invalid return type: emulator\n",                # E
-			"\n#error Invalid return type: &emulator\n",               # e
-			"fn({0});",                                                # v
-			"R_RAX=fn({0});",                                          # c
-			"R_RAX=fn({0});",                                          # w
-			"R_RAX=(int64_t)fn({0});",                                 # i  should be int32_t
-			"R_RAX=(int64_t)fn({0});",                                 # I
-			"R_RAX=(unsigned char)fn({0});",                           # C
-			"R_RAX=(unsigned short)fn({0});",                          # W
-			"R_RAX=(uint64_t)fn({0});",                                # u  should be uint32_t
-			"R_RAX=fn({0});",                                          # U
-			"emu->xmm[0].f[0]=fn({0});",                               # f
-			"emu->xmm[0].d[0]=fn({0});",                               # d
-			"long double ld=fn({0}); fpu_do_push(emu); ST0val = ld;",  # D
-			"double db=fn({0}); fpu_do_push(emu); ST0val = db;",       # K
-			"R_RAX=(intptr_t)fn({0});",                                # l
-			"R_RAX=(uintptr_t)fn({0});",                               # L
-			"R_RAX=(uintptr_t)fn({0});",                               # p
-			"\n#error Invalid return type: va_list\n",                 # V
-			"\n#error Invalid return type: at_flags\n",                # O
-			"\n#error Invalid return type: _io_file*\n",               # S
-			"\n#error Invalid return type: ... with 1 arg\n",          # N
-			"\n#error Invalid return type: ... with 2 args\n",         # M
-			"unsigned __int128 u128 = fn({0}); R_RAX=(u128&0xFFFFFFFFFFFFFFFFL); R_RDX=(u128>>64)&0xFFFFFFFFFFFFFFFFL;", # H
-			"\n#error Invalid return type: pointer in the stack\n",    # P
+		arg_s = [
+			"",                                         # E
+			"",                                         # e
+			"",                                         # v
+			"*(int8_t*)(R_RSP + {p}), ",                # c
+			"*(int16_t*)(R_RSP + {p}), ",               # w
+			"*(int64_t*)(R_RSP + {p}), ",               # i  should be int32_t
+			"*(int64_t*)(R_RSP + {p}), ",               # I
+			"*(uint8_t*)(R_RSP + {p}), ",               # C
+			"*(uint16_t*)(R_RSP + {p}), ",              # W
+			"*(uint64_t*)(R_RSP + {p}), ",              # u  should be uint32_t
+			"*(uint64_t*)(R_RSP + {p}), ",              # U
+			"*(float*)(R_RSP + {p}), ",                 # f
+			"*(double*)(R_RSP + {p}), ",                # d
+			"LD2localLD((void*)(R_RSP + {p})), ",       # D
+			"FromLD((void*)(R_RSP + {p})), ",           # K
+			"*(intptr_t*)(R_RSP + {p}), ",              # l
+			"*(uintptr_t*)(R_RSP + {p}), ",             # L
+			"*(void**)(R_RSP + {p}), ",                 # p
+			"",                                         # V
+			"of_convert(*(int32_t*)(R_RSP + {p})), ",   # O
+			"io_convert(*(void**)(R_RSP + {p})), ",     # S
+			"*(void**)(R_RSP + {p}), ",                 # N
+			"*(void**)(R_RSP + {p}),*(void**)(R_RSP + {p} + 8), ", # M
+			"*(unsigned __int128)(R_RSP + {p}), ",      # H
+			"*(void**)(R_RSP + {p}), ",                 # P
 		]
+
 		# Asserts
 		if len(values) != len(vstack):
 			raise NotImplementedError("len(values) = {lenval} != len(vstack) = {lenvstack}".format(lenval=len(values), lenvstack=len(vstack)))
 		if len(values) != len(vreg):
 			raise NotImplementedError("len(values) = {lenval} != len(vreg) = {lenvreg}".format(lenval=len(values), lenvreg=len(vreg)))
 		if len(values) != len(vxmm):
-			raise NotImplementedError("len(values) = {lenval} != len(vxmm) = {lenvxmm}".format(lenval=len(values), lenvvxmm=len(vxmm)))
+			raise NotImplementedError("len(values) = {lenval} != len(vxmm) = {lenvxmm}".format(lenval=len(values), lenvxmm=len(vxmm)))
 		if len(values) != len(vother):
 			raise NotImplementedError("len(values) = {lenval} != len(vother) = {lenvother}".format(lenval=len(values), lenvother=len(vother)))
 		if len(values) != len(arg_s):
@@ -630,7 +791,7 @@ int isSimpleWrapper(wrapper_t fun);
 			raise NotImplementedError("len(values) = {lenval} != len(vals) = {lenvals}".format(lenval=len(values), lenvals=len(vals)))
 		
 		# Helper functions to write the function definitions
-		def function_args(args, d=8, r=0, x=0):
+		def function_args(args: FunctionType, d: int = 8, r: int = 0, x: int = 0) -> str:
 			# args: string of argument types
 			# d: delta (in the stack)
 			# r: general register no
@@ -663,7 +824,7 @@ int isSimpleWrapper(wrapper_t fun);
 				# Value is somewhere else
 				return arg_o[idx].format(p=d) + function_args(args[1:], d, r, x)
 		
-		def function_writer(f, N, W):
+		def function_writer(f, N: FunctionType, W: FunctionType) -> None:
 			# Write to f the function type N (real type W)
 			# rettype is a single character, args is the string of argument types
 			# (those could actually be deduced from N)
@@ -672,7 +833,7 @@ int isSimpleWrapper(wrapper_t fun);
 			# Generic function
 			f.write(vals[values.index(N[0])].format(function_args(N[2:])[:-2]) + " }\n")
 		
-		for v in gbl["()"]:
+		for v in gbl[str(Clauses())]:
 			if v == "vFv":
 				# Suppress all warnings...
 				file.write("void vFv(x64emu_t *emu, uintptr_t fcn) { vFv_t fn = (vFv_t)fcn; fn(); (void)emu; }\n")
@@ -684,12 +845,12 @@ int isSimpleWrapper(wrapper_t fun);
 				function_writer(file, v, v + "_t")
 			file.write("#endif\n")
 		file.write("\n")
-		for v in redirects["()"]:
-			function_writer(file, v[0], v[1] + "_t")
+		for vr, vf in redirects[str(Clauses())]:
+			function_writer(file, vr, vf + "_t")
 		for k in redirects_idxs:
 			file.write("\n#if " + k + "\n")
-			for v in redirects[k]:
-				function_writer(file, v[0], v[1] + "_t")
+			for vr, vf in redirects[k]:
+				function_writer(file, vr, vf + "_t")
 			file.write("#endif\n")
 		
 		# Write the isSimpleWrapper function
@@ -709,7 +870,7 @@ int isSimpleWrapper(wrapper_t fun);
 	with open(os.path.join(root, "src", "wrapped", "generated", "wrapper.h"), 'w') as file:
 		file.write(files_header["wrapper.h"].format(lbr="{", rbr="}", version=ver))
 		# Normal function types
-		for v in gbl["()"]:
+		for v in gbl[str(Clauses())]:
 			file.write("void " + v + "(x64emu_t *emu, uintptr_t fnc);\n")
 		for k in gbl_idxs:
 			file.write("\n#if " + k + "\n")
@@ -718,12 +879,12 @@ int isSimpleWrapper(wrapper_t fun);
 			file.write("#endif\n")
 		file.write("\n")
 		# Redirects
-		for v in redirects["()"]:
-			file.write("void " + v[0] + "(x64emu_t *emu, uintptr_t fnc);\n")
+		for vr, _ in redirects[str(Clauses())]:
+			file.write("void " + vr + "(x64emu_t *emu, uintptr_t fnc);\n")
 		for k in redirects_idxs:
 			file.write("\n#if " + k + "\n")
-			for v in redirects[k]:
-				file.write("void " + v[0] + "(x64emu_t *emu, uintptr_t fnc);\n")
+			for vr, _ in redirects[k]:
+				file.write("void " + vr + "(x64emu_t *emu, uintptr_t fnc);\n")
 			file.write("#endif\n")
 		file.write(files_guard["wrapper.h"].format(lbr="{", rbr="}", version=ver))
 	
@@ -750,6 +911,7 @@ if __name__ == '__main__':
 	for i, v in enumerate(sys.argv):
 		if v == "--":
 			limit.append(i)
-	if main(sys.argv[1], sys.argv[2:limit[0]], sys.argv[limit[0]+1:], "1.3.0.12") != 0:
+	Define.defines = sys.argv[2:limit[0]]
+	if main(sys.argv[1], sys.argv[limit[0]+1:], "2.0.0.13") != 0:
 		exit(2)
 	exit(0)
diff --git a/src/wrapped/generated/wrappedbz2types.h b/src/wrapped/generated/wrappedbz2types.h
index 642a8887..d55ec009 100644
--- a/src/wrapped/generated/wrappedbz2types.h
+++ b/src/wrapped/generated/wrappedbz2types.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedbz2TYPES_H_
 #define __wrappedbz2TYPES_H_
diff --git a/src/wrapped/generated/wrappedcryptotypes.h b/src/wrapped/generated/wrappedcryptotypes.h
index 600dff4c..dc766cd4 100644
--- a/src/wrapped/generated/wrappedcryptotypes.h
+++ b/src/wrapped/generated/wrappedcryptotypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedcryptoTYPES_H_
 #define __wrappedcryptoTYPES_H_
diff --git a/src/wrapped/generated/wrappedcurltypes.h b/src/wrapped/generated/wrappedcurltypes.h
index 0da88c16..51016b24 100644
--- a/src/wrapped/generated/wrappedcurltypes.h
+++ b/src/wrapped/generated/wrappedcurltypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedcurlTYPES_H_
 #define __wrappedcurlTYPES_H_
diff --git a/src/wrapped/generated/wrappeddbustypes.h b/src/wrapped/generated/wrappeddbustypes.h
index 999ff10e..edd8c998 100644
--- a/src/wrapped/generated/wrappeddbustypes.h
+++ b/src/wrapped/generated/wrappeddbustypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappeddbusTYPES_H_
 #define __wrappeddbusTYPES_H_
diff --git a/src/wrapped/generated/wrappedexpattypes.h b/src/wrapped/generated/wrappedexpattypes.h
index 12d57431..5cb6d168 100644
--- a/src/wrapped/generated/wrappedexpattypes.h
+++ b/src/wrapped/generated/wrappedexpattypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedexpatTYPES_H_
 #define __wrappedexpatTYPES_H_
diff --git a/src/wrapped/generated/wrappedflactypes.h b/src/wrapped/generated/wrappedflactypes.h
index 1aded520..72321809 100644
--- a/src/wrapped/generated/wrappedflactypes.h
+++ b/src/wrapped/generated/wrappedflactypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedflacTYPES_H_
 #define __wrappedflacTYPES_H_
diff --git a/src/wrapped/generated/wrappedfontconfigtypes.h b/src/wrapped/generated/wrappedfontconfigtypes.h
index cbbf89ef..404df1a4 100644
--- a/src/wrapped/generated/wrappedfontconfigtypes.h
+++ b/src/wrapped/generated/wrappedfontconfigtypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedfontconfigTYPES_H_
 #define __wrappedfontconfigTYPES_H_
diff --git a/src/wrapped/generated/wrappedfreetypetypes.h b/src/wrapped/generated/wrappedfreetypetypes.h
index e0a1a903..f0ccf9a2 100644
--- a/src/wrapped/generated/wrappedfreetypetypes.h
+++ b/src/wrapped/generated/wrappedfreetypetypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedfreetypeTYPES_H_
 #define __wrappedfreetypeTYPES_H_
diff --git a/src/wrapped/generated/wrappedgnutlstypes.h b/src/wrapped/generated/wrappedgnutlstypes.h
index 6a497aa3..ed3803ce 100644
--- a/src/wrapped/generated/wrappedgnutlstypes.h
+++ b/src/wrapped/generated/wrappedgnutlstypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedgnutlsTYPES_H_
 #define __wrappedgnutlsTYPES_H_
diff --git a/src/wrapped/generated/wrappedldlinuxtypes.h b/src/wrapped/generated/wrappedldlinuxtypes.h
index 3261e14e..0d03cc90 100644
--- a/src/wrapped/generated/wrappedldlinuxtypes.h
+++ b/src/wrapped/generated/wrappedldlinuxtypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedldlinuxTYPES_H_
 #define __wrappedldlinuxTYPES_H_
diff --git a/src/wrapped/generated/wrappedlibasoundtypes.h b/src/wrapped/generated/wrappedlibasoundtypes.h
index 6f0ccfad..7cafcc34 100644
--- a/src/wrapped/generated/wrappedlibasoundtypes.h
+++ b/src/wrapped/generated/wrappedlibasoundtypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedlibasoundTYPES_H_
 #define __wrappedlibasoundTYPES_H_
diff --git a/src/wrapped/generated/wrappedlibctypes.h b/src/wrapped/generated/wrappedlibctypes.h
index ac39432f..81f51164 100644
--- a/src/wrapped/generated/wrappedlibctypes.h
+++ b/src/wrapped/generated/wrappedlibctypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedlibcTYPES_H_
 #define __wrappedlibcTYPES_H_
diff --git a/src/wrapped/generated/wrappedlibdltypes.h b/src/wrapped/generated/wrappedlibdltypes.h
index 613a0638..f12f52df 100644
--- a/src/wrapped/generated/wrappedlibdltypes.h
+++ b/src/wrapped/generated/wrappedlibdltypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedlibdlTYPES_H_
 #define __wrappedlibdlTYPES_H_
diff --git a/src/wrapped/generated/wrappedlibgltypes.h b/src/wrapped/generated/wrappedlibgltypes.h
index 0a8aaa9d..7154e6e3 100644
--- a/src/wrapped/generated/wrappedlibgltypes.h
+++ b/src/wrapped/generated/wrappedlibgltypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedlibglTYPES_H_
 #define __wrappedlibglTYPES_H_
diff --git a/src/wrapped/generated/wrappedlibglutypes.h b/src/wrapped/generated/wrappedlibglutypes.h
index 41213d7f..a2dd9c43 100644
--- a/src/wrapped/generated/wrappedlibglutypes.h
+++ b/src/wrapped/generated/wrappedlibglutypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedlibgluTYPES_H_
 #define __wrappedlibgluTYPES_H_
diff --git a/src/wrapped/generated/wrappedlibpthreadtypes.h b/src/wrapped/generated/wrappedlibpthreadtypes.h
index 59ba240e..3d4c0a26 100644
--- a/src/wrapped/generated/wrappedlibpthreadtypes.h
+++ b/src/wrapped/generated/wrappedlibpthreadtypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedlibpthreadTYPES_H_
 #define __wrappedlibpthreadTYPES_H_
diff --git a/src/wrapped/generated/wrappedlibrttypes.h b/src/wrapped/generated/wrappedlibrttypes.h
index 28005685..b31ceaf8 100644
--- a/src/wrapped/generated/wrappedlibrttypes.h
+++ b/src/wrapped/generated/wrappedlibrttypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedlibrtTYPES_H_
 #define __wrappedlibrtTYPES_H_
diff --git a/src/wrapped/generated/wrappedlibsmtypes.h b/src/wrapped/generated/wrappedlibsmtypes.h
index a730c34c..08779089 100644
--- a/src/wrapped/generated/wrappedlibsmtypes.h
+++ b/src/wrapped/generated/wrappedlibsmtypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedlibsmTYPES_H_
 #define __wrappedlibsmTYPES_H_
diff --git a/src/wrapped/generated/wrappedlibssltypes.h b/src/wrapped/generated/wrappedlibssltypes.h
index 0ab0d2ce..805b0445 100644
--- a/src/wrapped/generated/wrappedlibssltypes.h
+++ b/src/wrapped/generated/wrappedlibssltypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedlibsslTYPES_H_
 #define __wrappedlibsslTYPES_H_
diff --git a/src/wrapped/generated/wrappedlibx11types.h b/src/wrapped/generated/wrappedlibx11types.h
index c2160c7c..afef27e6 100644
--- a/src/wrapped/generated/wrappedlibx11types.h
+++ b/src/wrapped/generated/wrappedlibx11types.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedlibx11TYPES_H_
 #define __wrappedlibx11TYPES_H_
diff --git a/src/wrapped/generated/wrappedlibxexttypes.h b/src/wrapped/generated/wrappedlibxexttypes.h
index 76907a8d..60324d87 100644
--- a/src/wrapped/generated/wrappedlibxexttypes.h
+++ b/src/wrapped/generated/wrappedlibxexttypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedlibxextTYPES_H_
 #define __wrappedlibxextTYPES_H_
diff --git a/src/wrapped/generated/wrappedlibxtsttypes.h b/src/wrapped/generated/wrappedlibxtsttypes.h
index e4911baa..e8fa799d 100644
--- a/src/wrapped/generated/wrappedlibxtsttypes.h
+++ b/src/wrapped/generated/wrappedlibxtsttypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedlibxtstTYPES_H_
 #define __wrappedlibxtstTYPES_H_
diff --git a/src/wrapped/generated/wrappedlibxttypes.h b/src/wrapped/generated/wrappedlibxttypes.h
index 1dc97f13..b8ed27b9 100644
--- a/src/wrapped/generated/wrappedlibxttypes.h
+++ b/src/wrapped/generated/wrappedlibxttypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedlibxtTYPES_H_
 #define __wrappedlibxtTYPES_H_
diff --git a/src/wrapped/generated/wrappedlibztypes.h b/src/wrapped/generated/wrappedlibztypes.h
index e9a2095a..896fa768 100644
--- a/src/wrapped/generated/wrappedlibztypes.h
+++ b/src/wrapped/generated/wrappedlibztypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedlibzTYPES_H_
 #define __wrappedlibzTYPES_H_
diff --git a/src/wrapped/generated/wrappedopenaltypes.h b/src/wrapped/generated/wrappedopenaltypes.h
index a3a7ae6e..23d9eb44 100644
--- a/src/wrapped/generated/wrappedopenaltypes.h
+++ b/src/wrapped/generated/wrappedopenaltypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedopenalTYPES_H_
 #define __wrappedopenalTYPES_H_
diff --git a/src/wrapped/generated/wrappedpangotypes.h b/src/wrapped/generated/wrappedpangotypes.h
index c6a2c80a..056c7d89 100644
--- a/src/wrapped/generated/wrappedpangotypes.h
+++ b/src/wrapped/generated/wrappedpangotypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedpangoTYPES_H_
 #define __wrappedpangoTYPES_H_
diff --git a/src/wrapped/generated/wrappedpng16types.h b/src/wrapped/generated/wrappedpng16types.h
index 7e54c1c0..c0b5ed6c 100644
--- a/src/wrapped/generated/wrappedpng16types.h
+++ b/src/wrapped/generated/wrappedpng16types.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedpng16TYPES_H_
 #define __wrappedpng16TYPES_H_
diff --git a/src/wrapped/generated/wrappedpulsetypes.h b/src/wrapped/generated/wrappedpulsetypes.h
index a3797cb6..58e95b84 100644
--- a/src/wrapped/generated/wrappedpulsetypes.h
+++ b/src/wrapped/generated/wrappedpulsetypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedpulseTYPES_H_
 #define __wrappedpulseTYPES_H_
diff --git a/src/wrapped/generated/wrappedsdl1imagetypes.h b/src/wrapped/generated/wrappedsdl1imagetypes.h
index 7ccad27a..86085912 100644
--- a/src/wrapped/generated/wrappedsdl1imagetypes.h
+++ b/src/wrapped/generated/wrappedsdl1imagetypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedsdl1imageTYPES_H_
 #define __wrappedsdl1imageTYPES_H_
diff --git a/src/wrapped/generated/wrappedsdl1mixertypes.h b/src/wrapped/generated/wrappedsdl1mixertypes.h
index 745b7ac8..ced84f3b 100644
--- a/src/wrapped/generated/wrappedsdl1mixertypes.h
+++ b/src/wrapped/generated/wrappedsdl1mixertypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedsdl1mixerTYPES_H_
 #define __wrappedsdl1mixerTYPES_H_
diff --git a/src/wrapped/generated/wrappedsdl1soundtypes.h b/src/wrapped/generated/wrappedsdl1soundtypes.h
index 629c866e..ce521f5b 100644
--- a/src/wrapped/generated/wrappedsdl1soundtypes.h
+++ b/src/wrapped/generated/wrappedsdl1soundtypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedsdl1soundTYPES_H_
 #define __wrappedsdl1soundTYPES_H_
diff --git a/src/wrapped/generated/wrappedsdl1ttftypes.h b/src/wrapped/generated/wrappedsdl1ttftypes.h
index 818f9130..4f020df2 100644
--- a/src/wrapped/generated/wrappedsdl1ttftypes.h
+++ b/src/wrapped/generated/wrappedsdl1ttftypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedsdl1ttfTYPES_H_
 #define __wrappedsdl1ttfTYPES_H_
diff --git a/src/wrapped/generated/wrappedsdl1types.h b/src/wrapped/generated/wrappedsdl1types.h
index 35fcf38c..ed1e5ccb 100644
--- a/src/wrapped/generated/wrappedsdl1types.h
+++ b/src/wrapped/generated/wrappedsdl1types.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedsdl1TYPES_H_
 #define __wrappedsdl1TYPES_H_
diff --git a/src/wrapped/generated/wrappedsdl2imagetypes.h b/src/wrapped/generated/wrappedsdl2imagetypes.h
index 857c7a85..f54a6928 100644
--- a/src/wrapped/generated/wrappedsdl2imagetypes.h
+++ b/src/wrapped/generated/wrappedsdl2imagetypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedsdl2imageTYPES_H_
 #define __wrappedsdl2imageTYPES_H_
diff --git a/src/wrapped/generated/wrappedsdl2mixertypes.h b/src/wrapped/generated/wrappedsdl2mixertypes.h
index 75dc35de..ee90054f 100644
--- a/src/wrapped/generated/wrappedsdl2mixertypes.h
+++ b/src/wrapped/generated/wrappedsdl2mixertypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedsdl2mixerTYPES_H_
 #define __wrappedsdl2mixerTYPES_H_
diff --git a/src/wrapped/generated/wrappedsdl2ttftypes.h b/src/wrapped/generated/wrappedsdl2ttftypes.h
index cab07246..9e481582 100644
--- a/src/wrapped/generated/wrappedsdl2ttftypes.h
+++ b/src/wrapped/generated/wrappedsdl2ttftypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedsdl2ttfTYPES_H_
 #define __wrappedsdl2ttfTYPES_H_
diff --git a/src/wrapped/generated/wrappedsdl2types.h b/src/wrapped/generated/wrappedsdl2types.h
index 0aaa6390..6123d9d6 100644
--- a/src/wrapped/generated/wrappedsdl2types.h
+++ b/src/wrapped/generated/wrappedsdl2types.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedsdl2TYPES_H_
 #define __wrappedsdl2TYPES_H_
diff --git a/src/wrapped/generated/wrappedsmpeg2types.h b/src/wrapped/generated/wrappedsmpeg2types.h
index 1bc81835..e8b138bf 100644
--- a/src/wrapped/generated/wrappedsmpeg2types.h
+++ b/src/wrapped/generated/wrappedsmpeg2types.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedsmpeg2TYPES_H_
 #define __wrappedsmpeg2TYPES_H_
diff --git a/src/wrapped/generated/wrappedsmpegtypes.h b/src/wrapped/generated/wrappedsmpegtypes.h
index f58ef8e2..75b4cf9f 100644
--- a/src/wrapped/generated/wrappedsmpegtypes.h
+++ b/src/wrapped/generated/wrappedsmpegtypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedsmpegTYPES_H_
 #define __wrappedsmpegTYPES_H_
diff --git a/src/wrapped/generated/wrappedutiltypes.h b/src/wrapped/generated/wrappedutiltypes.h
index b71eb85c..cfaabed6 100644
--- a/src/wrapped/generated/wrappedutiltypes.h
+++ b/src/wrapped/generated/wrappedutiltypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedutilTYPES_H_
 #define __wrappedutilTYPES_H_
diff --git a/src/wrapped/generated/wrappedvorbisfiletypes.h b/src/wrapped/generated/wrappedvorbisfiletypes.h
index 84e5e334..a88c6330 100644
--- a/src/wrapped/generated/wrappedvorbisfiletypes.h
+++ b/src/wrapped/generated/wrappedvorbisfiletypes.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedvorbisfileTYPES_H_
 #define __wrappedvorbisfileTYPES_H_
diff --git a/src/wrapped/generated/wrappedxml2types.h b/src/wrapped/generated/wrappedxml2types.h
index 95a88d61..89f58f8d 100644
--- a/src/wrapped/generated/wrappedxml2types.h
+++ b/src/wrapped/generated/wrappedxml2types.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __wrappedxml2TYPES_H_
 #define __wrappedxml2TYPES_H_
diff --git a/src/wrapped/generated/wrapper.c b/src/wrapped/generated/wrapper.c
index 3ca1cd78..90acead3 100644
--- a/src/wrapped/generated/wrapper.c
+++ b/src/wrapped/generated/wrapper.c
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #include <stdio.h>
 #include <stdlib.h>
diff --git a/src/wrapped/generated/wrapper.h b/src/wrapped/generated/wrapper.h
index 9dc0ebf9..89294b87 100644
--- a/src/wrapped/generated/wrapper.h
+++ b/src/wrapped/generated/wrapper.h
@@ -1,5 +1,5 @@
 /*******************************************************************
- * File automatically generated by rebuild_wrappers.py (v1.3.0.12) *
+ * File automatically generated by rebuild_wrappers.py (v2.0.0.13) *
  *******************************************************************/
 #ifndef __WRAPPER_H_
 #define __WRAPPER_H_
@@ -23,7 +23,6 @@ typedef void (*wrapper_t)(x64emu_t* emu, uintptr_t fnc);
 // W = unsigned short w = short
 // O = libc O_ flags bitfield
 // S = _IO_2_1_stdXXX_ pointer (or FILE*)
-// Q = ...
 // N = ... automatically sending 1 arg
 // M = ... automatically sending 2 args
 // H = Huge 128bits value/struct