xgl.py: add more methods to Param and Proto
diff --git a/xgl.py b/xgl.py
index 5755855..544b362 100644
--- a/xgl.py
+++ b/xgl.py
@@ -37,6 +37,28 @@
         else:
             return "%s %s" % (self.ty, self.name)
 
+    def indirection_level(self):
+        """Return the level of indirection."""
+        return self.ty.count("*") + self.ty.count("[")
+
+    def dereferenced_type(self, level=0):
+        """Return the type after dereferencing."""
+        if not level:
+            level = self.indirection_level()
+
+        deref = self.ty if level else ""
+        while level > 0:
+            idx = deref.rfind("[")
+            if idx < 0:
+                idx = deref.rfind("*")
+            if idx < 0:
+                deref = ""
+                break
+            deref = deref[:idx]
+            level -= 1;
+
+        return deref.rstrip()
+
     def __repr__(self):
         return "Param(\"%s\", \"%s\")" % (self.ty, self.name)
 
@@ -108,6 +130,15 @@
         """Return a call to the prototype in C."""
         return "%s(%s)" % (self.name, self.c_params(need_type=False))
 
+    def object_in_params(self):
+        """Return the params that are simple XGL objects and are inputs."""
+        return [param for param in self.params if param.ty in objects]
+
+    def object_out_params(self):
+        """Return the params that are simple XGL objects and are outputs."""
+        return [param for param in self.params
+                if param.dereferenced_type() in objects]
+
     def __repr__(self):
         param_strs = []
         for param in self.params: