Jordan,

You are oh, so right! Thank you for helping me resolve a particularly major 
piece of stupidity on my part.

The following code seems (subject to testing, of course), achieve what I’m 
looking for:

public extension String {
        
        public func localized(dsoHandle : UnsafeRawPointer = #dsohandle) -> 
String {
                var dlInformation : dl_info = dl_info()
                let _ = dladdr(dsoHandle, &dlInformation)
                let path = String(cString: dlInformation.dli_fname)
                let url = URL(fileURLWithPath: path).deletingLastPathComponent()
                let bundle = Bundle(url: url)
                let str = bundle?.localizedString(forKey: self, value: self, 
table: nil)
                return str!
        }
}

Cheers,

Rick

> On Dec 2, 2016, at 5:37 PM, Jordan Rose <jordan_r...@apple.com> wrote:
> 
> 
>> On Dec 2, 2016, at 15:36, Rick Aurbach <rla...@icloud.com 
>> <mailto:rla...@icloud.com>> wrote:
>> 
>> Greg,
>> 
>> This is looking quite strange, because I didn’t see anything like what I 
>> expected.
>> 
>> Here’s the code that I’ve been using to test #dsohandle:
>> 
>> public extension String {
>>      
>>      public func localized(dsoHandle : UnsafeRawPointer = #dsohandle) {
>>              var dlInformation : dl_info = dl_info()
>>              let _ = dladdr(dsoHandle, &dlInformation)
>>              let path = String(describing: dlInformation.dli_fname!)
> 
> ^ You asked for a string describing a pointer and you got one. :-) Try 
> String(cString:) instead.
> 
> 
> 
>>              let bundle = Bundle(path: path)
>>      }
>> }
>> 
>> which is consistent with the following excerpt from the header file:
>> 
>> /*
>>  * Structure filled in by dladdr().
>>  */
>> public struct dl_info {
>> 
>>     public var dli_fname: UnsafePointer<Int8>! /* Pathname of shared object 
>> */
>> 
>>     public var dli_fbase: UnsafeMutableRawPointer! /* Base address of shared 
>> object */
>> 
>>     public var dli_sname: UnsafePointer<Int8>! /* Name of nearest symbol */
>> 
>>     public var dli_saddr: UnsafeMutableRawPointer! /* Address of nearest 
>> symbol */
>> 
>>     public init()
>> 
>>     public init(dli_fname: UnsafePointer<Int8>!, dli_fbase: 
>> UnsafeMutableRawPointer!, dli_sname: UnsafePointer<Int8>!, dli_saddr: 
>> UnsafeMutableRawPointer!)
>> }
>> public typealias Dl_info = dl_info
>> 
>> public func dladdr(_: UnsafeRawPointer!, _: UnsafeMutablePointer<Dl_info>!) 
>> -> Int32
>> /* not POSIX */
>> 
>> 
>> I would have expected path to look something like a URL. However, here is 
>> what the debugger says (with a breakpoint on the “let bundle…” line:
>> 
>> <Capto_Annotation.png>
>> 
>> As you can see, dli_fname doesn’t look anything like the “pathname of the 
>> shared object”. Instead it looks more like the address where it was loaded. 
>> Which, unfortunately, doesn’t get me any further along.
>> 
>> Thoughts?
>> 
>> Has this gotten hairy (and time consuming) enough that I should handle this 
>> as a Technical Incident??
>> 
>> Cheers,
>> 
>> Rick Aurbach
>> 
>>> On Dec 2, 2016, at 3:08 PM, Greg Parker <gpar...@apple.com 
>>> <mailto:gpar...@apple.com>> wrote:
>>> 
>>> On Darwin #dsohandle points to a Mach-O file header. You can pass that 
>>> address to dyld but I don't see an easy way to pass it to NSBundle.
>>> 
>>> This might work:
>>> 1. Pass #dsohandle to dladdr()
>>> 2. Pass the dli_fname returned by dladdr() to NSBundle(path:).
>>> 
>>> 
>>>> On Dec 2, 2016, at 12:50 PM, Rick Aurbach <rla...@icloud.com 
>>>> <mailto:rla...@icloud.com>> wrote:
>>>> 
>>>> Jordan,
>>>> 
>>>> I agree — #dsohandle is, indeed, little known. In fact, I’m having a devil 
>>>> of a time figuring out what it is and what I can do with it. It is clearly 
>>>> an UnsafeRawPointer, but to what?? 
>>>> 
>>>> Can you offer either a reference or a few lines of code that can help me 
>>>> get the information I need from it? [recall that I want the framework’s 
>>>> bundle so I can find it’s localized.strings file].
>>>> 
>>>> Cheers,
>>>> 
>>>> Rick Aurbach
>>>> 
>>>>> On Dec 2, 2016, at 12:56 PM, Jordan Rose <jordan_r...@apple.com 
>>>>> <mailto:jordan_r...@apple.com>> wrote:
>>>>> 
>>>>> On Apple platforms, we'd probably prefer you use the little-known 
>>>>> #dsoHandle, a magic pointer that's unique to the current dylib. Parsing 
>>>>> out a module name seems incredibly brittle; the form of #function is not 
>>>>> guaranteed to be stable or useful across Swift versions.
>>>>> 
>>>>> Jordan
>> 
>> 
> 

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to