cygwinplatformutils.cpp

来自「IBM的解析xml的工具Xerces的源代码」· C++ 代码 · 共 572 行 · 第 1/2 页

CPP
572
字号
    return fopen( posix_name , "wb" );}FileHandle XMLPlatformUtils::openStdInHandle(MemoryManager* const manager){    return (FileHandle)fdopen(dup(0), "rb");}unsigned intXMLPlatformUtils::readFileBuffer( FileHandle          theFile                                , const unsigned int  toRead                                , XMLByte* const      toFill                                , MemoryManager* const manager){    size_t noOfItemsRead = fread((void*) toFill, 1, toRead, (FILE*)theFile);    if(ferror((FILE*)theFile))    {        ThrowXMLwithMemMgr(XMLPlatformUtilsException,                 XMLExcepts::File_CouldNotReadFromFile, manager);    }    return (unsigned int)noOfItemsRead;}voidXMLPlatformUtils::writeBufferToFile( FileHandle     const  theFile                                   , long                  toWrite                                   , const XMLByte* const  toFlush                                   , MemoryManager* const manager){    if (!theFile        ||        (toWrite <= 0 ) ||        !toFlush         )        return;    const XMLByte* tmpFlush = (const XMLByte*) toFlush;    size_t bytesWritten = 0;    while (true)    {        bytesWritten=fwrite(tmpFlush, sizeof(XMLByte), toWrite, (FILE*)theFile);        if(ferror((FILE*)theFile))        {            ThrowXMLwithMemMgr(XMLPlatformUtilsException, XMLExcepts::File_CouldNotWriteToFile, manager);        }        if (bytesWritten < toWrite) //incomplete write        {            tmpFlush+=bytesWritten;            toWrite-=bytesWritten;            bytesWritten=0;        }        else            return;    }    return;}void XMLPlatformUtils::resetFile(FileHandle theFile                                 , MemoryManager* const manager){    // Seek to the start of the file    if (fseek((FILE*)theFile, 0, SEEK_SET))        ThrowXMLwithMemMgr(XMLPlatformUtilsException,                 XMLExcepts::File_CouldNotResetFile, manager);}// ---------------------------------------------------------------------------//  XMLPlatformUtils: File system methods// ---------------------------------------------------------------------------XMLCh* XMLPlatformUtils::getFullPath(const XMLCh* const srcPath,                                     MemoryManager* const manager){    //    //  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, manager);    ArrayJanitor<char> janText(newSrc, manager);    // Use a local buffer that is big enough for the largest legal path	char posix_name[PATH_MAX + 1];    // get the absolute path    if (0 != cygwin_conv_to_full_posix_path(newSrc, posix_name))    {        ThrowXMLwithMemMgr(XMLPlatformUtilsException, XMLExcepts::File_CouldNotGetBasePathName, manager);    }    return XMLString::transcode(posix_name, manager);}bool XMLPlatformUtils::isRelative(const XMLCh* const toCheck                                  , MemoryManager* const manager){    // Check for pathological case of empty path    if (!toCheck[0])        return false;    //    //  If its starts with a drive, then it cannot be relative. Note that    //  we checked the drive not being empty above, so worst case its one    //  char long and the check of the 1st char will fail because its really    //  a null character.    //    if (toCheck[1] == chColon)    {        if (((toCheck[0] >= chLatin_A) && (toCheck[0] <= chLatin_Z))        ||  ((toCheck[0] >= chLatin_a) && (toCheck[0] <= chLatin_z)))        {            return false;        }    }    //    //  If it starts with a double slash, then it cannot be relative since    //  it's a remote file.    //    if (isBackSlash(toCheck[0]) && isBackSlash(toCheck[1]))        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;}XMLCh* XMLPlatformUtils::getCurrentDirectory(MemoryManager* const manager){    char  dirBuf[PATH_MAX + 2];    char  *curDir = getcwd(&dirBuf[0], PATH_MAX + 1);    if (!curDir)    {        ThrowXMLwithMemMgr(XMLPlatformUtilsException,                 XMLExcepts::File_CouldNotGetBasePathName, manager);    }    return XMLString::transcode(curDir, manager);}inline bool XMLPlatformUtils::isAnySlash(XMLCh c) {    return ( chBackSlash == c || chForwardSlash == c);}// ---------------------------------------------------------------------------//  XMLPlatformUtils: Timing Methods// ---------------------------------------------------------------------------unsigned long XMLPlatformUtils::getCurrentMillis(){    timeb aTime;    ftime(&aTime);    return (unsigned long)(aTime.time*1000 + aTime.millitm);}// -----------------------------------------------------------------------//  Mutex methods// -----------------------------------------------------------------------#if !defined(APP_NO_THREADS)// ---------------------------------------------------------------------------//  XMLPlatformUtils: Platform init method// ---------------------------------------------------------------------------void XMLPlatformUtils::platformInit(){}void* XMLPlatformUtils::makeMutex(){	CRITICAL_SECTION* newCS = new CRITICAL_SECTION;	::InitializeCriticalSection(newCS);	return newCS;}void XMLPlatformUtils::closeMutex(void* const mtxHandle){	::DeleteCriticalSection((LPCRITICAL_SECTION)mtxHandle);	delete (CRITICAL_SECTION*)mtxHandle;}void XMLPlatformUtils::lockMutex(void* const mtxHandle){	::EnterCriticalSection((LPCRITICAL_SECTION)mtxHandle);}void XMLPlatformUtils::unlockMutex(void* const mtxHandle){	::LeaveCriticalSection((LPCRITICAL_SECTION)mtxHandle);}void* XMLPlatformUtils::compareAndSwap (void**             toFill,                                        const void* const  newValue,                                        const void* const  toCompare){#if defined WIN64	return ::InterlockedCompareExchangePointer(toFill, (void*)newValue, (void*)toCompare);#else	//	//  Note we have to cast off the constness of some of these because	//  the system APIs are not C++ aware in all cases.	//	return (void*) ::InterlockedCompareExchange((LPLONG)toFill, (LONG)newValue,			(LONG)toCompare);#endif}int XMLPlatformUtils::atomicIncrement(int &location){    return ::InterlockedIncrement(&(long &)location);}int XMLPlatformUtils::atomicDecrement(int &location){    return ::InterlockedDecrement(&(long &)location);}#else // #if !defined (APP_NO_THREADS)void XMLPlatformUtils::platformInit(){}void* XMLPlatformUtils::makeMutex(){	return 0;}void XMLPlatformUtils::closeMutex(void* const mtxHandle){}void XMLPlatformUtils::lockMutex(void* const mtxHandle){}void XMLPlatformUtils::unlockMutex(void* const mtxHandle){}void* XMLPlatformUtils::compareAndSwap (void**             toFill,                                        const void* const  newValue,                                        const void* const  toCompare){	void *retVal = *toFill;	if (*toFill == toCompare)		*toFill = (void *)newValue;	return retVal;}int XMLPlatformUtils::atomicIncrement(int &location){	return ++location;}int XMLPlatformUtils::atomicDecrement(int &location){	return --location;}#endif // APP_NO_THREADSvoid XMLPlatformUtils::platformTerm(){}#include <xercesc/util/LogicalPath.c>XERCES_CPP_NAMESPACE_END

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?