diff --git a/src/xercesc/configure b/src/xercesc/configure index d0462a8e5bd70f1279a8fdd1dd8ba6ce3fc883d9..89e11e9d8a4c72e6d3b0a6f395a2ee9d3ea3ed25 100755 --- a/src/xercesc/configure +++ b/src/xercesc/configure @@ -1531,6 +1531,7 @@ util/Platforms/UnixWare/Makefile \ 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/UnixWare/Makefile \ 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 \ diff --git a/src/xercesc/configure.in b/src/xercesc/configure.in index f0fc8290097aa301544abcb1bfd508fc11fb7087..3e5f567978a8ae9a61a4e286795fb9dc367b92a3 100644 --- a/src/xercesc/configure.in +++ b/src/xercesc/configure.in @@ -139,6 +139,7 @@ util/Platforms/UnixWare/Makefile \ 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 \ diff --git a/src/xercesc/util/AutoSense.hpp b/src/xercesc/util/AutoSense.hpp index 52534660b8d1f777aaf18420aa590bf029df526a..5d936492644e16ed36630bdee81e54b59e540749 100644 --- a/src/xercesc/util/AutoSense.hpp +++ b/src/xercesc/util/AutoSense.hpp @@ -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 diff --git a/src/xercesc/util/Platforms/Cygwin/CygwinDefs.hpp b/src/xercesc/util/Platforms/Cygwin/CygwinDefs.hpp new file mode 100755 index 0000000000000000000000000000000000000000..34829fe0166fc5702df05cfa4425c64ee7c38d74 --- /dev/null +++ b/src/xercesc/util/Platforms/Cygwin/CygwinDefs.hpp @@ -0,0 +1,71 @@ +/* + * 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 apache\@apache.org. + * + * 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$ + * 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; diff --git a/src/xercesc/util/Platforms/Cygwin/CygwinPlatformUtils.cpp b/src/xercesc/util/Platforms/Cygwin/CygwinPlatformUtils.cpp new file mode 100755 index 0000000000000000000000000000000000000000..2732b4815b0276281ca32aac25d636c718b0bc71 --- /dev/null +++ b/src/xercesc/util/Platforms/Cygwin/CygwinPlatformUtils.cpp @@ -0,0 +1,608 @@ +/* + * 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 apache\@apache.org. + * + * 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$ + * 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 + diff --git a/src/xercesc/util/Platforms/Cygwin/Makefile.in b/src/xercesc/util/Platforms/Cygwin/Makefile.in new file mode 100755 index 0000000000000000000000000000000000000000..3defee03d87815014df6d0f86ec776bb4b869df9 --- /dev/null +++ b/src/xercesc/util/Platforms/Cygwin/Makefile.in @@ -0,0 +1,89 @@ +# +# 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 apache\@apache.org. +# +# 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$ +# 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 diff --git a/src/xercesc/util/Platforms/Makefile.in b/src/xercesc/util/Platforms/Makefile.in index ca469ccb2ebf354ff31cf5e0b766a218c77ed284..d84c5f2e17e55d28e5d0e18e33e5b5e4df7486da 100644 --- a/src/xercesc/util/Platforms/Makefile.in +++ b/src/xercesc/util/Platforms/Makefile.in @@ -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 @@ ifeq (${PLATFORM}, MACOSX) SUBMODULE = MacOS endif ifeq (${PLATFORM}, CYGWIN) - SUBMODULE = Win32 + SUBMODULE = Cygwin endif ifeq (${PLATFORM}, INTERIX) SUBMODULE = Interix diff --git a/src/xercesc/util/XercesDefs.hpp b/src/xercesc/util/XercesDefs.hpp index dd0a9e99ca1a10b818d56b6919a5916bb64b7250..6808bfa4a07a1dc4e2fe8a80e426b9ceb053fdfd 100644 --- a/src/xercesc/util/XercesDefs.hpp +++ b/src/xercesc/util/XercesDefs.hpp @@ -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) * @@ -246,6 +249,10 @@ #include <xercesc/util/Platforms/Win32/Win32Defs.hpp> #endif +#if defined(XML_CYGWIN) +#include <xercesc/util/Platforms/Cygwin/CygwinDefs.hpp> +#endif + #if defined(XML_AIX) #include <xercesc/util/Platforms/AIX/AIXDefs.hpp> #endif