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