Hi.

I meant to do more work on this over the past few weeks, but seem to
have had other things taking up my time instead. Attached is a patch
against CVS from today. It adds various bits necessary for a FreeBSD
port.

The FreeBSDPlatformUtils does not build - it seems the Transcoder stuff
has changed since in the past couple of weeks. Also there is a problem
compiling IconvTransService. The libxerces library is built, but there
are some undefined symbols.

I am busy for at least the next week, so will not have to look at these
problems until after then. I am sending the patch in case anyone else is
working on a FreeBSD port or has an interest in it and might be able to
sort some of the problems out (or moan at me to fix them. :). I would
also appreciate it if these changes could go in the CVS - I know they
don't work, but they shouldn't affect anything else.

Also, I have edited the configure.in's, but not included the patches to
configure - you'll need to run autoconf to generate them.

J.

-- 
Social deviant, | I am Pentium of Borg.  Division | Fax: +44-28-30250834
programmer and  |     is Futile.  You will be     | Tel: +44-28-30252654
student         |          approximated.          |  Made by HuggieTag
diff -ruN xml-xerces/c/samples/Makefile.incl 
xml-xerces.freebsd/c/samples/Makefile.incl
--- xml-xerces/c/samples/Makefile.incl  Thu Dec 23 05:57:05 1999
+++ xml-xerces.freebsd/c/samples/Makefile.incl  Sat Dec 25 08:41:27 1999
@@ -126,6 +126,16 @@
 SHLIBSUFFIX=.so
 endif
 
+#=============== FREEBSD SPECIFIC OPTIONS =========================
+ifeq (${PLATFORM}, FREEBSD)
+CMP= -c ${CXXFLAGS}
+CC= g++ -c -D${PLATFORM} -D_REENTRANT -fpic -instances=static
+LINK = g++ -D${PLATFORM} -fpic
+PLATFORM_LIB_LINK_OPTIONS=-L/usr/lib -L/usr/local/lib
+EXTRA_LINK_OPTIONS=-lc -lc_r -lstdc++ -pthread
+SHLIBSUFFIX=.so
+endif
+
 #================= HP SPECIFIC OPTIONS ===========================
 ifeq (${PLATFORM}, HPUX)
   ifeq (${COMPILER}, aCC)
diff -ruN xml-xerces/c/samples/aclocal.m4 
xml-xerces.freebsd/c/samples/aclocal.m4
--- xml-xerces/c/samples/aclocal.m4     Thu Jan  1 01:00:00 1970
+++ xml-xerces.freebsd/c/samples/aclocal.m4     Sat Dec 25 08:41:27 1999
@@ -0,0 +1,25 @@
+dnl aclocal.m4 for xerces
+dnl Jonathan McDowell <[EMAIL PROTECTED]>
+
+dnl FreeBSD -pthread check - Jonathan McDowell <[EMAIL PROTECTED]>
+AC_DEFUN(AC_PTHREAD_FREEBSD,
+[AC_MSG_CHECKING([if we need -pthread for threads])
+AC_CACHE_VAL(ac_ldflag_pthread,
+[ac_save_LDFLAGS="$LDFLAGS"
+LDFLAGS="-pthread $LDFLAGS"
+AC_TRY_LINK(
+[
+char pthread_create();
+],
+pthread_create();,
+eval "ac_ldflag_pthread=yes",
+eval "ac_ldflag_pthread=no"),
+LIBS="$ac_save_LDFLAGS"
+])
+if eval "test \"`echo $ac_ldflag_pthread`\" = yes"; then
+       AC_MSG_RESULT(yes)
+else
+       AC_MSG_RESULT(no)
+fi
+])
+
diff -ruN xml-xerces/c/samples/configure.in 
xml-xerces.freebsd/c/samples/configure.in
--- xml-xerces/c/samples/configure.in   Wed Dec  1 18:58:20 1999
+++ xml-xerces.freebsd/c/samples/configure.in   Sat Dec 25 08:41:27 1999
@@ -11,10 +11,14 @@
 AC_CHECK_LIB(m, floor)
 
 dnl special pthread handling (AIX uses pthreads instead of pthread)
+dnl and FreeBSD uses -pthread instead of -lpthread
 AC_CHECK_LIB(pthread, pthread_create)
 if test $ac_cv_lib_pthread_pthread_create = no; then
 AC_CHECK_LIB(pthreads, pthread_create)
 fi
+if test $ac_cv_lib_pthread_pthread_create = no; then
+AC_PTHREAD_FREEBSD
+fi
 
 dnl Checks for header files
 AC_CHECK_HEADERS(inttypes.h)
@@ -32,6 +36,7 @@
 case "${host}" in
         *-*-solaris*)   platform=SOLARIS ;;
         *-*-linux*)     platform=LINUX ;;
+        *-*-freebsd*)   platform=FREEBSD ;;
         *-*-aix*)       platform=AIX ;;
         *-*-hp*)        platform=HPUX ;;
         *-*-mvs*)       platform=OS390 ;;
diff -ruN xml-xerces/c/samples/runConfigure 
xml-xerces.freebsd/c/samples/runConfigure
--- xml-xerces/c/samples/runConfigure   Sat Dec  4 16:36:26 1999
+++ xml-xerces.freebsd/c/samples/runConfigure   Sat Dec 25 08:41:28 1999
@@ -111,7 +111,7 @@
     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')"
+    echo "       -p <platform> (accepts 'aix', 'linux', 'solaris', 'hp-10', 
'hp-11', 'freebsd')"
     echo "       -c <C compiler name> (e.g. gcc or xlc)"
     echo "       -x <C++ compiler name> (e.g. g++ or xlC)"
     echo "       -d (specifies that you want to build debug version)"
@@ -192,7 +192,7 @@
 
 # Now check if the options are correct or not, bail out if incorrect
 case $platform in
-   aix | linux | solaris | hp-10 | hp-11)
+   aix | linux | solaris | hp-10 | hp-11 | freebsd)
        # platform has been recognized
        ;;
    *)
diff -ruN xml-xerces/c/src/Makefile.incl xml-xerces.freebsd/c/src/Makefile.incl
--- xml-xerces/c/src/Makefile.incl      Thu Dec 23 05:57:10 1999
+++ xml-xerces.freebsd/c/src/Makefile.incl      Sat Dec 25 08:36:51 1999
@@ -227,6 +227,19 @@
 SHLIBSUFFIX=.so
 endif
 
+#=============== FREEBSD SPECIFIC OPTIONS =========================
+ifeq (${PLATFORM}, FREEBSD)
+PLATFORM_COMPILE_OPTIONS = -fpic -instances=static -D${PLATFORM} -D_REENTRANT
+MAKE_SHARED = ${CXX} -D${PLATFORM} -shared -fpic
+MAKE_SHARED_C = ${CC} -D${PLATFORM} -shared -fpic
+ifeq (${TRANSCODER}, ICU)
+    ALLLIBS = ${LIBS} -L/usr/lib -L/usr/local/lib -L/usr/ccs/lib -licu-uc -lc
+else
+    ALLLIBS = ${LIBS} -L/usr/lib -L/usr/local/lib -L/usr/ccs/lib -lc
+endif
+SHLIBSUFFIX=.so
+endif
+
 #=============== IRIX SPECIFIC OPTIONS ============================
 ifeq (${PLATFORM}, IRIX)
 PLATFORM_COMPILE_OPTIONS = -mips4 -LANG:pch -LANG:std -O2 \
diff -ruN xml-xerces/c/src/aclocal.m4 xml-xerces.freebsd/c/src/aclocal.m4
--- xml-xerces/c/src/aclocal.m4 Thu Jan  1 01:00:00 1970
+++ xml-xerces.freebsd/c/src/aclocal.m4 Sat Dec 25 08:41:28 1999
@@ -0,0 +1,25 @@
+dnl aclocal.m4 for xerces
+dnl Jonathan McDowell <[EMAIL PROTECTED]>
+
+dnl FreeBSD -pthread check - Jonathan McDowell <[EMAIL PROTECTED]>
+AC_DEFUN(AC_PTHREAD_FREEBSD,
+[AC_MSG_CHECKING([if we need -pthread for threads])
+AC_CACHE_VAL(ac_ldflag_pthread,
+[ac_save_LDFLAGS="$LDFLAGS"
+LDFLAGS="-pthread $LDFLAGS"
+AC_TRY_LINK(
+[
+char pthread_create();
+],
+pthread_create();,
+eval "ac_ldflag_pthread=yes",
+eval "ac_ldflag_pthread=no"),
+LIBS="$ac_save_LDFLAGS"
+])
+if eval "test \"`echo $ac_ldflag_pthread`\" = yes"; then
+       AC_MSG_RESULT(yes)
+else
+       AC_MSG_RESULT(no)
+fi
+])
+
diff -ruN xml-xerces/c/src/configure.in xml-xerces.freebsd/c/src/configure.in
--- xml-xerces/c/src/configure.in       Thu Dec 23 05:57:10 1999
+++ xml-xerces.freebsd/c/src/configure.in       Sat Dec 25 08:39:04 1999
@@ -11,6 +11,9 @@
 dnl Checks for libraries
 AC_CHECK_LIB(m, floor)
 
+dnl Do we need libcompat for ftime (FreeBSD does)
+AC_CHECK_LIB(compat, ftime)
+
 dnl
 dnl Do not know how to use this macro, so comment it out.
 dnl
@@ -21,6 +24,12 @@
 dnl fi
 dnl
 
+ldflags=${LDCFLAGS}
+AC_SUBST(ldflags)
+
+dnl Check if for FreeBSD threads
+AC_PTHREAD_FREEBSD
+
 dnl Checks for typedefs
 AC_CHECK_TYPE(XMLByte,unsigned char)
 
@@ -34,6 +43,7 @@
         *-*-UnixWare*)  platform=UNIXWARE ;;
         *-*-unixware*)  platform=UNIXWARE ;;
         *-*-linux*)     platform=LINUX ;;
+       *-*-freebsd*)   platform=FREEBSD ;;
         *-*-irix*)      platform=IRIX ;;
         *-*-aix*)       platform=AIX ;;
         *-*-hp*)        platform=HPUX ;
@@ -64,9 +74,6 @@
 
 cflags=${CFLAGS}
 AC_SUBST(cflags)
-
-ldflags=${LDCFLAGS}
-AC_SUBST(ldflags)
 
 libs=${LIBS}
 AC_SUBST(libs)
diff -ruN xml-xerces/c/src/runConfigure xml-xerces.freebsd/c/src/runConfigure
--- xml-xerces/c/src/runConfigure       Thu Dec 23 05:57:10 1999
+++ xml-xerces.freebsd/c/src/runConfigure       Sat Dec 25 08:41:28 1999
@@ -155,7 +155,7 @@
     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', 'irix', 'unixware')"
+    echo "       -p <platform> (accepts 'aix', 'linux', 'solaris', 'hp-10', 
'hp-11', 'irix', 'unixware', 'freebsd')"
     echo "       -c <C compiler name> (e.g. gcc, cc, xlc)"
     echo "       -x <C++ compiler name> (e.g. g++, CC, xlC)"
     echo "       -d (specifies that you want to build debug version)"
@@ -263,7 +263,7 @@
 #
 
 case $platform in
-   aix | linux | solaris | hp-10 | hp-11 | irix | unixware)
+   aix | linux | solaris | hp-10 | hp-11 | irix | unixware | freebsd)
        # platform has been recognized
        ;;
    *)
@@ -311,6 +311,8 @@
 elif test $platform = "hp-10"; then
     threadingLibs="-lcma"
     threadingDefines="-DXML_USE_DCE"
+elif test $platform = "freebsd"; then
+    threadingLibs=""
 fi
 
 
diff -ruN xml-xerces/c/src/util/AutoSense.hpp 
xml-xerces.freebsd/c/src/util/AutoSense.hpp
--- xml-xerces/c/src/util/AutoSense.hpp Thu Dec 23 05:57:26 1999
+++ xml-xerces.freebsd/c/src/util/AutoSense.hpp Sat Dec 25 08:40:59 1999
@@ -100,6 +100,9 @@
 #elif defined(__linux__)
     #define XML_LINUX
     #define XML_UNIX
+#elif defined(__FreeBSD__)
+    #define XML_FREEBSD
+    #define XML_UNIX
 #elif defined(IRIX)
     #define XML_IRIX
     #define XML_UNIX
@@ -173,7 +176,7 @@
     #define XML_MIPSPRO_CC
 #elif defined(XML_TANDEM)
     #define XML_TANDEMCC
-#elif defined(__linux__)
+#elif defined(__linux__) || defined(__FreeBSD__)
     #define XML_GCC
 #elif defined(__MVS__) && defined(__cplusplus)
     #define XML_MVSCPP
diff -ruN xml-xerces/c/src/util/Platforms/FreeBSD/FreeBSDDefs.hpp 
xml-xerces.freebsd/c/src/util/Platforms/FreeBSD/FreeBSDDefs.hpp
--- xml-xerces/c/src/util/Platforms/FreeBSD/FreeBSDDefs.hpp     Thu Jan  1 
01:00:00 1970
+++ xml-xerces.freebsd/c/src/util/Platforms/FreeBSD/FreeBSDDefs.hpp     Sat Dec 
25 08:41:28 1999
@@ -0,0 +1,65 @@
+/*
+ * The Apache Software License, Version 1.1
+ * 
+ * Copyright (c) 1999 The Apache Software Foundation.  All rights 
+ * reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ * 
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 
+ * 3. The end-user documentation included with the redistribution,
+ *    if any, must include the following acknowledgment:  
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowledgment may appear in the software itself,
+ *    if and wherever such third-party acknowledgments normally appear.
+ * 
+ * 4. The names "Xerces" and "Apache Software Foundation" must
+ *    not be used to endorse or promote products derived from this
+ *    software without prior written permission. For written 
+ *    permission, please contact [EMAIL PROTECTED]
+ * 
+ * 5. Products derived from this software may not be called "Apache",
+ *    nor may "Apache" appear in their name, without prior written
+ *    permission of the Apache Software Foundation.
+ * 
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ * 
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation, and was
+ * originally based on software copyright (c) 1999, International
+ * Business Machines, Inc., http://www.ibm.com .  For more information
+ * on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+// ---------------------------------------------------------------------------
+//  FreeBSD Runs in little endian mode
+// ---------------------------------------------------------------------------
+#define ENDIANMODE_LITTLE
+typedef void* FileHandle;
+
+#ifndef FREEBSD
+#define FREEBSD
+#endif
diff -ruN xml-xerces/c/src/util/Platforms/FreeBSD/FreeBSDPlatformUtils.cpp 
xml-xerces.freebsd/c/src/util/Platforms/FreeBSD/FreeBSDPlatformUtils.cpp
--- xml-xerces/c/src/util/Platforms/FreeBSD/FreeBSDPlatformUtils.cpp    Thu Jan 
 1 01:00:00 1970
+++ xml-xerces.freebsd/c/src/util/Platforms/FreeBSD/FreeBSDPlatformUtils.cpp    
Sat Dec 25 08:41:28 1999
@@ -0,0 +1,670 @@
+/*
+ * The Apache Software License, Version 1.1
+ * 
+ * Copyright (c) 1999 The Apache Software Foundation.  All rights 
+ * reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ * 
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 
+ * 3. The end-user documentation included with the redistribution,
+ *    if any, must include the following acknowledgment:  
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowledgment may appear in the software itself,
+ *    if and wherever such third-party acknowledgments normally appear.
+ * 
+ * 4. The names "Xerces" and "Apache Software Foundation" must
+ *    not be used to endorse or promote products derived from this
+ *    software without prior written permission. For written 
+ *    permission, please contact [EMAIL PROTECTED]
+ * 
+ * 5. Products derived from this software may not be called "Apache",
+ *    nor may "Apache" appear in their name, without prior written
+ *    permission of the Apache Software Foundation.
+ * 
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ * 
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation, and was
+ * originally based on software copyright (c) 1999, International
+ * Business Machines, Inc., http://www.ibm.com .  For more information
+ * on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+// ---------------------------------------------------------------------------
+//  Includes
+// ---------------------------------------------------------------------------
+
+#if !defined(APP_NO_THREADS)
+#include    <pthread.h>
+#endif
+
+#include    <unistd.h>
+#include    <stdio.h>
+#include    <stdlib.h>
+#include    <errno.h>
+// #include    <libgen.h>
+#include    <sys/types.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/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
+
+
+
+// ---------------------------------------------------------------------------
+//  Local Methods
+// ---------------------------------------------------------------------------
+
+static void WriteCharStr( FILE* stream, const char* const toWrite)
+{
+    if (fputs(toWrite, stream) == EOF)
+    {
+        ThrowXML(XMLPlatformUtilsException,
+                 XML4CExcepts::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,
+                XML4CExcepts::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,
+                 XML4CExcepts::Strm_StdOutWriteFailure);
+    }
+}
+
+XMLNetAccessor* XMLPlatformUtils::makeNetAccessor()
+{
+    return 0;
+}
+
+
+// -----------------------------------------------------------------------
+//  Standard out/error support
+// -----------------------------------------------------------------------
+
+void XMLPlatformUtils::writeToStdErr(const char* const toWrite)
+{
+    WriteCharStr(stderr, toWrite);
+}
+void XMLPlatformUtils::writeToStdErr(const XMLCh* const toWrite)
+{
+    WriteUStrStdErr(toWrite);
+}
+void XMLPlatformUtils::writeToStdOut(const XMLCh* const toWrite)
+{
+    WriteUStrStdOut(toWrite);
+}
+void XMLPlatformUtils::writeToStdOut(const char* const toWrite)
+{
+    WriteCharStr(stdout, toWrite);
+}
+
+
+// ---------------------------------------------------------------------------
+//  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();
+
+    // Here you would also set the fgLibLocation global variable
+    // XMLPlatformUtils::fgLibLocation is the variable to be set
+
+    static const char*  sharedLibEnvVar = "LD_LIBRARY_PATH";
+    char*               libraryPath = 0;
+    char                libName[256];
+
+    // Construct the library name from the global variables
+
+    strcpy(libName, XML4C_DLLName);
+    strcat(libName, gXML4CVersionStr);
+    strcat(libName, ".so");
+
+    char* libEnvVar = getenv(sharedLibEnvVar);
+    char* libPath = NULL;
+
+    if (libEnvVar == NULL)
+    {
+        panic(XMLPlatformUtils::Panic_CantFindLib);
+    }
+
+    //
+    // Its necessary to create a copy because strtok() modifies the
+    // string as it returns tokens. We don't want to modify the string
+    // returned to by getenv().
+    //
+
+    libPath = new char[strlen(libEnvVar) + 1];
+    strcpy(libPath, libEnvVar);
+
+
+    // First do the searching process for the first directory listing
+
+    char*  allPaths = libPath;
+    char*  libPathName;
+
+    while ((libPathName = strtok(allPaths, ":")) != NULL)
+    {
+        FILE*  dummyFptr = 0;
+        allPaths = 0;
+
+        char* libfile = new char[strlen(libPathName) + strlen(libName) + 2];
+        strcpy(libfile, libPathName);
+        strcat(libfile, "/");
+        strcat(libfile, libName);
+
+        dummyFptr = (FILE *) fopen(libfile, "rb");
+        delete [] libfile;
+        if (dummyFptr != NULL)
+        {
+            fclose(dummyFptr);
+            libraryPath = new char[strlen(libPathName)+1];
+            strcpy((char *) libraryPath, libPathName);
+            break;
+        }
+
+    } // while
+
+    delete libPath;
+
+    XMLPlatformUtils::fgLibLocation = libraryPath;
+
+    if (XMLPlatformUtils::fgLibLocation == NULL)
+    {
+        panic(XMLPlatformUtils::Panic_CantFindLib);
+    }
+}
+
+
+// ---------------------------------------------------------------------------
+//  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)
+    //
+    //  We need to figure out the path to the Intl converter files.
+    //
+
+    static const char * icuDataEnvVar   = "ICU_DATA";
+    char *              intlPath        = 0;
+
+    char* envVal = getenv(icuDataEnvVar);
+
+    // Check if environment variable is set...
+    if (envVal != NULL)
+    {
+        unsigned int pathLen = strlen(envVal);
+        intlPath = new char[pathLen + 2];
+
+        strcpy((char *) intlPath, envVal);
+        if (envVal[pathLen - 1] != '/')
+        {
+            strcat((char *) intlPath, "/");
+        }
+
+        ICUTransService::setICUPath(intlPath);
+        delete intlPath;
+
+        return new ICUTransService;
+    }
+
+    //
+    //  If the environment variable ICU_DATA is not set, assume that the
+    //  converter files are stored relative to the Xerces-C library.
+    //
+
+    unsigned int  lent = strlen(XMLPlatformUtils::fgLibLocation) +
+                         strlen("/icu/data/") + 1;
+    intlPath = new char[lent];
+    strcpy(intlPath, XMLPlatformUtils::fgLibLocation);
+    strcat(intlPath, "/icu/data/");
+
+    ICUTransService::setICUPath(intlPath);
+    delete intlPath;
+
+    return new ICUTransService;
+
+
+#else
+
+    // Use native transcoding services.
+    // same as -DXML_USE_INMEM_MESSAGELOADER
+    return new IconvTransService;
+
+#endif
+
+} // XMLPlatformUtils::makeTransService
+
+
+
+// ---------------------------------------------------------------------------
+//  XMLPlatformUtils: The panic method
+// ---------------------------------------------------------------------------
+void XMLPlatformUtils::panic(const PanicReasons reason)
+{
+    //
+    //  We just print a message and exit
+    //
+    
+    fprintf(stderr,
+        "The Xerces-C system could not be initialized.\n");
+    fprintf(stderr,
+        "If you are using ICU, then the most likely reason for this 
failure\n");
+    fprintf(stderr,
+        "is the inability to find the ICU coverter files. The converter 
files\n");
+    fprintf(stderr,
+        "have the extension .cnv and exist in a directory 'icu/data' 
relative\n");
+    fprintf(stderr,
+        "to the Xerces-C shared library. If you have installed the converter 
files\n");
+    fprintf(stderr,
+        "in a different location, you need to set up the environment 
variable\n");
+    fprintf(stderr,
+        "'ICU_DATA' to point directly to the directory containing the\n");
+    fprintf(stderr,
+        "converter files.\n");
+    
+    exit(-1);
+}
+
+
+// ---------------------------------------------------------------------------
+//  XMLPlatformUtils: File Methods
+// ---------------------------------------------------------------------------
+
+unsigned int XMLPlatformUtils::curFilePos(FileHandle theFile)
+{
+    int curPos = ftell( (FILE*)theFile);
+    if (curPos == -1)
+        ThrowXML(XMLPlatformUtilsException,
+                 XML4CExcepts::File_CouldNotGetSize);
+
+    return (unsigned int)curPos;
+}
+
+void XMLPlatformUtils::closeFile(FileHandle theFile)
+{
+    if (fclose((FILE*)theFile))
+        ThrowXML(XMLPlatformUtilsException,
+                 XML4CExcepts::File_CouldNotCloseFile);
+}
+
+unsigned int XMLPlatformUtils::fileSize(FileHandle theFile)
+{
+    // Get the current position
+    long  int curPos = ftell((FILE*) theFile);
+    if (curPos == -1)
+        ThrowXML(XMLPlatformUtilsException,
+                 XML4CExcepts::File_CouldNotGetCurPos);
+
+    // Seek to the end and save that value for return
+     if (fseek((FILE*) theFile, 0, SEEK_END))
+        ThrowXML(XMLPlatformUtilsException,
+                 XML4CExcepts::File_CouldNotSeekToEnd);
+
+    long int retVal = ftell((FILE*)theFile);
+    if (retVal == -1)
+        ThrowXML(XMLPlatformUtilsException,
+                 XML4CExcepts::File_CouldNotSeekToEnd);
+
+    // And put the pointer back
+
+    if (fseek( (FILE*)theFile, curPos, SEEK_SET) )
+        ThrowXML(XMLPlatformUtilsException,
+                 XML4CExcepts::File_CouldNotSeekToPos);
+
+    return (unsigned int)retVal;
+}
+
+FileHandle XMLPlatformUtils::openFile(const unsigned short* 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::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,
+                 XML4CExcepts::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,
+                 XML4CExcepts::File_CouldNotResetFile);
+}
+
+
+// ---------------------------------------------------------------------------
+//  XMLPlatformUtils: Timing Methods
+// ---------------------------------------------------------------------------
+
+unsigned long XMLPlatformUtils::getCurrentMillis()
+{
+    timeb aTime;
+    ftime(&aTime);
+    return (unsigned long)(aTime.time*1000 + aTime.millitm);
+
+}
+
+XMLCh* XMLPlatformUtils::getBasePath(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
+    // Note #1186: dirName() is not thread safe.
+    char* tmpPath = strdup(newSrc);
+    int curloc = strlen(tmpPath)-1;
+
+    while (curloc>=0 && tmpPath[curloc]!='/') curloc--;
+    if (tmpPath[curloc]=='/') tmpPath[curloc]=0;
+
+    if (!tmpPath)
+    {
+        ThrowXML(XMLPlatformUtilsException,
+                 XML4CExcepts::File_CouldNotGetBasePathName);
+    }
+
+    char* newXMLString = new char [strlen(tmpPath) +2];
+    ArrayJanitor<char> newJanitor(newXMLString);
+    strcpy(newXMLString, tmpPath);
+    strcat(newXMLString , "/");
+
+    // Return a copy of the path, in Unicode format
+    return XMLString::transcode(newXMLString);
+}
+
+
+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)
+
+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,
+                 XML4CExcepts::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,
+                     XML4CExcepts::Mutex_CouldNotDestroy);
+        }
+        delete mtxHandle;
+    }
+}
+
+
+void XMLPlatformUtils::lockMutex(void* const mtxHandle)
+{
+    if (mtxHandle != NULL)
+    {
+        if (pthread_mutex_lock((pthread_mutex_t*) mtxHandle))
+        {
+            ThrowXML(XMLPlatformUtilsException,
+                     XML4CExcepts::Mutex_CouldNotLock);
+        }
+    }
+}
+
+
+void XMLPlatformUtils::unlockMutex(void* const mtxHandle)
+{
+    if (mtxHandle != NULL)
+    {
+        if (pthread_mutex_unlock((pthread_mutex_t*) mtxHandle))
+        {
+            ThrowXML(XMLPlatformUtilsException,
+                     XML4CExcepts::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::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
+
diff -ruN xml-xerces/c/src/util/Platforms/Makefile.in 
xml-xerces.freebsd/c/src/util/Platforms/Makefile.in
--- xml-xerces/c/src/util/Platforms/Makefile.in Thu Dec 23 05:57:52 1999
+++ xml-xerces.freebsd/c/src/util/Platforms/Makefile.in Sat Dec 25 08:41:28 1999
@@ -119,6 +119,12 @@
     CPP_PUBHEADERS = Linux/LinuxDefs.hpp
     CPP_OBJECTS = Linux/LinuxPlatformUtils.o
 endif
+ifeq (${PLATFORM}, FREEBSD)
+    SUBMODULE = Platforms/FreeBSD
+    CXXFLAGS += -D__USE_UNIX98 -D__USE_GNU
+    CPP_PUBHEADERS = FreeBSD/FreeBSDDefs.hpp
+    CPP_OBJECTS = FreeBSD/FreeBSDPlatformUtils.o
+endif
 ifeq (${PLATFORM}, HPUX)
     SUBMODULE = Platforms/HPUX
     CPP_PUBHEADERS = HPUX/HPUXDefs.hpp
diff -ruN xml-xerces/c/src/util/XML4CDefs.hpp 
xml-xerces.freebsd/c/src/util/XML4CDefs.hpp
--- xml-xerces/c/src/util/XML4CDefs.hpp Thu Dec 23 05:57:28 1999
+++ xml-xerces.freebsd/c/src/util/XML4CDefs.hpp Sat Dec 25 08:41:28 1999
@@ -139,6 +139,10 @@
 #include    <util/Platforms/Linux/LinuxDefs.hpp>
 #endif
 
+#if defined(XML_FREEBSD)
+#include    <util/Platforms/FreeBSD/FreeBSDDefs.hpp>
+#endif
+
 #if defined(XML_OE390)
 #include    <util/Platforms/OS390/OE390Defs.hpp>
 #endif

Reply via email to