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 <[email protected]> wrote:
>
>
>> On Dec 2, 2016, at 15:36, Rick Aurbach <[email protected]
>> <mailto:[email protected]>> 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 <[email protected]
>>> <mailto:[email protected]>> 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 <[email protected]
>>>> <mailto:[email protected]>> 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 <[email protected]
>>>>> <mailto:[email protected]>> 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
[email protected]
https://lists.swift.org/mailman/listinfo/swift-users