1ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved. 2ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 3ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// found in the LICENSE file. 4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 5ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <algorithm> 8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fgas/src/fgas_base.h" 10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || \ 11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann _FX_OS_ == _FX_WIN64_ 12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <io.h> 13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#elif _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_LINUX_Mini_ 14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <sys/times.h> 15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif 16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef __cplusplus 17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannextern "C" { 18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif 19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FLOAT FX_tan(FX_FLOAT a) { 20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return (FX_FLOAT)tan(a); 21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FLOAT FX_log(FX_FLOAT b, FX_FLOAT x) { 23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FXSYS_log(x) / FXSYS_log(b); 24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_WCHAR* FX_wcsncpy(FX_WCHAR* dstStr, const FX_WCHAR* srcStr, size_t count) { 26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(dstStr != NULL && srcStr != NULL && count > 0); 27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (size_t i = 0; i < count; ++i) 28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((dstStr[i] = srcStr[i]) == L'\0') { 29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return dstStr; 32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t FX_wcsnicmp(const FX_WCHAR* s1, const FX_WCHAR* s2, size_t count) { 34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(s1 != NULL && s2 != NULL && count > 0); 35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_WCHAR wch1 = 0, wch2 = 0; 36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (count-- > 0) { 37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann wch1 = (FX_WCHAR)FX_tolower(*s1++); 38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann wch2 = (FX_WCHAR)FX_tolower(*s2++); 39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (wch1 != wch2) { 40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return wch1 - wch2; 44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t FX_strnicmp(const FX_CHAR* s1, const FX_CHAR* s2, size_t count) { 46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(s1 != NULL && s2 != NULL && count > 0); 47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_CHAR ch1 = 0, ch2 = 0; 48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (count-- > 0) { 49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ch1 = (FX_CHAR)FX_tolower(*s1++); 50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ch2 = (FX_CHAR)FX_tolower(*s2++); 51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (ch1 != ch2) { 52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return ch1 - ch2; 56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t FX_filelength(FXSYS_FILE* file) { 58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(file != NULL); 59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_ 60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return _filelength(_fileno(file)); 61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else 62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iPos = FXSYS_ftell(file); 63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_fseek(file, 0, FXSYS_SEEK_END); 64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iLen = FXSYS_ftell(file); 65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_fseek(file, iPos, FXSYS_SEEK_SET); 66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return iLen; 67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif 68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL FX_fsetsize(FXSYS_FILE* file, int32_t size) { 70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(file != NULL); 71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_ 72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return _chsize(_fileno(file), size) == 0; 73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#elif _FX_OS_ == _FX_WIN32_MOBILE_ 74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann HANDLE hFile = _fileno(file); 75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD dwPos = ::SetFilePointer(hFile, 0, 0, FILE_CURRENT); 76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ::SetFilePointer(hFile, size, 0, FILE_BEGIN); 77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bRet = ::SetEndOfFile(hFile); 78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ::SetFilePointer(hFile, (int32_t)dwPos, 0, FILE_BEGIN); 79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return bRet; 80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else 81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif 83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FLOAT FX_strtof(const FX_CHAR* pcsStr, int32_t iLength, int32_t* pUsedLen) { 85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pcsStr != NULL); 86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iLength < 0) { 87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iLength = FXSYS_strlen(pcsStr); 88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FX_wcstof(CFX_WideString::FromLocal(pcsStr, iLength), iLength, 90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pUsedLen); 91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FLOAT FX_wcstof(const FX_WCHAR* pwsStr, int32_t iLength, int32_t* pUsedLen) { 93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pwsStr != NULL); 94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iLength < 0) { 95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iLength = FXSYS_wcslen(pwsStr); 96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iLength == 0) { 98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0.0f; 99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iUsedLen = 0; 101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL bNegtive = FALSE; 102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann switch (pwsStr[iUsedLen]) { 103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case '-': 104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bNegtive = TRUE; 105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case '+': 106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iUsedLen++; 107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT fValue = 0.0f; 110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (iUsedLen < iLength) { 111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_WCHAR wch = pwsStr[iUsedLen]; 112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (wch >= L'0' && wch <= L'9') { 113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann fValue = fValue * 10.0f + (wch - L'0'); 114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann iUsedLen++; 118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iUsedLen < iLength && pwsStr[iUsedLen] == L'.') { 120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_FLOAT fPrecise = 0.1f; 121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (++iUsedLen < iLength) { 122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_WCHAR wch = pwsStr[iUsedLen]; 123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (wch >= L'0' && wch <= L'9') { 124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann fValue += (wch - L'0') * fPrecise; 125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann fPrecise *= 0.1f; 126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pUsedLen) { 132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *pUsedLen = iUsedLen; 133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return bNegtive ? -fValue : fValue; 135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid FX_memset(void* pBuf, int32_t iValue, size_t size) { 137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pBuf != NULL && size > 0 && (size & 0x03) == 0); 138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert((((size_t)pBuf) & 0x03) == 0); 139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD* pStart = (FX_DWORD*)pBuf; 140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD* pEnd = pStart + (size >> 2); 141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (pStart < pEnd) { 142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *pStart++ = iValue; 143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid FX_memcpy(void* pDst, const void* pSrc, size_t size) { 146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert(pDst != NULL && pSrc != NULL && size > 0 && (size & 0x03) == 0); 147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_assert((((size_t)pDst) & 0x03) == 0 && (((size_t)pSrc) & 0x03) == 0); 148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD* pStart = (FX_DWORD*)pDst; 149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD* pEnd = pStart + (size >> 2); 150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_DWORD* pValue = (FX_DWORD*)pSrc; 151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (pStart < pEnd) { 152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *pStart++ = *pValue++; 153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL FX_IsRelativePath(const CFX_WideStringC& wsUrl) { 156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t iUrlLen = wsUrl.GetLength(); 157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (iUrlLen == 0) { 158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (int32_t i = std::min(5, iUrlLen) - 1; i >= 0; --i) 161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (wsUrl.GetAt(i) == ':') { 162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL FX_JoinPath(const CFX_WideStringC& wsBasePath, 167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const CFX_WideStringC& wsRelativePath, 168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString& wsAbsolutePath) { 169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!FX_IsRelativePath(wsRelativePath)) { 170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann wsAbsolutePath = wsRelativePath; 171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FX_WCHAR* pRelStart = wsRelativePath.GetPtr(); 174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FX_WCHAR* pRelEnd = pRelStart + wsRelativePath.GetLength(); 175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pRelStart < pRelEnd) { 176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann switch (*pRelStart) { 177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case '#': 178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann wsAbsolutePath = CFX_WideString(wsBasePath, wsRelativePath); 179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return wsAbsolutePath.GetLength() > 0; 180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case '/': 181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case '\\': 182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann wsAbsolutePath = wsRelativePath; 183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return wsAbsolutePath.GetLength() > 0; 184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t nBackCount = 0; 187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for (;;) { 188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pRelStart >= pRelEnd) { 189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann wsAbsolutePath = wsBasePath; 190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return TRUE; 191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (*pRelStart != '.') { 193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pRelStart + 1 < pRelEnd && 196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (pRelStart[1] == '/' || pRelStart[1] == '\\')) { 197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pRelStart += 2; 198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (pRelStart + 2 < pRelEnd && pRelStart[1] == '.' && 199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (pRelStart[2] == '/' || pRelStart[2] == '\\')) { 200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann pRelStart += 3; 201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann nBackCount++; 202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else { 203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FX_WCHAR* pBaseStart = wsBasePath.GetPtr(); 207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann const FX_WCHAR* pBaseEnd = pBaseStart + wsBasePath.GetLength(); 208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (pBaseStart < (--pBaseEnd) && *pBaseEnd != '/' && *pBaseEnd != '\\') 209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ; 210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pBaseStart == pBaseEnd) { 211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann wsAbsolutePath = CFX_WideStringC(pRelStart, pRelEnd - pRelStart); 212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return wsAbsolutePath.GetLength() > 0; 213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann while (nBackCount > 0) { 215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (pBaseStart >= (--pBaseEnd)) { 216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return FALSE; 217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } else if (*pBaseEnd == '/' || *pBaseEnd == '\\') 218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ((--nBackCount) <= 0) { 219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann break; 220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann wsAbsolutePath = 223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString(CFX_WideStringC(pBaseStart, pBaseEnd - pBaseStart + 1), 224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideStringC(pRelStart, pRelEnd - pRelStart)); 225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return wsAbsolutePath.GetLength() > 0; 226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef __cplusplus 228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}; 229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif 230