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