// 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

#ifndef _FX_SYSTEM
#define _FX_SYSTEM
#ifdef __cplusplus
extern "C" {
#endif
#define FX_RAD2DEG(r) ((r)*180.0f / FX_PI)
#define FX_DEG2RAD(a) ((a)*FX_PI / 180.0f)
typedef int8_t* FX_LPINT8;
typedef int8_t const* FX_LPCINT8;
typedef int32_t* FX_LPINT32;
typedef int32_t const* FX_LPCINT32;
typedef long FX_LONG;
typedef FX_LONG* FX_LPLONG;
typedef FX_LONG const* FX_LPCLONG;
typedef FX_FLOAT const* FX_LPCFLOAT;
typedef double FX_DOUBLE;
typedef FX_DOUBLE* FX_LPDOUBLE;
typedef FX_DOUBLE const* FX_LPCDOUBLE;
FX_FLOAT FX_tan(FX_FLOAT a);
FX_FLOAT FX_log(FX_FLOAT b, FX_FLOAT x);
FX_FLOAT FX_strtof(const FX_CHAR* pcsStr,
                   int32_t iLength = -1,
                   int32_t* pUsedLen = NULL);
FX_FLOAT FX_wcstof(const FX_WCHAR* pwsStr,
                   int32_t iLength = -1,
                   int32_t* pUsedLen = NULL);
FX_WCHAR* FX_wcsncpy(FX_WCHAR* dstStr, const FX_WCHAR* srcStr, size_t count);
int32_t FX_wcsnicmp(const FX_WCHAR* s1, const FX_WCHAR* s2, size_t count);
int32_t FX_strnicmp(const FX_CHAR* s1, const FX_CHAR* s2, size_t count);
inline FX_BOOL FX_islower(int32_t ch) {
  return ch >= 'a' && ch <= 'z';
}
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;
}
inline int32_t FX_toupper(int32_t ch) {
  return FX_islower(ch) ? (ch - 0x20) : ch;
}
int32_t FX_filelength(FXSYS_FILE* file);
FX_BOOL FX_fsetsize(FXSYS_FILE* file, int32_t size);
void FX_memset(void* pBuf, int32_t iValue, size_t size);
void FX_memcpy(void* pDst, const void* pSrc, size_t size);
FX_BOOL FX_IsRelativePath(const CFX_WideStringC& wsPath);
FX_BOOL FX_JoinPath(const CFX_WideStringC& wsBasePath,
                    const CFX_WideStringC& wsRelativePath,
                    CFX_WideString& wsAbsolutePath);
typedef struct _FX_VERSION {
  FX_DWORD dwMajorVersion;
  FX_DWORD dwMinorVersion;
  FX_DWORD dwBuildVersion;
} FX_VERSION, *FX_LPVERSION;
typedef FX_VERSION const* FX_LPCVERSION;
#ifdef __cplusplus
};
#endif
#endif
