diff --git a/Sources/Foundation/NSPathUtilities.swift b/Sources/Foundation/NSPathUtilities.swift index b4c6a2889e..2142f057b9 100644 --- a/Sources/Foundation/NSPathUtilities.swift +++ b/Sources/Foundation/NSPathUtilities.swift @@ -191,21 +191,23 @@ extension String { temp.removeSubrange(startIndex.. String? { guard self != prefix else { return nil } let temp = _stringByRemovingPrefix(prefix) +#if os(WASI) + return temp +#else if FileManager.default.fileExists(atPath: temp) { return temp } - +#endif + return nil } -#endif } extension NSString { @@ -335,7 +337,6 @@ extension NSString { return result._stringByFixingSlashes() } -#if !os(WASI) public var expandingTildeInPath: String { guard hasPrefix("~") else { return _swiftObject @@ -356,7 +357,6 @@ extension NSString { return result } -#endif #if os(Windows) public var unixPath: String { @@ -370,8 +370,7 @@ extension NSString { return converted._stringByFixingSlashes(stripTrailing: false) } #endif - -#if !os(WASI) + public var standardizingPath: String { #if os(Windows) let expanded = unixPath.expandingTildeInPath @@ -408,9 +407,11 @@ extension NSString { default: resolvedPath = resolvedPath._bridgeToObjectiveC().appendingPathComponent(component) +#if !os(WASI) if let destination = FileManager.default._tryToResolveTrailingSymlinkInPath(resolvedPath) { resolvedPath = destination } +#endif } } @@ -419,8 +420,7 @@ extension NSString { return resolvedPath } -#endif - + public func stringsByAppendingPaths(_ paths: [String]) -> [String] { if self == "" { return paths @@ -722,12 +722,16 @@ public func NSSearchPathForDirectoriesInDomains(_ directory: FileManager.SearchP return path } } +#endif public func NSHomeDirectory() -> String { return NSHomeDirectoryForUser(nil)! } public func NSHomeDirectoryForUser(_ user: String?) -> String? { +#if os(WASI) + return nil +#else let userName = user?._cfObject guard let homeDir = CFCopyHomeDirectoryURLForUser(userName)?.takeRetainedValue() else { return nil @@ -735,8 +739,10 @@ public func NSHomeDirectoryForUser(_ user: String?) -> String? { let url: URL = homeDir._swiftObject return url.path +#endif } +#if !os(WASI) public func NSUserName() -> String { let userName = CFCopyUserName().takeRetainedValue() return userName._swiftObject diff --git a/Sources/Foundation/NSURL.swift b/Sources/Foundation/NSURL.swift index 9147594658..4fabe5070e 100644 --- a/Sources/Foundation/NSURL.swift +++ b/Sources/Foundation/NSURL.swift @@ -26,7 +26,6 @@ internal let kCFURLPlatformPathStyle = kCFURLWindowsPathStyle internal let kCFURLPlatformPathStyle = kCFURLPOSIXPathStyle #endif -#if !os(WASI) private func _standardizedPath(_ path: String) -> String { if !path.isAbsolutePath { return path._nsObject.standardizingPath @@ -37,7 +36,6 @@ private func _standardizedPath(_ path: String) -> String { return path #endif } -#endif internal func _pathComponents(_ path: String?) -> [String]? { guard let p = path else { @@ -193,8 +191,7 @@ open class NSURL : NSObject, NSSecureCoding, NSCopying { aCoder.encode(self.baseURL?._nsObject, forKey:"NS.base") aCoder.encode(self.relativeString._bridgeToObjectiveC(), forKey:"NS.relative") } - -#if !os(WASI) + public init(fileURLWithPath path: String, isDirectory isDir: Bool, relativeTo baseURL: URL?) { super.init() @@ -214,6 +211,7 @@ open class NSURL : NSObject, NSSecureCoding, NSCopying { if validPathSeps.contains(where: { thePath.hasSuffix(String($0)) }) { isDir = true } else { +#if !os(WASI) let absolutePath: String if let absPath = baseURL?.appendingPathComponent(path).path { absolutePath = absPath @@ -222,6 +220,7 @@ open class NSURL : NSObject, NSSecureCoding, NSCopying { } let _ = FileManager.default.fileExists(atPath: absolutePath, isDirectory: &isDir) +#endif } self.init(fileURLWithPath: thePath, isDirectory: isDir.boolValue, relativeTo: baseURL) @@ -238,9 +237,11 @@ open class NSURL : NSObject, NSSecureCoding, NSCopying { if validPathSeps.contains(where: { thePath.hasSuffix(String($0)) }) { isDir = true } else { +#if !os(WASI) if !FileManager.default.fileExists(atPath: path, isDirectory: &isDir) { isDir = false } +#endif } super.init() _CFURLInitWithFileSystemPathRelativeToBase(_cfObject, thePath._cfObject, kCFURLPlatformPathStyle, isDir.boolValue, nil) @@ -251,7 +252,6 @@ open class NSURL : NSObject, NSSecureCoding, NSCopying { let pathString = String(cString: path) self.init(fileURLWithPath: pathString, isDirectory: isDir, relativeTo: baseURL) } -#endif public convenience init?(string URLString: String) { self.init(string: URLString, relativeTo:nil) @@ -893,8 +893,7 @@ extension NSURL { open var deletingPathExtension: URL? { return CFURLCreateCopyDeletingPathExtension(kCFAllocatorSystemDefault, _cfObject)?._swiftObject } - -#if !os(WASI) + /* The following methods work only on `file:` scheme URLs; for non-`file:` scheme URLs, these methods return the URL unchanged. */ open var standardizingPath: URL? { @@ -902,7 +901,7 @@ extension NSURL { // In remaining cases it works just like URLByResolvingSymlinksInPath. return _resolveSymlinksInPath(excludeSystemDirs: true, preserveDirectoryFlag: true) } - + open var resolvingSymlinksInPath: URL? { return _resolveSymlinksInPath(excludeSystemDirs: true) } @@ -920,8 +919,12 @@ extension NSURL { if selfPath.isAbsolutePath { absolutePath = selfPath } else { +#if os(WASI) + return nil +#else let workingDir = FileManager.default.currentDirectoryPath absolutePath = workingDir._bridgeToObjectiveC().appendingPathComponent(selfPath) +#endif } @@ -942,15 +945,20 @@ extension NSURL { default: resolvedPath = resolvedPath._bridgeToObjectiveC().appendingPathComponent(component) +#if !os(WASI) if let destination = FileManager.default._tryToResolveTrailingSymlinkInPath(resolvedPath) { resolvedPath = destination } +#endif } } // It might be a responsibility of NSURL(fileURLWithPath:). Check it. var isExistingDirectory: ObjCBool = false + +#if !os(WASI) let _ = FileManager.default.fileExists(atPath: resolvedPath, isDirectory: &isExistingDirectory) +#endif if excludeSystemDirs { resolvedPath = resolvedPath._tryToRemovePathPrefix("/private") ?? resolvedPath @@ -966,7 +974,6 @@ extension NSURL { return URL(fileURLWithPath: resolvedPath) } } -#endif fileprivate func _pathByRemovingDots(_ comps: [String]) -> String { var components = comps diff --git a/Sources/Foundation/URL.swift b/Sources/Foundation/URL.swift index f5bff293d1..8dc9b71e93 100644 --- a/Sources/Foundation/URL.swift +++ b/Sources/Foundation/URL.swift @@ -504,8 +504,7 @@ public struct URL : ReferenceConvertible, Equatable { guard !string.isEmpty, let inner = NSURL(string: string, relativeTo: url) else { return nil } _url = URL._converted(from: inner) } - -#if !os(WASI) + /// Initializes a newly created file URL referencing the local file or directory at path, relative to a base URL. /// /// If an empty string is used for the path, then the path is assumed to be ".". @@ -535,11 +534,6 @@ public struct URL : ReferenceConvertible, Equatable { public init(fileURLWithPath path: String) { _url = URL._converted(from: NSURL(fileURLWithPath: path.isEmpty ? "." : path)) } -#else - public init(fileURLWithPath path: String) { - _url = NSURL(string: "file://\(path)")! - } -#endif /// Initializes a newly created URL using the contents of the given data, relative to a base URL. /// diff --git a/Sources/FoundationXML/XMLParser.swift b/Sources/FoundationXML/XMLParser.swift index 61fb287cf8..a4d5cf405d 100644 --- a/Sources/FoundationXML/XMLParser.swift +++ b/Sources/FoundationXML/XMLParser.swift @@ -48,7 +48,6 @@ private func UTF8STRING(_ bytes: UnsafePointer?) -> String? { return nil } -#if !os(WASI) internal func _NSXMLParserCurrentParser() -> _CFXMLInterface? { if let parser = XMLParser.currentParser() { return parser.interface @@ -56,7 +55,6 @@ internal func _NSXMLParserCurrentParser() -> _CFXMLInterface? { return nil } } -#endif internal func _NSXMLParserExternalEntityWithURL(_ interface: _CFXMLInterface, urlStr: UnsafePointer, identifier: UnsafePointer, context: _CFXMLInterfaceParserContext, originalLoaderFunction: _CFXMLInterfaceExternalEntityLoader) -> _CFXMLInterfaceParserInput? { let parser = interface.parser @@ -65,13 +63,11 @@ internal func _NSXMLParserExternalEntityWithURL(_ interface: _CFXMLInterface, ur if let allowedEntityURLs = parser.allowedExternalEntityURLs { if let url = URL(string: String(describing: urlStr)) { a = url - #if !os(WASI) if let scheme = url.scheme { if scheme == "file" { a = URL(fileURLWithPath: url.path) } } - #endif } if let url = a { let allowed = allowedEntityURLs.contains(url) @@ -470,23 +466,33 @@ open class XMLParser : NSObject { open var allowedExternalEntityURLs: Set? -#if !os(WASI) +#if os(WASI) + private static var _currentParser: XMLParser? +#endif + internal static func currentParser() -> XMLParser? { +#if os(WASI) + return _currentParser +#else if let current = Thread.current.threadDictionary["__CurrentNSXMLParser"] { return current as? XMLParser } else { return nil } +#endif } internal static func setCurrentParser(_ parser: XMLParser?) { +#if os(WASI) + _currentParser = parser +#else if let p = parser { Thread.current.threadDictionary["__CurrentNSXMLParser"] = p } else { Thread.current.threadDictionary.removeObject(forKey: "__CurrentNSXMLParser") } - } #endif + } internal func _handleParseResult(_ parseResult: Int32) -> Bool { if parseResult == 0 { @@ -563,9 +569,6 @@ open class XMLParser : NSObject { internal func parseFrom(_ stream : InputStream) -> Bool { var result = true - guard let buffer = malloc(_chunkSize)?.bindMemory(to: UInt8.self, capacity: _chunkSize) else { return false } - defer { free(buffer) } - stream.open() defer { stream.close() } parseLoop: while result { @@ -588,27 +591,23 @@ open class XMLParser : NSObject { return result } -#endif - +#else internal func parse(from data: Data) -> Bool { - var data = data var result = true - let buffer = malloc(_chunkSize)!.bindMemory(to: UInt8.self, capacity: _chunkSize) - defer { free(buffer) } - var range = NSRange(location: 0, length: min(_chunkSize, data.count)) + var chunkStart = 0 + var chunkEnd = min(_chunkSize, data.count) while result { - let chunk = data.withUnsafeMutableBytes { (rawBuffer: UnsafeMutableRawBufferPointer) -> Data in - let ptr = rawBuffer.baseAddress!.advanced(by: range.location) - return Data(bytesNoCopy: ptr, count: range.length, deallocator: .none) - } - result = parseData(chunk) - if range.location + range.length >= data.count { + if chunkStart >= data.count || chunkEnd >= data.count { break } - range = NSRange(location: range.location + range.length, length: min(_chunkSize, data.count - (range.location + range.length))) + let chunk = data[chunkStart.. Bool { @@ -1031,10 +1030,8 @@ extension NSObject { func setupXMLParsing() { _CFSetupXMLInterface() _CFSetupXMLBridgeIfNeededUsingBlock { -#if !os(WASI) __CFSwiftXMLParserBridge.CFBridge = CF.originalBridge __CFSwiftXMLParserBridge.currentParser = _NSXMLParserCurrentParser -#endif __CFSwiftXMLParserBridge._xmlExternalEntityWithURL = _NSXMLParserExternalEntityWithURL __CFSwiftXMLParserBridge.getContext = _NSXMLParserGetContext __CFSwiftXMLParserBridge.internalSubset = _NSXMLParserInternalSubset