diff --git a/Modules/Parser/Sources/Parser/Utilities/Data+Parser.swift b/Modules/Parser/Sources/Parser/Utilities/Data+Parser.swift new file mode 100644 index 000000000..052ca6d9c --- /dev/null +++ b/Modules/Parser/Sources/Parser/Utilities/Data+Parser.swift @@ -0,0 +1,68 @@ +// +// Data+Parser.swift +// +// +// Created by Brent Simmons on 8/24/24. +// + +import Foundation + +extension Data { + + /// Return true if the data contains a given String. + /// + /// Assumes that the data is UTF-8 or similar encoding — + /// if it’s UTF-16 or UTF-32, for instance, this will always return false. + /// Luckily these are rare. + /// + /// The String to search for should be something that could be encoded + /// in ASCII — like " Bool { + + contains(searchFor.utf8) + } + + /// Return true if searchFor appears in self. + func contains(_ searchFor: Data) -> Bool { + + let searchForCount = searchFor.count + let dataCount = self.count + + guard searchForCount > 0, searchForCount <= dataCount else { + return false + } + + let searchForInitialByte = searchFor[0] + var found = false + + self.withUnsafeBytes { bytes in + + let buffer = bytes.bindMemory(to: UInt8.self) + + for i in 0...dataCount - searchForCount { + + if buffer[i] == searchForInitialByte { + + var match = true + + for j in 1..