diff --git a/Package.swift b/Package.swift index 01be12e..3091e8e 100755 --- a/Package.swift +++ b/Package.swift @@ -49,5 +49,5 @@ let package = Package( ] ) ], - swiftLanguageVersions: [4] + swiftLanguageVersions: [5] ) diff --git a/README.md b/README.md index dcc8b03..07ed639 100755 --- a/README.md +++ b/README.md @@ -27,6 +27,11 @@ You can also use the `convert` command to create a binary header map from JSON: You can discover all the commands and options by using `hmap --help`. +## Requirements + +- hmap requires Swift 5. +- Starting from Xcode 10.2, Swift 5 command line tools require the Swift 5 runtime libraries which are included in macOS Majave 10.4.4. If you're running an earlier version of macOS, you need to install the "Swift 5 Runtime Support for Command Line Tools" available from [More Downloads for Apple Developers](https://developer.apple.com/download/more/). + # Building from Source ## Xcode @@ -47,8 +52,8 @@ If you would like to build from the command line, run: To produce a release build suitable for distribution, run: - swift build -c release -Xswiftc -static-stdlib + swift build -c release To verify that all tests pass, run: - swift test \ No newline at end of file + swift test diff --git a/Sources/HeaderMapCore/BinaryHeaderMap.swift b/Sources/HeaderMapCore/BinaryHeaderMap.swift index 490ba56..d85b584 100755 --- a/Sources/HeaderMapCore/BinaryHeaderMap.swift +++ b/Sources/HeaderMapCore/BinaryHeaderMap.swift @@ -185,10 +185,10 @@ extension BinaryHeaderMap { guard preambleSize <= begin, begin < data.count else { return nil } let nullByteIndex = data.withUnsafeBytes { - (bytes: UnsafePointer) -> Int? in + (bytes: UnsafeRawBufferPointer) -> Int? in - for i in begin.. DataHeaderParseResult { throw HeaderMapParseError.missingDataHeader } - return try data.withUnsafeBytes { (headerBytes: UnsafePointer) in + return try data.withUnsafeBytes { (headerRawBytes: UnsafeRawBufferPointer) in typealias H = BinaryHeaderMap.DataHeader + guard let baseRawPointer = headerRawBytes.baseAddress else { + throw HeaderMapParseError.missingDataHeader + } + + let headerBytes = baseRawPointer.bindMemory(to: UInt8.self, capacity: headerRawBytes.count) let decoder = ByteBufferDecoder(bytes: headerBytes, byteSwap: false) let magicValue = decoder.advanceByteSwappable( diff --git a/Sources/HeaderMapCore/HeaderMapError.swift b/Sources/HeaderMapCore/HeaderMapError.swift index 8b2652c..a0f4860 100755 --- a/Sources/HeaderMapCore/HeaderMapError.swift +++ b/Sources/HeaderMapCore/HeaderMapError.swift @@ -41,6 +41,7 @@ public enum HeaderMapCreateError: LocalizedError { case stringWithoutOffsetInTable case hashTableFull case unhashableKey + case emptyDataBuffer } extension HeaderMapError { @@ -84,6 +85,8 @@ extension HeaderMapCreateError { return "Header map is full" case .unhashableKey: return "Key cannot be hashed" + case .emptyDataBuffer: + return "Failed to allocate data buffer" } } } diff --git a/Sources/HeaderMapCore/HeaderMapMaker.swift b/Sources/HeaderMapCore/HeaderMapMaker.swift index 5377caa..a742fbd 100755 --- a/Sources/HeaderMapCore/HeaderMapMaker.swift +++ b/Sources/HeaderMapCore/HeaderMapMaker.swift @@ -136,7 +136,13 @@ fileprivate func makeBucketSection( let bucketCount = numberOfBuckets(forEntryCount: entries.count) var bytes = Data(count: bucketCount * BinaryHeaderMap.Bucket.packedSize) try bytes.withUnsafeMutableBytes { - (bytePointer: UnsafeMutablePointer) in + (rawBytes: UnsafeMutableRawBufferPointer) in + + guard let rawBasePointer = rawBytes.baseAddress else { + throw HeaderMapCreateError.emptyDataBuffer + } + + let bytePointer = rawBasePointer.bindMemory(to: UInt8.self, capacity: rawBytes.count) try entries.forEach { (entry) in guard let keyHash = entry.key.headerMapHash else { diff --git a/Sources/HeaderMapCore/extensions/StringExtensions.swift b/Sources/HeaderMapCore/extensions/StringExtensions.swift index 9c79394..bf8981a 100755 --- a/Sources/HeaderMapCore/extensions/StringExtensions.swift +++ b/Sources/HeaderMapCore/extensions/StringExtensions.swift @@ -29,7 +29,7 @@ extension String { } let lowercasedBytes = charBytes.map { $0.asciiLowercased() } - return Data(bytes: lowercasedBytes) + return Data(lowercasedBytes) } func clangLowercased() throws -> String? { @@ -42,12 +42,11 @@ extension String { else { return nil } return characterBytes.withUnsafeBytes { - (charBlockPointer: UnsafePointer) -> UInt32 in + (charBytes: UnsafeRawBufferPointer) -> UInt32 in var result = UInt32(0) - for i in 0 ..< characterBytes.count { - let charPointer = charBlockPointer.advanced(by: i) - result += UInt32(charPointer.pointee) * 13 + for i in 0 ..< charBytes.count { + result += UInt32(charBytes[i]) * 13 } return result }