1"""
2Example data formatters for strings represented as (pointer,length) pairs
3encoded in UTF8/16/32 for use with the LLDB debugger
4
5To use in your projects, tweak the children names as appropriate for your data structures
6and use as summaries for your data types
7
8part of The LLVM Compiler Infrastructure
9This file is distributed under the University of Illinois Open Source
10License. See LICENSE.TXT for details.
11"""
12
13import lldb
14def utf8_summary(value,unused):
15	pointer = value.GetChildMemberWithName("first").GetValueAsUnsigned(0)
16	length = value.GetChildMemberWithName("second").GetValueAsUnsigned(0)
17	if pointer == 0:
18		return False
19	if length == 0:
20		return '""'
21	error = lldb.SBError()
22	string_data = value.process.ReadMemory(pointer, length, error)
23	return '"%s"' % (string_data) # utf8 is safe to emit as-is on OSX
24
25def utf16_summary(value,unused):
26	pointer = value.GetChildMemberWithName("first").GetValueAsUnsigned(0)
27	length = value.GetChildMemberWithName("second").GetValueAsUnsigned(0)
28	# assume length is in bytes - if in UTF16 chars, just multiply by 2
29	if pointer == 0:
30		return False
31	if length == 0:
32		return '""'
33	error = lldb.SBError()
34	string_data = value.process.ReadMemory(pointer, length, error)
35	return '"%s"' % (string_data.decode('utf-16').encode('utf-8')) # utf8 is safe to emit as-is on OSX
36
37def utf32_summary(value,unused):
38	pointer = value.GetChildMemberWithName("first").GetValueAsUnsigned(0)
39	length = value.GetChildMemberWithName("second").GetValueAsUnsigned(0)
40	# assume length is in bytes - if in UTF32 chars, just multiply by 4
41	if pointer == 0:
42		return False
43	if length == 0:
44		return '""'
45	error = lldb.SBError()
46	string_data = value.process.ReadMemory(pointer, length, error)
47	return '"%s"' % (string_data.decode('utf-32').encode('utf-8')) # utf8 is safe to emit as-is on OSX
48
49