blob: 3ab39268efdf98d6c76498adb85bb348fcbdfee9 [file] [log] [blame]
// 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 <algorithm>
#include "core/fxcrt/include/fx_system.h"
#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || \
_FX_OS_ == _FX_WIN64_
#include <io.h>
#elif _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_LINUX_Mini_
#include <sys/times.h>
#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) {
ASSERT(s1 != NULL && s2 != NULL && count > 0);
FX_WCHAR wch1 = 0;
FX_WCHAR 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) {
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) {
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);
uint32_t 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) {
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;
}