neilg 2004/02/17 07:56:51 Modified: c/src/xercesc configure configure.in c/src/xercesc/util AutoSense.hpp XercesDefs.hpp c/src/xercesc/util/Platforms Makefile.in Added: c/src/xercesc/util/Platforms/Cygwin Makefile.in CygwinDefs.hpp CygwinPlatformUtils.cpp Log: fix for bug 25035; much thanks to Abe Backus Revision Changes Path 1.17 +2 -0 xml-xerces/c/src/xercesc/configure Index: configure =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/configure,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- configure 4 Feb 2004 13:26:44 -0000 1.16 +++ configure 17 Feb 2004 15:56:50 -0000 1.17 @@ -1531,6 +1531,7 @@ util/Platforms/Tru64/Makefile \ util/Platforms/MacOS/Makefile \ util/Platforms/Win32/Makefile \ +util/Platforms/Cygwin/Makefile \ util/Compilers/Makefile \ util/MsgLoaders/InMemory/Makefile \ util/MsgLoaders/ICU/Makefile \ @@ -1689,6 +1690,7 @@ util/Platforms/Tru64/Makefile \ util/Platforms/MacOS/Makefile \ util/Platforms/Win32/Makefile \ +util/Platforms/Cygwin/Makefile \ util/Compilers/Makefile \ util/MsgLoaders/InMemory/Makefile \ util/MsgLoaders/ICU/Makefile \ 1.21 +1 -0 xml-xerces/c/src/xercesc/configure.in Index: configure.in =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/configure.in,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- configure.in 12 Feb 2004 20:44:10 -0000 1.20 +++ configure.in 17 Feb 2004 15:56:50 -0000 1.21 @@ -139,6 +139,7 @@ util/Platforms/Tru64/Makefile \ util/Platforms/MacOS/Makefile \ util/Platforms/Win32/Makefile \ +util/Platforms/Cygwin/Makefile \ util/Compilers/Makefile \ util/MsgLoaders/InMemory/Makefile \ util/MsgLoaders/ICU/Makefile \ 1.14 +10 -2 xml-xerces/c/src/xercesc/util/AutoSense.hpp Index: AutoSense.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/AutoSense.hpp,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- AutoSense.hpp 4 Feb 2004 13:26:44 -0000 1.13 +++ AutoSense.hpp 17 Feb 2004 15:56:50 -0000 1.14 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.14 2004/02/17 15:56:50 neilg + * fix for bug 25035; much thanks to Abe Backus + * * Revision 1.13 2004/02/04 13:26:44 amassari * Added support for the Interix platform (Windows Services for Unix 3.5) * @@ -243,7 +246,12 @@ #define XML_TANDEM #define XML_UNIX #define XML_CSET -#elif defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) +#elif defined(__CYGWIN__) + #define XML_CYGWIN + #ifndef WIN32 + #define WIN32 + #endif +#elif defined(_WIN32) || defined(WIN32) #define XML_WIN32 #ifndef WIN32 #define WIN32 1.17 +8 -1 xml-xerces/c/src/xercesc/util/XercesDefs.hpp Index: XercesDefs.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/XercesDefs.hpp,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- XercesDefs.hpp 4 Feb 2004 13:26:44 -0000 1.16 +++ XercesDefs.hpp 17 Feb 2004 15:56:50 -0000 1.17 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.17 2004/02/17 15:56:50 neilg + * fix for bug 25035; much thanks to Abe Backus + * * Revision 1.16 2004/02/04 13:26:44 amassari * Added support for the Interix platform (Windows Services for Unix 3.5) * @@ -244,6 +247,10 @@ // --------------------------------------------------------------------------- #if defined(XML_WIN32) #include <xercesc/util/Platforms/Win32/Win32Defs.hpp> +#endif + +#if defined(XML_CYGWIN) +#include <xercesc/util/Platforms/Cygwin/CygwinDefs.hpp> #endif #if defined(XML_AIX) 1.10 +5 -2 xml-xerces/c/src/xercesc/util/Platforms/Makefile.in Index: Makefile.in =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/Platforms/Makefile.in,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- Makefile.in 4 Feb 2004 13:26:44 -0000 1.9 +++ Makefile.in 17 Feb 2004 15:56:50 -0000 1.10 @@ -55,6 +55,9 @@ # # # $Log$ +# Revision 1.10 2004/02/17 15:56:50 neilg +# fix for bug 25035; much thanks to Abe Backus +# # Revision 1.9 2004/02/04 13:26:44 amassari # Added support for the Interix platform (Windows Services for Unix 3.5) # @@ -206,7 +209,7 @@ SUBMODULE = MacOS endif ifeq (${PLATFORM}, CYGWIN) - SUBMODULE = Win32 + SUBMODULE = Cygwin endif ifeq (${PLATFORM}, INTERIX) SUBMODULE = Interix 1.1 xml-xerces/c/src/xercesc/util/Platforms/Cygwin/Makefile.in Index: Makefile.in =================================================================== # # The Apache Software License, Version 1.1 # # Copyright (c) 2004 The Apache Software Foundation. All rights # reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # # 3. The end-user documentation included with the redistribution, # if any, must include the following acknowledgment: # "This product includes software developed by the # Apache Software Foundation (http://www.apache.org/)." # Alternately, this acknowledgment may appear in the software itself, # if and wherever such third-party acknowledgments normally appear. # # 4. The names "Xerces" and "Apache Software Foundation" must # not be used to endorse or promote products derived from this # software without prior written permission. For written # permission, please contact [EMAIL PROTECTED] # # 5. Products derived from this software may not be called "Apache", # nor may "Apache" appear in their name, without prior written # permission of the Apache Software Foundation. # # THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR # ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT # OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # ==================================================================== # # This software consists of voluntary contributions made by many # individuals on behalf of the Apache Software Foundation, and was # originally based on software copyright (c) 1999, International # Business Machines, Inc., http://www.ibm.com . For more information # on the Apache Software Foundation, please see # <http://www.apache.org/>. # # $Log: Makefile.in,v $ # Revision 1.1 2004/02/17 15:56:50 neilg # fix for bug 25035; much thanks to Abe Backus # #: # PLATFORM = @platform@ CC = @cc@ CXX = @cxx@ GCC = @GCC@ GXX = @GXX@ CXXFLAGS = @cxxflags@ CFLAGS = @cflags@ PREFIX = @prefix@ PREFIX_INCLUDE = @prefix_include@ LDFLAGS = @ldflags@ LIBS = @libs@ OSVER = @osver@ USELIBWWW = @uselibwww@ MESSAGELOADER = @messageloader@ TRANSCODER = @transcoder@ THREADS = @threads@ MODULE = util include ../../../Makefile.incl SUBMODULE = Platforms/Cygwin CXXFLAGS += -D_GNU_SOURCE -D__USE_GNU CPP_PUBHEADERS = CygwinDefs.hpp CPP_OBJECTS = CygwinPlatformUtils.$(TO) include ../../Makefile.util.submodule 1.1 xml-xerces/c/src/xercesc/util/Platforms/Cygwin/CygwinDefs.hpp Index: CygwinDefs.hpp =================================================================== /* * The Apache Software License, Version 1.1 * * Copyright (c) 2004 Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Xerces" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation, and was * originally based on software copyright (c) 1999, International * Business Machines, Inc., http://www.ibm.com . For more information * on the Apache Software Foundation, please see * <http://www.apache.org/>. */ /* * $Log: CygwinDefs.hpp,v $ * Revision 1.1 2004/02/17 15:56:50 neilg * fix for bug 25035; much thanks to Abe Backus * * */ // --------------------------------------------------------------------------- // NT and Win98 always run the CPU in little endian mode. // --------------------------------------------------------------------------- #define ENDIANMODE_LITTLE typedef void* FileHandle; 1.1 xml-xerces/c/src/xercesc/util/Platforms/Cygwin/CygwinPlatformUtils.cpp Index: CygwinPlatformUtils.cpp =================================================================== /* * The Apache Software License, Version 1.1 * * Copyright (c) 2004 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Xerces" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation, and was * originally based on software copyright (c) 1999, International * Business Machines, Inc., http://www.ibm.com . For more information * on the Apache Software Foundation, please see * <http://www.apache.org/>. */ /* * $Log: CygwinPlatformUtils.cpp,v $ * Revision 1.1 2004/02/17 15:56:50 neilg * fix for bug 25035; much thanks to Abe Backus * * */ // --------------------------------------------------------------------------- // Includes // --------------------------------------------------------------------------- #if !defined(APP_NO_THREADS) #include <windows.h> #endif #ifndef _GNU_SOURCE #error _GNU_SOURCE is not defined in your compile settings #endif #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <sys/timeb.h> #include <sys/cygwin.h> #include <string.h> #include <xercesc/util/PlatformUtils.hpp> #include <xercesc/util/RuntimeException.hpp> #include <xercesc/util/Janitor.hpp> #include <xercesc/util/Mutexes.hpp> #include <xercesc/util/XMLString.hpp> #include <xercesc/util/XMLUniDefs.hpp> #include <xercesc/util/XMLUni.hpp> #include <xercesc/util/PanicHandler.hpp> #include <xercesc/util/OutOfMemoryException.hpp> #if defined(XML_USE_ICU_TRANSCODER) #include <xercesc/util/Transcoders/ICU/ICUTransService.hpp> #elif defined (XML_USE_GNU_TRANSCODER) #include <xercesc/util/Transcoders/IconvGNU/IconvGNUTransService.hpp> #elif defined (XML_USE_CYGWIN_TRANSCODER) #include <xercesc/util/Transcoders/Cygwin/CygwinTransService.hpp> #else // Use native transcoder. Same as -DXML_USE_NATIVE_TRANSCODER #include <xercesc/util/Transcoders/Iconv/IconvTransService.hpp> #endif #if defined(XML_USE_ICU_MESSAGELOADER) #include <xercesc/util/MsgLoaders/ICU/ICUMsgLoader.hpp> #elif defined (XML_USE_ICONV_MESSAGELOADER) #include <xercesc/util/MsgLoaders/MsgCatalog/MsgCatalogLoader.hpp> #else // Same as -DXML_USE_INMEM_MESSAGELOADER #include <xercesc/util/MsgLoaders/InMemory/InMemMsgLoader.hpp> #endif #if defined (XML_USE_NETACCESSOR_LIBWWW) #include <xercesc/util/NetAccessors/libWWW/LibWWWNetAccessor.hpp> #elif defined (XML_USE_NETACCESSOR_SOCKET) #include <xercesc/util/NetAccessors/Socket/SocketNetAccessor.hpp> #endif XERCES_CPP_NAMESPACE_BEGIN // --------------------------------------------------------------------------- // XMLPlatformUtils: Private Static Methods // --------------------------------------------------------------------------- XMLNetAccessor* XMLPlatformUtils::makeNetAccessor() { #if defined (XML_USE_NETACCESSOR_SOCKET) return new SocketNetAccessor(); #elif defined (XML_USE_NETACCESSOR_LIBWWW) return new LibWWWNetAccessor(); #else return 0; #endif } // // This method is called by the platform independent part of this class // when client code asks to have one of the supported message sets loaded. // XMLMsgLoader* XMLPlatformUtils::loadAMsgSet(const XMLCh* const msgDomain) { XMLMsgLoader* retVal; try { #if defined (XML_USE_ICU_MESSAGELOADER) retVal = new ICUMsgLoader(msgDomain); #elif defined (XML_USE_ICONV_MESSAGELOADER) retVal = new MsgCatalogLoader(msgDomain); #else // same as -DXML_USE_INMEM_MESSAGELOADER retVal = new InMemMsgLoader(msgDomain); #endif } catch(const OutOfMemoryException&) { throw; } catch(...) { panic(PanicHandler::Panic_CantLoadMsgDomain); } return retVal; } // // This method is called very early in the bootstrapping process. This guy // must create a transcoding service and return it. It cannot use any string // methods, any transcoding services, throw any exceptions, etc... It just // makes a transcoding service and returns it, or returns zero on failure. // XMLTransService* XMLPlatformUtils::makeTransService() { #if defined (XML_USE_ICU_TRANSCODER) // Use ICU transcoding services. // same as -DXML_USE_ICU_MESSAGELOADER return new ICUTransService; #elif defined (XML_USE_GNU_TRANSCODER) return new IconvGNUTransService; #elif defined (XML_USE_CYGWIN_TRANSCODER) return new CygwinTransService; #else // Use native transcoding services. // same as -DXML_USE_NATIVE_TRANSCODER return new IconvTransService; #endif } // --------------------------------------------------------------------------- // XMLPlatformUtils: The panic method // --------------------------------------------------------------------------- void XMLPlatformUtils::panic(const PanicHandler::PanicReasons reason) { fgUserPanicHandler? fgUserPanicHandler->panic(reason) : fgDefaultPanicHandler->panic(reason); } // --------------------------------------------------------------------------- // XMLPlatformUtils: File Methods // --------------------------------------------------------------------------- // // Functions to look for Unicode forward and back slashes. // This operation is complicated by the fact that some Japanese and Korean // encodings use the same encoding for both '\' and their currency symbol // (Yen or Won). In these encodings, which is meant is context dependent. // Unicode converters choose the currency symbols. But in the context // of a Windows file name, '\' is generally what was intended. // // So we make a leap of faith, and assume that if we get a Yen or Won // here, in the context of a file name, that it originated in one of // these encodings, and is really supposed to be a '\'. // static bool isBackSlash(XMLCh c) { return c == chBackSlash || c == chYenSign || c == chWonSign; } unsigned int XMLPlatformUtils::curFilePos(FileHandle theFile , MemoryManager* const manager) { int curPos = ftell( (FILE*)theFile); if (curPos == -1) ThrowXMLwithMemMgr(XMLPlatformUtilsException, XMLExcepts::File_CouldNotGetSize, manager); return (unsigned int)curPos; } void XMLPlatformUtils::closeFile(FileHandle theFile , MemoryManager* const manager) { if (fclose((FILE*)theFile)) ThrowXMLwithMemMgr(XMLPlatformUtilsException, XMLExcepts::File_CouldNotCloseFile, manager); } unsigned int XMLPlatformUtils::fileSize(FileHandle theFile , MemoryManager* const manager) { // Get the current position long int curPos = ftell((FILE*) theFile); if (curPos == -1) ThrowXMLwithMemMgr(XMLPlatformUtilsException, XMLExcepts::File_CouldNotGetCurPos, manager); // Seek to the end and save that value for return if (fseek((FILE*) theFile, 0, SEEK_END)) ThrowXMLwithMemMgr(XMLPlatformUtilsException, XMLExcepts::File_CouldNotSeekToEnd, manager); long int retVal = ftell((FILE*)theFile); if (retVal == -1) ThrowXMLwithMemMgr(XMLPlatformUtilsException, XMLExcepts::File_CouldNotSeekToEnd, manager); // And put the pointer back if (fseek( (FILE*)theFile, curPos, SEEK_SET) ) ThrowXMLwithMemMgr(XMLPlatformUtilsException, XMLExcepts::File_CouldNotSeekToPos, manager); return (unsigned int)retVal; } FileHandle XMLPlatformUtils::openFile(const XMLCh* const fileName , MemoryManager* const manager) { const char* tmpFileName = XMLString::transcode(fileName, manager); ArrayJanitor<char> janText((char*)tmpFileName, manager); char posix_name[PATH_MAX + 1]; cygwin_conv_to_posix_path(tmpFileName, posix_name); FileHandle retVal = (FILE*)fopen( posix_name , "rb" ); if (retVal == NULL) return 0; return retVal; } FileHandle XMLPlatformUtils::openFile(const char* const fileName , MemoryManager* const manager) { char posix_name[PATH_MAX + 1]; cygwin_conv_to_posix_path(fileName, posix_name); FileHandle retVal = (FILE*)fopen( posix_name , "rb" ); if (retVal == NULL) return 0; return retVal; } FileHandle XMLPlatformUtils::openFileToWrite(const XMLCh* const fileName , MemoryManager* const manager) { const char* tmpFileName = XMLString::transcode(fileName, manager); ArrayJanitor<char> janText((char*)tmpFileName, manager); char posix_name[PATH_MAX + 1]; cygwin_conv_to_posix_path(tmpFileName, posix_name); return fopen( posix_name , "wb" ); } FileHandle XMLPlatformUtils::openFileToWrite(const char* const fileName , MemoryManager* const manager) { char posix_name[PATH_MAX + 1]; cygwin_conv_to_posix_path(fileName, posix_name); return fopen( posix_name , "wb" ); } FileHandle XMLPlatformUtils::openStdInHandle(MemoryManager* const manager) { return (FileHandle)fdopen(dup(0), "rb"); } unsigned int XMLPlatformUtils::readFileBuffer( FileHandle theFile , const unsigned int toRead , XMLByte* const toFill , MemoryManager* const manager) { size_t noOfItemsRead = fread((void*) toFill, 1, toRead, (FILE*)theFile); if(ferror((FILE*)theFile)) { ThrowXMLwithMemMgr(XMLPlatformUtilsException, XMLExcepts::File_CouldNotReadFromFile, manager); } return (unsigned int)noOfItemsRead; } void XMLPlatformUtils::writeBufferToFile( FileHandle const theFile , long toWrite , const XMLByte* const toFlush , MemoryManager* const manager) { if (!theFile || (toWrite <= 0 ) || !toFlush ) return; const XMLByte* tmpFlush = (const XMLByte*) toFlush; size_t bytesWritten = 0; while (true) { bytesWritten=fwrite(tmpFlush, sizeof(XMLByte), toWrite, (FILE*)theFile); if(ferror((FILE*)theFile)) { ThrowXMLwithMemMgr(XMLPlatformUtilsException, XMLExcepts::File_CouldNotWriteToFile, manager); } if (bytesWritten < toWrite) //incomplete write { tmpFlush+=bytesWritten; toWrite-=bytesWritten; bytesWritten=0; } else return; } return; } void XMLPlatformUtils::resetFile(FileHandle theFile , MemoryManager* const manager) { // Seek to the start of the file if (fseek((FILE*)theFile, 0, SEEK_SET)) ThrowXMLwithMemMgr(XMLPlatformUtilsException, XMLExcepts::File_CouldNotResetFile, manager); } // --------------------------------------------------------------------------- // XMLPlatformUtils: File system methods // --------------------------------------------------------------------------- XMLCh* XMLPlatformUtils::getFullPath(const XMLCh* const srcPath, MemoryManager* const manager) { // // NOTE: The path provided has always already been opened successfully, // so we know that its not some pathological freaky path. It comes in // in native format, and goes out as Unicode always // char* newSrc = XMLString::transcode(srcPath, manager); ArrayJanitor<char> janText(newSrc, manager); // Use a local buffer that is big enough for the largest legal path char posix_name[PATH_MAX + 1]; // get the absolute path if (0 != cygwin_conv_to_full_posix_path(newSrc, posix_name)) { ThrowXMLwithMemMgr(XMLPlatformUtilsException, XMLExcepts::File_CouldNotGetBasePathName, manager); } return XMLString::transcode(posix_name, manager); } bool XMLPlatformUtils::isRelative(const XMLCh* const toCheck , MemoryManager* const manager) { // Check for pathological case of empty path if (!toCheck[0]) return false; // // If its starts with a drive, then it cannot be relative. Note that // we checked the drive not being empty above, so worst case its one // char long and the check of the 1st char will fail because its really // a null character. // if (toCheck[1] == chColon) { if (((toCheck[0] >= chLatin_A) && (toCheck[0] <= chLatin_Z)) || ((toCheck[0] >= chLatin_a) && (toCheck[0] <= chLatin_z))) { return false; } } // // If it starts with a double slash, then it cannot be relative since // it's a remote file. // if (isBackSlash(toCheck[0]) && isBackSlash(toCheck[1])) return false; // // If it starts with a slash, then it cannot be relative. This covers // both something like "\Test\File.xml" and an NT Lan type remote path // that starts with a node like "\\MyNode\Test\File.xml". // if (toCheck[0] == XMLCh('/')) return false; // Else assume its a relative path return true; } XMLCh* XMLPlatformUtils::getCurrentDirectory(MemoryManager* const manager) { char dirBuf[PATH_MAX + 2]; char *curDir = getcwd(&dirBuf[0], PATH_MAX + 1); if (!curDir) { ThrowXMLwithMemMgr(XMLPlatformUtilsException, XMLExcepts::File_CouldNotGetBasePathName, manager); } return XMLString::transcode(curDir, manager); } inline bool XMLPlatformUtils::isAnySlash(XMLCh c) { return ( chBackSlash == c || chForwardSlash == c); } // --------------------------------------------------------------------------- // XMLPlatformUtils: Timing Methods // --------------------------------------------------------------------------- unsigned long XMLPlatformUtils::getCurrentMillis() { timeb aTime; ftime(&aTime); return (unsigned long)(aTime.time*1000 + aTime.millitm); } // ----------------------------------------------------------------------- // Mutex methods // ----------------------------------------------------------------------- #if !defined(APP_NO_THREADS) // --------------------------------------------------------------------------- // XMLPlatformUtils: Platform init method // --------------------------------------------------------------------------- void XMLPlatformUtils::platformInit() { } void* XMLPlatformUtils::makeMutex() { CRITICAL_SECTION* newCS = new CRITICAL_SECTION; ::InitializeCriticalSection(newCS); return newCS; } void XMLPlatformUtils::closeMutex(void* const mtxHandle) { ::DeleteCriticalSection((LPCRITICAL_SECTION)mtxHandle); delete (CRITICAL_SECTION*)mtxHandle; } void XMLPlatformUtils::lockMutex(void* const mtxHandle) { ::EnterCriticalSection((LPCRITICAL_SECTION)mtxHandle); } void XMLPlatformUtils::unlockMutex(void* const mtxHandle) { ::LeaveCriticalSection((LPCRITICAL_SECTION)mtxHandle); } void* XMLPlatformUtils::compareAndSwap (void** toFill, const void* const newValue, const void* const toCompare) { #if defined WIN64 return ::InterlockedCompareExchangePointer(toFill, (void*)newValue, (void*)toCompare); #else // // Note we have to cast off the constness of some of these because // the system APIs are not C++ aware in all cases. // return (void*) ::InterlockedCompareExchange((LPLONG)toFill, (LONG)newValue, (LONG)toCompare); #endif } int XMLPlatformUtils::atomicIncrement(int &location) { return ::InterlockedIncrement(&(long &)location); } int XMLPlatformUtils::atomicDecrement(int &location) { return ::InterlockedDecrement(&(long &)location); } #else // #if !defined (APP_NO_THREADS) void XMLPlatformUtils::platformInit() { } void* XMLPlatformUtils::makeMutex() { return 0; } void XMLPlatformUtils::closeMutex(void* const mtxHandle) { } void XMLPlatformUtils::lockMutex(void* const mtxHandle) { } void XMLPlatformUtils::unlockMutex(void* const mtxHandle) { } void* XMLPlatformUtils::compareAndSwap (void** toFill, const void* const newValue, const void* const toCompare) { void *retVal = *toFill; if (*toFill == toCompare) *toFill = (void *)newValue; return retVal; } int XMLPlatformUtils::atomicIncrement(int &location) { return ++location; } int XMLPlatformUtils::atomicDecrement(int &location) { return --location; } #endif // APP_NO_THREADS void XMLPlatformUtils::platformTerm() { } #include <xercesc/util/LogicalPath.c> XERCES_CPP_NAMESPACE_END
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]