Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 29 additions & 15 deletions Sources/FoundationInternationalization/ICU/ICU+CaseMap.swift
Original file line number Diff line number Diff line change
Expand Up @@ -58,17 +58,23 @@ extension ICU {
}

func lowercase(_ s: String) -> String? {
s.utf8CString.withUnsafeBufferPointer { srcBuf in
_withResizingCharBuffer { destBuf, destSize, status in
ucasemap_utf8ToLower(casemap, destBuf, destSize, srcBuf.baseAddress!, Int32(srcBuf.count), &status)
var s = s
return s.withUTF8 { srcBuf in
srcBuf.withMemoryRebound(to: CChar.self) { srcBuf in
_withResizingCharBuffer { destBuf, destSize, status in
ucasemap_utf8ToLower(casemap, destBuf, destSize, srcBuf.baseAddress!, Int32(srcBuf.count), &status)
}
}
}
}

func uppercase(_ s: String) -> String? {
s.utf8CString.withUnsafeBufferPointer { srcBuf in
_withResizingCharBuffer { destBuf, destSize, status in
ucasemap_utf8ToUpper(casemap, destBuf, destSize, srcBuf.baseAddress!, Int32(srcBuf.count), &status)
var s = s
return s.withUTF8 { srcBuf in
srcBuf.withMemoryRebound(to: CChar.self) { srcBuf in
_withResizingCharBuffer { destBuf, destSize, status in
ucasemap_utf8ToUpper(casemap, destBuf, destSize, srcBuf.baseAddress!, Int32(srcBuf.count), &status)
}
}
}
}
Expand All @@ -77,9 +83,11 @@ extension ICU {
lock.withLock { _ in
var s = s
return s.withUTF8 { srcBuf in
srcBuf.withMemoryRebound(to: CChar.self) { buffer in
_withResizingCharBuffer { destBuf, destSize, status in
ucasemap_utf8ToTitle(casemap, destBuf, destSize, buffer.baseAddress!, Int32(buffer.count), &status)
srcBuf.withMemoryRebound(to: CChar.self) { srcBuf in
srcBuf.withMemoryRebound(to: CChar.self) { buffer in
_withResizingCharBuffer { destBuf, destSize, status in
ucasemap_utf8ToTitle(casemap, destBuf, destSize, buffer.baseAddress!, Int32(buffer.count), &status)
}
}
}
}
Expand All @@ -89,18 +97,24 @@ extension ICU {
func titlecase(_ s: String) -> String? {
// `ucasemap_utf8ToTitle` isn't thread-safe
lock.withLock { _ in
s.utf8CString.withUnsafeBufferPointer { srcBuf in
_withResizingCharBuffer { destBuf, destSize, status in
ucasemap_utf8ToTitle(casemap, destBuf, destSize, srcBuf.baseAddress!, Int32(srcBuf.count), &status)
var s = s
return s.withUTF8 { srcBuf in
srcBuf.withMemoryRebound(to: CChar.self) { srcBuf in
_withResizingCharBuffer { destBuf, destSize, status in
ucasemap_utf8ToTitle(casemap, destBuf, destSize, srcBuf.baseAddress!, Int32(srcBuf.count), &status)
}
}
}
}
}

func foldcase(_ s: String) -> String? {
s.utf8CString.withUnsafeBufferPointer { srcBuf in
_withResizingCharBuffer { destBuf, destSize, status in
ucasemap_utf8FoldCase(casemap, destBuf, destSize, srcBuf.baseAddress!, Int32(srcBuf.count), &status)
var s = s
return s.withUTF8 { srcBuf in
srcBuf.withMemoryRebound(to: CChar.self) { srcBuf in
_withResizingCharBuffer { destBuf, destSize, status in
ucasemap_utf8FoldCase(casemap, destBuf, destSize, srcBuf.baseAddress!, Int32(srcBuf.count), &status)
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -158,9 +158,7 @@ internal func _withFixedCharBuffer(size: Int32 = ULOC_FULLNAME_CAPACITY + ULOC_K
/// Use this function for ICU API which takes a C string and returns a C string. ICU may choose to return the original pointer, making the usual pattern of simply calling `String(cString: result)` use deallocated memory.
/// See also: rdar://104711456 and rdar://104710940
internal func _withStringAsCString(_ input: String, _ body: (UnsafePointer<CChar>) -> UnsafePointer<CChar>?) -> String? {
return input.utf8CString.withUnsafeBufferPointer { buffer -> String? in
// Intentional force unwrap
let base = buffer.baseAddress!
return input.withCString { base -> String? in
guard let result = body(base) else {
return nil
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ internal func compareStringsWithLocale(_ string1: Substring, _ string2: Substrin
let localeIdentifier = locale.identifier
var status = U_ZERO_ERROR

let collator = localeIdentifier.utf8CString.withUnsafeBufferPointer({ buffer in
ucol_open(buffer.baseAddress, &status)
let collator = localeIdentifier.withCString({ ptr in
ucol_open(ptr, &status)
})

defer {
Expand Down
8 changes: 3 additions & 5 deletions Tests/FoundationEssentialsTests/DataTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -99,11 +99,9 @@ private final class DataTests {
// String of course has its own way to get data, but this way tests our own data struct
func dataFrom(_ string : String) -> Data {
// Create a Data out of those bytes
return string.utf8CString.withUnsafeBufferPointer { (ptr) in
ptr.baseAddress!.withMemoryRebound(to: UInt8.self, capacity: ptr.count) {
// Subtract 1 so we don't get the null terminator byte. This matches NSString behavior.
return Data(bytes: $0, count: ptr.count - 1)
}
var string = string
return string.withUTF8 { (ptr) in
return Data(buffer: ptr)
}
}

Expand Down
Loading