@@ -43,13 +43,20 @@ typedef char TCHAR;
4343#ifndef  F_OK
4444    #define  F_OK  4 
4545#endif 
46+ #ifdef  _MSC_VER
47+ #ifndef  PATH_MAX
48+     #define  PATH_MAX  MAX_PATH
49+ #endif 
50+ #endif 
4651
4752#else  //  unix
4853
4954#if  defined( __APPLE__ )
5055    //  I'm not sure how we would handle this in raw Darwin
5156    //  without the AvailablilityMacros.
5257    #include  < AvailabilityMacros.h> 
58+     #include  < libgen.h> 
59+     #include  < mach-o/dyld.h> 
5360
5461    // >OSG_IOS
5562    // IOS includes
@@ -116,6 +123,7 @@ typedef char TCHAR;
116123#include  < osgDB/Registry> 
117124
118125#include  < errno.h> 
126+ #include  < limits.h> 
119127#include  < string.h> 
120128
121129#include  < stack> 
@@ -526,6 +534,58 @@ std::string osgDB::findFileInDirectory(const std::string& fileName,const std::st
526534    return  " " 
527535}
528536
537+ std::string osgDB::executableFilePath ()
538+ {
539+     std::string path;
540+ 
541+ #if  defined(WIN32)
542+     TCHAR buf[PATH_MAX + 1 ];
543+     DWORD result = GetModuleFileName (NULL , buf, static_cast <DWORD>(std::size (buf) - 1 ));
544+     if  (result && result < std::size (buf))
545+         path = buf;
546+ #elif  defined(__linux__)
547+ 
548+     std::vector<char > buffer (1024 );
549+     ssize_t  len = 0 ;
550+     while  ((len = ::readlink (" /proc/self/exe" data (), buffer.size ())) == static_cast <ssize_t >(buffer.size ()))
551+     {
552+         buffer.resize (buffer.size () * 2 );
553+     }
554+ 
555+     //  add terminator to string.
556+     buffer[len] = ' \0 ' 
557+ 
558+     return  buffer.data ();
559+ 
560+ #elif  defined(__APPLE__)
561+ #    if  TARGET_OS_MAC
562+     char  realPathName[PATH_MAX + 1 ];
563+     char  buf[PATH_MAX + 1 ];
564+     uint32_t  size = (uint32_t )sizeof (buf);
565+ 
566+     if  (!_NSGetExecutablePath (buf, &size))
567+     {
568+         realpath (buf, realPathName);
569+         path = realPathName;
570+     }
571+ #    elif  TARGET_IPHONE_SIMULATOR
572+     //  iOS, tvOS, or watchOS Simulator
573+     //  Not currently implemented
574+ #    elif  TARGET_OS_MACCATALYST
575+     //  Mac's Catalyst (ports iOS API into Mac, like UIKit).
576+     //  Not currently implemented
577+ #    elif  TARGET_OS_IPHONE
578+     //  iOS, tvOS, or watchOS device
579+     //  Not currently implemented
580+ #    else 
581+ #        error  "Unknown Apple platform"
582+ #    endif 
583+ #elif  defined(__ANDROID__)
584+     //  Not currently implemented
585+ #endif 
586+     return  path;
587+ }
588+ 
529589static  void  appendInstallationLibraryFilePaths (osgDB::FilePathList& filepath)
530590{
531591#ifdef  OSG_DEFAULT_LIBRARY_PATH
0 commit comments