# To autoload this file into GDB, put the following line in ~/.gdbinit:
#
#     python execfile("/path/to/icu_unicodestring_prettyprinter.py")
#
# You can also run that line of code in the GDB console without adding it to ~/.gdbinit.

from __future__ import print_function
from array import array
import re

class UnicodeStringPrinter:
	"""GDB pretty printer for ICU4C UnicodeString"""

	def __init__(self, val):
		self.val = val

	def to_string(self):
		fLengthAndFlags = self.val["fUnion"]["fFields"]["fLengthAndFlags"]

		if fLengthAndFlags >= 0:
			# Short length
			length = fLengthAndFlags >> 5
		else:
			# Long length
			length = self.val["fUnion"]["fFields"]["fLength"]

		if (fLengthAndFlags & 2) != 0:
			# Stack storage
			if (fLengthAndFlags & 1) != 0:
				return u"UnicodeString (BOGUS)"
			stack = True
			buffer = self.val["fUnion"]["fStackFields"]["fBuffer"]
		else:
			# Heap storage
			stack = False
			buffer = self.val["fUnion"]["fFields"]["fArray"]

		content = array('B', [buffer[i] for i in range(length)]).tostring()
		return u"UnicodeString (%d on %s): \"%s\"" % (
			length,
			u"stack" if stack else u"heap",
			content)

unicode_string_re = re.compile("^icu_?\d*::UnicodeString$")

def lookup_type(val):
	if unicode_string_re.match(str(val.type)):
		return UnicodeStringPrinter(val)
	return None

gdb.pretty_printers.append(lookup_type)