jberry 2004/01/25 15:30:07 Modified: c/src/xercesc/util/Platforms/MacOS MacOSPlatformUtils.cpp Log: Fix Bug #26419 reported by Pedro Custodio: Mac OS partial paths were being resolved using the Carbon file manager's concept of current directory, which defaults to the location of the executable; we now use getcwd where possible in order to pick up the cwd from any invoking shell. Revision Changes Path 1.23 +53 -20 xml-xerces/c/src/xercesc/util/Platforms/MacOS/MacOSPlatformUtils.cpp Index: MacOSPlatformUtils.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/Platforms/MacOS/MacOSPlatformUtils.cpp,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- MacOSPlatformUtils.cpp 24 Dec 2003 15:24:14 -0000 1.22 +++ MacOSPlatformUtils.cpp 25 Jan 2004 23:30:07 -0000 1.23 @@ -169,8 +169,12 @@ // // gUsePosixFiles // True if we're using XMLMacPosixFile rather than XMLMacCarbonFile. +// +// gUseGETCWD +// True if we can rely on getcwd to get the current directory path. //---------------------------------------------------------------------------- bool gFileSystemCompatible = false; +bool gMacOSXOrBetter = false; bool gHasFSSpecAPIs = false; bool gHasFS2TBAPIs = false; bool gHasHFSPlusAPIs = false; @@ -178,6 +182,7 @@ bool gPathAPIsUsePosixPaths = false; bool gHasMPAPIs = false; bool gUsePosixFiles = false; +bool gUseGETCWD = false; // --------------------------------------------------------------------------- @@ -352,8 +357,13 @@ { // Get a newly allocated path to the current directory FSSpec spec; + + // Parse to path to determine current directory: this allows the + // path parsing routines to determine best way to find the current + // directory. + XMLCh curDirPath[] = { '.', 0 }; XMLCh* path = - (noErr == FSMakeFSSpec(0, 0, NULL, &spec)) + (XMLParsePathToFSSpec(curDirPath, spec, manager)) ? XMLCreateFullPathFromFSSpec(spec, manager) : NULL; @@ -525,6 +535,11 @@ // Detect available functions + // Check whether we're on OS X + gMacOSXOrBetter = noErr == Gestalt(gestaltSystemVersion, &value) + && value >= 0x00001000 + ; + // Look for file system services if (noErr == Gestalt(gestaltFSAttr, &value)) { @@ -551,9 +566,15 @@ #if __MSL__ && (__MSL__ < 0x08000 || _MSL_CARBON_FILE_APIS) gUsePosixFiles = false; #else - gUsePosixFiles = noErr == Gestalt(gestaltSystemVersion, &value) - && value >= 0x00001000 - ; + gUsePosixFiles = gMacOSXOrBetter; + #endif + + // Determine whether to use getcwd or not. We use it only if we're not using MSL, + // and we're on a Mac OS X system. + #if __MSL__ + gUseGETCWD = false; + #else + gUseGETCWD = gMacOSXOrBetter; #endif // Look for MP @@ -808,25 +829,37 @@ { // Right justify the user path to make room for the pre-pended path std::memmove(p + kMaxMacStaticPathChars - pathLen, p, pathLen); + *p = '\0'; // Get the current directory - FSSpec spec; - if (err == noErr) - err = FSMakeFSSpec(0, 0, NULL, &spec); - if (err == noErr) - err = FSpMakeFSRef(&spec, &ref); - - // Get pathname to the current directory - if (err == noErr) - err = FSRefMakePath(&ref, reinterpret_cast<UInt8*>(p), kMaxMacStaticPathChars - pathLen - 1); // leave room for one '/' - std::size_t prefixLen = std::strlen(p); - - // Now munge the two paths back together - if (err == noErr) + if (gUseGETCWD) { - p[prefixLen++] = '/'; - std::memmove(p + prefixLen, p + kMaxMacStaticPathChars - pathLen, pathLen); + // Get current directory path, leaving room for one '/' after + if (err == noErr) + getcwd(p, kMaxMacStaticPathChars - pathLen - 1); } + else + { + // Get current directory path, leaving room for one '/' after + + // We quiz the carbon file manager for the current directory. + // Note that carbon defaults its concept of the current directory + // to the location of the executable. + FSSpec spec; + if (err == noErr) + err = FSMakeFSSpec(0, 0, NULL, &spec); + if (err == noErr) + err = FSpMakeFSRef(&spec, &ref); + + // Get current directory path, leaving room for one '/' after + if (err == noErr) + err = FSRefMakePath(&ref, reinterpret_cast<UInt8*>(p), kMaxMacStaticPathChars - pathLen - 1); + } + + // Now munge the two paths back together + std::size_t prefixLen = std::strlen(p); + p[prefixLen++] = '/'; + std::memmove(p + prefixLen, p + kMaxMacStaticPathChars - pathLen, pathLen); // We now have a path from an absolute starting point }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]