| // Copyright 2012 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| //go:build darwin | |
| package main | |
| /* | |
| #cgo LDFLAGS: -framework CoreFoundation | |
| #include <CoreFoundation/CFBase.h> | |
| #include <CoreFoundation/CoreFoundation.h> | |
| */ | |
| import "C" | |
| import ( | |
| "unsafe" | |
| ) | |
| func init() { | |
| AddFactory(CollatorFactory{"osx", newOSX16Collator, | |
| "OS X/Darwin collator, using native strings."}) | |
| AddFactory(CollatorFactory{"osx8", newOSX8Collator, | |
| "OS X/Darwin collator for UTF-8."}) | |
| } | |
| func osxUInt8P(s []byte) *C.UInt8 { | |
| return (*C.UInt8)(unsafe.Pointer(&s[0])) | |
| } | |
| func osxCharP(s []uint16) *C.UniChar { | |
| return (*C.UniChar)(unsafe.Pointer(&s[0])) | |
| } | |
| // osxCollator implements an Collator based on OS X's CoreFoundation. | |
| type osxCollator struct { | |
| loc C.CFLocaleRef | |
| opt C.CFStringCompareFlags | |
| } | |
| func (c *osxCollator) init(locale string) { | |
| l := C.CFStringCreateWithBytes( | |
| C.kCFAllocatorDefault, | |
| osxUInt8P([]byte(locale)), | |
| C.CFIndex(len(locale)), | |
| C.kCFStringEncodingUTF8, | |
| C.Boolean(0), | |
| ) | |
| c.loc = C.CFLocaleCreate(C.kCFAllocatorDefault, l) | |
| } | |
| func newOSX8Collator(locale string) (Collator, error) { | |
| c := &osx8Collator{} | |
| c.init(locale) | |
| return c, nil | |
| } | |
| func newOSX16Collator(locale string) (Collator, error) { | |
| c := &osx16Collator{} | |
| c.init(locale) | |
| return c, nil | |
| } | |
| func (c osxCollator) Key(s Input) []byte { | |
| return nil // sort keys not supported by OS X CoreFoundation | |
| } | |
| type osx8Collator struct { | |
| osxCollator | |
| } | |
| type osx16Collator struct { | |
| osxCollator | |
| } | |
| func (c osx16Collator) Compare(a, b Input) int { | |
| sa := C.CFStringCreateWithCharactersNoCopy( | |
| C.kCFAllocatorDefault, | |
| osxCharP(a.UTF16), | |
| C.CFIndex(len(a.UTF16)), | |
| C.kCFAllocatorDefault, | |
| ) | |
| sb := C.CFStringCreateWithCharactersNoCopy( | |
| C.kCFAllocatorDefault, | |
| osxCharP(b.UTF16), | |
| C.CFIndex(len(b.UTF16)), | |
| C.kCFAllocatorDefault, | |
| ) | |
| _range := C.CFRangeMake(0, C.CFStringGetLength(sa)) | |
| return int(C.CFStringCompareWithOptionsAndLocale(sa, sb, _range, c.opt, c.loc)) | |
| } | |
| func (c osx8Collator) Compare(a, b Input) int { | |
| sa := C.CFStringCreateWithBytesNoCopy( | |
| C.kCFAllocatorDefault, | |
| osxUInt8P(a.UTF8), | |
| C.CFIndex(len(a.UTF8)), | |
| C.kCFStringEncodingUTF8, | |
| C.Boolean(0), | |
| C.kCFAllocatorDefault, | |
| ) | |
| sb := C.CFStringCreateWithBytesNoCopy( | |
| C.kCFAllocatorDefault, | |
| osxUInt8P(b.UTF8), | |
| C.CFIndex(len(b.UTF8)), | |
| C.kCFStringEncodingUTF8, | |
| C.Boolean(0), | |
| C.kCFAllocatorDefault, | |
| ) | |
| _range := C.CFRangeMake(0, C.CFStringGetLength(sa)) | |
| return int(C.CFStringCompareWithOptionsAndLocale(sa, sb, _range, c.opt, c.loc)) | |
| } |