You are viewing a plain text version of this content. The canonical link for it is here.
Posted to c-dev@xerces.apache.org by pe...@ca.ibm.com on 2001/09/04 21:29:10 UTC
Re: patch for IRIX sproc( ) compatibility
Christopher
The runConfigure and IRIXPlatformUtils.cpp are in CVS now, please
help verify, thanks.
Regards,
Peiyong Zhang
____________________________________________
XML Parsers Development
IBM Toronto Laboratory email: peiyongz@ca.ibm.com
Phone: (416)448-4088; Fax: (416)448-4414; T/L: 778-4088
Christopher Just <cj...@qwest.net>@e33.esmtp.ibm.com on 08/30/2001
11:43:24 PM
Please respond to xerces-c-dev@xml.apache.org
Sent by: coronax@e33.esmtp.ibm.com
To: xerces-c-dev@xml.apache.org, PeiYong Zhang/Toronto/IBM@IBMCA
cc:
Subject: Re: patch for IRIX sproc( ) compatibility
peiyongz@ca.ibm.com wrote:
>
> Christopher,
>
> Would you mind sending us your version of the files?
> thanks.
>
> /src/runConfigure
> /src/util/Platforms/IRIX/IRIXPlatformUtils.cpp
Here they are. Thanks for taking an interest in this.
-chris
--
Christopher Just------------------------------------coronax@iastate.edu
http://www.public.iastate.edu/~coronax
"We hit a little snag when the universe collapsed in upon itself."
-- Bart Simpson#!/bin/sh
#
# The Apache Software License, Version 1.1
#
# Copyright (c) 1999-2000 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/>.
#
#
# $Id: runConfigure,v 1.40 2001/07/06 17:11:54 tng Exp $
#
#
#
# runConfigure:
# This script will run the "configure" script for the appropriate
# platform. Only supported platforms are recognized.
#
# The following variables are defined and exported at the end of this
# script.
#
# LIBS
# LDFLAGS
# CXXFLAGS
# TRANSCODER
#
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',
'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++)"
echo " -d (specifies that you want to build debug version)"
echo " -m <message loader> can be 'inmem', 'icu', 'MsgFile' or
'iconv'"
echo " -n <net accessor> can be 'fileonly', 'libwww', 'socket' or
'native'"
echo " -t <transcoder> can be 'icu', 'Iconv400', 'Iconv390' or
'native'"
echo " -r <thread option> can be 'pthread' or 'dce' (only used on
aix, HP-11 and solaris) or 'sproc' (only on IRIX) or 'none'"
echo " -l <extra linker options>"
echo " -z <extra compiler options>"
echo " -P <install-prefix>"
echo " -C <any one extra configure options>"
echo " -h (to get help on the above commands)"
}
ERROR_EXIT_CODE=1
if test ${1}o = "o"; then
usage
exit ${ERROR_EXIT_CODE}
fi
if test ${XERCESCROOT}o = "o"; then
echo ERROR : You have not set your XERCESCROOT environment variable
echo Though this environment variable has nothing to do with creating
makefiles,
echo this is just a general warning to prevent you from pitfalls in
future. Please
echo set an environment variable called XERCESCROOT to indicate where
you installed
echo the XERCES-C files, and run this command again to proceed. See the
documentation
echo for an example if you are still confused.
exit ${ERROR_EXIT_CODE}
fi
if test $1 = "-h"; then
usage
exit ${ERROR_EXIT_CODE}
fi
# Get the command line parameters
if test -x /usr/bin/getopt; then
set -- `getopt p:c:x:dm:n:t:r:l:z:P:C:h $*`
else
set -- `getopts p:c:x:dm:n:t:r:l:z:P:C:h `$*``
fi
if [ $? != 0 ]
then
usage
exit ${ERROR_EXIT_CODE}
fi
# Set up the default values for each parameter
debug=off # by default debug is off
transcoder=native # by default use native transcoder
msgloader=inmem # by default use inmem message loader
netaccessor=socket # by default use socket (can do HTTP URL's)
thread=pthread # by default use POSIX threads
configureoptions=""
for i in $*
do
case $i in
-p)
platform=$2; shift 2;;
-c)
ccompiler=$2; shift 2;;
-x)
cppcompiler=$2; shift 2;;
-d)
debug=on; shift;;
-m)
msgloader=$2; shift 2;;
-n)
netaccessor=$2; shift 2;;
-t)
transcoder=$2; shift 2;;
-r)
thread=$2; shift 2;;
-l)
linkeroptions=$2; shift 2;;
-z)
compileroptions=$2; shift 2;;
-P)
configureoptions="$configureoptions --prefix=$2"; shift 2;;
-C)
configureoptions="$configureoptions $2"; shift 2;;
-h)
usage
exit ${ERROR_EXIT_CODE};;
--)
shift; break;;
esac
done
echo "Generating makefiles with the following options ..."
echo "Platform: $platform"
echo "C Compiler: $ccompiler"
echo "C++ Compiler: $cppcompiler"
echo "Extra compile options: $compileroptions"
echo "Extra link options: $linkeroptions"
echo "Message Loader: $msgloader"
echo "Net Accessor: $netaccessor"
echo "Transcoder: $transcoder"
echo "Thread option: $thread"
echo "Extra configure options: $configureoptions"
#
# Now check if the options are correct or not, bail out if incorrect
#
case $platform in
aix | linux | solaris | hp-10 | hp-11 | irix | unixware | os400 | ptx |
tru64 | macosx)
# platform has been recognized
;;
*)
echo "I do not recognize the platform '$platform'. Please type '${0}
-h' for help."
exit ${ERROR_EXIT_CODE};;
esac
#
# Enable debugging or not...
#
if test $debug = "off"; then
echo "Debug is OFF"
if test ${SYSOVR}o = "o"; then
if test $platform = "os400"; then
echo "NATIVE OS400 BUILD"
debugflag="";
elif test $platform = "irix"; then
debugflag="-O2";
else
debugflag="-O";
fi
else
echo "OVERRIDE FOR OS400 ON AIX"
debugflag="";
fi
else
echo "Debug is ON"
debugflag="-g";
fi
#
# Check for the threading option
#
if test $thread = "none"; then
THREADS=none
threadingLibs=""
threadingDefines="-DAPP_NO_THREADS -DXML_USE_NO_THREADS"
else
THREADS=pthread
threadingDefines="-DXML_USE_PTHREADS"
threadingLibs="-lpthread"
if test $platform = "hp-11"; then
if test $thread; then
case $thread in
pthread)
;;
dce)
THREADS=dce ;
threadingLibs="-lcma" ;
threadingDefines="-D_PTHREADS_DRAFT4 -D_THREAD_SAFE
-DXML_USE_DCE" ;;
*)
echo "I do not recognize the thread option '$thread'. Please
type '${0} -h' for help." ;
exit ${ERROR_EXIT_CODE};;
esac
fi
elif test $platform = "aix"; then
aix_version=`./config.guess`;
echo Found host system to be $aix_version
case $aix_version in
*4.3*)
## Linkflags control the use of libpthreads on AIX
threadingLibs="-lpthreads_compat";;
*)
threadingLibs="-lpthreads";;
esac
if test $thread; then
case $thread in
pthread)
;;
dce)
THREADS=dce ;
threadingDefines="-DXML_USE_DCE"
case $aix_version in
*4.3*)
## Linkflags control the use of libpthreads on AIX
threadingLibs="-ldcelibc_r -ldcepthreads
-lpthreads_compat";;
*)
threadingLibs="-lC_r -lC -ldcelibc_r -ldcepthreads";;
esac
;;
*)
echo "I do not recognize the thread option '$thread'. Please
type '${0} -h' for help." ;
exit ${ERROR_EXIT_CODE};;
esac
fi
elif test $platform = "ptx"; then
threadingLibs=" "
if test -z $XMLINSTALL; then
XMLINSTALL=$ICUROOT ## use either the -C or the -P
option now.
fi
elif test $platform = "hp-10"; then
THREADS=dce
threadingLibs="-lcma"
threadingDefines="-DXML_USE_DCE"
elif test $platform = "unixware"; then
threadingLibs="" ## Linkflags control the use of threads on
UnixWare
elif test $platform = "solaris"; then
if test $thread; then
case $thread in
pthread)
;;
dce)
THREADS=dce ;
threadingLibs="-ldce";
threadingDefines="-DXML_USE_DCE";;
*)
echo "I do not recognize the thread option '$thread'. Please
type '${0} -h' for help."
exit ${ERROR_EXIT_CODE};;
esac
fi
elif test $platform = "irix"; then
if test $thread; then
case $thread in
pthread)
;;
sproc)
threadingLibs=" ";
threadingDefines="-DXML_USE_SPROC" ;;
*)
echo "I do not recognize the thread option '$thread'. Please
type '${0} -h' for help."
exit ${ERROR_EXIT_CODE};;
esac
fi
fi
fi
export THREADS
#
# Now check for what kind of transcoding service is desired.
#
transcodingDefines="-DXML_USE_NATIVE_TRANSCODER"
TRANSCODER=NATIVE
if test $transcoder; then
case $transcoder in
icu)
if test -z $ICUROOT; 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";
TRANSCODER=ICU;;
Iconv400)
transcodingDefines="-DXML_USE_ICONV400_TRANSCODER" ;
TRANSCODER=Iconv400 ;;
Iconv390)
transcodingDefines="-DXML_USE_ICONV390_TRANSCODER" ;
TRANSCODER=Iconv390 ;;
native)
;;
*)
echo "I do not recognize the transcoder option '$transcoder'. Please
type '${0} -h' for help."
exit ${ERROR_EXIT_CODE};;
esac
fi
export TRANSCODER
#
# Now check for the message loader
#
MESSAGELOADER=INMEM # By default use in-memory
msgloaderDefines="-DXML_USE_INMEM_MESSAGELOADER"
if test $msgloader ; then
case $msgloader in
icu)
if test -z $ICUROOT ; then
echo '***Error*** ICUROOT environment variable not defined.
Exiting...';
exit ${ERROR_EXIT_CODE};
fi
MESSAGELOADER=ICU;
msgloaderDefines="-DXML_USE_ICU_MESSAGELOADER" ;;
inmem)
;;
MsgFile)
MESSAGELOADER=MSGFILE;
msgloaderDefines="-DXML_USE_MSGFILE_MESSAGELOADER" ;;
iconv)
MESSAGELOADER=ICONV;
msgloaderDefines="-DXML_USE_ICONV_MESSAGELOADER" ;;
*)
echo "I do not recognize the message loader option '$msgloader'.
Please type '${0} -h' for help.";
exit ${ERROR_EXIT_CODE};;
esac
fi
export MESSAGELOADER
#
# Check for the type of net accessor
#
NETACCESSOR=Socket # By default use socket (does HTTP URL's)
if test $netaccessor ; then
case $netaccessor in
fileonly)
NETACCESSOR=FileOnly
netaccessorDefines="" ;;
socket)
NETACCESSOR=Socket
netaccessorDefines="-DXML_USE_NETACCESSOR_SOCKET"
case $platform in
unixware)
netaccessorLibs="-lnsl -lsocket";;
hp-11)
netaccessorLibs="-lnsl";;
aix)
netaccessorLibs="-lbsd";;
solaris)
netaccessorLibs="-lnsl -lsocket"
if test $thread = "dce"; then
netaccessorLibs=""
fi
;;
*)
;;
esac;;
libwww)
NETACCESSOR=LibWWW
if test -z "`libwww-config --libs 2>/dev/null`" ; then
echo "Netaccessor is libwww, but libwww-config is not found.
Cannot proceed further."
exit ${ERROR_EXIT_CODE};
fi
netaccessorDefines="-DXML_USE_NETACCESSOR_LIBWWW `libwww-config
--cflags`"
netaccessorLibs="`libwww-config --libs`"
USELIBWWW=1;;
native)
NETACCESSOR=NATIVE
netaccessorDefines="-DXML_USE_NETACCESSOR_NATIVE"
netaccessorLibs=""
;;
*)
echo "I do not recognize the netaccessor option '$netaccessor'.
Please type '${0} -h' for help."
exit ${ERROR_EXIT_CODE};;
esac
fi
export NETACCESSOR
#
# Set the C compiler and C++ compiler environment variables
#
case $cppcompiler in
xlC* | xlc* | g++ | c++ | cc | CC | aCC | icc | ICC | cxx)
;;
*)
echo "I do not recognize the C++ compiler '$cppcompiler'. Continuing
anyway ..."
;;
esac
CC="$ccompiler"
export CC
CXX="$cppcompiler"
export CXX
#
# Set the extra C and C++ compiler flags
#
CXXFLAGS="$compileroptions $debugflag $transcodingDefines $msgloaderDefines
$threadingDefines $netaccessorDefines"
export CXXFLAGS
CFLAGS="$compileroptions $debugflag $transcodingDefines $msgloaderDefines
$threadingDefines $netaccessorDefines"
export CFLAGS
# gcc crashes if optimisation is turned on in a Tru64 environment
if [ $platform = "tru64" -a $CXX = "g++" ]; then
CXXFLAGS=`echo $CXXFLAGS | sed -e 's/-O[0-9]*//g'`
CFLAGS=`echo $CXXFLAGS | sed -e 's/-O[0-9]*//g'`
export CXXFLAGS CFLAGS
fi
LDFLAGS="$linkeroptions"
export LDFLAGS
LIBS="$transcodingLibs $threadingLibs $netaccessorLibs"
export LIBS
echo
rm -f config.cache
rm -f config.log
rm -f config.status
if test $platform = "os400"; then
./configure --host AS400-OS400 $configureoptions
elif test $platform = "ptx"; then
./configure --prefix=$XMLINSTALL
else
sh ./configure $configureoptions
fi
echo
echo In future, you may also directly type the following commands to create
the Makefiles.
echo
echo export TRANSCODER=\"$TRANSCODER\"
echo export MESSAGELOADER=\"$MESSAGELOADER\"
echo export NETACCESSOR=\"$NETACCESSOR\"
echo export THREADS=\"$THREADS\"
echo export CC=\"$CC\"
echo export CXX=\"$CXX\"
echo export CXXFLAGS=\"$CXXFLAGS\"
echo export CFLAGS=\"$CFLAGS\"
echo export LDFLAGS=\"$LDFLAGS\"
echo export LIBS=\"$LIBS\"
echo configure $configureoptions
echo
echo If the result of the above commands look OK to you, go to the
directory
echo ${XERCESCROOT}/src and type \"gmake\" to make the XERCES-C system.
exit 0;
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999-2000 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: IRIXPlatformUtils.cpp,v $
* Revision 1.11 2001/01/26 15:42:00 tng
* Undefined symbol error when building a single threaded version of the
xerces lib on irix. Fixed by Walker.
*
* Revision 1.10 2000/07/25 22:29:45 aruna1
* Char definitions in XMLUni moved to XMLUniDefs
*
* Revision 1.9 2000/04/03 19:27:19 abagchi
* Included changes for SGI IRIX 6.5
*
* Revision 1.8 2000/03/02 21:10:36 abagchi
* Added empty function platformTerm()
*
* Revision 1.7 2000/03/02 20:42:40 abagchi
* Fixed typo in XMLExcepts
*
* Revision 1.6 2000/03/02 19:55:22 roddey
* This checkin includes many changes done while waiting for the
* 1.1.0 code to be finished. I can't list them all here, but a list is
* available elsewhere.
*
* Revision 1.5 2000/02/06 07:48:27 rahulj
* Year 2K copyright swat.
*
* Revision 1.4 2000/01/25 22:32:35 aruna1
* Updated panic information
*
* Revision 1.3 1999/12/18 00:54:43 rahulj
* Merged in changes for IRIX submitted by Marc Stuessel
*
* Revision 1.2 1999/12/14 23:53:32 rahulj
* Removed the offending Ctrl-M's from the commit message
* logs which was giving packaging problems.
*
* PR:
* Obtained from:
* Submitted by:
* Reviewed by:
*
* Revision 1.1 1999/12/01 17:16:18 rahulj
* Added support for IRIX 6.5.5 using SGI MIPSpro C++ 7.3 and 7.21
generating 32 bit objects. Changes submitted by Marc Stuessel
*
*/
//
---------------------------------------------------------------------------
// Includes
//
---------------------------------------------------------------------------
#if !defined(APP_NO_THREADS)
#ifdef XML_USE_SPROC
#include <ulocks.h>
#else
#include <pthread.h>
#endif
#endif
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/param.h>
#include <sys/timeb.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()
{
timeb aTime;
ftime(&aTime);
return (unsigned long)(aTime.time*1000 + aTime.millitm);
}
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[1024];
// 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)
static XMLMutex atomicOpsMutex;
#ifdef XML_USE_SPROC
//
---------------------------------------------------------------------------
// XMLPlatformUtils: Platform init method
//
---------------------------------------------------------------------------
static char* arenaName = 0;
static usptr_t* arena = 0;
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.
// need a shared memory space
usconfig(CONF_INITUSERS, 128);
usconfig(CONF_INITSIZE, 16000);
usconfig(CONF_AUTOGROW, 1); // Default, but we set anyway
arenaName = strdup ("/var/tmp/xerces-sharedmemXXXXXX");
arena = usinit (mktemp (arenaName));
atomicOpsMutex.fHandle = XMLPlatformUtils::makeMutex();
}
void XMLPlatformUtils::platformTerm()
{
usdetach (arena);
unlink (arenaName);
free (arenaName);
// We don't have any termination requirements at this time
}
void* XMLPlatformUtils::makeMutex()
{
if (arena) {
usema_t* sema = usnewsema (arena, 1);
if (sema && (usctlsema (sema, CS_RECURSIVEON) != -1)) {
return (void*)sema;
}
else
ThrowXML (XMLPlatformUtilsException,
XMLExcepts::Mutex_CouldNotCreate);
}
else {
// arena==0; therefore platformInit hasn't been called.
// it's important that we fail quietly here so that we don't
// throw an exception when trying to initizlize the
// atomicOpsMutex, which we re-initizlize in platformInit anyay.
return 0;
}
}
void XMLPlatformUtils::closeMutex(void* const mtxHandle)
{
if (mtxHandle != NULL) {
usfreesema (mtxHandle, arena);
// never returns anything testable for failure, so nothing
// to throw an exception about.
}
}
void XMLPlatformUtils::lockMutex(void* const mtxHandle)
{
if (mtxHandle != NULL) {
if (uspsema (mtxHandle) != 1)
ThrowXML(XMLPlatformUtilsException,
XMLExcepts::Mutex_CouldNotLock);
}
}
void XMLPlatformUtils::unlockMutex(void* const mtxHandle)
{
if (mtxHandle != NULL)
{
if (usvsema(mtxHandle) == -1)
{
ThrowXML(XMLPlatformUtilsException,
XMLExcepts::Mutex_CouldNotUnlock);
}
}
}
#else
//
---------------------------------------------------------------------------
// 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::platformTerm()
{
// We don't have any termination requirements at this time
}
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);
}
}
}
#endif // XML_USE_SPROC
// -----------------------------------------------------------------------
// 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;
}
void XMLPlatformUtils::platformTerm()
{
// We don't have any termination requirements at this time
}
#endif // APP_NO_THREADS
//void XMLPlatformUtils::platformTerm()
//{
// We don't have any termination requirements at this time
//}
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-c-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-c-dev-help@xml.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-c-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-c-dev-help@xml.apache.org