func cstrToStr(cstr C.CFStringRef) (goString string) { len := C.CFStringGetLength(cstr) buf := make([]byte, len*2) cbuf := (*C.char)(unsafe.Pointer(&buf[0])) C.CFStringGetCString(cstr, cbuf, len*2, C.CFStringGetSystemEncoding()) return string(buf) }
func convertCFStringToString(cfStr C.CFStringRef) string { cstrPtr := C.CFStringGetCStringPtr(cfStr, C.kCFStringEncodingUTF8) if cstrPtr != nil { return C.GoString(cstrPtr) } // quick path doesn't work, so copy the bytes out to a buffer length := C.CFStringGetLength(cfStr) if length == 0 { // short-cut for empty strings return "" } cfRange := C.CFRange{0, length} enc := C.CFStringEncoding(C.kCFStringEncodingUTF8) // first find the buffer size necessary var usedBufLen C.CFIndex if C.CFStringGetBytes(cfStr, cfRange, enc, 0, C.false, nil, 0, &usedBufLen) > 0 { bytes := make([]byte, usedBufLen) buffer := (*C.UInt8)(unsafe.Pointer(&bytes[0])) if C.CFStringGetBytes(cfStr, cfRange, enc, 0, C.false, buffer, usedBufLen, nil) > 0 { // bytes is now filled up // convert it to a string header := (*reflect.SliceHeader)(unsafe.Pointer(&bytes)) strHeader := &reflect.StringHeader{ Data: header.Data, Len: header.Len, } return *(*string)(unsafe.Pointer(strHeader)) } } // we failed to convert, for some reason. Too bad there's no nil string return "" }
func (c osx16Collator) Compare(a, b Input) int { sa := C.CFStringCreateWithCharactersNoCopy( nil, osxCharP(a.UTF16), C.CFIndex(len(a.UTF16)), nil, ) sb := C.CFStringCreateWithCharactersNoCopy( nil, osxCharP(b.UTF16), C.CFIndex(len(b.UTF16)), nil, ) _range := C.CFRangeMake(0, C.CFStringGetLength(sa)) return int(C.CFStringCompareWithOptionsAndLocale(sa, sb, _range, c.opt, c.loc)) }
// CFStringToString converts a CFStringRef to a string. func CFStringToString(s C.CFStringRef) string { p := C.CFStringGetCStringPtr(s, C.kCFStringEncodingUTF8) if p != nil { return C.GoString(p) } length := C.CFStringGetLength(s) if length == 0 { return "" } maxBufLen := C.CFStringGetMaximumSizeForEncoding(length, C.kCFStringEncodingUTF8) if maxBufLen == 0 { return "" } buf := make([]byte, maxBufLen) var usedBufLen C.CFIndex _ = C.CFStringGetBytes(s, C.CFRange{0, length}, C.kCFStringEncodingUTF8, C.UInt8(0), C.false, (*C.UInt8)(&buf[0]), maxBufLen, &usedBufLen) return string(buf[:usedBufLen]) }
func NSStringToString(inString Object) string { cr := C.CFStringRef(unsafe.Pointer(inString)) var usedBufLen C.CFIndex rng := C.CFRange{C.CFIndex(0), C.CFStringGetLength(cr)} n := int(C.CFStringGetBytes(cr, rng, C.kCFStringEncodingUTF8, 0, 0, nil, 0, &usedBufLen)) if n <= 0 { return "" } buf := make([]byte, int(usedBufLen)) C.CFStringGetBytes(cr, rng, C.kCFStringEncodingUTF8, 0, 0, (*C.UInt8)(unsafe.Pointer(&buf[0])), C.CFIndex(len(buf)), &usedBufLen) sh := &reflect.StringHeader{ Data: uintptr(unsafe.Pointer(&buf[0])), Len: int(usedBufLen), } return *(*string)(unsafe.Pointer(sh)) }
func (c osx8Collator) Compare(a, b Input) int { sa := C.CFStringCreateWithBytesNoCopy( nil, osxUInt8P(a.UTF8), C.CFIndex(len(a.UTF8)), C.kCFStringEncodingUTF8, C.Boolean(0), nil, ) sb := C.CFStringCreateWithBytesNoCopy( nil, osxUInt8P(b.UTF8), C.CFIndex(len(b.UTF8)), C.kCFStringEncodingUTF8, C.Boolean(0), nil, ) _range := C.CFRangeMake(0, C.CFStringGetLength(sa)) return int(C.CFStringCompareWithOptionsAndLocale(sa, sb, _range, c.opt, c.loc)) }
func getCFDictValueUTF8String(dict C.CFDictionaryRef, key C.CFTypeRef) (string, error) { valCFStringRef, err := getCFDictValueCFStringRef(dict, key) if err != nil { return "", err } log.Debugf("valCFStringRef: %#v", valCFStringRef) if valCFStringRef == nil { return "", errors.New("getCFDictValueUTF8String: Nil value") } strLen := C.CFStringGetLength(valCFStringRef) log.Debugf("strLen: %d", strLen) charUTF8Len := C.CFStringGetMaximumSizeForEncoding(strLen, C.kCFStringEncodingUTF8) + 1 log.Debugf("charUTF8Len: %d", charUTF8Len) cstrBytes := make([]byte, charUTF8Len, charUTF8Len) if C.Boolean(0) == C.CFStringGetCString(valCFStringRef, (*C.char)(unsafe.Pointer(&cstrBytes[0])), charUTF8Len, C.kCFStringEncodingUTF8) { return "", errors.New("getCFDictValueUTF8String: CFStringGetCString: failed to convert value to string") } return C.GoString((*C.char)(unsafe.Pointer(&cstrBytes[0]))), nil }
// Converts a CGStringRef object to a Go string. func CFStringToGoString(s C.CFStringRef) string { ptr := C.CFStringGetCStringPtr(s, C.kCFStringEncodingUTF8) if ptr != nil { return C.GoString(ptr) } n := C.CFStringGetLength(s) b := make([]byte, int(4*n)) C.CFStringGetBytes( s, C.CFRangeMake(0, n), C.kCFStringEncodingUTF8, '?', 0, (*C.UInt8)(unsafe.Pointer(&b[0])), C.CFIndex(len(b)), &n, ) return string(b[:n]) }