From d96267259c876dd57bcef271f9208b2b2e91c8cf Mon Sep 17 00:00:00 2001 From: Paul Knight Date: Tue, 14 Mar 2017 16:42:00 -0700 Subject: [PATCH] Initial commit from private projects repository. --- .gitignore | 2 + Configurations/Debug.xcconfig | 4 + Configurations/Project.xcconfig | 5 + Configurations/Release.xcconfig | 5 + Extras/DictionaryExtras.swift | 18 + Extras/ErrorExtras.swift | 28 + Extras/PointerExtras.swift | 36 ++ Extras/SequenceExtras.swift | 22 + Extras/StrideExtras.swift | 10 + Extras/StringExtras.swift | 100 ++++ Modules/FUSE/module.modulemap | 5 + README | 49 ++ SwresExplode/SwresExplode.swift | 367 ++++++++++++ SwresExplode/SwresExplode.xcconfig | 1 + SwresExplode/main.swift | 8 + SwresFUSE.png | Bin 0 -> 193674 bytes SwresFUSE/FilesystemNode.swift | 113 ++++ SwresFUSE/SwresFUSE.xcconfig | 6 + SwresFUSE/SwresFuse.swift | 324 +++++++++++ SwresFUSE/main.swift | 8 + SwresTools.xcodeproj/project.pbxproj | 535 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + SwresTools/FourCharCode.swift | 50 ++ SwresTools/Resource.swift | 27 + SwresTools/ResourceForkReader.swift | 189 +++++++ SwresTools/SeekableReader.swift | 103 ++++ SwresTools/Writer.swift | 125 ++++ Translators/PascalStringTranslator.swift | 49 ++ Translators/SndTranslator.swift | 149 +++++ Translators/Translator.swift | 49 ++ Translators/TranslatorManager.swift | 62 ++ 31 files changed, 2456 insertions(+) create mode 100644 Configurations/Debug.xcconfig create mode 100644 Configurations/Project.xcconfig create mode 100644 Configurations/Release.xcconfig create mode 100644 Extras/DictionaryExtras.swift create mode 100644 Extras/ErrorExtras.swift create mode 100644 Extras/PointerExtras.swift create mode 100644 Extras/SequenceExtras.swift create mode 100644 Extras/StrideExtras.swift create mode 100644 Extras/StringExtras.swift create mode 100644 Modules/FUSE/module.modulemap create mode 100644 README create mode 100644 SwresExplode/SwresExplode.swift create mode 100644 SwresExplode/SwresExplode.xcconfig create mode 100644 SwresExplode/main.swift create mode 100644 SwresFUSE.png create mode 100644 SwresFUSE/FilesystemNode.swift create mode 100644 SwresFUSE/SwresFUSE.xcconfig create mode 100644 SwresFUSE/SwresFuse.swift create mode 100644 SwresFUSE/main.swift create mode 100644 SwresTools.xcodeproj/project.pbxproj create mode 100644 SwresTools.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 SwresTools/FourCharCode.swift create mode 100644 SwresTools/Resource.swift create mode 100644 SwresTools/ResourceForkReader.swift create mode 100644 SwresTools/SeekableReader.swift create mode 100644 SwresTools/Writer.swift create mode 100644 Translators/PascalStringTranslator.swift create mode 100644 Translators/SndTranslator.swift create mode 100644 Translators/Translator.swift create mode 100644 Translators/TranslatorManager.swift diff --git a/.gitignore b/.gitignore index 2c22487..5964b45 100644 --- a/.gitignore +++ b/.gitignore @@ -63,3 +63,5 @@ fastlane/report.xml fastlane/Preview.html fastlane/screenshots fastlane/test_output + +.DS_Store diff --git a/Configurations/Debug.xcconfig b/Configurations/Debug.xcconfig new file mode 100644 index 0000000..c6934ba --- /dev/null +++ b/Configurations/Debug.xcconfig @@ -0,0 +1,4 @@ +#include "Project.xcconfig" + +ONLY_ACTIVE_ARCH = YES +SWIFT_OPTIMIZATION_LEVEL = -Onone diff --git a/Configurations/Project.xcconfig b/Configurations/Project.xcconfig new file mode 100644 index 0000000..5d3cefc --- /dev/null +++ b/Configurations/Project.xcconfig @@ -0,0 +1,5 @@ +SDKROOT = macosx +WARNING_CFLAGS = -Wall -Wextra + +SWIFT_VERSION = 3.0 +SWIFT_INCLUDE_PATHS = "${PROJECT_DIR}/Modules" diff --git a/Configurations/Release.xcconfig b/Configurations/Release.xcconfig new file mode 100644 index 0000000..e48b233 --- /dev/null +++ b/Configurations/Release.xcconfig @@ -0,0 +1,5 @@ +#include "Project.xcconfig" + +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) NDEBUG=1 + +SWIFT_OPTIMIZATION_LEVEL = -O diff --git a/Extras/DictionaryExtras.swift b/Extras/DictionaryExtras.swift new file mode 100644 index 0000000..972c2a4 --- /dev/null +++ b/Extras/DictionaryExtras.swift @@ -0,0 +1,18 @@ +// +// DictionaryExtras.swift +// SwresTools +// + +extension Dictionary { + init(_ elements: Array){ + self.init() + for (key, value) in elements { + self[key] = value + } + } + + func flatMap(transform: (Key, Value) -> (Key, Value)?) -> Dictionary { + return Dictionary(self.flatMap(transform)) + } +} + diff --git a/Extras/ErrorExtras.swift b/Extras/ErrorExtras.swift new file mode 100644 index 0000000..0ee69ff --- /dev/null +++ b/Extras/ErrorExtras.swift @@ -0,0 +1,28 @@ +// +// ErrorExtras.swift +// SwresTools +// + +protocol SwresError: Error, CustomStringConvertible { +} + +protocol NestingSwresError: SwresError { + var underlyingError: Error? { get } +} + +extension Error { + func shortDescription(withUnderlyingError: Bool = false) -> String { + switch self { + case let error as NestingSwresError: + var string = error.description + if let underlyingError = error.underlyingError, withUnderlyingError == true { + string += "\n" + underlyingError.shortDescription(withUnderlyingError: true) + } + return string + case let error as SwresError: + return error.description + default: + return localizedDescription + } + } +} diff --git a/Extras/PointerExtras.swift b/Extras/PointerExtras.swift new file mode 100644 index 0000000..3cd6385 --- /dev/null +++ b/Extras/PointerExtras.swift @@ -0,0 +1,36 @@ +// +// PointerExtras.swift +// SwresTools +// + +import Darwin + +// For performance, there are a few places strings are passed around as a base pointer +// and a count of bytes. The Swift standard library includes `UnsafeBufferPointer` and +// `UnsafeMutableBufferPointer` which could wrap that pointer and length, but it's +// surprisingly slow. Replacing that with this tiny `Buffer` struct sped up string +// formatting hotpaths considerably. +struct Buffer { + let pointer: UnsafePointer + let count: Int +} + +class ManagedUnsafeMutablePointer: Hashable { + let pointer: UnsafeMutablePointer + + init(adoptPointer: UnsafeMutablePointer) { + pointer = adoptPointer + } + + deinit { + free(pointer) + } + + var hashValue: Int { + return pointer.hashValue + } + + static func ==(lhs: ManagedUnsafeMutablePointer, rhs: ManagedUnsafeMutablePointer) -> Bool { + return lhs.pointer == rhs.pointer + } +} diff --git a/Extras/SequenceExtras.swift b/Extras/SequenceExtras.swift new file mode 100644 index 0000000..48a838e --- /dev/null +++ b/Extras/SequenceExtras.swift @@ -0,0 +1,22 @@ +// +// SequenceExtras.swift +// SwresTools +// + +extension Sequence { + func firstSome(_ transform: @escaping (Iterator.Element) -> ElementOfResult?) -> ElementOfResult? { + return self.lazy.flatMap(transform).first + } + + func groupBy(_ transform: (Iterator.Element) -> ElementOfResult) -> Dictionary> { + var groupedBy: Dictionary> = Dictionary() + for item in self { + let transformed = transform(item) + if groupedBy[transformed] == nil { + groupedBy[transformed] = Array() + } + groupedBy[transformed]!.append(item) + } + return groupedBy + } +} diff --git a/Extras/StrideExtras.swift b/Extras/StrideExtras.swift new file mode 100644 index 0000000..a348ae8 --- /dev/null +++ b/Extras/StrideExtras.swift @@ -0,0 +1,10 @@ +// +// StrideExtras.swift +// SwresTools +// + +func offsetAndLengthStride(from: Int, to: Int, by: Int, _ block: (Int, Int) -> Void) { + for offset in stride(from: from, to: to, by: by) { + block(offset, min(by, to - offset)) + } +} diff --git a/Extras/StringExtras.swift b/Extras/StringExtras.swift new file mode 100644 index 0000000..cf3836d --- /dev/null +++ b/Extras/StringExtras.swift @@ -0,0 +1,100 @@ +// +// StringFunctions.swift +// SwresTools +// + +import Foundation + +private let MinimumDisplayableByteValue: UInt8 = 32 + +let MacOSRomanByteFullStop: UInt8 = 0x2E +let MacOSRomanByteQuestionMark: UInt8 = 0x3F + +struct MacOSRomanConversionOptions { + let filterControlCharacters: Bool + let filterFilesystemUnsafeCharacters: Bool + let filterNonASCIICharacters: Bool + let replacementMacOSRomanByte: UInt8? +} + +func stringFromMacOSRomanBytes(_ buffer: Buffer, options: MacOSRomanConversionOptions) -> String { + let filterControlCharacters = options.filterControlCharacters || options.filterFilesystemUnsafeCharacters + + let filteredBytes = UnsafeMutablePointer.allocate(capacity: buffer.count + 1) + defer { + filteredBytes.deallocate(capacity: buffer.count + 1) + } + + var filteredByteIterator = filteredBytes + + @inline(__always) func writeFilteredByte(_ byte: UInt8) { + filteredByteIterator.pointee = byte + filteredByteIterator += 1 + } + + var bufferPointer = buffer.pointer + let endPointer = buffer.pointer + buffer.count + + while bufferPointer < endPointer { + var replaceCharacter = false + let byte = bufferPointer.pointee + + // SPACE, DELETE + if filterControlCharacters, byte < 0x20 || byte == 0x7F { + replaceCharacter = true + } + // DELETE + else if options.filterNonASCIICharacters, byte > 0x7F { + replaceCharacter = true + } + // ASTERISK, FULL STOP, SOLIDUS, COLON, REVERSE SOLIDUS, TILDE + // Some of these aren't technically unsafe, but they can cause issues in the + // shell or Finder, such as a period at the start of a file or a tilde. + else if options.filterFilesystemUnsafeCharacters, byte == 0x2A || byte == 0x2E || byte == 0x2F || byte == 0x3A || byte == 0x5C || byte == 0x7E { + replaceCharacter = true + } + + if replaceCharacter, let unwrappedReplacementByte = options.replacementMacOSRomanByte { + writeFilteredByte(unwrappedReplacementByte) + } else if !replaceCharacter { + writeFilteredByte(byte) + } + + bufferPointer += 1 + } + + filteredByteIterator.pointee = 0 + + let cStringPointer = UnsafeRawPointer(filteredBytes).assumingMemoryBound(to: CChar.self) + return String(cString: cStringPointer, encoding: String.Encoding.macOSRoman)! +} + +func stringFromMacOSRomanBytes(_ data: Data, options: MacOSRomanConversionOptions) -> String { + return data.withUnsafeBytes { (bytes: UnsafePointer) in + let buffer = Buffer(pointer: bytes, count: data.count) + return stringFromMacOSRomanBytes(buffer, options: options) + } +} + +func filesystemSafeString(_ data: Data) -> String { + let options = MacOSRomanConversionOptions(filterControlCharacters: true, filterFilesystemUnsafeCharacters: true, filterNonASCIICharacters: false, replacementMacOSRomanByte: nil) + return stringFromMacOSRomanBytes(data, options: options) +} + +extension String { + func copyCString() -> ManagedUnsafeMutablePointer { + return self.withCString({ (cString: UnsafePointer) -> ManagedUnsafeMutablePointer in + return ManagedUnsafeMutablePointer(adoptPointer: strdup(cString)) + }) + } +} + +struct StringAndCString { + let string: String + let cString: ManagedUnsafeMutablePointer + + init(_ string: String) { + self.string = string + cString = string.copyCString() + } +} diff --git a/Modules/FUSE/module.modulemap b/Modules/FUSE/module.modulemap new file mode 100644 index 0000000..f9f5d93 --- /dev/null +++ b/Modules/FUSE/module.modulemap @@ -0,0 +1,5 @@ +module Fuse [system] { + header "/usr/local/include/osxfuse/fuse.h" + link "osxfuse" + export * +} diff --git a/README b/README new file mode 100644 index 0000000..a3ef517 --- /dev/null +++ b/README @@ -0,0 +1,49 @@ +SwresTools is a set of two tools for exploring and dumping classic Macintosh resource forks, written in Swift. + +SwresTools can convert some resources to modern types. For example, it can translate some snd resources to WAV files. + +To be honest, this was just a fun side project and shouldn't be used for anything important. + +### SwresExplode + +`SwresExplode` dumps the resources of a classic Macintosh resource fork to individual files. + +For example, list all of the resource types in a resource fork: + + SwresExplode resourcefile + +Dump all `snd ` resources to individual files: + + SwresExplode -d -t 'snd ' + +### SwresFUSE + +`SwresFUSE` mounts a resource fork as a filesystem. It requires [FUSE for macOS][fuse]. + +Example usage: + + SwresFUSE resourcefile mountpoint + +![A screenshot of SwresFUSE exploring a resource fork.](SwresFUSE.png) + +[fuse]: https://osxfuse.github.io + +### Why? + +¯\\_(ツ)_/¯ + +### No, Really, Why? + +I wanted to rip the music out of the old Mac game [Troubled Souls][troubledsouls], and this seemed like such a bad way to go about it I had to give it a go. I was playing around with Swift and thought this would be a fun way to write a project that interfaced with a C library. + +[troubledsouls]: https://en.wikipedia.org/wiki/Troubled_Souls + +### Buiding + +You may need to point the header parameter of Modules/FUSE/module.modulemap to your FUSE header directory. For some reason module maps don't seem to respect header search paths and need absolute paths. + +### Limitations + +* The translators are very limited. Only Pascal style prefix strings and an extremely limited subset of `SND` resources are supported. +* ResEdit features like `RMAP` and `TMPL` resources are not supported. +* Editing or creating new resources is not supported. \ No newline at end of file diff --git a/SwresExplode/SwresExplode.swift b/SwresExplode/SwresExplode.swift new file mode 100644 index 0000000..ea0e428 --- /dev/null +++ b/SwresExplode/SwresExplode.swift @@ -0,0 +1,367 @@ +// +// SwresExplode.swift +// SwresTools +// + +import Foundation + +struct ExplodeTask { + var printResources: Bool = false + var dumpResources: Bool = false + var overwriteExistingFiles: Bool = false + var translatorFilter: TranslatorFilter = TranslatorFilter.noTranslators + var identifierFilter: Int16? + var typeFilter: FourCharCode? + var inputURL: URL? + var outputFolder: URL = URL(fileURLWithPath: "SwresExplode") +} + +func printUsageAndExit(status: Int32 = EXIT_SUCCESS) -> Never { + let processName = ProcessInfo.processInfo.processName + + print("Extract Macintosh Toolbox resources.") + print("Usage: \(processName) [options] resourcefile") + print("Options:") + print(" -h Show this help message") + print("Filtering Options:") + print(" -i [id] Filter by resource identifier.") + print(" -t [xxxx] Filter by resource type.") + print("Dumping Options:") + print(" -p Print resources to standard output.") + print(" -d Dump resources to files.") + print(" -o Output directory for the dumped resource.") + print(" -f Overwrite existing files when dumping.") + print(" -c Attempt to convert resources into more modern or portable formats.") + print(" -C Also use best guess conversions.") + print("Examples:") + print(" \(processName) resourcefile List all of the types.") + print(" \(processName) -d -t 'snd ' Dump all `snd ' resources.") + print(" \(processName) -d -t 'snd ' -i 1000 Dump the `snd ' resource with id 1000.") + print(" \(processName) -d -o /tmp/foo Dump all resources to the directory /tmp/foo.") + + exit(status) +} + +func taskForArguments() -> ExplodeTask { + var task = ExplodeTask() + let argc = CommandLine.argc + opterr = 0 + + while true { + let option = getopt(argc, CommandLine.unsafeArgv, "hi:t:pdfcCo:") + if option == -1 { + break + } + + let optionScalar = UnicodeScalar(Int(option))! + switch optionScalar { + case UnicodeScalar("h"): + printUsageAndExit() + case UnicodeScalar("i"): + let identifierNumber = String(cString: optarg) + task.identifierFilter = Int16(identifierNumber) + case UnicodeScalar("t"): + do { + task.typeFilter = try FourCharCode(optarg) + } catch FourCharCodeError.invalidSequence { + print("Invalid type filter."); + printUsageAndExit(status: EXIT_FAILURE) + } catch { + print("Unexpected error parsing type filter.") + printUsageAndExit(status: EXIT_FAILURE) + } + case UnicodeScalar("p"): + task.printResources = true + case UnicodeScalar("d"): + task.dumpResources = true + case UnicodeScalar("o"): + task.outputFolder = URL(fileURLWithPath: String(cString: optarg)) + case UnicodeScalar("f"): + task.overwriteExistingFiles = true + case UnicodeScalar("c"): + task.translatorFilter = max(task.translatorFilter, TranslatorFilter.onlyLikelyTranslators) + case UnicodeScalar("C"): + task.translatorFilter = max(task.translatorFilter, TranslatorFilter.likelyAndPossibleTranslators) + case UnicodeScalar("?"): + let unknownOption = UnicodeScalar(Int(optopt))! + if unknownOption == UnicodeScalar("i") || unknownOption == UnicodeScalar("t") { + print("Option -\(unknownOption) requires an argument.") + } else { + print("Unknown option -\(unknownOption.escaped(asASCII: true)).") + } + printUsageAndExit(status: EXIT_FAILURE) + default: + printUsageAndExit(status: EXIT_FAILURE) + } + } + + guard optind < argc else { + print("No input file specified.") + printUsageAndExit(status: EXIT_FAILURE) + } + + let inputPathBytes = CommandLine.unsafeArgv[Int(optind)]! + let inputPath = String(cString:inputPathBytes) + task.inputURL = URL(fileURLWithPath: inputPath) + + return task +} + +func run(_ task: ExplodeTask) -> Int32 { + let resourcesByType = read(task) + process(task: task, resourcesByType: resourcesByType) + return EXIT_SUCCESS +} + +func read(_ task: ExplodeTask) -> ResourcesByType { + do { + return try readResourceFork(task.inputURL!) + } catch let error { + print(error.shortDescription(withUnderlyingError: true)) + exit(EXIT_FAILURE) + } +} + +func process(task: ExplodeTask, resourcesByType: ResourcesByType) { + if task.dumpResources { + do { + try createOutputDirectory(task: task) + } catch let error { + print(error.shortDescription(withUnderlyingError: true)) + exit(EXIT_FAILURE) + } + } + + let filteredResourcesByType = filter(resources: resourcesByType, task: task) + for (_, resources) in filteredResourcesByType { + for resource in resources { + print(format(resource)) + + if task.printResources { + print(format(resource.data)) + } + + if task.dumpResources { + dump(task: task, resource: resource) + } + } + } +} + +enum OutputDirectoryError: NestingSwresError { + case directoryIsNotAFolder + case directoryExists + case couldntCreateDirectory(underlyingError: Error) + + var underlyingError: Error? { + switch self { + case .couldntCreateDirectory(let underlyingError): + return underlyingError + default: + return nil + } + } + + var description: String { + switch self { + case .directoryIsNotAFolder: + return "Output directory is not a folder." + case .directoryExists: + return "Output directory already exists. Use -f to overwrite existing files." + case .couldntCreateDirectory: + return "Couldn't create output directory." + } + } +} + +func createOutputDirectory(task: ExplodeTask) throws { + let fileManager = FileManager.default + let outputDirectoryPath = task.outputFolder.path + + var isDirectory: ObjCBool = false + if fileManager.fileExists(atPath: outputDirectoryPath, isDirectory: &isDirectory) { + guard isDirectory.boolValue else { + throw OutputDirectoryError.directoryIsNotAFolder + } + + guard task.overwriteExistingFiles else { + throw OutputDirectoryError.directoryExists + } + } + + do { + try fileManager.createDirectory(at: task.outputFolder, withIntermediateDirectories: true, attributes: nil) + } catch let error { + throw OutputDirectoryError.couldntCreateDirectory(underlyingError: error) + } +} + +func dump(task: ExplodeTask, resource: Resource) { + let (folderURL, fileURL) = explodedLocation(task: task, resource: resource) + + let fileManager = FileManager.default + do { + try fileManager.createDirectory(at: folderURL, withIntermediateDirectories: true, attributes: nil) + try resource.data.write(to: fileURL) + } catch let error { + print("Couldn't dump resource \(resource.type) \(resource.identifier).") + print(error.shortDescription) + } + + if task.translatorFilter >= TranslatorFilter.onlyLikelyTranslators { + let translatorManager = TranslatorManager.sharedInstance + let translationResults = translatorManager.translate(resource, includeTranslators: task.translatorFilter) + + for translationResult in translationResults { + switch translationResult { + case .translated(let translation): + let outputURL = fileURL.appendingPathExtension(translation.suggestedFileExtension) + let data = translation.data + do { + try data.write(to: outputURL) + } catch let error { + let resourceDescription = format(resource, short: true) + print("Couldn't write translation for resource \(resourceDescription).") + print(error.shortDescription(withUnderlyingError: true)) + } + case .error(let error): + let resourceDescription = format(resource, short: true) + print("Failed to translate resource \(resourceDescription).") + print(error.shortDescription(withUnderlyingError: true)) + } + } + } +} + +func filter(resources: ResourcesByType, task: ExplodeTask) -> ResourcesByType { + return resources.flatMap { (type: FourCharCode, resources: Array) -> (FourCharCode, Array)? in + if let typeFilter = task.typeFilter, type != typeFilter { + return nil + } + + let filteredResources = resources.flatMap { (resource: Resource) -> Resource? in + if let identifierFilter = task.identifierFilter, resource.identifier != identifierFilter { + return nil + } + return resource + } + + return (type, filteredResources) + } +} + +func format(_ resource: Resource, short: Bool = false) -> String { + if short { + return "'\(resource.type.description)' \(resource.identifier)" + } + + var string = String(format: "'%@' %7d %8d bytes", resource.type.description, resource.identifier, resource.data.count) + if let name = resource.stringName { + string += " \"\(name)\"" + } + return string +} + +func format(_ data: Data) -> String { + let options = MacOSRomanConversionOptions(filterControlCharacters: true, filterFilesystemUnsafeCharacters: false, filterNonASCIICharacters: true, replacementMacOSRomanByte: MacOSRomanByteFullStop) + + var lines = Array() + data.withUnsafeBytes { (unsafeBytes: UnsafePointer) in + offsetAndLengthStride(from: 0, to: data.count, by: 16, { (offset: Int, length: Int) in + let formattedOffset = format(asHex: offset, length: 8) + + let lineBuffer = Buffer(pointer: unsafeBytes + offset, count: length) + let formattedLine = format(line: lineBuffer, lineLength: 16) + let asciiFormattedBytes = stringFromMacOSRomanBytes(lineBuffer, options: options) + + let rowString = "\(formattedOffset): \(formattedLine) \(asciiFormattedBytes)" + lines.append(rowString) + }) + } + + return lines.joined(separator: "\n") +} + +// 0-9, A-F +let asciiHexCharacters: Array = [0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66] +let asciiSpace: CChar = 0x20 + +func format(asHex number: Int, length: Int) -> String { + assert(length >= 0) + + var number = number + let stringBufferCapacity = length + 1 + let stringBuffer = UnsafeMutablePointer.allocate(capacity: stringBufferCapacity) + defer { + stringBuffer.deallocate(capacity: stringBufferCapacity) + } + + var stringBufferIterator = stringBuffer + length + stringBufferIterator.pointee = 0 + stringBufferIterator -= 1 + + while stringBufferIterator >= stringBuffer { + stringBufferIterator.pointee = asciiHexCharacters[number % 16] + number = number / 16 + stringBufferIterator -= 1 + } + + return String(cString: stringBuffer, encoding: String.Encoding.ascii)! +} + +func format(line lineBuffer: Buffer, lineLength: Int) -> String { + assert(lineBuffer.count <= lineLength) + + let lineBytes = lineBuffer.pointer + let lineBytesCount = lineBuffer.count + + let spacerCount = max(0, (lineLength - 1) / 2) + let stringBufferSize = lineLength * 2 + spacerCount + 1 + let stringBuffer = UnsafeMutablePointer.allocate(capacity: stringBufferSize) + defer { + stringBuffer.deallocate(capacity: stringBufferSize) + } + + var stringBufferIterator = stringBuffer + + @inline(__always) func writeCChar(_ char: CChar) { + stringBufferIterator.pointee = char + stringBufferIterator += 1 + } + + for byteIndex in 0.. 0 { + writeCChar(asciiSpace) + } + + if byteIndex < lineBytesCount { + let byte = lineBytes[byteIndex] + writeCChar(asciiHexCharacters[Int(byte / 16)]) + writeCChar(asciiHexCharacters[Int(byte % 16)]) + } else { + writeCChar(asciiSpace) + writeCChar(asciiSpace) + } + } + + writeCChar(0) + + return String(cString: stringBuffer, encoding: String.Encoding.ascii)! +} + +func explodedLocation(task: ExplodeTask, resource: Resource) -> (URL, URL) { + let outputFolder = task.outputFolder + let typeFolder = outputFolder.appendingPathComponent(filesystemSafeString(resource.type.bytes)) + var filename = "\(resource.identifier)" + if let name = resource.name { + let sanitizedName = filesystemSafeString(name) + filename += " \(sanitizedName)" + } + let url = typeFolder.appendingPathComponent(filename) + return (typeFolder, url) +} + +func swresExplodeMain() -> Int32 { + let task = taskForArguments() + return run(task) +} diff --git a/SwresExplode/SwresExplode.xcconfig b/SwresExplode/SwresExplode.xcconfig new file mode 100644 index 0000000..0e0ad21 --- /dev/null +++ b/SwresExplode/SwresExplode.xcconfig @@ -0,0 +1 @@ +PRODUCT_NAME = SwresExplode diff --git a/SwresExplode/main.swift b/SwresExplode/main.swift new file mode 100644 index 0000000..aca6c75 --- /dev/null +++ b/SwresExplode/main.swift @@ -0,0 +1,8 @@ +// +// main.swift +// SwresTools +// + +import Darwin + +exit(swresExplodeMain()) diff --git a/SwresFUSE.png b/SwresFUSE.png new file mode 100644 index 0000000000000000000000000000000000000000..c0606cf3f1fc2b3ae263f36a67e6f2bbd74daefa GIT binary patch literal 193674 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

wFjEb~%F}8bh59(K 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≪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�gQ^ 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%0Dogynv0P)#~&CoG!?GN@em6x-QuJGKB+Z}ko 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 + case file(name: StringAndCString, data: Data) + + var cStringName: ManagedUnsafeMutablePointer { + switch self { + case .folder(let name, _): + return name.cString + case .file(let name, _): + return name.cString + } + } + + var name: String { + switch self { + case .folder(let name, _): + return name.string + case .file(let name, _): + return name.string + } + } + + init(name: String, data: Data) { + self = .file(name: StringAndCString(name), data: data) + } + + init(name: String, children: Array) { + let nameAndChildTuples = children.map { (child: FilesystemNode) -> (String, FilesystemNode) in + return (child.name, child) + } + self = .folder(name: StringAndCString(name), children: Dictionary(nameAndChildTuples)) + } + + func nodeAtPath(_ path: UnsafePointer) -> FilesystemNode? { + guard let pathString = String(cString: path, encoding: String.Encoding.utf8) else { + return nil + } + return nodeAtPath(pathString) + } + + func nodeAtPath(_ path: String) -> FilesystemNode? { + let pathComponents = path.components(separatedBy: "/").filter { (pathComponent: String) -> Bool in + pathComponent.characters.count > 0 + } + + return _nodeAtPath(pathComponents[0 ..< pathComponents.endIndex]) + } + + private func _nodeAtPath(_ pathComponents: ArraySlice) -> FilesystemNode? { + guard let nextComponent = pathComponents.first else { + return self + } + + switch self { + case .file: + guard pathComponents.count == 1 && nextComponent == self.name else { + return nil + } + return self + case .folder(_, let children): + guard let child = children[nextComponent] else { + return nil + } + return child._nodeAtPath(pathComponents[1 ..< pathComponents.endIndex]) + } + } + + func isFolder() -> Bool { + switch self { + case .folder: + return true + default: + return false + } + } + + func stLinkCount() -> nlink_t { + switch self { + case .file: + return 1 + case .folder(_, let children): + let childFolders = children.filter { (_, child: FilesystemNode) in + return child.isFolder() + } + return nlink_t(childFolders.count + 2) + } + } + + func stMode() -> mode_t { + switch self { + case .file: + return S_IFREG | 0o0444 + case .folder: + return S_IFDIR | 0o0555 + } + } + + func stSize() -> off_t { + switch self { + case .file(_, let data): + return off_t(data.count) + case .folder: + return 0 + } + } +} diff --git a/SwresFUSE/SwresFUSE.xcconfig b/SwresFUSE/SwresFUSE.xcconfig new file mode 100644 index 0000000..3e87d71 --- /dev/null +++ b/SwresFUSE/SwresFUSE.xcconfig @@ -0,0 +1,6 @@ +PRODUCT_NAME = SwresFUSE + +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) FUSE_USE_VERSION=26 _FILE_OFFSET_BITS=64 + +HEADER_SEARCH_PATHS = $(inherited) /usr/local/include/osxfuse +LIBRARY_SEARCH_PATHS = $(inherited) /usr/local/lib diff --git a/SwresFUSE/SwresFuse.swift b/SwresFUSE/SwresFuse.swift new file mode 100644 index 0000000..7a1667a --- /dev/null +++ b/SwresFUSE/SwresFuse.swift @@ -0,0 +1,324 @@ +// +// SwresFuse.swift +// SwresTools +// + +import Foundation +import Fuse + +struct FuseTask { + var inputURL: URL? + var includeTranslations: Bool = false + var allowPossibleTranslations: Bool = false + var fuseArgs: ManagedUnsafeMutablePointer? +} + +struct CommandLineOption { + let template: String + let key: CommandLineKey +} + +enum CommandLineKey: Int32 { + case fuse_opt_key_keep = -3 + case fuse_opt_key_nonopt = -2 + case fuse_opt_key_opt = -1 + case help = 1 + case includeTranslations + case allowPossibleTranslations +} + +var rootNode: FilesystemNode? +let currentDirectoryCString = ".".copyCString() +let parentDirectoryCString = "..".copyCString() + +func printUsageAndExit(status: Int32 = EXIT_SUCCESS) -> Never { + let processName = ProcessInfo.processInfo.processName + + print("Mount a resource fork with FUSE.") + print("Usage: \(processName) [options] resourcefile mountpoint") + print("Options:") + print(" -h Show this help message") + print(" -c Attempt to convert resources into more modern or portable formats.") + print(" -C Also use best guess conversions.") + + exit(status) +} + +func dieWithMessage(_ message: String) -> Never { + print(message) + exit(EXIT_FAILURE) +} + +func withFuseOptions(_ options: Array, _ block: (UnsafePointer) -> Void) { + var cStringPool = Array>() + + var fuseOptions = ContiguousArray() + fuseOptions.reserveCapacity(options.count) + + for option in options { + let cString = option.template.copyCString() + cStringPool.append(cString) + + let fuseOption = fuse_opt(templ: UnsafePointer(cString.pointer), offset: UInt(UInt32(bitPattern: -1)), value: option.key.rawValue) + fuseOptions.append(fuseOption) + } + + let nullOption = fuse_opt(templ: nil, offset: 0, value: 0) + fuseOptions.append(nullOption) + + fuseOptions.withUnsafeBufferPointer { (fuseOptionsBufferPointer: UnsafeBufferPointer) in + guard let fuseOptionsPointer = fuseOptionsBufferPointer.baseAddress else { + dieWithMessage("Error setting up option parsing.") + } + block(fuseOptionsPointer) + } +} + +func taskForArguments() -> FuseTask { + var task = FuseTask() + + let options = [ + CommandLineOption(template: "-h", key: CommandLineKey.help), + CommandLineOption(template: "-c", key: CommandLineKey.includeTranslations), + CommandLineOption(template: "-C", key: CommandLineKey.allowPossibleTranslations), + CommandLineOption(template: "-d", key: CommandLineKey.fuse_opt_key_keep), + ] + + let args = malloc(MemoryLayout.size).assumingMemoryBound(to: fuse_args.self) + args.pointee.argc = CommandLine.argc + args.pointee.argv = CommandLine.unsafeArgv + args.pointee.allocated = 0 + + withFuseOptions(options, { (fuseOptions: UnsafePointer) in + let parseResult = fuse_opt_parse(args, &task, fuseOptions, { (context: UnsafeMutableRawPointer?, arg: UnsafePointer?, key: Int32, args: UnsafeMutablePointer?) -> Int32 in + guard let taskRawPointer = UnsafeMutableRawPointer(context) else { + dieWithMessage("Error parsing arguments. Received a NULL context pointer from FUSE.") + } + let taskPointer = taskRawPointer.bindMemory(to: FuseTask.self, capacity: 1) + + guard let arg = arg else { + dieWithMessage("Error parsing arguments. Received a NULL argument from FUSE.") + } + guard let option = String(cString: arg, encoding: String.Encoding.ascii) else { + dieWithMessage("Error parsing arguments. Argument encoding unrecognized.") + } + + guard let key = CommandLineKey(rawValue: key) else { + dieWithMessage("Unexpected key from FUSE.") + } + + switch key { + case .fuse_opt_key_nonopt: + if taskPointer.pointee.inputURL == nil { + taskPointer.pointee.inputURL = URL(fileURLWithPath: option) + return 0 + } + return 1 + case .fuse_opt_key_opt: + print("Unrecognized option \(option).") + printUsageAndExit(status: EXIT_FAILURE) + case .help: + printUsageAndExit() + case .includeTranslations: + taskPointer.pointee.includeTranslations = true + return 0 + case .allowPossibleTranslations: + taskPointer.pointee.includeTranslations = true + taskPointer.pointee.allowPossibleTranslations = true + return 0 + default: + dieWithMessage("Unexpected key from FUSE.") + } + return 1 + }) + + if parseResult != 0 { + print("Failed to parse optinos.") + exit(EXIT_FAILURE) + } + }) + + fuse_opt_add_arg(args, "-s") + fuse_opt_add_arg(args, "-f") + + task.fuseArgs = ManagedUnsafeMutablePointer(adoptPointer: args) + return task +} + +func getAttr(path: UnsafePointer?, stbuf: UnsafeMutablePointer?) -> Int32 { + guard let rootNode = rootNode else { + dieWithMessage("No filesystem root note was created.") + } + guard let path = path, let stbuf = stbuf else { + dieWithMessage("Received null parameter from FUSE.") + } + + guard let node = rootNode.nodeAtPath(path) else { + return -ENOENT + } + + stbuf.pointee.st_mode = node.stMode() + stbuf.pointee.st_nlink = node.stLinkCount() + stbuf.pointee.st_size = node.stSize() + stbuf.pointee.st_uid = getuid() + stbuf.pointee.st_gid = getgid() + + return 0 +} + +func readDir(path: UnsafePointer?, buf: UnsafeMutableRawPointer?, filler: fuse_fill_dir_t?, offset: off_t, fi: UnsafeMutablePointer?) -> Int32 { + guard let rootNode = rootNode else { + dieWithMessage("No filesystem root note was created.") + } + guard let path = path, let buf = buf, let filler = filler else { + dieWithMessage("Received null parameter from FUSE.") + } + + guard let node = rootNode.nodeAtPath(path) else { + return -ENOENT + } + + @inline(__always) func appendEntry(filename: ManagedUnsafeMutablePointer) { + guard filler(buf, filename.pointer, nil, 0) == 0 else { + // TODO: Figure out how to correctly support large directories. + dieWithMessage("readDir buffer is full.") + } + } + + switch node { + case .file: + return -ENOENT + case .folder(_, let children): + appendEntry(filename: parentDirectoryCString) + appendEntry(filename: currentDirectoryCString) + for (_, child) in children { + appendEntry(filename: child.cStringName) + } + } + + return 0 +} + +func openFile(path: UnsafePointer?, fi: UnsafeMutablePointer?) -> Int32 { + guard let rootNode = rootNode else { + dieWithMessage("No filesystem root note was created.") + } + guard let path = path, let fi = fi else { + dieWithMessage("Received null parameter from FUSE.") + } + + guard let _ = rootNode.nodeAtPath(path) else { + return -ENOENT + } + + guard fi.pointee.flags & 3 == O_RDONLY else { + return -EACCES + } + + return 0 +} + +func readFile(path: UnsafePointer?, buf: UnsafeMutablePointer?, size: size_t, offset: off_t, fi: UnsafeMutablePointer?) -> Int32 { + guard let rootNode = rootNode else { + dieWithMessage("No filesystem root note was created.") + } + guard let path = path else { + dieWithMessage("Received null parameter from FUSE.") + } + + guard let node = rootNode.nodeAtPath(path) else { + return -ENOENT + } + + switch node { + case .folder: + return -ENOENT + case .file(_, let data): + let length = data.count + let offset = Int(offset) + guard length > offset else { + return 0 + } + let bytesCopied = min(length - offset, size) + data.withUnsafeBytes { (dataBytes: UnsafePointer) -> Void in + memcpy(buf, dataBytes + offset, bytesCopied) + } + return Int32(bytesCopied) + } +} + +func run(_ task: FuseTask) -> Int32 { + guard let inputURL = task.inputURL else { + dieWithMessage("Missing inputURL in task.") + } + + do { + let resourcesByType = try readResourceFork(inputURL) + rootNode = filesystemNode(resourcesByType, includeTranslations: task.includeTranslations) + + var operations = fuse_operations() + operations.getattr = getAttr + operations.readdir = readDir + operations.open = openFile + operations.read = readFile + + guard let args = task.fuseArgs?.pointer else { + dieWithMessage("Failed to construct arguments to pass to FUSE.") + } + + let result = fuse_main_real(args.pointee.argc, args.pointee.argv, &operations, MemoryLayout.size(ofValue: operations), nil) + print("hi") + return result + } catch { + dieWithMessage(error.shortDescription(withUnderlyingError: true)) + } +} + +func filesystemNode(_ resourcesByType: ResourcesByType, includeTranslations: Bool) -> FilesystemNode { + let folders = resourcesByType.map { (type: FourCharCode, resources: Array) -> FilesystemNode in + let folderName = filesystemSafeString(type.bytes) + let children = resources.flatMap { (resource: Resource) -> Array in + return filesystemNodes(resource, includeTranslations: includeTranslations) + } + + return FilesystemNode(name: folderName, children: children) + } + + return FilesystemNode(name: "ROOT", children: folders) +} + +func filesystemNodes(_ resource: Resource, includeTranslations: Bool) -> Array { + var nodes = Array() + + var filename = "\(resource.identifier)" + if let name = resource.name { + let sanitizedName = filesystemSafeString(name) + filename += " \(sanitizedName)" + } + nodes.append(FilesystemNode(name: filename, data: resource.data)) + + if (includeTranslations) { + let translatorManager = TranslatorManager.sharedInstance + let translationResults = translatorManager.translate(resource, includeTranslators: TranslatorFilter.likelyAndPossibleTranslators) + + let translationNodes = translationResults.flatMap { (translationResult: TranslationResult) -> FilesystemNode? in + switch translationResult { + case .translated(let translation): + let translatedFilename = filename + ".\(translation.suggestedFileExtension)" + return FilesystemNode(name: translatedFilename, data: translation.data) + case .error(let error): + print(error.shortDescription(withUnderlyingError: true)) + return nil + } + } + + nodes.append(contentsOf: translationNodes) + } + + return nodes +} + +func swresFuseMain() -> Int32 { + let task = taskForArguments() + return run(task) +} diff --git a/SwresFUSE/main.swift b/SwresFUSE/main.swift new file mode 100644 index 0000000..2272b4b --- /dev/null +++ b/SwresFUSE/main.swift @@ -0,0 +1,8 @@ +// +// main.swift +// SwresFUSE +// + +import Darwin + +exit(swresFuseMain()) diff --git a/SwresTools.xcodeproj/project.pbxproj b/SwresTools.xcodeproj/project.pbxproj new file mode 100644 index 0000000..74d9215 --- /dev/null +++ b/SwresTools.xcodeproj/project.pbxproj @@ -0,0 +1,535 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXAggregateTarget section */ + CA9567C41DC132620031E5F5 /* Everything */ = { + isa = PBXAggregateTarget; + buildConfigurationList = CA9567C51DC132620031E5F5 /* Build configuration list for PBXAggregateTarget "Everything" */; + buildPhases = ( + ); + dependencies = ( + CA9567C91DC1326A0031E5F5 /* PBXTargetDependency */, + CA9567CB1DC1326C0031E5F5 /* PBXTargetDependency */, + ); + name = Everything; + productName = Everything; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + CA2B20FF1DA57DAB00A14B92 /* TranslatorManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA2B20FE1DA57DAB00A14B92 /* TranslatorManager.swift */; }; + CA4150EA1DAF4401005F689D /* SequenceExtras.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA4150E41DAF4401005F689D /* SequenceExtras.swift */; }; + CA4150EB1DAF4401005F689D /* DictionaryExtras.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA4150E51DAF4401005F689D /* DictionaryExtras.swift */; }; + CA4150EC1DAF4401005F689D /* ErrorExtras.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA4150E61DAF4401005F689D /* ErrorExtras.swift */; }; + CA4150ED1DAF4401005F689D /* PointerExtras.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA4150E71DAF4401005F689D /* PointerExtras.swift */; }; + CA4150EE1DAF4401005F689D /* StrideExtras.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA4150E81DAF4401005F689D /* StrideExtras.swift */; }; + CA4150EF1DAF4401005F689D /* StringExtras.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA4150E91DAF4401005F689D /* StringExtras.swift */; }; + CA4150F21DAF4407005F689D /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA4150F01DAF4407005F689D /* main.swift */; }; + CA4150F31DAF4407005F689D /* SwresExplode.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA4150F11DAF4407005F689D /* SwresExplode.swift */; }; + CA4150F61DAF440F005F689D /* PascalStringTranslator.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA4150F41DAF440F005F689D /* PascalStringTranslator.swift */; }; + CA4150F71DAF440F005F689D /* SndTranslator.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA4150F51DAF440F005F689D /* SndTranslator.swift */; }; + CA4EB2CE1DB8057100A775DF /* SequenceExtras.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA4150E41DAF4401005F689D /* SequenceExtras.swift */; }; + CA4EB2CF1DB8057100A775DF /* DictionaryExtras.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA4150E51DAF4401005F689D /* DictionaryExtras.swift */; }; + CA4EB2D01DB8057100A775DF /* ErrorExtras.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA4150E61DAF4401005F689D /* ErrorExtras.swift */; }; + CA4EB2D11DB8057100A775DF /* PointerExtras.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA4150E71DAF4401005F689D /* PointerExtras.swift */; }; + CA4EB2D21DB8057100A775DF /* StrideExtras.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA4150E81DAF4401005F689D /* StrideExtras.swift */; }; + CA4EB2D31DB8057100A775DF /* StringExtras.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA4150E91DAF4401005F689D /* StringExtras.swift */; }; + CA4EB2D41DB8057700A775DF /* FourCharCode.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA9007D01D8DBD1900B7D2BD /* FourCharCode.swift */; }; + CA4EB2D51DB8057700A775DF /* Resource.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA9007D41D8DF9C400B7D2BD /* Resource.swift */; }; + CA4EB2D61DB8057700A775DF /* ResourceForkReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA9007CE1D8DBCAF00B7D2BD /* ResourceForkReader.swift */; }; + CA4EB2D71DB8057700A775DF /* SeekableReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA9007CC1D8DB31400B7D2BD /* SeekableReader.swift */; }; + CA4EB2D81DB8057700A775DF /* Writer.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA572C501DB2058E00A2AF8F /* Writer.swift */; }; + CA4EB2D91DB8057700A775DF /* TranslatorManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA2B20FE1DA57DAB00A14B92 /* TranslatorManager.swift */; }; + CA4EB2DA1DB8057700A775DF /* PascalStringTranslator.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA4150F41DAF440F005F689D /* PascalStringTranslator.swift */; }; + CA4EB2DB1DB8057700A775DF /* SndTranslator.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA4150F51DAF440F005F689D /* SndTranslator.swift */; }; + CA4EB2DC1DB8057700A775DF /* Translator.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA6136641DA4ADD0001F81DA /* Translator.swift */; }; + CA4EB2E11DB9ECCB00A775DF /* FilesystemNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA4EB2DF1DB9E44300A775DF /* FilesystemNode.swift */; }; + CA572C511DB2058E00A2AF8F /* Writer.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA572C501DB2058E00A2AF8F /* Writer.swift */; }; + CA584C971DB491DF00E36C26 /* SwresFuse.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA584C961DB491DF00E36C26 /* SwresFuse.swift */; }; + CA5AA8EC1DB44814001866EB /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA5AA8EB1DB44814001866EB /* main.swift */; }; + CA6136651DA4ADD0001F81DA /* Translator.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA6136641DA4ADD0001F81DA /* Translator.swift */; }; + CA9007CD1D8DB31400B7D2BD /* SeekableReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA9007CC1D8DB31400B7D2BD /* SeekableReader.swift */; }; + CA9007CF1D8DBCAF00B7D2BD /* ResourceForkReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA9007CE1D8DBCAF00B7D2BD /* ResourceForkReader.swift */; }; + CA9007D11D8DBD1900B7D2BD /* FourCharCode.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA9007D01D8DBD1900B7D2BD /* FourCharCode.swift */; }; + CA9007D51D8DF9C400B7D2BD /* Resource.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA9007D41D8DF9C400B7D2BD /* Resource.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + CA9567C81DC1326A0031E5F5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = CA9007BA1D8DAFB500B7D2BD /* Project object */; + proxyType = 1; + remoteGlobalIDString = CA9007C11D8DAFB500B7D2BD; + remoteInfo = SwresExplode; + }; + CA9567CA1DC1326C0031E5F5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = CA9007BA1D8DAFB500B7D2BD /* Project object */; + proxyType = 1; + remoteGlobalIDString = CA5AA8E81DB44814001866EB; + remoteInfo = SwresFUSE; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + CA5AA8E71DB44814001866EB /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + CA9007C01D8DAFB500B7D2BD /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + CA2B20FE1DA57DAB00A14B92 /* TranslatorManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TranslatorManager.swift; path = Translators/TranslatorManager.swift; sourceTree = ""; }; + CA4150E41DAF4401005F689D /* SequenceExtras.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SequenceExtras.swift; path = Extras/SequenceExtras.swift; sourceTree = ""; }; + CA4150E51DAF4401005F689D /* DictionaryExtras.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DictionaryExtras.swift; path = Extras/DictionaryExtras.swift; sourceTree = ""; }; + CA4150E61DAF4401005F689D /* ErrorExtras.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ErrorExtras.swift; path = Extras/ErrorExtras.swift; sourceTree = ""; }; + CA4150E71DAF4401005F689D /* PointerExtras.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PointerExtras.swift; path = Extras/PointerExtras.swift; sourceTree = ""; }; + CA4150E81DAF4401005F689D /* StrideExtras.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = StrideExtras.swift; path = Extras/StrideExtras.swift; sourceTree = ""; }; + CA4150E91DAF4401005F689D /* StringExtras.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = StringExtras.swift; path = Extras/StringExtras.swift; sourceTree = ""; }; + CA4150F01DAF4407005F689D /* main.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = main.swift; path = SwresExplode/main.swift; sourceTree = ""; }; + CA4150F11DAF4407005F689D /* SwresExplode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwresExplode.swift; path = SwresExplode/SwresExplode.swift; sourceTree = ""; }; + CA4150F41DAF440F005F689D /* PascalStringTranslator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PascalStringTranslator.swift; path = Translators/PascalStringTranslator.swift; sourceTree = ""; }; + CA4150F51DAF440F005F689D /* SndTranslator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SndTranslator.swift; path = Translators/SndTranslator.swift; sourceTree = ""; }; + CA4EB2DF1DB9E44300A775DF /* FilesystemNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FilesystemNode.swift; sourceTree = ""; }; + CA572C501DB2058E00A2AF8F /* Writer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Writer.swift; sourceTree = ""; }; + CA584C8C1DB47C9300E36C26 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; name = module.modulemap; path = Modules/FUSE/module.modulemap; sourceTree = ""; }; + CA584C8F1DB4894500E36C26 /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Configurations/Debug.xcconfig; sourceTree = ""; }; + CA584C901DB4894500E36C26 /* Project.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Project.xcconfig; path = Configurations/Project.xcconfig; sourceTree = ""; }; + CA584C911DB4894500E36C26 /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Configurations/Release.xcconfig; sourceTree = ""; }; + CA584C941DB4897800E36C26 /* SwresExplode.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = SwresExplode.xcconfig; path = SwresExplode/SwresExplode.xcconfig; sourceTree = ""; }; + CA584C951DB4897F00E36C26 /* SwresFUSE.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = SwresFUSE.xcconfig; sourceTree = ""; }; + CA584C961DB491DF00E36C26 /* SwresFuse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwresFuse.swift; sourceTree = ""; }; + CA5AA8E91DB44814001866EB /* SwresFUSE */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = SwresFUSE; sourceTree = BUILT_PRODUCTS_DIR; }; + CA5AA8EB1DB44814001866EB /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; + CA6136641DA4ADD0001F81DA /* Translator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Translator.swift; path = Translators/Translator.swift; sourceTree = ""; }; + CA9007C21D8DAFB500B7D2BD /* SwresExplode */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = SwresExplode; sourceTree = BUILT_PRODUCTS_DIR; }; + CA9007CC1D8DB31400B7D2BD /* SeekableReader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SeekableReader.swift; sourceTree = ""; }; + CA9007CE1D8DBCAF00B7D2BD /* ResourceForkReader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ResourceForkReader.swift; sourceTree = ""; }; + CA9007D01D8DBD1900B7D2BD /* FourCharCode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FourCharCode.swift; sourceTree = ""; }; + CA9007D41D8DF9C400B7D2BD /* Resource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Resource.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + CA5AA8E61DB44814001866EB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CA9007BF1D8DAFB500B7D2BD /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + CA4150E31DAF439C005F689D /* SwresExpolode */ = { + isa = PBXGroup; + children = ( + CA4150F01DAF4407005F689D /* main.swift */, + CA4150F11DAF4407005F689D /* SwresExplode.swift */, + CA584C941DB4897800E36C26 /* SwresExplode.xcconfig */, + ); + name = SwresExpolode; + sourceTree = ""; + }; + CA584C8D1DB47C9F00E36C26 /* Modules */ = { + isa = PBXGroup; + children = ( + CA5AA8F01DB44E40001866EB /* FUSE */, + ); + name = Modules; + sourceTree = ""; + }; + CA584C8E1DB4893300E36C26 /* Configurations */ = { + isa = PBXGroup; + children = ( + CA584C8F1DB4894500E36C26 /* Debug.xcconfig */, + CA584C901DB4894500E36C26 /* Project.xcconfig */, + CA584C911DB4894500E36C26 /* Release.xcconfig */, + ); + name = Configurations; + sourceTree = ""; + }; + CA5AA8EA1DB44814001866EB /* SwresFUSE */ = { + isa = PBXGroup; + children = ( + CA5AA8EB1DB44814001866EB /* main.swift */, + CA4EB2DF1DB9E44300A775DF /* FilesystemNode.swift */, + CA584C961DB491DF00E36C26 /* SwresFuse.swift */, + CA584C951DB4897F00E36C26 /* SwresFUSE.xcconfig */, + ); + path = SwresFUSE; + sourceTree = ""; + }; + CA5AA8F01DB44E40001866EB /* FUSE */ = { + isa = PBXGroup; + children = ( + CA584C8C1DB47C9300E36C26 /* module.modulemap */, + ); + name = FUSE; + sourceTree = ""; + }; + CA6136601DA49D48001F81DA /* Extras */ = { + isa = PBXGroup; + children = ( + CA4150E51DAF4401005F689D /* DictionaryExtras.swift */, + CA4150E61DAF4401005F689D /* ErrorExtras.swift */, + CA4150E71DAF4401005F689D /* PointerExtras.swift */, + CA4150E41DAF4401005F689D /* SequenceExtras.swift */, + CA4150E81DAF4401005F689D /* StrideExtras.swift */, + CA4150E91DAF4401005F689D /* StringExtras.swift */, + ); + name = Extras; + sourceTree = ""; + }; + CA6136611DA4ADA2001F81DA /* Translators */ = { + isa = PBXGroup; + children = ( + CA4150F41DAF440F005F689D /* PascalStringTranslator.swift */, + CA4150F51DAF440F005F689D /* SndTranslator.swift */, + CA6136641DA4ADD0001F81DA /* Translator.swift */, + CA2B20FE1DA57DAB00A14B92 /* TranslatorManager.swift */, + ); + name = Translators; + sourceTree = ""; + }; + CA9007B91D8DAFB500B7D2BD = { + isa = PBXGroup; + children = ( + CA6136601DA49D48001F81DA /* Extras */, + CA9007C41D8DAFB500B7D2BD /* SwresTools */, + CA6136611DA4ADA2001F81DA /* Translators */, + CA4150E31DAF439C005F689D /* SwresExpolode */, + CA5AA8EA1DB44814001866EB /* SwresFUSE */, + CA584C8D1DB47C9F00E36C26 /* Modules */, + CA584C8E1DB4893300E36C26 /* Configurations */, + CA9007C31D8DAFB500B7D2BD /* Products */, + ); + sourceTree = ""; + }; + CA9007C31D8DAFB500B7D2BD /* Products */ = { + isa = PBXGroup; + children = ( + CA9007C21D8DAFB500B7D2BD /* SwresExplode */, + CA5AA8E91DB44814001866EB /* SwresFUSE */, + ); + name = Products; + sourceTree = ""; + }; + CA9007C41D8DAFB500B7D2BD /* SwresTools */ = { + isa = PBXGroup; + children = ( + CA9007D01D8DBD1900B7D2BD /* FourCharCode.swift */, + CA9007D41D8DF9C400B7D2BD /* Resource.swift */, + CA9007CE1D8DBCAF00B7D2BD /* ResourceForkReader.swift */, + CA9007CC1D8DB31400B7D2BD /* SeekableReader.swift */, + CA572C501DB2058E00A2AF8F /* Writer.swift */, + ); + path = SwresTools; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + CA5AA8E81DB44814001866EB /* SwresFUSE */ = { + isa = PBXNativeTarget; + buildConfigurationList = CA5AA8EF1DB44814001866EB /* Build configuration list for PBXNativeTarget "SwresFUSE" */; + buildPhases = ( + CA5AA8E51DB44814001866EB /* Sources */, + CA5AA8E61DB44814001866EB /* Frameworks */, + CA5AA8E71DB44814001866EB /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SwresFUSE; + productName = SwresFUSE; + productReference = CA5AA8E91DB44814001866EB /* SwresFUSE */; + productType = "com.apple.product-type.tool"; + }; + CA9007C11D8DAFB500B7D2BD /* SwresExplode */ = { + isa = PBXNativeTarget; + buildConfigurationList = CA9007C91D8DAFB500B7D2BD /* Build configuration list for PBXNativeTarget "SwresExplode" */; + buildPhases = ( + CA9007BE1D8DAFB500B7D2BD /* Sources */, + CA9007BF1D8DAFB500B7D2BD /* Frameworks */, + CA9007C01D8DAFB500B7D2BD /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SwresExplode; + productName = SwresTools; + productReference = CA9007C21D8DAFB500B7D2BD /* SwresExplode */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + CA9007BA1D8DAFB500B7D2BD /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0810; + LastUpgradeCheck = 0810; + ORGANIZATIONNAME = "Paul Knight"; + TargetAttributes = { + CA5AA8E81DB44814001866EB = { + CreatedOnToolsVersion = 8.0; + ProvisioningStyle = Automatic; + }; + CA9007C11D8DAFB500B7D2BD = { + CreatedOnToolsVersion = 8.0; + ProvisioningStyle = Automatic; + }; + CA9567C41DC132620031E5F5 = { + CreatedOnToolsVersion = 8.0; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = CA9007BD1D8DAFB500B7D2BD /* Build configuration list for PBXProject "SwresTools" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = CA9007B91D8DAFB500B7D2BD; + productRefGroup = CA9007C31D8DAFB500B7D2BD /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + CA9567C41DC132620031E5F5 /* Everything */, + CA9007C11D8DAFB500B7D2BD /* SwresExplode */, + CA5AA8E81DB44814001866EB /* SwresFUSE */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + CA5AA8E51DB44814001866EB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CA4EB2D11DB8057100A775DF /* PointerExtras.swift in Sources */, + CA4EB2D21DB8057100A775DF /* StrideExtras.swift in Sources */, + CA4EB2D71DB8057700A775DF /* SeekableReader.swift in Sources */, + CA4EB2DC1DB8057700A775DF /* Translator.swift in Sources */, + CA4EB2D01DB8057100A775DF /* ErrorExtras.swift in Sources */, + CA4EB2D51DB8057700A775DF /* Resource.swift in Sources */, + CA4EB2D31DB8057100A775DF /* StringExtras.swift in Sources */, + CA5AA8EC1DB44814001866EB /* main.swift in Sources */, + CA4EB2E11DB9ECCB00A775DF /* FilesystemNode.swift in Sources */, + CA4EB2CE1DB8057100A775DF /* SequenceExtras.swift in Sources */, + CA4EB2CF1DB8057100A775DF /* DictionaryExtras.swift in Sources */, + CA584C971DB491DF00E36C26 /* SwresFuse.swift in Sources */, + CA4EB2D91DB8057700A775DF /* TranslatorManager.swift in Sources */, + CA4EB2D81DB8057700A775DF /* Writer.swift in Sources */, + CA4EB2D61DB8057700A775DF /* ResourceForkReader.swift in Sources */, + CA4EB2DB1DB8057700A775DF /* SndTranslator.swift in Sources */, + CA4EB2D41DB8057700A775DF /* FourCharCode.swift in Sources */, + CA4EB2DA1DB8057700A775DF /* PascalStringTranslator.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CA9007BE1D8DAFB500B7D2BD /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CA6136651DA4ADD0001F81DA /* Translator.swift in Sources */, + CA4150F21DAF4407005F689D /* main.swift in Sources */, + CA9007CD1D8DB31400B7D2BD /* SeekableReader.swift in Sources */, + CA4150EA1DAF4401005F689D /* SequenceExtras.swift in Sources */, + CA4150F31DAF4407005F689D /* SwresExplode.swift in Sources */, + CA9007CF1D8DBCAF00B7D2BD /* ResourceForkReader.swift in Sources */, + CA9007D11D8DBD1900B7D2BD /* FourCharCode.swift in Sources */, + CA2B20FF1DA57DAB00A14B92 /* TranslatorManager.swift in Sources */, + CA4150EB1DAF4401005F689D /* DictionaryExtras.swift in Sources */, + CA4150EF1DAF4401005F689D /* StringExtras.swift in Sources */, + CA4150EC1DAF4401005F689D /* ErrorExtras.swift in Sources */, + CA4150EE1DAF4401005F689D /* StrideExtras.swift in Sources */, + CA572C511DB2058E00A2AF8F /* Writer.swift in Sources */, + CA4150ED1DAF4401005F689D /* PointerExtras.swift in Sources */, + CA4150F71DAF440F005F689D /* SndTranslator.swift in Sources */, + CA9007D51D8DF9C400B7D2BD /* Resource.swift in Sources */, + CA4150F61DAF440F005F689D /* PascalStringTranslator.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + CA9567C91DC1326A0031E5F5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = CA9007C11D8DAFB500B7D2BD /* SwresExplode */; + targetProxy = CA9567C81DC1326A0031E5F5 /* PBXContainerItemProxy */; + }; + CA9567CB1DC1326C0031E5F5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = CA5AA8E81DB44814001866EB /* SwresFUSE */; + targetProxy = CA9567CA1DC1326C0031E5F5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + CA5AA8ED1DB44814001866EB /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = CA584C951DB4897F00E36C26 /* SwresFUSE.xcconfig */; + buildSettings = { + }; + name = Debug; + }; + CA5AA8EE1DB44814001866EB /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = CA584C951DB4897F00E36C26 /* SwresFUSE.xcconfig */; + buildSettings = { + }; + name = Release; + }; + CA9007C71D8DAFB500B7D2BD /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = CA584C8F1DB4894500E36C26 /* Debug.xcconfig */; + buildSettings = { + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + }; + name = Debug; + }; + CA9007C81D8DAFB500B7D2BD /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = CA584C911DB4894500E36C26 /* Release.xcconfig */; + buildSettings = { + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + }; + name = Release; + }; + CA9007CA1D8DAFB500B7D2BD /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = CA584C941DB4897800E36C26 /* SwresExplode.xcconfig */; + buildSettings = { + }; + name = Debug; + }; + CA9007CB1D8DAFB500B7D2BD /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = CA584C941DB4897800E36C26 /* SwresExplode.xcconfig */; + buildSettings = { + }; + name = Release; + }; + CA9567C61DC132620031E5F5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + CA9567C71DC132620031E5F5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + CA5AA8EF1DB44814001866EB /* Build configuration list for PBXNativeTarget "SwresFUSE" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CA5AA8ED1DB44814001866EB /* Debug */, + CA5AA8EE1DB44814001866EB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + CA9007BD1D8DAFB500B7D2BD /* Build configuration list for PBXProject "SwresTools" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CA9007C71D8DAFB500B7D2BD /* Debug */, + CA9007C81D8DAFB500B7D2BD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + CA9007C91D8DAFB500B7D2BD /* Build configuration list for PBXNativeTarget "SwresExplode" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CA9007CA1D8DAFB500B7D2BD /* Debug */, + CA9007CB1D8DAFB500B7D2BD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + CA9567C51DC132620031E5F5 /* Build configuration list for PBXAggregateTarget "Everything" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CA9567C61DC132620031E5F5 /* Debug */, + CA9567C71DC132620031E5F5 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = CA9007BA1D8DAFB500B7D2BD /* Project object */; +} diff --git a/SwresTools.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/SwresTools.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..7c55926 --- /dev/null +++ b/SwresTools.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/SwresTools/FourCharCode.swift b/SwresTools/FourCharCode.swift new file mode 100644 index 0000000..f27790b --- /dev/null +++ b/SwresTools/FourCharCode.swift @@ -0,0 +1,50 @@ +// +// FourCharCode.swift +// SwresTools +// + +import Foundation + +enum FourCharCodeError: SwresError { + case invalidSequence + + var description: String { + return "Cannot construct FourCharCode from invalid byte sequence." + } +} + +struct FourCharCode: Equatable, Hashable, CustomStringConvertible { + let bytes: Data + + init(_ bytes: Data) throws { + guard bytes.count == 4 else { + throw FourCharCodeError.invalidSequence + } + self.bytes = bytes + } + + init(_ cString: UnsafeMutablePointer) throws { + let string = String(cString: cString) + try self.init(string) + } + + init(_ string: String) throws { + guard let data = string.data(using: String.Encoding.utf8) else { + throw FourCharCodeError.invalidSequence + } + try self.init(data) + } + + static func ==(lhs: FourCharCode, rhs: FourCharCode) -> Bool { + return lhs.bytes == rhs.bytes + } + + var hashValue: Int { + return (Int(bytes[0]) << 24) + (Int(bytes[1]) << 16) + (Int(bytes[2]) << 8) + (Int(bytes[3])) + } + + var description: String { + let options = MacOSRomanConversionOptions(filterControlCharacters: true, filterFilesystemUnsafeCharacters: false, filterNonASCIICharacters: false, replacementMacOSRomanByte: MacOSRomanByteQuestionMark) + return stringFromMacOSRomanBytes(bytes, options: options) + } +} diff --git a/SwresTools/Resource.swift b/SwresTools/Resource.swift new file mode 100644 index 0000000..66bf545 --- /dev/null +++ b/SwresTools/Resource.swift @@ -0,0 +1,27 @@ +// +// Resource.swift +// SwresTools +// + +import Foundation + +struct Resource: CustomStringConvertible { + let type: FourCharCode + let identifier: Int16 + let name: Data? + let data: Data + + var stringName: String? { + guard let name = name else { + return nil + } + + let options = MacOSRomanConversionOptions(filterControlCharacters: true, filterFilesystemUnsafeCharacters: false, filterNonASCIICharacters: false, replacementMacOSRomanByte: MacOSRomanByteQuestionMark) + return stringFromMacOSRomanBytes(name, options: options) + } + + var description: String { + let formattedName = stringName ?? "" + return "" + } +} diff --git a/SwresTools/ResourceForkReader.swift b/SwresTools/ResourceForkReader.swift new file mode 100644 index 0000000..b78e575 --- /dev/null +++ b/SwresTools/ResourceForkReader.swift @@ -0,0 +1,189 @@ +// +// ResourceManager.swift +// SwresTools +// + +// Resource Map documentation comes from Inside Macintosh: More Macintosh Toolbox (1993). + +import Foundation + +typealias ResourcesByType = Dictionary> + +enum ResourceForkReaderError: NestingSwresError { + case emptyResourceFork + case couldntReadResourceFork(underlyingError: Error?) + case invalidFormat(underlyingError: SeekableReaderError) + case other + + var description: String { + switch self { + case .emptyResourceFork: + return "The resource fork is empty." + case .couldntReadResourceFork(_): + return "Couldn't read resource fork." + case .invalidFormat(_): + return "Input file is corrupted or not a resource fork." + case .other : + return "An unexpected error happend while reading the resource fork." + } + } + + var underlyingError: Error? { + switch self { + case .couldntReadResourceFork(let subError): + return subError + case .invalidFormat(let subError): + return subError + default: + return nil + } + } +} + +// The resource header is: +// * Offset from beginning of resource fork to resource data (4) +// * Offset from beginning of resource fork to resource map (4) +// * Length of resource data (4) +// * Length of resource map (4) +func readResourceFork(_ path: URL) throws -> ResourcesByType { + let data = try _readResourceFork(path) + + do { + var reader = SeekableReader(data) + let dataOffset = try reader.readInt32() + let mapOffset = try reader.readInt32() + return try _parseResourceMap(reader: reader, dataOffset: dataOffset, mapOffset: mapOffset) + } catch let error as SeekableReaderError { + throw ResourceForkReaderError.invalidFormat(underlyingError: error) + } catch { + assertionFailure() + throw ResourceForkReaderError.other + } +} + +func _readResourceFork(_ path: URL) throws -> Data { + var error: Error? + + guard let data = ["..namedfork/rsrc", ""].firstSome({ (suffix: String) -> Data? in + let url = path.appendingPathComponent(suffix) + + var data: Data? + do { + data = try Data(contentsOf: url) + } catch let lastError { + error = lastError + } + + if data != nil && data!.count == 0 { + error = ResourceForkReaderError.emptyResourceFork + data = nil + } + + return data + }) else { + throw ResourceForkReaderError.couldntReadResourceFork(underlyingError: error) + } + + return data +} + +// The resource map is: +// * Reserved for copy of resource header (16) +// * Reserved for handle to next resource map (4) +// * Reserved for file reference number (2) +// * Resource fork attributes (2) +// * Offset from beginning of map to resource type list (2) [1] +// * Offset from beginning of map to resource name list (2) +// * Number of types in the map minus 1 (2) +// * Resource type list (Variable) +// * Reference lists (Variable) +// * Resource name list (Variable) +// +// Type list starts with: +// * Number of types in the map minus 1 +// Each type is: +// * Resource type (4) +// * Number of resources of this type in map minus 1 (2) +// * Offset from beginning of resource type list to reference list for this type (2) +// +// [1] Actually points to the type count, not the start of the variable length type list +func _parseResourceMap(reader: SeekableReader, dataOffset: Int32, mapOffset: Int32) throws -> ResourcesByType { + var reader = reader + var resourcesByType = ResourcesByType() + + try reader.seek(mapOffset) + try reader.skip(16 + 4 + 2 + 2) // Header copy, handle, file no., attributes + + let typeListOffset = mapOffset + Int32(try reader.readInt16()) + let nameListOffset = mapOffset + Int32(try reader.readInt16()) + + try reader.seek(typeListOffset) + let typeCount = try reader.readInt16() + 1 + + for _ in 1...typeCount { + let fourCharCodeBytes = try reader.readBytes(4) + let type = try FourCharCode(fourCharCodeBytes) + let resourceCount = try reader.readInt16() + 1 + let referenceListOffset = typeListOffset + Int32(try reader.readInt16()) + + resourcesByType[type] = try _parseReferenceList(reader: reader, dataOffset: dataOffset, referenceListOffset: referenceListOffset, nameListOffset: nameListOffset, type: type, resourceCount: resourceCount) + } + + return resourcesByType +} + +// A reference list entry is: +// * Resource ID (2) +// * Offset from beginning of resource name list to resource name (2) +// * Resource attributes (1) +// * Offset from beginning of resource data to data for this resource (3) +// * Reserved for handle to resource (4) +private func _parseReferenceList(reader: SeekableReader, dataOffset: Int32, referenceListOffset: Int32, nameListOffset: Int32, type: FourCharCode, resourceCount: Int16) throws -> Array { + var reader = reader + var resources = Array() + resources.reserveCapacity(Int(resourceCount)) + + try reader.seek(referenceListOffset) + for _ in 1...resourceCount { + let identifier = try reader.readInt16() + + var name: Data? + let nameOffset = try reader.readInt16() + if nameOffset != -1 { + let absoluteNameOffset = nameListOffset + Int32(nameOffset) + try name = _parseName(reader: reader, offset: absoluteNameOffset) + } + + try reader.skip(1) // Resource attributes + + let relativeDataOffset = try reader.readInt24() + let absoluteDataOffset = dataOffset + Int32(relativeDataOffset) + let data = try _parseResourceData(reader: reader, offset: absoluteDataOffset) + + let resource = Resource(type: type, identifier: identifier, name: name, data: data) + resources.append(resource) + + try reader.skip(4) // Handle to resource + } + + return resources +} + +// A name is: +// * Length of following resource name (1) +// * Characters of resource name (Variable) +private func _parseName(reader: SeekableReader, offset: Int32) throws -> Data { + var reader = reader + try reader.seek(offset) + let length = Int(try reader.readInt8()) + let bytes = try reader.readBytes(length) + return bytes +} + +private func _parseResourceData(reader: SeekableReader, offset: Int32) throws -> Data { + var reader = reader + try reader.seek(offset) + + let length = try reader.readInt32() + return try reader.readBytes(length) +} diff --git a/SwresTools/SeekableReader.swift b/SwresTools/SeekableReader.swift new file mode 100644 index 0000000..0db5c65 --- /dev/null +++ b/SwresTools/SeekableReader.swift @@ -0,0 +1,103 @@ +// +// SeekableReader.swift +// SwresTools +// + +import Foundation + +enum SeekableReaderError: SwresError { + case invalidLocation(Int) + case invalidRange(location: Int, length: Int) + case invalidParameter(name: String, value: Any) + case internalError + + var description: String { + switch(self) { + case .invalidLocation(let location): + return String.init(format: "Invalid seek to location 0x%x.", location) + case .invalidRange(let location, let length): + return String.init(format: "Invalid read at location 0x%x with length %d.", location, length) + case .invalidParameter: + return "Program error." + case .internalError: + return "Internal error." + } + } +} + +// Assumes big-endian byte order. +struct SeekableReader { + private let _data: Data + private var _offset: Int + + init(_ data: Data) { + _data = data + _offset = 0 + } + + private mutating func _readUInt32(length: Int) throws -> UInt32 { + guard length > 0 else { + assertionFailure() + throw SeekableReaderError.internalError + } + guard _offset + length <= _data.count else { + throw SeekableReaderError.invalidRange(location: _offset, length: length) + } + + var value: UInt32 = 0 + for _ in 1...length { + let byte = _data[_offset] + value = (value << 8) + UInt32(byte) + _offset += 1 + } + return value + } + + mutating func readInt8() throws -> Int8 { + return try Int8(truncatingBitPattern: _readUInt32(length: 1)) + } + + mutating func readInt16() throws -> Int16 { + return try Int16(truncatingBitPattern: _readUInt32(length: 2)) + } + + mutating func readInt24() throws -> Int32 { + return try Int32(bitPattern: _readUInt32(length: 3)) + } + + mutating func readInt32() throws -> Int32 { + return try Int32(bitPattern: _readUInt32(length: 4)) + } + + mutating func readBytes(_ length: Int) throws -> Data { + guard length > 0 else { + throw SeekableReaderError.invalidParameter(name: "length", value: length) + } + guard _offset + length <= _data.count else { + throw SeekableReaderError.invalidRange(location: _offset, length: length) + } + + let subdata = _data.subdata(in: _offset..<(_offset + length)) + _offset += length + return subdata + } + + mutating func readBytes(_ length: Int32) throws -> Data { + return try readBytes(Int(length)) + } + + mutating func seek(_ offset: Int) throws { + guard offset >= 0 && offset < _data.count else { + throw SeekableReaderError.invalidLocation(offset) + } + _offset = offset + } + + mutating func seek(_ offset: Int32) throws { + try seek(Int(offset)) + } + + mutating func skip(_ offset: Int) throws { + try(seek(_offset + offset)) + } +} diff --git a/SwresTools/Writer.swift b/SwresTools/Writer.swift new file mode 100644 index 0000000..621b87a --- /dev/null +++ b/SwresTools/Writer.swift @@ -0,0 +1,125 @@ +// +// Writer.swift +// SwresTools +// + +import Foundation + +enum WriterEndianness { + case littleEndian + case bigEndian +} + +enum WriterError: SwresError { + case invalidParameter(message: String) + case alreadyFinalized + case internalError + + var description: String { + switch self { + case .invalidParameter(let message): + return "Invalid parameter. \(message)" + case .alreadyFinalized: + return "The writer has already been finalized." + case .internalError: + return "Internal error." + } + } +} + +class Writer { + private let _endianness: WriterEndianness + private var _outputStream: OutputStream + private var _finalized: Bool = false + + init(endianness: WriterEndianness) { + _endianness = endianness + _outputStream = OutputStream.toMemory() + _outputStream.open() + } + + private func _unwrapped(_ endianness: WriterEndianness?) -> WriterEndianness { + if let unwrappedEndianness = endianness { + return unwrappedEndianness + } + return _endianness + } + + private func _validateNotFinalized() throws { + guard !_finalized else { + throw WriterError.alreadyFinalized + } + } + + func write(_ value: Int16, endianness: WriterEndianness? = nil) throws { + try _validateNotFinalized() + + var value = value + + switch _unwrapped(endianness) { + case .littleEndian: + value = value.littleEndian + case .bigEndian: + value = value.bigEndian + } + + try withUnsafePointer(to: &value) { (valuePointer: UnsafePointer) in + let bytePointer = UnsafeRawPointer(valuePointer).assumingMemoryBound(to: UInt8.self) + try _write(bytePointer, length: MemoryLayout.size) + } + } + + func write(_ value: Int32, endianness: WriterEndianness? = nil) throws { + try _validateNotFinalized() + + var value = value + + switch _unwrapped(endianness) { + case .littleEndian: + value = value.littleEndian + case .bigEndian: + value = value.bigEndian + } + + try withUnsafePointer(to: &value) { (valuePointer: UnsafePointer) in + let bytePointer = UnsafeRawPointer(valuePointer).assumingMemoryBound(to: UInt8.self) + try _write(bytePointer, length: MemoryLayout.size) + } + } + + func write(_ data: Data) throws { + try _validateNotFinalized() + + _ = try data.withUnsafeBytes { (pointer: UnsafePointer) in + try _write(pointer, length: data.count) + } + } + + func write(ascii: String) throws { + try _validateNotFinalized() + + guard let data = ascii.data(using: String.Encoding.ascii, allowLossyConversion: true) else { + throw WriterError.invalidParameter(message: "Invalid ASCII string.") + } + + try write(data) + } + + private func _write(_ pointer: UnsafePointer, length: Int) throws { + let writtenBytes = _outputStream.write(pointer, maxLength: length) + guard writtenBytes == length else { + throw WriterError.internalError + } + } + + func finalize() throws -> Data { + try _validateNotFinalized() + + let result = _outputStream.property(forKey: Stream.PropertyKey.dataWrittenToMemoryStreamKey) + guard let unwrappedResult = result, let data = unwrappedResult as? Data else { + throw WriterError.internalError + } + _finalized = true + return data + } +} diff --git a/Translators/PascalStringTranslator.swift b/Translators/PascalStringTranslator.swift new file mode 100644 index 0000000..acfb625 --- /dev/null +++ b/Translators/PascalStringTranslator.swift @@ -0,0 +1,49 @@ +// +// PascalStringTranslator.swift +// SwresTools +// + +import Foundation + +struct PascalStringTranslator: Translator { + @discardableResult func _looksLikePascalString(_ data: Data) throws -> Bool { + guard data.count > 0 else { + throw TranslatorError.unsupportedResource(reason: "Can't translate empty data.") + } + + let length = data[0] + guard data.count == Int(length) + 1 else { + throw TranslatorError.unsupportedResource(reason: "Resource length doesn't match first byte prefix.") + } + + return true + } + + static private var _strType: FourCharCode = try! FourCharCode("STR ") + + func compatibilityWith(resource: Resource) -> TranslatorCompatibility { + do { + try _looksLikePascalString(resource.data) + } catch { + return TranslatorCompatibility.notCompatible + } + + switch resource.type { + case PascalStringTranslator._strType: + return TranslatorCompatibility.likelyCompatible + default: + return TranslatorCompatibility.possiblyCompatible + } + } + + func translate(resource: Resource) throws -> Translation { + let data = resource.data + try _looksLikePascalString(data) + + let options = MacOSRomanConversionOptions(filterControlCharacters: false, filterFilesystemUnsafeCharacters: false, filterNonASCIICharacters: false, replacementMacOSRomanByte: nil) + let string = stringFromMacOSRomanBytes(data.subdata(in: 1.. TranslatorCompatibility { + if resource.type == SndResourceType { + return TranslatorCompatibility.likelyCompatible + } + return TranslatorCompatibility.notCompatible + } + + func translate(resource: Resource) throws -> Translation { + let reader = SeekableReader(resource.data) + + do { + let sndResource = try _readSndResource(reader) + let data = try _wavData(sndResource) + return Translation(data: data, suggestedFileExtension: SuggestedFileExtension) + } catch let error { + throw TranslatorError.invalidResource(reason: "Failed to parse snd resource.", underlyingError: error) + } + } + + private func _readSndResource(_ reader: SeekableReader) throws -> SndResource { + var reader = reader + let format = try reader.readInt16() + + guard format == 1 || format == 2 else { + throw TranslatorError.invalidResource(reason: "Unknown snd format \(format)", underlyingError: nil) + } + guard format == 1 else { + throw TranslatorError.unsupportedResource(reason: "Format 2 snd resources are not supported.") + } + + let dataFormatCount = try reader.readInt16() + guard dataFormatCount > 0 else { + throw TranslatorError.unsupportedResource(reason: "The resource doesn't contain any data formats.") + } + guard dataFormatCount == 1 else { + throw TranslatorError.unsupportedResource(reason: "The author hasn't read the spec closely enough to understand what to do when the resource contains more than one data format.") + } + + let dataType = try reader.readInt16() + guard dataType == 5 else { + throw TranslatorError.unsupportedResource(reason: "Only sampled sound data (type 0x0005) is supported.") + } + + // Skip the sound channel init options. + try reader.skip(4) + + let commandCount = try reader.readInt16() + guard commandCount == 1 else { + throw TranslatorError.unsupportedResource(reason: "The author hasn't read the spec closely enough to understand what to do when the resource contains more than one sound command.") + } + + let command = try reader.readInt16() + guard command == Int16(bitPattern: 0x8051) else { + throw TranslatorError.unsupportedResource(reason: "Only bufferCmd commands are supported.") + } + + // param1 seems to be unused for this command. + try reader.skip(2) + let soundHeaderOffset = try reader.readInt32() + + try reader.seek(soundHeaderOffset) + let sampleDataPointer = try reader.readInt32() + guard sampleDataPointer == 0 else { + throw TranslatorError.unsupportedResource(reason: "The author hasn't read the spec closely enough to understand what a non-zero sample data pointer means.") + } + + let sampleByteLength = try reader.readInt32() + guard sampleByteLength > 0 else { + throw TranslatorError.invalidResource(reason: "Sample has a negative length.", underlyingError: nil) + } + + // The sample rate is an unsigned 16.16 fixed point integer. Flooring the frequency loses + // information but the precision loss is less than one hundredth of one percent and WAV + // maybe doesn't support fractional frequencies? + let sampleRateFixed = try reader.readInt32() + let sampleRate = Int(sampleRateFixed >> 16) + + // Skip the two loop point parameters + try reader.skip(8) + + let sampleEncoding = try reader.readInt8() + guard sampleEncoding == 0 else { + throw TranslatorError.unsupportedResource(reason: "Encoded samples are not supported.") + } + + // Skip baseFrequency + try reader.skip(1) + + let sampleData = try reader.readBytes(sampleByteLength) + + return SndResource(sampleRate: sampleRate, data: sampleData) + } + + private func _wavData(_ sndResource: SndResource) throws -> Data { + let writer = Writer(endianness: .littleEndian) + + let data = sndResource.data + let dataCount = data.count + let wavFileSize = dataCount + WAVHeaderCount + + let sampleRate = sndResource.sampleRate + + // The header ChunkSize does not include the first ChunkID and size, i.e. + // it's the file size minus the first 8 bytes + try writer.write(ascii: "RIFF") + try writer.write(Int32(wavFileSize - 8)) + try writer.write(ascii: "WAVE") + + try writer.write(ascii: "fmt ") + try writer.write(Int32(16)) // Subchunk size + try writer.write(Int16(1)) // AudioFormat: PCM + try writer.write(Int16(1)) // Channel count + try writer.write(Int32(sampleRate)) + try writer.write(Int32(sampleRate)) // Bytes per second + try writer.write(Int16(1)) // Block alignment + try writer.write(Int16(8)) // Bits per sample + + try writer.write(ascii: "data") + try writer.write(Int32(dataCount)) + try writer.write(data) + + return try writer.finalize() + } +} diff --git a/Translators/Translator.swift b/Translators/Translator.swift new file mode 100644 index 0000000..8c8e25c --- /dev/null +++ b/Translators/Translator.swift @@ -0,0 +1,49 @@ +// +// Translator.swift +// SwresTools +// + +import Foundation + +enum TranslatorError: NestingSwresError { + case unsupportedResource(reason: String) + case invalidResource(reason: String?, underlyingError: Error?) + + var description: String { + switch self { + case .unsupportedResource(let reason): + return "The resource may be valid but this translator is not able to convert it. \(reason)" + case .invalidResource(let reason, _): + var message = "The resource does not appear to be valid." + if let unwrappedReason = reason { + message += " \(unwrappedReason)" + } + return message + } + } + + var underlyingError: Error? { + switch self { + case .invalidResource(_, let error): + return error + default: + return nil + } + } +} + +enum TranslatorCompatibility { + case notCompatible + case possiblyCompatible + case likelyCompatible +} + +struct Translation { + let data: Data + let suggestedFileExtension: String +} + +protocol Translator { + func compatibilityWith(resource: Resource) -> TranslatorCompatibility + func translate(resource: Resource) throws -> Translation +} diff --git a/Translators/TranslatorManager.swift b/Translators/TranslatorManager.swift new file mode 100644 index 0000000..1d3d291 --- /dev/null +++ b/Translators/TranslatorManager.swift @@ -0,0 +1,62 @@ +// +// TranslatorManager +// SwresTools +// + +import Foundation + +enum TranslatorFilter: Int, Comparable { + case noTranslators + case onlyLikelyTranslators + case likelyAndPossibleTranslators + + static func <(lhs: TranslatorFilter, rhs: TranslatorFilter) -> Bool { + return lhs.rawValue < rhs.rawValue + } +} + +enum TranslationResult { + case translated(_: Translation) + case error(_: Error) +} + +struct TranslatorManager { + static let sharedInstance = TranslatorManager() + + private let _translators: Array + + private init() { + _translators = [ + PascalStringTranslator(), + SndTranslator(), + ] + } + + func translate(_ resource: Resource, includeTranslators translatorFilter: TranslatorFilter = TranslatorFilter.noTranslators) -> Array { + var translationResults = Array() + + let translatorsByCompatibility = _translators.groupBy({ (translator: Translator) in + return translator.compatibilityWith(resource: resource) + }) + + var applicableTranslators = Array() + if let likelyTranslators = translatorsByCompatibility[TranslatorCompatibility.likelyCompatible] { + applicableTranslators.append(contentsOf: likelyTranslators) + } + + if translatorFilter >= TranslatorFilter.likelyAndPossibleTranslators, let possibleTranslators = translatorsByCompatibility[TranslatorCompatibility.possiblyCompatible] { + applicableTranslators.append(contentsOf: possibleTranslators) + } + + for translator in applicableTranslators { + do { + let translation = try translator.translate(resource: resource) + translationResults.append(TranslationResult.translated(translation)) + } catch let error { + translationResults.append(TranslationResult.error(error)) + } + } + + return translationResults + } +}