"""
Example data formatters for strings represented as (pointer,length) pairs
encoded in UTF8/16/32 for use with the LLDB debugger

To use in your projects, tweak the children names as appropriate for your data structures
and use as summaries for your data types

part of The LLVM Compiler Infrastructure
This file is distributed under the University of Illinois Open Source
License. See LICENSE.TXT for details.
"""

import lldb


def utf8_summary(value, unused):
    pointer = value.GetChildMemberWithName("first").GetValueAsUnsigned(0)
    length = value.GetChildMemberWithName("second").GetValueAsUnsigned(0)
    if pointer == 0:
        return False
    if length == 0:
        return '""'
    error = lldb.SBError()
    string_data = value.process.ReadMemory(pointer, length, error)
    return '"%s"' % (string_data)  # utf8 is safe to emit as-is on OSX


def utf16_summary(value, unused):
    pointer = value.GetChildMemberWithName("first").GetValueAsUnsigned(0)
    length = value.GetChildMemberWithName("second").GetValueAsUnsigned(0)
    # assume length is in bytes - if in UTF16 chars, just multiply by 2
    if pointer == 0:
        return False
    if length == 0:
        return '""'
    error = lldb.SBError()
    string_data = value.process.ReadMemory(pointer, length, error)
    # utf8 is safe to emit as-is on OSX
    return '"%s"' % (string_data.decode('utf-16').encode('utf-8'))


def utf32_summary(value, unused):
    pointer = value.GetChildMemberWithName("first").GetValueAsUnsigned(0)
    length = value.GetChildMemberWithName("second").GetValueAsUnsigned(0)
    # assume length is in bytes - if in UTF32 chars, just multiply by 4
    if pointer == 0:
        return False
    if length == 0:
        return '""'
    error = lldb.SBError()
    string_data = value.process.ReadMemory(pointer, length, error)
    # utf8 is safe to emit as-is on OSX
    return '"%s"' % (string_data.decode('utf-32').encode('utf-8'))
