Hello Ian,

Yes, thank you, this is very interesting; I noticed your code in response to a 
previous post which I also replied to; although in retrospect, _my_ reply to 
that post is possibly erroneous: there are obviously caveats to the path when 
running a windows app under Wine that I was not aware of at that time. On 
MacOS, I believe the issue is complicated because one never knows if your 
program will launched by the Finder, Xcode, gdb, or the console. Mr. Eberly 
also has a neat solution for this issue when running under MacOS in his 
Wm3.System.cpp from the WildMagic 3 distribution.

Nicholas

>
>
> For what it is worth (and this doesn't really answer your question,
> since it does not integrate well with Fl_Preferences and so forth) here
> is the code I use to ascertain the app's "home" directory in a
> cross-platform way.
>
> Might be some use to you, I guess.
>
>
>
>
> /*
>  * Mechanism to handle determining *where* the exe actually lives
>  */
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <unistd.h>
>
> #ifdef WIN32
> #include <windows.h> /* GetModuleFileName */
> #endif /* WIN32 */
>
> #ifdef __APPLE__ /* assume this is OSX */
> #include <sys/param.h>
> #include <mach-o/dyld.h> /* _NSGetExecutablePath : must add -framework
> CoreFoundation to link line */
> #include <string.h>
> # ifndef PATH_MAX
> #  define PATH_MAX MAXPATHLEN
> # endif
> #endif /* APPLE */
>
> #ifndef PATH_MAX
> #  define PATH_MAX 2048
> #endif
>
> #include "get_app_path.h"
>
> /***********************************************************************
> *********************/
> int get_app_path (char *pname, size_t pathsize)
> {
>       long result;
>
> #ifdef LINUX
>       /* Oddly, the readlink(2) man page says no NULL is appended. */
>       /* So you have to do it yourself, based on the return value: */
>       pathsize --; /* Preserve a space to add the trailing NULL */
>       result = readlink("/proc/self/exe", pname, pathsize);
>       if (result > 0)
>       {
>               pname[result] = 0; /* add the #...@!%ing NULL */
>
>               if ((access(pname, 0) == 0))
>                       return 0; /* file exists, return OK */
>               /*else name doesn't seem to exist, return FAIL (falls
> through) */
>       }
> #endif /* LINUX */
>
> #ifdef WIN32
>       result = GetModuleFileName(NULL, pname, pathsize);
>       if (result > 0)
>       {
>               /* fix up the dir slashes... */
>               int len = strlen(pname);
>               int idx;
>               for (idx = 0; idx < len; idx++)
>               {
>                       if (pname[idx] == '\\') pname[idx] = '/';
>               }
>               if ((access(pname, 0) == 0))
>                       return 0; /* file exists, return OK */
>               /*else name doesn't seem to exist, return FAIL (falls
> through) */
>       }
> #endif /* WIN32 */
>
> #ifdef SOLARIS
>       char *p = getexecname();
>       if (p)
>       {
>               /* According to the Sun manpages, getexecname will
> "normally" return an */
>         /* absolute path - BUT might not... AND that IF it is not,
> pre-pending */
>               /* getcwd() will "usually" be the correct thing... Urgh!
> */
>
>               /* check pathname is absolute (begins with a / ???) */
>               if (p[0] == '/') /* assume this means we have an
> absolute path */
>               {
>                       strncpy(pname, p, pathsize);
>                       if ((access(pname, 0) == 0))
>                               return 0; /* file exists, return OK */
>               }
>               else /* if not, prepend getcwd() then check if file
> exists */
>               {
>                       getcwd(pname, pathsize);
>                       result = strlen(pname);
>                       strncat(pname, "/", (pathsize - result));
>                       result ++;
>                       strncat(pname, p, (pathsize - result));
>
>                       if ((access(pname, 0) == 0))
>                               return 0; /* file exists, return OK */
>                       /*else name doesn't seem to exist, return FAIL
> (falls through) */
>               }
>       }
> #endif /* SOLARIS */
>
> #ifdef __APPLE__ /* assume this is OSX */
> /*
>       from http://www.hmug.org/man/3/NSModule.html
>
>       extern int _NSGetExecutablePath(char *buf, unsigned long
> *bufsize);
>
>       _NSGetExecutablePath  copies  the  path  of the executable
>       into the buffer and returns 0 if the path was successfully
>       copied  in the provided buffer. If the buffer is not large
>       enough, -1 is returned and the  expected  buffer  size  is
>       copied  in  *bufsize.  Note that _NSGetExecutablePath will
>       return "a path" to the executable not a "real path" to the
>       executable.  That  is  the path may be a symbolic link and
>       not the real file. And with  deep  directories  the  total
>       bufsize needed could be more than MAXPATHLEN.
> */
>       int status = -1;
>       char *given_path = malloc(MAXPATHLEN * 2);
>       if (!given_path) return status;
>
>       pathsize = MAXPATHLEN * 2;
>       result = _NSGetExecutablePath(given_path, &pathsize);
>       if (result == 0)
>       { /* OK, we got something - now try and resolve the real path...
> */
>               if (realpath(given_path, pname) != NULL)
>               {
>                       if ((access(pname, 0) == 0))
>                               status = 0; /* file exists, return OK */
>               }
>       }
>       free (given_path);
>       return status;
> #endif /* APPLE */
>
>       return -1; /* Path Lookup Failed */
> } /* where_do_I_live */
>
> /***********************************************************************
> *********************/
> /* End of File */
>
>
>
>
> SELEX Sensors and Airborne Systems Limited
> Registered Office: Sigma House, Christopher Martin Road, Basildon, Essex SS14 
> 3EL
> A company registered in England & Wales.  Company no. 02426132
> ********************************************************************
> This email and any attachments are confidential to the intended
> recipient and may also be privileged. If you are not the intended
> recipient please delete it from your system and notify the sender.
> You should not copy it or use it for any purpose nor disclose or
> distribute its contents to any other person.
> ********************************************************************
>

_______________________________________________
fltk mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk

Reply via email to