#
#
#

import sys
import re

from pykd import isWindbgExt
from pykd import dprintln
from pykd import expr
from pykd import typedVar
from pykd import typeInfo
from pykd import addr64
from pykd import sizeof


def addTableChilds( table, links ):
   
    table.append( links.getAddress() + sizeof( "nt!_RTL_BALANCED_LINKS" ) )

    if links.LeftChild != 0:
        addTableChilds( table, typedVar("nt!_RTL_BALANCED_LINKS", links.LeftChild) )
    if links.RightChild != 0:
        addTableChilds( table, typedVar("nt!_RTL_BALANCED_LINKS", links.RightChild) )       


def getAVLTable( addr ):

    table = []
    avl = typedVar( "nt!_RTL_AVL_TABLE", addr )
    addTableChilds( table, avl.BalancedRoot )
    return table


def printUsage():
    dprintln( "!py avl [addr] (type)")


if __name__ == "__main__":

    if len( sys.argv ) < 2:
        printUsage()
        quit(0)
   
    showAll = False
    args = sys.argv
    if '-a' in args:
        args.remove('-a')
        showAll = True
        
    items = getAVLTable( addr64( expr( sys.argv[1] ) ) )       
        
    if showAll:
        if len( sys.argv ) == 2:
            dprintln( "\n".join( [ "<link cmd=\"db 0x%x\">db 0x%x</link>" % (  entry, entry ) for entry in items ] ), True )
        else:
            ti = typeInfo(sys.argv[2])
            dprintln( "\n".join( [ "<link cmd=\"dt %s 0x%x\">dt %s</link>\n%s" % ( sys.argv[2], entry, sys.argv[2], typedVar(ti, entry) ) for entry in items ] ), True )  
    
    else:
        if len( sys.argv ) == 2:
            dprintln( "\n".join( [ "<link cmd=\"db 0x%x\">db 0x%x</link>" % (  entry, entry ) for entry in items ] ), True )
        else:
            dprintln( "\n".join( [ "<link cmd=\"dt %s 0x%x\">dt %s</link>" % ( sys.argv[2], entry, sys.argv[2] ) for entry in items ] ), True )