OS2PlatformUtils.cpp
上传用户:zhuqijet
上传日期:2013-06-25
资源大小:10074k
文件大小:14k
源码类别:

词法分析

开发平台:

Visual C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 1999-2000 The Apache Software Foundation.  All rights
  5.  * reserved.
  6.  *
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  *
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  *
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in
  16.  *    the documentation and/or other materials provided with the
  17.  *    distribution.
  18.  *
  19.  * 3. The end-user documentation included with the redistribution,
  20.  *    if any, must include the following acknowledgment:
  21.  *       "This product includes software developed by the
  22.  *        Apache Software Foundation (http://www.apache.org/)."
  23.  *    Alternately, this acknowledgment may appear in the software itself,
  24.  *    if and wherever such third-party acknowledgments normally appear.
  25.  *
  26.  * 4. The names "Xerces" and "Apache Software Foundation" must
  27.  *    not be used to endorse or promote products derived from this
  28.  *    software without prior written permission. For written
  29.  *    permission, please contact apache@apache.org.
  30.  *
  31.  * 5. Products derived from this software may not be called "Apache",
  32.  *    nor may "Apache" appear in their name, without prior written
  33.  *    permission of the Apache Software Foundation.
  34.  *
  35.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47.  * ====================================================================
  48.  *
  49.  * This software consists of voluntary contributions made by many
  50.  * individuals on behalf of the Apache Software Foundation, and was
  51.  * originally based on software copyright (c) 1999, International
  52.  * Business Machines, Inc., http://www.ibm.com .  For more information
  53.  * on the Apache Software Foundation, please see
  54.  * <http://www.apache.org/>.
  55.  */
  56. /*
  57.  * $Id: OS2PlatformUtils.cpp,v 1.6 2003/05/15 18:37:48 knoaman Exp $
  58.  */
  59. // ---------------------------------------------------------------------------
  60. //  Includes
  61. // ---------------------------------------------------------------------------
  62. #define INCL_DOSSEMAPHORES
  63. #define INCL_DOSERRORS
  64. #define INCL_DOSMISC
  65. #define INCL_DOSFILEMGR
  66. #include    <xercesc/util/XercesDefs.hpp>
  67. #include    <xercesc/util/PlatformUtils.hpp>
  68. #include    <xercesc/util/RuntimeException.hpp>
  69. #include    <xercesc/util/Janitor.hpp>
  70. #include    <xercesc/util/XMLString.hpp>
  71. #include    <xercesc/util/XMLUniDefs.hpp>
  72. #include    <xercesc/util/PanicHandler.hpp>
  73. #include    <stdio.h>
  74. #include    <stdlib.h>
  75. #include    <io.h>
  76. #if defined(XML_USE_ICU_TRANSCODER)
  77.   #include  <xercesc/util/Transcoders/ICU/ICUTransService.hpp>
  78. #elif defined(XML_USE_ICONV_TRANSCODER)
  79.   #include  <xercesc/util/Transcoders/Iconv/IconvTransService.hpp>
  80. #else
  81.   #error A transcoding service must be chosen
  82. #endif
  83. #if defined(XML_USE_INMEMORY_MSGLOADER)
  84.   #include  <xercesc/util/MsgLoaders/InMemory/InMemMsgLoader.hpp>
  85. #else
  86.   #error A message loading service must be chosen
  87. #endif
  88. #if defined(XML_IBMVAOS2)
  89. #include    <builtin.h>
  90. #endif
  91. #include    <OS2.h>
  92. XERCES_CPP_NAMESPACE_BEGIN
  93. // ---------------------------------------------------------------------------
  94. //  XMLPlatformUtils: Platform init and term methods
  95. // ---------------------------------------------------------------------------
  96. void XMLPlatformUtils::platformInit()
  97. {
  98. }
  99. void XMLPlatformUtils::platformTerm()
  100. {
  101.     // We don't have any termination requirements at this time
  102. }
  103. // ---------------------------------------------------------------------------
  104. //  XMLPlatformUtils: File Methods
  105. // ---------------------------------------------------------------------------
  106. unsigned int XMLPlatformUtils::curFilePos(FileHandle theFile)
  107. {
  108.     // Get the current position
  109.     int curPos = ftell( (FILE*)theFile);
  110.     if (curPos == -1)
  111.         ThrowXML(XMLPlatformUtilsException, XMLExcepts::File_CouldNotGetCurPos);
  112.     return (unsigned int)curPos;
  113. }
  114. void XMLPlatformUtils::closeFile(FileHandle theFile)
  115. {
  116.     if (fclose((FILE*)theFile))
  117.         ThrowXML(XMLPlatformUtilsException, XMLExcepts::File_CouldNotCloseFile);
  118. }
  119. unsigned int XMLPlatformUtils::fileSize(FileHandle theFile)
  120. {
  121.     return (unsigned int)filelength(fileno((FILE *)theFile));
  122. }
  123. FileHandle XMLPlatformUtils::openFile(const char* const fileName)
  124. {
  125.     FileHandle retVal = (FILE*)fopen( fileName , "rb" );
  126.     if (retVal == NULL)
  127.         return 0;
  128.     return retVal;
  129. }
  130. FileHandle XMLPlatformUtils::openFile(const XMLCh* const fileName)
  131. {
  132.     const char* tmpFileName = XMLString::transcode(fileName, fgMemoryManager);
  133.     ArrayJanitor<char> janText((char*)tmpFileName, fgMemoryManager);
  134.     FileHandle retVal = (FILE*)fopen( tmpFileName , "rb" );
  135.     if (retVal == NULL)
  136.         return 0;
  137.     return retVal;
  138. }
  139. FileHandle XMLPlatformUtils::openStdInHandle()
  140. {
  141.     return (FileHandle)fdopen(dup(0), "rb");
  142. }
  143. unsigned int XMLPlatformUtils::readFileBuffer ( FileHandle      theFile
  144.                             , const unsigned int    toRead
  145.                             ,       XMLByte* const  toFill )
  146. {
  147.     size_t noOfItemsRead = fread( (void*) toFill, 1, toRead, (FILE*)theFile);
  148.     if(ferror((FILE*)theFile))
  149.     {
  150.         ThrowXML(XMLPlatformUtilsException, XMLExcepts::File_CouldNotReadFromFile);
  151.     }
  152.     return (unsigned int)noOfItemsRead;
  153. }
  154. void XMLPlatformUtils::resetFile(FileHandle theFile)
  155. {
  156.     // Seek to the start of the file
  157.     if (fseek((FILE*)theFile, 0, SEEK_SET) )
  158.         ThrowXML(XMLPlatformUtilsException, XMLExcepts::File_CouldNotResetFile);
  159. }
  160. // -----------------------------------------------------------------------
  161. //  File system methods
  162. // -----------------------------------------------------------------------
  163. XMLCh* XMLPlatformUtils::getFullPath(const XMLCh* const srcPath,
  164.                                      MemoryManager* const manager)
  165. {
  166.     // Transcode the incoming string
  167.     char* tmpSrcPath = XMLString::transcode(srcPath, fgMemoryManager);
  168.     ArrayJanitor<char> janSrcPath(tmpSrcPath, fgMemoryManager);
  169.     char tmpPath[CCHMAXPATH];
  170.     _fullpath(tmpPath, tmpSrcPath, CCHMAXPATH);
  171.     return XMLString::transcode(tmpPath, manager);
  172. }
  173. bool XMLPlatformUtils::isRelative(const XMLCh* const toCheck)
  174. {
  175.     // Check for pathological case of an empty path
  176.     if (!toCheck[0])
  177.         return false;
  178.     //
  179.     //  If it starts with a drive, then it cannot be relative. Note that
  180.     //  we checked the drive not being empty above, so worst case it's one
  181.     //  char long and the check of the 1st char will fail because it's really
  182.     //  a null character.
  183.     //
  184.     if (toCheck[1] == chColon)
  185.     {
  186.         if (((toCheck[0] >= chLatin_A) && (toCheck[0] <= chLatin_Z))
  187.         ||  ((toCheck[0] >= chLatin_a) && (toCheck[0] <= chLatin_z)))
  188.         {
  189.             return false;
  190.         }
  191.     }
  192.     //
  193.     //  If it starts with a double slash, then it cannot be relative since
  194.     //  its a remote file.
  195.     //
  196.     if ((toCheck[0] == chBackSlash) && (toCheck[1] == chBackSlash))
  197.         return false;
  198.     // Else assume its a relative path
  199.     return true;
  200. }
  201. XMLCh* XMLPlatformUtils::getCurrentDirectory(MemoryManager* const manager)
  202. {
  203.     /*** 
  204.      *  REVISIT:
  205.      * 
  206.      *   To be implemented later
  207.     ***/
  208.     XMLCh curDir[]={ chPeriod, chForwardSlash, chNull};
  209.     return getFullPath(curDir, manager);
  210. }
  211. inline bool XMLPlatformUtils::isAnySlash(XMLCh c) 
  212. {
  213.     return ( chBackSlash == c || chForwardSlash == c);
  214. }
  215. // -----------------------------------------------------------------------
  216. //  Timing methods
  217. // -----------------------------------------------------------------------
  218. unsigned long XMLPlatformUtils::getCurrentMillis()
  219. {
  220.     APIRET  retr;
  221.     ULONG   timerBuf = 0;
  222.     retr =  DosQuerySysInfo( QSV_MS_COUNT, QSV_MS_COUNT, (PVOID) &timerBuf,
  223.                              sizeof( ULONG ) );
  224. //  if ( retr != NO_ERROR )
  225. //     return (timerBuf);
  226.     return (timerBuf);
  227. }
  228. // -----------------------------------------------------------------------
  229. //  Mutex methods
  230. // -----------------------------------------------------------------------
  231. void XMLPlatformUtils::closeMutex(void* const mtxHandle)
  232. {
  233. #if ! defined(APP_NO_THREADS)
  234.     if (mtxHandle == NULL)
  235.       return;
  236.     if (DosCloseMutexSem( (HMTX)mtxHandle))
  237.     {
  238.       ThrowXML(XMLPlatformUtilsException, XMLExcepts::Mutex_CouldNotDestroy);
  239.     }
  240. #endif
  241. }
  242. void XMLPlatformUtils::lockMutex(void* const mtxHandle)
  243. {
  244. #if ! defined(APP_NO_THREADS)
  245.     if (mtxHandle == NULL)
  246.       return;
  247.     if (DosRequestMutexSem( (HMTX)mtxHandle,(ULONG) SEM_INDEFINITE_WAIT) )
  248.     {
  249.       ThrowXML(XMLPlatformUtilsException, XMLExcepts::Mutex_CouldNotLock);
  250.     }
  251. #endif
  252. }
  253. void* XMLPlatformUtils::makeMutex()
  254. {
  255. #if ! defined(APP_NO_THREADS)
  256.     HMTX hRet; // Mutex Handle
  257.     if (DosCreateMutexSem(NULL, &hRet, 0, FALSE))
  258.         ThrowXML(XMLPlatformUtilsException, XMLExcepts::Mutex_CouldNotCreate);
  259.     return (void*)hRet;
  260. #else
  261.     return 0;
  262. #endif
  263. }
  264. void XMLPlatformUtils::unlockMutex(void* const mtxHandle)
  265. {
  266. #if ! defined(APP_NO_THREADS)
  267.     if (mtxHandle == NULL)
  268.        return;
  269.     if (DosReleaseMutexSem( (HMTX)mtxHandle))
  270.     {
  271.       ThrowXML(XMLPlatformUtilsException, XMLExcepts::Mutex_CouldNotUnlock);
  272.     }
  273. #endif
  274. }
  275. // -----------------------------------------------------------------------
  276. //  Miscellaneous synchronization methods
  277. // -----------------------------------------------------------------------
  278. void* XMLPlatformUtils::compareAndSwap ( void**      toFill
  279.                                        , const void* const newValue
  280.                                        , const void* const toCompare )
  281. {
  282. #if defined(XML_IBMVA4_OS2)
  283.     return (void *)__smp_cmpxchg4((unsigned int *)toFill,
  284.                                   (unsigned int)newValue,
  285.                                   (unsigned int)toCompare);
  286. #elif defined(__GNUG__)
  287.     char ret;
  288.     long int readval;
  289.     long int * p    = (long **)toFill;
  290.     __asm__ __volatile__ ("lock; cmpxchgl %3, %1ntsete %0"
  291.                           : "=q" (ret), "=m" (*p), "=a" (readval)
  292.                           : "r" (newValue), "m" (*p), "a" (toCompare)
  293.                           : "memory");
  294.     return (void *)(long)ret;
  295. #else
  296.     void * retVal = *toFill;
  297.     if (*toFill == toCompare)
  298.       *toFill = (void *)newValue;
  299.     return retVal;
  300. #endif
  301. }
  302. // -----------------------------------------------------------------------
  303. //  Atomic Increment and Decrement
  304. //
  305. //  The function return value is positive if the result of the operation
  306. //  was positive. Zero if the result of the operation was zero. Negative
  307. //  if the result of the operation was negative. Except for the zero
  308. //  case, the value returned may differ from the actual result of the
  309. //  operation - only the sign and zero/nonzero state is guaranteed to be
  310. //  correct.
  311. // -----------------------------------------------------------------------
  312. int XMLPlatformUtils::atomicIncrement(int& location)
  313. {
  314. #if defined(XML_IBMVA4_OS2)
  315.     return __smp_inc4(&location);
  316. #elif defined(__GNUG__)
  317.     __asm__ __volatile__ ("lock; incl %0" : "=m" (location) : );
  318.     return location;
  319. #else
  320.     return ++location;
  321. #endif
  322. }
  323. int XMLPlatformUtils::atomicDecrement(int& location)
  324. {
  325. #if defined(XML_IBMVA4_OS2)
  326.     return __smp_dec4(&location);
  327. #elif defined(__GNUG__)
  328.     __asm__ __volatile__ ("lock; decl %0" : "=m" (location) : );
  329.     return location;
  330. #else
  331.     return --location;
  332. #endif
  333. }
  334. // ---------------------------------------------------------------------------
  335. //  XMLPlatformUtils: The panic method
  336. // ---------------------------------------------------------------------------
  337. void XMLPlatformUtils::panic(const PanicHandler::PanicReasons reason)
  338. {
  339.     fgUserPanicHandler? fgUserPanicHandler->panic(reason) : fgDefaultPanicHandler->panic(reason);
  340. }
  341. // -----------------------------------------------------------------------
  342. //  Private static methods. These are provided by the per-platform
  343. //  implementation files.
  344. // -----------------------------------------------------------------------
  345. XMLMsgLoader* XMLPlatformUtils::loadAMsgSet(const XMLCh* const msgDomain)
  346. {
  347. #if defined(XML_USE_INMEMORY_MSGLOADER)
  348.     return new InMemMsgLoader(msgDomain);
  349. #else
  350.     return 0;
  351. #endif
  352. }
  353. XMLNetAccessor* XMLPlatformUtils::makeNetAccessor()
  354. {
  355.   return 0;
  356. }
  357. XMLTransService* XMLPlatformUtils::makeTransService()
  358. {
  359. #if defined(XML_USE_ICU_TRANSCODER)
  360.     return new ICUTransService;
  361. #elif defined(XML_USE_ICONV_TRANSCODER)
  362.     return new IconvTransService;
  363. #else
  364.     return 0;
  365. #endif
  366. }
  367. #include <xercesc/util/LogicalPath.c>
  368. XERCES_CPP_NAMESPACE_END