From 0eb734fc738499e81795f8b0586860ad46b9a527 Mon Sep 17 00:00:00 2001 From: Tinny Ng <tng@apache.org> Date: Thu, 29 Nov 2001 18:25:18 +0000 Subject: [PATCH] FreeBSD support by Michael Huedepohl. git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@173327 13f79535-47bb-0310-9956-ffa450edef68 --- samples/Makefile.incl | 17 +- samples/configure | 1 + samples/configure.in | 1 + samples/runConfigure | 12 +- src/Makefile.incl | 19 +- src/configure | 5 +- src/configure.in | 2 + src/runConfigure | 20 +- src/util/AutoSense.hpp | 6 + src/util/Platforms/FreeBSD/FreeBSDDefs.hpp | 73 ++ .../FreeBSD/FreeBSDPlatformUtils.cpp | 665 ++++++++++++++++++ src/util/Platforms/FreeBSD/Makefile.in | 86 +++ src/util/Platforms/Makefile.in | 8 +- src/util/XercesDefs.hpp | 7 + 14 files changed, 907 insertions(+), 15 deletions(-) create mode 100644 src/util/Platforms/FreeBSD/FreeBSDDefs.hpp create mode 100644 src/util/Platforms/FreeBSD/FreeBSDPlatformUtils.cpp create mode 100644 src/util/Platforms/FreeBSD/Makefile.in diff --git a/samples/Makefile.incl b/samples/Makefile.incl index 5b2661b79..9b0182798 100644 --- a/samples/Makefile.incl +++ b/samples/Makefile.incl @@ -1,7 +1,7 @@ # # The Apache Software License, Version 1.1 # -# Copyright (c) 1999-2000 The Apache Software Foundation. All rights +# Copyright (c) 1999-2001 The Apache Software Foundation. All rights # reserved. # # Redistribution and use in source and binary forms, with or without @@ -178,6 +178,21 @@ EXTRA_LINK_OPTIONS=-lc SHLIBSUFFIX=.so endif +#=============== FREEBSD SPECIFIC OPTIONS ========================= +ifeq (${PLATFORM}, FREEBSD) + CMP= -c ${CXXFLAGS} + CC= g++ -c -D${PLATFORM} -fPIC + LINK = g++ -D${PLATFORM} -fPIC + ifdef ICUROOT + PLATFORM_LIB_LINK_OPTIONS=-L$(ICUROOT) + EXTRA_LINK_OPTIONS=-licudata -lstdc++ -pthread + else + PLATFORM_LIB_LINK_OPTIONS= + EXTRA_LINK_OPTIONS=-lstdc++ -pthread + endif + SHLIBSUFFIX=.so +endif + #================= HP SPECIFIC OPTIONS =========================== ifeq (${PLATFORM}, HPUX) ifeq (${COMPILER}, aCC) diff --git a/samples/configure b/samples/configure index d18aba39f..c08208a19 100755 --- a/samples/configure +++ b/samples/configure @@ -1308,6 +1308,7 @@ case "${host}" in *-*-*unixware*) platform=UNIXWARE ;; *-*-sysv5uw7*) platform=UNIXWARE ;; *-*-linux*) platform=LINUX ;; + *-*-freebsd*) platform=FREEBSD ;; *-*-irix*) platform=IRIX ;; *-*-aix*) platform=AIX ;; *-*-hp*) platform=HPUX ; diff --git a/samples/configure.in b/samples/configure.in index e2faa08f3..4bedaae91 100644 --- a/samples/configure.in +++ b/samples/configure.in @@ -36,6 +36,7 @@ case "${host}" in *-*-*unixware*) platform=UNIXWARE ;; *-*-sysv5uw7*) platform=UNIXWARE ;; *-*-linux*) platform=LINUX ;; + *-*-freebsd*) platform=FREEBSD ;; *-*-irix*) platform=IRIX ;; *-*-aix*) platform=AIX ;; *-*-hp*) platform=HPUX ; diff --git a/samples/runConfigure b/samples/runConfigure index 3a57b716e..445821c49 100755 --- a/samples/runConfigure +++ b/samples/runConfigure @@ -1,10 +1,8 @@ #!/bin/sh - - # # The Apache Software License, Version 1.1 # -# Copyright (c) 1999-2000 The Apache Software Foundation. All rights +# Copyright (c) 1999-2001 The Apache Software Foundation. All rights # reserved. # # Redistribution and use in source and binary forms, with or without @@ -70,7 +68,7 @@ usage() echo "runConfigure: Helper script to run \"configure\" for one of the supported platforms" echo "Usage: runConfigure \"options\"" echo " where options may be any of the following:" - echo " -p <platform> (accepts 'aix', 'unixware', 'linux', 'solaris', + echo " -p <platform> (accepts 'aix', 'unixware', 'linux', 'freebsd', 'solaris', 'hp-10', 'hp-11', 'os400', 'irix', 'ptx', 'tru64', 'macosx')" echo " -c <C compiler name> (e.g. gcc, xlc or icc)" echo " -x <C++ compiler name> (e.g. g++, xlC, or icc)" @@ -178,7 +176,7 @@ fi # Now check if the options are correct or not, bail out if incorrect case $platform in - aix | unixware | linux | solaris | hp-10 | hp-11 | os400 | irix | ptx | tru64 | macosx) + aix | unixware | linux | freebsd | solaris | hp-10 | hp-11 | os400 | irix | ptx | tru64 | macosx) # platform has been recognized ;; *) @@ -246,6 +244,10 @@ elif test $platform = "ptx"; then else ./configure fi +# exit if configure failed +if test $? != 0; then + exit 1 +fi echo echo In future, you may also directly type the following commands to create the Makefiles. diff --git a/src/Makefile.incl b/src/Makefile.incl index 4a6c1d59f..e7cf8f7e2 100644 --- a/src/Makefile.incl +++ b/src/Makefile.incl @@ -1,7 +1,7 @@ # # The Apache Software License, Version 1.1 # -# Copyright (c) 1999-2000 The Apache Software Foundation. All rights +# Copyright (c) 1999-2001 The Apache Software Foundation. All rights # reserved. # # Redistribution and use in source and binary forms, with or without @@ -254,6 +254,20 @@ endif SHLIBSUFFIX=.so endif +#=============== FREEBSD SPECIFIC OPTIONS ========================= +ifeq (${PLATFORM}, FREEBSD) +MAKE_SHARED = ${CXX} -D${PLATFORM} -shared -fPIC ${LDFLAGS} +MAKE_SHARED_C = ${CC} -D${PLATFORM} -shared -fPIC ${LDFLAGS} +ifeq (${TRANSCODER}, ICU) + PLATFORM_COMPILE_OPTIONS = -fPIC -D${PLATFORM} -I/usr/local/include + ALLLIBS = ${LIBS} -L/usr/local/lib -licuuc -L${ICUROOT} -licudata -lgcc +else + PLATFORM_COMPILE_OPTIONS = -fPIC -D${PLATFORM} + ALLLIBS = ${LIBS} +endif +SHLIBSUFFIX=.so +endif + #=============== IRIX SPECIFIC OPTIONS ============================ ifeq (${PLATFORM}, IRIX) PLATFORM_COMPILE_OPTIONS = -LANG:pch -LANG:std -O2 \ @@ -405,6 +419,9 @@ CP = -cp -fph else CP = -cp -fp endif +ifeq (${PLATFORM}, FREEBSD) +CP = -cp -p +endif RM = -rm -f CAT = cat AR = ar -cqv diff --git a/src/configure b/src/configure index d05a942a7..0fb74d43f 100755 --- a/src/configure +++ b/src/configure @@ -1254,6 +1254,7 @@ case "${host}" in *-*-UnixWare*) platform=UNIXWARE ;; *-*-unixware*) platform=UNIXWARE ;; *-*-linux*) platform=LINUX ;; + *-*-freebsd*) platform=FREEBSD ;; *-*-irix*) platform=IRIX ;; *-*-aix*) platform=AIX case "${host}" in @@ -1285,7 +1286,7 @@ cc=${CC} -prefix_include=${PREFIX}/include/xercesc +prefix_include='${PREFIX}/include/xercesc' @@ -1444,6 +1445,7 @@ util/Platforms/Makefile \ util/Platforms/Solaris/Makefile \ util/Platforms/AIX/Makefile \ util/Platforms/Linux/Makefile \ +util/Platforms/FreeBSD/Makefile \ util/Platforms/HPUX/Makefile \ util/Platforms/OS390/Makefile \ util/Platforms/OS400/Makefile \ @@ -1585,6 +1587,7 @@ util/Platforms/Makefile \ util/Platforms/Solaris/Makefile \ util/Platforms/AIX/Makefile \ util/Platforms/Linux/Makefile \ +util/Platforms/FreeBSD/Makefile \ util/Platforms/HPUX/Makefile \ util/Platforms/OS390/Makefile \ util/Platforms/OS400/Makefile \ diff --git a/src/configure.in b/src/configure.in index 144d82117..ea16dab17 100644 --- a/src/configure.in +++ b/src/configure.in @@ -32,6 +32,7 @@ case "${host}" in *-*-UnixWare*) platform=UNIXWARE ;; *-*-unixware*) platform=UNIXWARE ;; *-*-linux*) platform=LINUX ;; + *-*-freebsd*) platform=FREEBSD ;; *-*-irix*) platform=IRIX ;; *-*-aix*) platform=AIX case "${host}" in @@ -110,6 +111,7 @@ util/Platforms/Makefile \ util/Platforms/Solaris/Makefile \ util/Platforms/AIX/Makefile \ util/Platforms/Linux/Makefile \ +util/Platforms/FreeBSD/Makefile \ util/Platforms/HPUX/Makefile \ util/Platforms/OS390/Makefile \ util/Platforms/OS400/Makefile \ diff --git a/src/runConfigure b/src/runConfigure index 73a966b4c..5fbe1ac75 100755 --- a/src/runConfigure +++ b/src/runConfigure @@ -2,7 +2,7 @@ # # The Apache Software License, Version 1.1 # -# Copyright (c) 1999-2000 The Apache Software Foundation. All rights +# Copyright (c) 1999-2001 The Apache Software Foundation. All rights # reserved. # # Redistribution and use in source and binary forms, with or without @@ -78,7 +78,7 @@ usage() echo "runConfigure: Helper script to run \"configure\" for one of the supported platforms" echo "Usage: runConfigure \"options\"" echo " where options may be any of the following:" - echo " -p <platform> (accepts 'aix', 'linux', 'solaris', + echo " -p <platform> (accepts 'aix', 'linux', 'freebsd', 'solaris', 'hp-10', 'hp-11', 'unixware', 'os400', 'irix', 'ptx', 'tru64', 'macosx' )" echo " -c <C compiler name> (e.g. gcc, cc, xlc_r, icc)" echo " -x <C++ compiler name> (e.g. g++, CC, xlC_r, icc, c++)" @@ -202,7 +202,7 @@ echo "Extra configure options: $configureoptions" # case $platform in - aix | linux | solaris | hp-10 | hp-11 | irix | unixware | os400 | ptx | tru64 | macosx) + aix | linux | freebsd | solaris | hp-10 | hp-11 | irix | unixware | os400 | ptx | tru64 | macosx) # platform has been recognized ;; *) @@ -262,6 +262,9 @@ else exit ${ERROR_EXIT_CODE};; esac fi + elif test $platform = "freebsd"; then + threadingLibs="-pthread -lc_r" + threadingDefines="-D_THREAD_SAFE -DXML_USE_PTHREADS" elif test $platform = "aix"; then aix_version=`./config.guess`; echo Found host system to be $aix_version @@ -347,12 +350,12 @@ TRANSCODER=NATIVE if test $transcoder; then case $transcoder in icu) - if test -z $ICUROOT; then + if test ${ICUROOT}o = "o"; then echo '***Error*** ICUROOT environment variable not defined. Exiting...'; exit ${ERROR_EXIT_CODE}; fi transcodingDefines="-DXML_USE_ICU_TRANSCODER -I${ICUROOT}/include"; - transcodingLibs="-L${ICUROOT}/lib -L${ICUROOT}/data"; + transcodingLibs="-L${ICUROOT} -L${ICUROOT}/lib -L${ICUROOT}/data"; TRANSCODER=ICU;; Iconv400) transcodingDefines="-DXML_USE_ICONV400_TRANSCODER" ; @@ -382,7 +385,7 @@ msgloaderDefines="-DXML_USE_INMEM_MESSAGELOADER" if test $msgloader ; then case $msgloader in icu) - if test -z $ICUROOT ; then + if test ${ICUROOT}o = "o" ; then echo '***Error*** ICUROOT environment variable not defined. Exiting...'; exit ${ERROR_EXIT_CODE}; fi @@ -522,6 +525,11 @@ elif test $platform = "ptx"; then else sh ./configure $configureoptions fi +# exit if configure failed +if test $? != 0; then + exit 1 +fi + echo echo In future, you may also directly type the following commands to create the Makefiles. echo diff --git a/src/util/AutoSense.hpp b/src/util/AutoSense.hpp index e27d14ab8..caf655801 100644 --- a/src/util/AutoSense.hpp +++ b/src/util/AutoSense.hpp @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.21 2001/11/29 18:25:18 tng + * FreeBSD support by Michael Huedepohl. + * * Revision 1.20 2001/05/11 13:26:26 tng * Copyright update. * @@ -158,6 +161,9 @@ #elif defined(__linux__) #define XML_LINUX #define XML_UNIX +#elif defined(__FreeBSD__) + #define XML_FREEBSD + #define XML_UNIX #elif defined(IRIX) || defined(__sgi) #define XML_IRIX #define XML_UNIX diff --git a/src/util/Platforms/FreeBSD/FreeBSDDefs.hpp b/src/util/Platforms/FreeBSD/FreeBSDDefs.hpp new file mode 100644 index 000000000..a687d14d4 --- /dev/null +++ b/src/util/Platforms/FreeBSD/FreeBSDDefs.hpp @@ -0,0 +1,73 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 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) 2001, 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 2001/11/29 18:25:18 tng + * FreeBSD support by Michael Huedepohl. + * + */ + + +// --------------------------------------------------------------------------- +// FreeBSD runs in little endian mode +// --------------------------------------------------------------------------- +#define ENDIANMODE_LITTLE +typedef void* FileHandle; + +#ifndef FREEBSD +#define FREEBSD +#endif diff --git a/src/util/Platforms/FreeBSD/FreeBSDPlatformUtils.cpp b/src/util/Platforms/FreeBSD/FreeBSDPlatformUtils.cpp new file mode 100644 index 000000000..4d45a6870 --- /dev/null +++ b/src/util/Platforms/FreeBSD/FreeBSDPlatformUtils.cpp @@ -0,0 +1,665 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 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) 2001, 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 2001/11/29 18:25:18 tng + * FreeBSD support by Michael Huedepohl. + * + */ + + +// --------------------------------------------------------------------------- +// Includes +// --------------------------------------------------------------------------- + +#if !defined(APP_NO_THREADS) +#include <pthread.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 <libgen.h> +#include <sys/time.h> +#include <string.h> +#include <util/PlatformUtils.hpp> +#include <util/RuntimeException.hpp> +#include <util/Janitor.hpp> +#include <util/Mutexes.hpp> +#include <util/XMLString.hpp> +#include <util/XMLUniDefs.hpp> +#include <util/XMLUni.hpp> + +#if defined(XML_USE_ICU_TRANSCODER) + #include <util/Transcoders/ICU/ICUTransService.hpp> +#else + // Use native transcoder. Same as -DXML_USE_NATIVE_TRANSCODER + #include <util/Transcoders/Iconv/IconvTransService.hpp> +#endif + + +#if defined(XML_USE_ICU_MESSAGELOADER) + #include <util/MsgLoaders/ICU/ICUMsgLoader.hpp> +#else + // Same as -DXML_USE_INMEM_MESSAGELOADER + #include <util/MsgLoaders/InMemory/InMemMsgLoader.hpp> +#endif + + +#if defined (XML_USE_NETACCESSOR_SOCKET) + #include <util/NetAccessors/Socket/SocketNetAccessor.hpp> +#endif + + + +// --------------------------------------------------------------------------- +// Local Methods +// --------------------------------------------------------------------------- + +static void WriteCharStr( FILE* stream, const char* const toWrite) +{ + if (fputs(toWrite, stream) == EOF) + { + ThrowXML(XMLPlatformUtilsException, + XMLExcepts::Strm_StdErrWriteFailure); + } +} + +static void WriteUStrStdErr( const XMLCh* const toWrite) +{ + char* tmpVal = XMLString::transcode(toWrite); + ArrayJanitor<char> janText(tmpVal); + if (fputs(tmpVal, stderr) == EOF) + { + ThrowXML(XMLPlatformUtilsException, + XMLExcepts::Strm_StdErrWriteFailure); + } +} + +static void WriteUStrStdOut( const XMLCh* const toWrite) + { + char* tmpVal = XMLString::transcode(toWrite); + ArrayJanitor<char> janText(tmpVal); + if (fputs(tmpVal, stdout) == EOF) + { + ThrowXML(XMLPlatformUtilsException, + XMLExcepts::Strm_StdOutWriteFailure); + } +} + +XMLNetAccessor* XMLPlatformUtils::makeNetAccessor() +{ +#if defined (XML_USE_NETACCESSOR_SOCKET) + return new SocketNetAccessor(); +#else + return 0; +#endif +} + + + +XMLCh* XMLPlatformUtils::weavePaths(const XMLCh* const basePath + , const XMLCh* const relativePath) + +{ + // Create a buffer as large as both parts and empty it + XMLCh* tmpBuf = new XMLCh[XMLString::stringLen(basePath) + + XMLString::stringLen(relativePath) + + 2]; + *tmpBuf = 0; + + // + // If we have no base path, then just take the relative path as + // is. + // + if (!basePath) + { + XMLString::copyString(tmpBuf, relativePath); + return tmpBuf; + } + + if (!*basePath) + { + XMLString::copyString(tmpBuf, relativePath); + return tmpBuf; + } + + const XMLCh* basePtr = basePath + (XMLString::stringLen(basePath) - 1); + if ((*basePtr != chForwardSlash) + && (*basePtr != chBackSlash)) + { + while ((basePtr >= basePath) + && ((*basePtr != chForwardSlash) && (*basePtr != chBackSlash))) + { + basePtr--; + } + } + + // There is no relevant base path, so just take the relative part + if (basePtr < basePath) + { + XMLString::copyString(tmpBuf, relativePath); + return tmpBuf; + } + + // After this, make sure the buffer gets handled if we exit early + ArrayJanitor<XMLCh> janBuf(tmpBuf); + + // + // We have some path part, so we need to check to see if we ahve to + // weave any of the parts together. + // + const XMLCh* pathPtr = relativePath; + while (true) + { + // If it does not start with some period, then we are done + if (*pathPtr != chPeriod) + break; + + unsigned int periodCount = 1; + pathPtr++; + if (*pathPtr == chPeriod) + { + pathPtr++; + periodCount++; + } + + // Has to be followed by a \ or / or the null to mean anything + if ((*pathPtr != chForwardSlash) && (*pathPtr != chBackSlash) + && *pathPtr) + { + break; + } + if (*pathPtr) + pathPtr++; + + // If its one period, just eat it, else move backwards in the base + if (periodCount == 2) + { + basePtr--; + while ((basePtr >= basePath) + && ((*basePtr != chForwardSlash) && (*basePtr != chBackSlash))) + { + basePtr--; + } + + // The base cannot provide enough levels, so its in error/ + if (basePtr < basePath) + ThrowXML(XMLPlatformUtilsException, + XMLExcepts::File_BasePathUnderflow); + } + } + + // Copy the base part up to the base pointer + XMLCh* bufPtr = tmpBuf; + const XMLCh* tmpPtr = basePath; + while (tmpPtr <= basePtr) + *bufPtr++ = *tmpPtr++; + + // And then copy on the rest of our path + XMLString::copyString(bufPtr, pathPtr); + + // Orphan the buffer and return it + janBuf.orphan(); + return tmpBuf; +} + + +// --------------------------------------------------------------------------- +// XMLPlatformUtils: Private Static Methods +// --------------------------------------------------------------------------- + +// +// 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); +#else + // same as -DXML_USE_INMEM_MESSAGELOADER + retVal = new InMemMsgLoader(msgDomain); +#endif + } + + catch(...) + { + panic(XMLPlatformUtils::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; +#else + // Use native transcoding services. + // same as -DXML_USE_INMEM_MESSAGELOADER + return new IconvTransService; + +#endif +} + +// --------------------------------------------------------------------------- +// XMLPlatformUtils: The panic method +// --------------------------------------------------------------------------- +void XMLPlatformUtils::panic(const PanicReasons reason) +{ + const char* reasonStr = "Unknown reason"; + if (reason == Panic_NoTransService) + reasonStr = "Could not load a transcoding service"; + else if (reason == Panic_NoDefTranscoder) + reasonStr = "Could not load a local code page transcoder"; + else if (reason == Panic_CantFindLib) + reasonStr = "Could not find the xerces-c DLL"; + else if (reason == Panic_UnknownMsgDomain) + reasonStr = "Unknown message domain"; + else if (reason == Panic_CantLoadMsgDomain) + reasonStr = "Cannot load message domain"; + else if (reason == Panic_SynchronizationErr) + reasonStr = "Cannot synchronize system or mutex"; + else if (reason == Panic_SystemInit) + reasonStr = "Cannot initialize the system or mutex"; + + fprintf(stderr, "%s\n", reasonStr); + + exit(-1); +} + + +// --------------------------------------------------------------------------- +// XMLPlatformUtils: File Methods +// --------------------------------------------------------------------------- + +unsigned int XMLPlatformUtils::curFilePos(FileHandle theFile) +{ + int curPos = ftell( (FILE*)theFile); + if (curPos == -1) + ThrowXML(XMLPlatformUtilsException, + XMLExcepts::File_CouldNotGetSize); + + return (unsigned int)curPos; +} + +void XMLPlatformUtils::closeFile(FileHandle theFile) +{ + if (fclose((FILE*)theFile)) + ThrowXML(XMLPlatformUtilsException, + XMLExcepts::File_CouldNotCloseFile); +} + +unsigned int XMLPlatformUtils::fileSize(FileHandle theFile) +{ + // Get the current position + long int curPos = ftell((FILE*) theFile); + if (curPos == -1) + ThrowXML(XMLPlatformUtilsException, + XMLExcepts::File_CouldNotGetCurPos); + + // Seek to the end and save that value for return + if (fseek((FILE*) theFile, 0, SEEK_END)) + ThrowXML(XMLPlatformUtilsException, + XMLExcepts::File_CouldNotSeekToEnd); + + long int retVal = ftell((FILE*)theFile); + if (retVal == -1) + ThrowXML(XMLPlatformUtilsException, + XMLExcepts::File_CouldNotSeekToEnd); + + // And put the pointer back + + if (fseek( (FILE*)theFile, curPos, SEEK_SET) ) + ThrowXML(XMLPlatformUtilsException, + XMLExcepts::File_CouldNotSeekToPos); + + return (unsigned int)retVal; +} + +FileHandle XMLPlatformUtils::openFile(const XMLCh* const fileName) +{ + const char* tmpFileName = XMLString::transcode(fileName); + ArrayJanitor<char> janText((char*)tmpFileName); + FileHandle retVal = (FILE*)fopen( tmpFileName , "rb" ); + + if (retVal == NULL) + return 0; + return retVal; +} + +FileHandle XMLPlatformUtils::openFile(const char* const fileName) +{ + FileHandle retVal = (FILE*)fopen( fileName , "rb" ); + + if (retVal == NULL) + return 0; + return retVal; +} + + +FileHandle XMLPlatformUtils::openStdInHandle() +{ + return (FileHandle)fdopen(dup(0), "rb"); +} + + + +unsigned int +XMLPlatformUtils::readFileBuffer( FileHandle theFile + , const unsigned int toRead + , XMLByte* const toFill) +{ + size_t noOfItemsRead = fread((void*) toFill, 1, toRead, (FILE*)theFile); + + if(ferror((FILE*)theFile)) + { + ThrowXML(XMLPlatformUtilsException, + XMLExcepts::File_CouldNotReadFromFile); + } + + return (unsigned int)noOfItemsRead; +} + + +void XMLPlatformUtils::resetFile(FileHandle theFile) +{ + // Seek to the start of the file + if (fseek((FILE*)theFile, 0, SEEK_SET)) + ThrowXML(XMLPlatformUtilsException, + XMLExcepts::File_CouldNotResetFile); +} + + +// --------------------------------------------------------------------------- +// XMLPlatformUtils: Timing Methods +// --------------------------------------------------------------------------- + +unsigned long XMLPlatformUtils::getCurrentMillis() +{ + struct timeval aTime; + gettimeofday(&aTime, NULL); + return (unsigned long) (aTime.tv_sec * 1000 + aTime.tv_usec / 1000); + +} + +XMLCh* XMLPlatformUtils::getFullPath(const XMLCh* const srcPath) +{ + + // + // 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); + ArrayJanitor<char> janText(newSrc); + + // Use a local buffer that is big enough for the largest legal path + char *absPath = new char[PATH_MAX]; + // get the absolute path + char* retPath = realpath(newSrc, absPath); + ArrayJanitor<char> janText2(retPath); + + if (!retPath) + { + ThrowXML(XMLPlatformUtilsException, XMLExcepts::File_CouldNotGetBasePathName); + } + return XMLString::transcode(absPath); +} + +bool XMLPlatformUtils::isRelative(const XMLCh* const toCheck) +{ + // Check for pathological case of empty path + if (!toCheck[0]) + 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; +} + + +// ----------------------------------------------------------------------- +// Mutex methods +// ----------------------------------------------------------------------- + +#if !defined(APP_NO_THREADS) + +// --------------------------------------------------------------------------- +// XMLPlatformUtils: Platform init method +// --------------------------------------------------------------------------- + +static XMLMutex atomicOpsMutex; + +void XMLPlatformUtils::platformInit() +{ + // + // The atomicOps mutex needs to be created early. + // Normally, mutexes are created on first use, but there is a + // circular dependency between compareAndExchange() and + // mutex creation that must be broken. + + atomicOpsMutex.fHandle = XMLPlatformUtils::makeMutex(); +} + +void* XMLPlatformUtils::makeMutex() +{ + pthread_mutex_t* mutex = new pthread_mutex_t; + pthread_mutexattr_t* attr = new pthread_mutexattr_t; + pthread_mutexattr_init(attr); + pthread_mutexattr_settype(attr, PTHREAD_MUTEX_RECURSIVE); + if (pthread_mutex_init(mutex, attr)) + { + ThrowXML(XMLPlatformUtilsException, + XMLExcepts::Mutex_CouldNotCreate); + } + pthread_mutexattr_destroy(attr); + delete attr; + return (void*)(mutex); + +} + +void XMLPlatformUtils::closeMutex(void* const mtxHandle) +{ + if (mtxHandle != NULL) + { + if (pthread_mutex_destroy((pthread_mutex_t*) mtxHandle)) + { + ThrowXML(XMLPlatformUtilsException, + XMLExcepts::Mutex_CouldNotDestroy); + } + delete mtxHandle; + } +} + + +void XMLPlatformUtils::lockMutex(void* const mtxHandle) +{ + if (mtxHandle != NULL) + { + if (pthread_mutex_lock((pthread_mutex_t*) mtxHandle)) + { + ThrowXML(XMLPlatformUtilsException, + XMLExcepts::Mutex_CouldNotLock); + } + } +} + + +void XMLPlatformUtils::unlockMutex(void* const mtxHandle) +{ + if (mtxHandle != NULL) + { + if (pthread_mutex_unlock((pthread_mutex_t*) mtxHandle)) + { + ThrowXML(XMLPlatformUtilsException, + XMLExcepts::Mutex_CouldNotUnlock); + } + } +} + + +// ----------------------------------------------------------------------- +// Miscellaneous synchronization methods +// ----------------------------------------------------------------------- + +void* XMLPlatformUtils::compareAndSwap(void** toFill + , const void* const newValue + , const void* const toCompare) +{ + XMLMutexLock lockMutex(&atomicOpsMutex); + + void *retVal = *toFill; + if (*toFill == toCompare) + *toFill = (void *)newValue; + + return retVal; +} + +int XMLPlatformUtils::atomicIncrement(int &location) +{ + XMLMutexLock localLock(&atomicOpsMutex); + + return ++location; +} + +int XMLPlatformUtils::atomicDecrement(int &location) +{ + XMLMutexLock localLock(&atomicOpsMutex); + + return --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() +{ +#if !defined(APP_NO_THREADS) + // delete the mutex we created + closeMutex(atomicOpsMutex.fHandle); + atomicOpsMutex.fHandle = 0; +#endif +} diff --git a/src/util/Platforms/FreeBSD/Makefile.in b/src/util/Platforms/FreeBSD/Makefile.in new file mode 100644 index 000000000..3ade32d41 --- /dev/null +++ b/src/util/Platforms/FreeBSD/Makefile.in @@ -0,0 +1,86 @@ +# +# The Apache Software License, Version 1.1 +# +# Copyright (c) 2001 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) 2001, 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 2001/11/29 18:25:18 tng +# FreeBSD support by Michael Huedepohl. +# +# + +PLATFORM = @platform@ +CC = @cc@ +CXX = @cxx@ +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/FreeBSD +CXXFLAGS += -D_GNU_SOURCE -D__USE_GNU +CPP_PUBHEADERS = FreeBSDDefs.hpp +CPP_OBJECTS = FreeBSDPlatformUtils.$(TO) + +include ../../Makefile.util.submodule diff --git a/src/util/Platforms/Makefile.in b/src/util/Platforms/Makefile.in index a16cafd68..7208decfe 100644 --- a/src/util/Platforms/Makefile.in +++ b/src/util/Platforms/Makefile.in @@ -1,7 +1,7 @@ # # The Apache Software License, Version 1.1 # -# Copyright (c) 1999-2000 The Apache Software Foundation. All rights +# Copyright (c) 1999-2001 The Apache Software Foundation. All rights # reserved. # # Redistribution and use in source and binary forms, with or without @@ -55,6 +55,9 @@ # # # $Log$ +# Revision 1.16 2001/11/29 18:25:18 tng +# FreeBSD support by Michael Huedepohl. +# # Revision 1.15 2001/07/06 17:12:02 tng # Automatic build of single-threaded library. By Martin Kalen. # @@ -134,6 +137,9 @@ endif ifeq (${PLATFORM}, LINUX) SUBMODULE = Linux endif +ifeq (${PLATFORM}, FREEBSD) + SUBMODULE = FreeBSD +endif ifeq (${PLATFORM}, HPUX) SUBMODULE = HPUX endif diff --git a/src/util/XercesDefs.hpp b/src/util/XercesDefs.hpp index 3dee36222..684e6dce2 100644 --- a/src/util/XercesDefs.hpp +++ b/src/util/XercesDefs.hpp @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.18 2001/11/29 18:25:18 tng + * FreeBSD support by Michael Huedepohl. + * * Revision 1.17 2001/11/23 17:19:33 tng * Change from 1.5.2 to 1.6.0 * @@ -220,6 +223,10 @@ const unsigned int gXercesRevision = 0; #include <util/Platforms/Linux/LinuxDefs.hpp> #endif +#if defined(XML_FREEBSD) +#include <util/Platforms/FreeBSD/FreeBSDDefs.hpp> +#endif + #if defined(XML_OS390) #include <util/Platforms/OS390/OS390Defs.hpp> #endif -- GitLab