#!/usr/bin/python2.3

import libxml2

# we need: export PYTHONPATH="/usr/lib/python2.3:/home/wxwindows/lib/python/:/home/wxwindows/pythonlibs/lib/python2.3/site-packages/:/home/wxwindows/pythonlibs/usr/lib/python2.3/site-packages/"

class XPathElem:
  def __init__(self, node):
    self.node = node
  def value(self, path): return self.node.xpathEval('string(' + path + ')')
  def nodes(self, path): return [ XPathElem(x) for x in self.node.xpathEval(path) ]
  def test(self, path): return self.node.xpathEval('boolean(' + path + ')')

root = XPathElem(libxml2.parseFile("/home/wxwindows/public_html/xmldocs/classes.xml"))

includes = '#include <wx/wx.h>\n';
main = 'void main () {';

platform = 'gtk';

for myclass in root.nodes ('/classes/class'):
  specific = myclass.value('@specific') 
  if specific and (specific != platform):
    continue
  annotation = myclass.value('@annotation')
  if annotation and (annotation == 'abstract'):
    continue
  obsolete = myclass.value('@obsolete')
  if obsolete:
    continue
  needdef = myclass.value('@needdefine') 
  if needdef:
    # print "#ifdef " + needdef
    main += "#if " + needdef + " == 1\n"
  if myclass.value('@name') == 'wxArray':
    continue;
  if myclass.value('@name') == 'wxURL':
    continue;
  if myclass.value('@name') == 'wxDelegateRendererNative':
    continue;
  main += "\n// Looking at class " + myclass.value('@name') + "\n"
  for myinclude in myclass.nodes ('includes/header'):
    if needdef:
      includes += "#if " + needdef + " == 1\n"
    includes += '#include <' + myinclude.value('@name') + ">\n"
    if needdef:
      includes += "#endif\n";
  main += myclass.value('@name') + " * my" + myclass.value('@name') + ";\n"
  for mymethod in myclass.nodes ('members/member'):
    # ignore destructors
    name = mymethod.value('@name')
    if name != "" and name[0] == '~':
      continue
    specific = mymethod.value('@specific') 
    if specific and (specific != platform):
      continue
    obsolete = mymethod.value('@obsolete') 
    if obsolete: 
      continue
    # ignore `operator *'
    if name[0:8] == "operator":
      continue
    main += "// Looking at method " + myclass.value('@name') + "::" + mymethod.value('@name')  + "\n"
    meth_needdef = mymethod.value('@needdefine') 
    if meth_needdef: 
      main += "#if " + meth_needdef + " == 1\n"
    i = 0;
    j = 0;
    for myfunction in mymethod.nodes ('function'):
      specific = myfunction.value('@specific') 
      if specific and (specific != platform):
        continue
      funcname = myfunction.value('@name');
      # ignore `operator *'
      if funcname[0:8] == "operator":
        continue
      obsolete = myfunction.value('@obsolete') 
      if obsolete:
        continue
      funcneeddef = myfunction.value('@needdefine') 
      if funcneeddef:
        # print "#ifdef " + funcneeddef
        main += "#if " + funcneeddef + " == 1\n"
      call = ""
      retname = myfunction.value('@type') 
      retname = retname.replace('&','')
      # ignore `virtual '
      if retname[0:7] == 'virtual':
        continue
      if (retname == ""):
        retname += myfunction.value('@name') + " * new" + funcname + str(i) + " = new " + funcname
      elif (retname[0:4] == "void") or (retname[0:11] == 'static void'):
        retname = "my" + myclass.value('@name') + "->" + funcname
      else:
        retname += " ret" + myclass.value('@name') + funcname + str(i) + " = my" + myclass.value('@name') + "->" + funcname

      params = '';
      first = 1;
      for param in myfunction.nodes ('parameters/parameter'):
        paramname = mymethod.value('@class') + funcname + param.value('@name') 
	paramname = paramname.replace(' ','')
	paramtype = param.value('@type').replace('&','')
	paramtype = paramtype.replace('const ','')
	if paramname [-2:] == '[]':
	  paramtype += " *"
	  paramname = paramname.replace('[','')
	  paramname = paramname.replace(']','')
	  paramname += 'ptr'
	paramname = paramname.replace('*','ptr')
	paramname += str(j)
        main += paramtype + " * " + paramname + ";\n"
        if (first == 0):
          params += ', '
	first = 0;
        params += " * " + paramname
        j += 1
      main += retname + '(' + params + ");\n"
      i += 1
      if funcneeddef:
        main += "#endif //" + funcneeddef + "\n"
    if meth_needdef: 
      main += "#endif //" + meth_needdef + "\n"
  if needdef:
    main += "#endif //" + needdef + "\n"

print includes
print "typedef wxIcon wxIconOrCursor;\n";
print main + '}';

