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]