// Copyright 2014 PDFium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #include "xfa/fgas/crt/fgas_system.h" #include #include "core/include/fxcrt/fx_system.h" #if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || \ _FX_OS_ == _FX_WIN64_ #include #elif _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_LINUX_Mini_ #include #endif namespace { inline FX_BOOL FX_isupper(int32_t ch) { return ch >= 'A' && ch <= 'Z'; } inline int32_t FX_tolower(int32_t ch) { return FX_isupper(ch) ? (ch + 0x20) : ch; } } // namespace int32_t FX_wcsnicmp(const FX_WCHAR* s1, const FX_WCHAR* s2, size_t count) { FXSYS_assert(s1 != NULL && s2 != NULL && count > 0); FX_WCHAR wch1 = 0, wch2 = 0; while (count-- > 0) { wch1 = (FX_WCHAR)FX_tolower(*s1++); wch2 = (FX_WCHAR)FX_tolower(*s2++); if (wch1 != wch2) { break; } } return wch1 - wch2; } int32_t FX_filelength(FXSYS_FILE* file) { FXSYS_assert(file != NULL); #if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_ return _filelength(_fileno(file)); #else int32_t iPos = FXSYS_ftell(file); FXSYS_fseek(file, 0, FXSYS_SEEK_END); int32_t iLen = FXSYS_ftell(file); FXSYS_fseek(file, iPos, FXSYS_SEEK_SET); return iLen; #endif } FX_BOOL FX_fsetsize(FXSYS_FILE* file, int32_t size) { FXSYS_assert(file != NULL); #if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_ return _chsize(_fileno(file), size) == 0; #elif _FX_OS_ == _FX_WIN32_MOBILE_ HANDLE hFile = _fileno(file); FX_DWORD dwPos = ::SetFilePointer(hFile, 0, 0, FILE_CURRENT); ::SetFilePointer(hFile, size, 0, FILE_BEGIN); FX_BOOL bRet = ::SetEndOfFile(hFile); ::SetFilePointer(hFile, (int32_t)dwPos, 0, FILE_BEGIN); return bRet; #else return FALSE; #endif } FX_FLOAT FX_wcstof(const FX_WCHAR* pwsStr, int32_t iLength, int32_t* pUsedLen) { FXSYS_assert(pwsStr != NULL); if (iLength < 0) { iLength = FXSYS_wcslen(pwsStr); } if (iLength == 0) { return 0.0f; } int32_t iUsedLen = 0; FX_BOOL bNegtive = FALSE; switch (pwsStr[iUsedLen]) { case '-': bNegtive = TRUE; case '+': iUsedLen++; break; } FX_FLOAT fValue = 0.0f; while (iUsedLen < iLength) { FX_WCHAR wch = pwsStr[iUsedLen]; if (wch >= L'0' && wch <= L'9') { fValue = fValue * 10.0f + (wch - L'0'); } else { break; } iUsedLen++; } if (iUsedLen < iLength && pwsStr[iUsedLen] == L'.') { FX_FLOAT fPrecise = 0.1f; while (++iUsedLen < iLength) { FX_WCHAR wch = pwsStr[iUsedLen]; if (wch >= L'0' && wch <= L'9') { fValue += (wch - L'0') * fPrecise; fPrecise *= 0.1f; } else { break; } } } if (pUsedLen) { *pUsedLen = iUsedLen; } return bNegtive ? -fValue : fValue; }