diff --git a/core/fpdfapi/edit/cpdf_creator.cpp b/core/fpdfapi/edit/cpdf_creator.cpp
index 7c56777..5f209a6 100644
--- a/core/fpdfapi/edit/cpdf_creator.cpp
+++ b/core/fpdfapi/edit/cpdf_creator.cpp
@@ -102,7 +102,7 @@
 bool CFX_FileBufferArchive::WriteDWord(uint32_t i) {
   char buf[32];
   FXSYS_itoa(i, buf, 10);
-  return WriteBlock(buf, static_cast<size_t>(FXSYS_strlen(buf)));
+  return WriteBlock(buf, static_cast<size_t>(strlen(buf)));
 }
 
 bool CFX_FileBufferArchive::WriteString(const ByteStringView& str) {
@@ -687,7 +687,7 @@
       char offset_buf[20];
       memset(offset_buf, 0, sizeof(offset_buf));
       FXSYS_i64toa(prev, offset_buf, 10);
-      if (!m_Archive->WriteBlock(offset_buf, FXSYS_strlen(offset_buf)))
+      if (!m_Archive->WriteBlock(offset_buf, strlen(offset_buf)))
         return -1;
     }
   }
@@ -749,7 +749,7 @@
   char offset_buf[20];
   memset(offset_buf, 0, sizeof(offset_buf));
   FXSYS_i64toa(m_XrefStart, offset_buf, 10);
-  if (!m_Archive->WriteBlock(offset_buf, FXSYS_strlen(offset_buf)) ||
+  if (!m_Archive->WriteBlock(offset_buf, strlen(offset_buf)) ||
       !m_Archive->WriteString("\r\n%%EOF\r\n")) {
     return -1;
   }
diff --git a/core/fpdfapi/parser/fpdf_parser_decode.cpp b/core/fpdfapi/parser/fpdf_parser_decode.cpp
index 228c012..7ad6c01 100644
--- a/core/fpdfapi/parser/fpdf_parser_decode.cpp
+++ b/core/fpdfapi/parser/fpdf_parser_decode.cpp
@@ -465,7 +465,7 @@
 
 ByteString PDF_EncodeText(const wchar_t* pString, int len) {
   if (len == -1)
-    len = FXSYS_wcslen(pString);
+    len = wcslen(pString);
 
   ByteString result;
   char* dest_buf1 = result.GetBuffer(len);
diff --git a/core/fpdftext/cpdf_textpagefind.cpp b/core/fpdftext/cpdf_textpagefind.cpp
index 9f9be20..a874521 100644
--- a/core/fpdftext/cpdf_textpagefind.cpp
+++ b/core/fpdftext/cpdf_textpagefind.cpp
@@ -376,8 +376,8 @@
       lpszFullString++;
   }
   const wchar_t* lpchEnd = std::wcschr(lpszFullString, chSep);
-  int nLen = lpchEnd ? (int)(lpchEnd - lpszFullString)
-                     : (int)FXSYS_wcslen(lpszFullString);
+  int nLen =
+      lpchEnd ? (int)(lpchEnd - lpszFullString) : (int)wcslen(lpszFullString);
   ASSERT(nLen >= 0);
   memcpy(rString.GetBuffer(nLen), lpszFullString, nLen * sizeof(wchar_t));
   rString.ReleaseBuffer(rString.GetStringLength());
diff --git a/core/fxcodec/codec/ccodec_pngmodule.cpp b/core/fxcodec/codec/ccodec_pngmodule.cpp
index d500745..0531ff1 100644
--- a/core/fxcodec/codec/ccodec_pngmodule.cpp
+++ b/core/fxcodec/codec/ccodec_pngmodule.cpp
@@ -80,11 +80,11 @@
     png_textp text = nullptr;
     png_get_text(png_ptr, info_ptr, &text, &num_text);
     for (i = 0; i < num_text; i++) {
-      len = FXSYS_strlen(text[i].key);
+      len = strlen(text[i].key);
       buf = "Time";
-      if (memcmp(buf, text[i].key, std::min(len, FXSYS_strlen(buf)))) {
+      if (memcmp(buf, text[i].key, std::min(len, strlen(buf)))) {
         buf = "Author";
-        if (!memcmp(buf, text[i].key, std::min(len, FXSYS_strlen(buf)))) {
+        if (!memcmp(buf, text[i].key, std::min(len, strlen(buf)))) {
           pAttribute->m_strAuthor =
               text[i].text_length > 0
                   ? ByteString(reinterpret_cast<uint8_t*>(text[i].text),
diff --git a/core/fxcodec/codec/ccodec_tiffmodule.cpp b/core/fxcodec/codec/ccodec_tiffmodule.cpp
index f11c480..0fcd9f3 100644
--- a/core/fxcodec/codec/ccodec_tiffmodule.cpp
+++ b/core/fxcodec/codec/ccodec_tiffmodule.cpp
@@ -201,7 +201,7 @@
   TIFFGetField(tif_ctx, tag, &buf);
   if (!buf)
     return;
-  size_t size = FXSYS_strlen(buf);
+  size_t size = strlen(buf);
   uint8_t* ptr = FX_Alloc(uint8_t, size + 1);
   memcpy(ptr, buf, size);
   ptr[size] = 0;
diff --git a/core/fxcrt/bytestring.cpp b/core/fxcrt/bytestring.cpp
index 3079eb7..37121a7 100644
--- a/core/fxcrt/bytestring.cpp
+++ b/core/fxcrt/bytestring.cpp
@@ -116,7 +116,7 @@
 }
 
 ByteString::ByteString(const char* ptr)
-    : ByteString(ptr, ptr ? FXSYS_strlen(ptr) : 0) {}
+    : ByteString(ptr, ptr ? strlen(ptr) : 0) {}
 
 ByteString::ByteString(const ByteStringView& stringSrc) {
   if (!stringSrc.IsEmpty())
@@ -169,7 +169,7 @@
   if (!pStr || !pStr[0])
     clear();
   else
-    AssignCopy(pStr, FXSYS_strlen(pStr));
+    AssignCopy(pStr, strlen(pStr));
 
   return *this;
 }
@@ -192,7 +192,7 @@
 
 const ByteString& ByteString::operator+=(const char* pStr) {
   if (pStr)
-    Concat(pStr, FXSYS_strlen(pStr));
+    Concat(pStr, strlen(pStr));
 
   return *this;
 }
@@ -223,7 +223,7 @@
   if (!ptr)
     return m_pData->m_nDataLength == 0;
 
-  return FXSYS_strlen(ptr) == m_pData->m_nDataLength &&
+  return strlen(ptr) == m_pData->m_nDataLength &&
          memcmp(ptr, m_pData->m_String, m_pData->m_nDataLength) == 0;
 }
 
diff --git a/core/fxcrt/bytestring.h b/core/fxcrt/bytestring.h
index 2b01bc1..67fdd1d 100644
--- a/core/fxcrt/bytestring.h
+++ b/core/fxcrt/bytestring.h
@@ -93,7 +93,7 @@
 
   size_t GetLength() const { return m_pData ? m_pData->m_nDataLength : 0; }
   size_t GetStringLength() const {
-    return m_pData ? FXSYS_strlen(m_pData->m_String) : 0;
+    return m_pData ? strlen(m_pData->m_String) : 0;
   }
   bool IsEmpty() const { return !GetLength(); }
   bool IsValidIndex(size_t index) const { return index < GetLength(); }
diff --git a/core/fxcrt/bytestring_unittest.cpp b/core/fxcrt/bytestring_unittest.cpp
index d3597ad..ed20abc 100644
--- a/core/fxcrt/bytestring_unittest.cpp
+++ b/core/fxcrt/bytestring_unittest.cpp
@@ -1421,7 +1421,7 @@
   EXPECT_TRUE(empty_str.IsEmpty());
   EXPECT_EQ(0u, empty_str.GetLength());
   const char* cstr = empty_str.c_str();
-  EXPECT_EQ(0u, FXSYS_strlen(cstr));
+  EXPECT_EQ(0u, strlen(cstr));
 }
 
 TEST(ByteString, InitializerList) {
diff --git a/core/fxcrt/cfx_widetextbuf.cpp b/core/fxcrt/cfx_widetextbuf.cpp
index 08e4921..a9b59b5 100644
--- a/core/fxcrt/cfx_widetextbuf.cpp
+++ b/core/fxcrt/cfx_widetextbuf.cpp
@@ -29,7 +29,7 @@
 CFX_WideTextBuf& CFX_WideTextBuf::operator<<(int i) {
   char buf[32];
   FXSYS_itoa(i, buf, 10);
-  size_t len = FXSYS_strlen(buf);
+  size_t len = strlen(buf);
   ExpandBuf(len * sizeof(wchar_t));
   wchar_t* str = (wchar_t*)(m_pBuffer.get() + m_DataSize);
   for (size_t j = 0; j < len; j++) {
@@ -52,7 +52,7 @@
 }
 
 CFX_WideTextBuf& CFX_WideTextBuf::operator<<(const wchar_t* lpsz) {
-  AppendBlock(lpsz, FXSYS_wcslen(lpsz) * sizeof(wchar_t));
+  AppendBlock(lpsz, wcslen(lpsz) * sizeof(wchar_t));
   return *this;
 }
 
diff --git a/core/fxcrt/css/cfx_cssstylesheet_unittest.cpp b/core/fxcrt/css/cfx_cssstylesheet_unittest.cpp
index 3029824..baa002b 100644
--- a/core/fxcrt/css/cfx_cssstylesheet_unittest.cpp
+++ b/core/fxcrt/css/cfx_cssstylesheet_unittest.cpp
@@ -32,7 +32,7 @@
                          size_t decl_count) {
     ASSERT(sheet_);
 
-    EXPECT_TRUE(sheet_->LoadBuffer(buf, FXSYS_wcslen(buf)));
+    EXPECT_TRUE(sheet_->LoadBuffer(buf, wcslen(buf)));
     EXPECT_EQ(sheet_->CountRules(), 1);
 
     CFX_CSSStyleRule* style = sheet_->GetRule(0);
@@ -89,7 +89,7 @@
 TEST_F(CFX_CSSStyleSheetTest, ParseMultipleSelectors) {
   const wchar_t* buf =
       L"a { border: 10px; }\nb { text-decoration: underline; }";
-  EXPECT_TRUE(sheet_->LoadBuffer(buf, FXSYS_wcslen(buf)));
+  EXPECT_TRUE(sheet_->LoadBuffer(buf, wcslen(buf)));
   EXPECT_EQ(2, sheet_->CountRules());
 
   CFX_CSSStyleRule* style = sheet_->GetRule(0);
@@ -137,7 +137,7 @@
 
 TEST_F(CFX_CSSStyleSheetTest, ParseChildSelectors) {
   const wchar_t* buf = L"a b c { border: 10px; }";
-  EXPECT_TRUE(sheet_->LoadBuffer(buf, FXSYS_wcslen(buf)));
+  EXPECT_TRUE(sheet_->LoadBuffer(buf, wcslen(buf)));
   EXPECT_EQ(1, sheet_->CountRules());
 
   CFX_CSSStyleRule* style = sheet_->GetRule(0);
@@ -172,19 +172,19 @@
 
 TEST_F(CFX_CSSStyleSheetTest, ParseUnhandledSelectors) {
   const wchar_t* buf = L"a > b { padding: 0; }";
-  EXPECT_TRUE(sheet_->LoadBuffer(buf, FXSYS_wcslen(buf)));
+  EXPECT_TRUE(sheet_->LoadBuffer(buf, wcslen(buf)));
   EXPECT_EQ(0, sheet_->CountRules());
 
   buf = L"a[first] { padding: 0; }";
-  EXPECT_TRUE(sheet_->LoadBuffer(buf, FXSYS_wcslen(buf)));
+  EXPECT_TRUE(sheet_->LoadBuffer(buf, wcslen(buf)));
   EXPECT_EQ(0, sheet_->CountRules());
 
   buf = L"a+b { padding: 0; }";
-  EXPECT_TRUE(sheet_->LoadBuffer(buf, FXSYS_wcslen(buf)));
+  EXPECT_TRUE(sheet_->LoadBuffer(buf, wcslen(buf)));
   EXPECT_EQ(0, sheet_->CountRules());
 
   buf = L"a ^ b { padding: 0; }";
-  EXPECT_TRUE(sheet_->LoadBuffer(buf, FXSYS_wcslen(buf)));
+  EXPECT_TRUE(sheet_->LoadBuffer(buf, wcslen(buf)));
   EXPECT_EQ(0, sheet_->CountRules());
 }
 
diff --git a/core/fxcrt/fx_extension.cpp b/core/fxcrt/fx_extension.cpp
index 4d0adb8..62cf8a0 100644
--- a/core/fxcrt/fx_extension.cpp
+++ b/core/fxcrt/fx_extension.cpp
@@ -12,7 +12,7 @@
 float FXSYS_wcstof(const wchar_t* pwsStr, int32_t iLength, int32_t* pUsedLen) {
   ASSERT(pwsStr);
   if (iLength < 0)
-    iLength = static_cast<int32_t>(FXSYS_wcslen(pwsStr));
+    iLength = static_cast<int32_t>(wcslen(pwsStr));
   if (iLength == 0)
     return 0.0f;
 
diff --git a/core/fxcrt/fx_string.cpp b/core/fxcrt/fx_string.cpp
index 233c5e6..13eb3a5 100644
--- a/core/fxcrt/fx_string.cpp
+++ b/core/fxcrt/fx_string.cpp
@@ -214,7 +214,7 @@
   }
   int i = scaled / scale;
   FXSYS_itoa(i, buf2, 10);
-  size_t len = FXSYS_strlen(buf2);
+  size_t len = strlen(buf2);
   memcpy(buf + buf_size, buf2, len);
   buf_size += len;
   int fraction = scaled % scale;
diff --git a/core/fxcrt/fx_system.h b/core/fxcrt/fx_system.h
index 2c84b02..aa9b849 100644
--- a/core/fxcrt/fx_system.h
+++ b/core/fxcrt/fx_system.h
@@ -116,16 +116,13 @@
 
 #include "third_party/base/numerics/safe_conversions.h"
 
-#define FXSYS_strlen(ptr) (strlen(ptr))
-#define FXSYS_wcslen(ptr) (wcslen(ptr))
-
 // Overloaded functions for C++ templates
 inline size_t FXSYS_len(const char* ptr) {
-  return FXSYS_strlen(ptr);
+  return strlen(ptr);
 }
 
 inline size_t FXSYS_len(const wchar_t* ptr) {
-  return FXSYS_wcslen(ptr);
+  return wcslen(ptr);
 }
 
 inline int FXSYS_cmp(const char* ptr1, const char* ptr2, size_t len) {
@@ -145,9 +142,6 @@
 }
 
 extern "C" {
-#else
-#define FXSYS_strlen(ptr) (strlen(ptr))
-#define FXSYS_wcslen(ptr) (wcslen(ptr))
 #endif  // __cplusplus
 
 #if _FX_PLATFORM_ == _FX_PLATFORM_WINDOWS_
diff --git a/core/fxcrt/widestring.cpp b/core/fxcrt/widestring.cpp
index b9d6dc2..adeb28c 100644
--- a/core/fxcrt/widestring.cpp
+++ b/core/fxcrt/widestring.cpp
@@ -135,7 +135,7 @@
       case 's': {
         const wchar_t* pstrNextArg = va_arg(argList, const wchar_t*);
         if (pstrNextArg) {
-          nItemLen = FXSYS_wcslen(pstrNextArg);
+          nItemLen = wcslen(pstrNextArg);
           if (nItemLen < 1) {
             nItemLen = 1;
           }
@@ -146,7 +146,7 @@
       case 'S': {
         const char* pstrNextArg = va_arg(argList, const char*);
         if (pstrNextArg) {
-          nItemLen = FXSYS_strlen(pstrNextArg);
+          nItemLen = strlen(pstrNextArg);
           if (nItemLen < 1) {
             nItemLen = 1;
           }
@@ -158,7 +158,7 @@
       case 'S' | FORCE_ANSI: {
         const char* pstrNextArg = va_arg(argList, const char*);
         if (pstrNextArg) {
-          nItemLen = FXSYS_strlen(pstrNextArg);
+          nItemLen = strlen(pstrNextArg);
           if (nItemLen < 1) {
             nItemLen = 1;
           }
@@ -170,7 +170,7 @@
       case 'S' | FORCE_UNICODE: {
         const wchar_t* pstrNextArg = va_arg(argList, wchar_t*);
         if (pstrNextArg) {
-          nItemLen = FXSYS_wcslen(pstrNextArg);
+          nItemLen = wcslen(pstrNextArg);
           if (nItemLen < 1) {
             nItemLen = 1;
           }
@@ -225,7 +225,7 @@
             f = va_arg(argList, double);
             FXSYS_snprintf(pszTemp, sizeof(pszTemp), "%*.*f", nWidth,
                            nPrecision + 6, f);
-            nItemLen = FXSYS_strlen(pszTemp);
+            nItemLen = strlen(pszTemp);
           }
           break;
         case 'p':
@@ -304,7 +304,7 @@
 }
 
 WideString::WideString(const wchar_t* ptr)
-    : WideString(ptr, ptr ? FXSYS_wcslen(ptr) : 0) {}
+    : WideString(ptr, ptr ? wcslen(ptr) : 0) {}
 
 WideString::WideString(const WideStringView& stringSrc) {
   if (!stringSrc.IsEmpty()) {
@@ -352,7 +352,7 @@
   if (!pStr || !pStr[0])
     clear();
   else
-    AssignCopy(pStr, FXSYS_wcslen(pStr));
+    AssignCopy(pStr, wcslen(pStr));
 
   return *this;
 }
@@ -375,7 +375,7 @@
 
 const WideString& WideString::operator+=(const wchar_t* pStr) {
   if (pStr)
-    Concat(pStr, FXSYS_wcslen(pStr));
+    Concat(pStr, wcslen(pStr));
 
   return *this;
 }
diff --git a/core/fxcrt/widestring.h b/core/fxcrt/widestring.h
index 73846e1..745fa5b 100644
--- a/core/fxcrt/widestring.h
+++ b/core/fxcrt/widestring.h
@@ -91,7 +91,7 @@
 
   size_t GetLength() const { return m_pData ? m_pData->m_nDataLength : 0; }
   size_t GetStringLength() const {
-    return m_pData ? FXSYS_wcslen(m_pData->m_String) : 0;
+    return m_pData ? wcslen(m_pData->m_String) : 0;
   }
   bool IsEmpty() const { return !GetLength(); }
   bool IsValidIndex(size_t index) const { return index < GetLength(); }
diff --git a/core/fxcrt/widestring_unittest.cpp b/core/fxcrt/widestring_unittest.cpp
index 1f72196..7824c2b 100644
--- a/core/fxcrt/widestring_unittest.cpp
+++ b/core/fxcrt/widestring_unittest.cpp
@@ -1268,7 +1268,7 @@
   EXPECT_TRUE(empty_str.IsEmpty());
   EXPECT_EQ(0u, empty_str.GetLength());
   const wchar_t* cstr = empty_str.c_str();
-  EXPECT_EQ(0u, FXSYS_wcslen(cstr));
+  EXPECT_EQ(0u, wcslen(cstr));
 }
 
 TEST(CFX_WidString, InitializerList) {
diff --git a/core/fxcrt/xml/cfx_xmlnode.cpp b/core/fxcrt/xml/cfx_xmlnode.cpp
index a1e3ac2..4550d5b 100644
--- a/core/fxcrt/xml/cfx_xmlnode.cpp
+++ b/core/fxcrt/xml/cfx_xmlnode.cpp
@@ -79,7 +79,7 @@
                                   bool bQualifiedName) const {
   ASSERT(pPath);
   if (iLength < 0) {
-    iLength = FXSYS_wcslen(pPath);
+    iLength = wcslen(pPath);
   }
   if (iLength == 0) {
     return nullptr;
diff --git a/core/fxge/android/cfpf_skiafontdescriptor.cpp b/core/fxge/android/cfpf_skiafontdescriptor.cpp
index 0c52107..8dd4481 100644
--- a/core/fxge/android/cfpf_skiafontdescriptor.cpp
+++ b/core/fxge/android/cfpf_skiafontdescriptor.cpp
@@ -25,7 +25,7 @@
 
 void CFPF_SkiaFontDescriptor::SetFamily(const char* pFamily) {
   FX_Free(m_pFamily);
-  int32_t iSize = FXSYS_strlen(pFamily);
+  int32_t iSize = strlen(pFamily);
   m_pFamily = FX_Alloc(char, iSize + 1);
   memcpy(m_pFamily, pFamily, iSize * sizeof(char));
   m_pFamily[iSize] = 0;
diff --git a/core/fxge/android/cfpf_skiafontmgr.cpp b/core/fxge/android/cfpf_skiafontmgr.cpp
index af1d58f..214e718 100644
--- a/core/fxge/android/cfpf_skiafontmgr.cpp
+++ b/core/fxge/android/cfpf_skiafontmgr.cpp
@@ -93,7 +93,7 @@
   if (!pStr)
     return 0;
   if (iLength < 0)
-    iLength = FXSYS_strlen(pStr);
+    iLength = strlen(pStr);
   const char* pStrEnd = pStr + iLength;
   uint32_t uHashCode = 0;
   while (pStr < pStrEnd)
diff --git a/core/fxge/android/cfpf_skiapathfont.cpp b/core/fxge/android/cfpf_skiapathfont.cpp
index 44e19bc..27f4fde 100644
--- a/core/fxge/android/cfpf_skiapathfont.cpp
+++ b/core/fxge/android/cfpf_skiapathfont.cpp
@@ -20,7 +20,7 @@
 
 void CFPF_SkiaPathFont::SetPath(const char* pPath) {
   FX_Free(m_pPath);
-  int32_t iSize = FXSYS_strlen(pPath);
+  int32_t iSize = strlen(pPath);
   m_pPath = FX_Alloc(char, iSize + 1);
   memcpy(m_pPath, pPath, iSize * sizeof(char));
   m_pPath[iSize] = 0;
diff --git a/fpdfsdk/fpdfview.cpp b/fpdfsdk/fpdfview.cpp
index bbd60bd..4085117 100644
--- a/fpdfsdk/fpdfview.cpp
+++ b/fpdfsdk/fpdfview.cpp
@@ -1398,7 +1398,7 @@
   if (!bstr || !length)
     return -1;
   if (length == -1)
-    length = FXSYS_strlen(bstr);
+    length = strlen(bstr);
 
   if (length == 0) {
     if (str->str) {
diff --git a/fpdfsdk/javascript/Field.cpp b/fpdfsdk/javascript/Field.cpp
index fa5d478..a89df16 100644
--- a/fpdfsdk/javascript/Field.cpp
+++ b/fpdfsdk/javascript/Field.cpp
@@ -2610,8 +2610,7 @@
           iIndex = pFormField->GetSelectedIndex(i);
           ElementValue =
               CJS_Value(pRuntime, pFormField->GetOptionValue(iIndex).c_str());
-          if (FXSYS_wcslen(ElementValue.ToCFXWideString(pRuntime).c_str()) ==
-              0) {
+          if (wcslen(ElementValue.ToCFXWideString(pRuntime).c_str()) == 0) {
             ElementValue =
                 CJS_Value(pRuntime, pFormField->GetOptionLabel(iIndex).c_str());
           }
diff --git a/fpdfsdk/javascript/util.cpp b/fpdfsdk/javascript/util.cpp
index c4b1568..b82020d 100644
--- a/fpdfsdk/javascript/util.cpp
+++ b/fpdfsdk/javascript/util.cpp
@@ -206,7 +206,7 @@
       int iEnd;
       while ((iEnd = cFormat.find(TbConvertTable[i].lpszJSMark, iStart)) !=
              -1) {
-        cFormat.replace(iEnd, FXSYS_wcslen(TbConvertTable[i].lpszJSMark),
+        cFormat.replace(iEnd, wcslen(TbConvertTable[i].lpszJSMark),
                         TbConvertTable[i].lpszCppMark);
         iStart = iEnd;
       }
@@ -243,8 +243,7 @@
             continue;
           }
         }
-        cFormat.replace(iEnd, FXSYS_wcslen(cTableAd[i].lpszJSMark),
-                        sValue.c_str());
+        cFormat.replace(iEnd, wcslen(cTableAd[i].lpszJSMark), sValue.c_str());
         iStart = iEnd;
       }
     }
diff --git a/xfa/fgas/font/cfgas_defaultfontmanager.cpp b/xfa/fgas/font/cfgas_defaultfontmanager.cpp
index 4b9091f..6f39797 100644
--- a/xfa/fgas/font/cfgas_defaultfontmanager.cpp
+++ b/xfa/fgas/font/cfgas_defaultfontmanager.cpp
@@ -30,7 +30,7 @@
         dwStyle |= FX_FONTSTYLE_Italic;
 
       const wchar_t* pReplace = pCurFont->pReplaceFont;
-      int32_t iLength = FXSYS_wcslen(pReplace);
+      int32_t iLength = wcslen(pReplace);
       while (iLength > 0) {
         const wchar_t* pNameText = pReplace;
         while (*pNameText != L',' && iLength > 0) {
diff --git a/xfa/fxfa/cxfa_ffwidget.cpp b/xfa/fxfa/cxfa_ffwidget.cpp
index 8592873..77f1ac5 100644
--- a/xfa/fxfa/cxfa_ffwidget.cpp
+++ b/xfa/fxfa/cxfa_ffwidget.cpp
@@ -1780,7 +1780,7 @@
   uint8_t* pCP;
   int32_t i = 0, j = 0;
   if (iLen == 0) {
-    iLen = FXSYS_strlen((char*)pStr);
+    iLen = strlen((char*)pStr);
   }
   pCP = FX_Alloc(uint8_t, iLen + 1);
   for (; i < iLen; i++) {
@@ -1799,11 +1799,11 @@
     return 0;
   }
   uint8_t* pBuffer =
-      XFA_RemoveBase64Whitespace((uint8_t*)pStr, FXSYS_strlen((char*)pStr));
+      XFA_RemoveBase64Whitespace((uint8_t*)pStr, strlen((char*)pStr));
   if (!pBuffer) {
     return 0;
   }
-  int32_t iLen = FXSYS_strlen((char*)pBuffer);
+  int32_t iLen = strlen((char*)pBuffer);
   int32_t i = 0, j = 0;
   uint32_t dwLimb = 0;
   for (; i + 3 < iLen; i += 4) {
diff --git a/xfa/fxfa/cxfa_textparser.cpp b/xfa/fxfa/cxfa_textparser.cpp
index 9cbb72a..35e9b01 100644
--- a/xfa/fxfa/cxfa_textparser.cpp
+++ b/xfa/fxfa/cxfa_textparser.cpp
@@ -84,8 +84,8 @@
       L"sub{vertical-align:-15em;font-size:.66em}";
 
   auto sheet = pdfium::MakeUnique<CFX_CSSStyleSheet>();
-  return sheet->LoadBuffer(s_pStyle, FXSYS_wcslen(s_pStyle)) ? std::move(sheet)
-                                                             : nullptr;
+  return sheet->LoadBuffer(s_pStyle, wcslen(s_pStyle)) ? std::move(sheet)
+                                                       : nullptr;
 }
 
 RetainPtr<CFX_CSSComputedStyle> CXFA_TextParser::CreateRootStyle(
diff --git a/xfa/fxfa/fm2js/cxfa_fm2jscontext.cpp b/xfa/fxfa/fm2js/cxfa_fm2jscontext.cpp
index b4d070a..00df016 100644
--- a/xfa/fxfa/fm2js/cxfa_fm2jscontext.cpp
+++ b/xfa/fxfa/fm2js/cxfa_fm2jscontext.cpp
@@ -3342,8 +3342,7 @@
     const wchar_t* const strName[] = {L"quot", L"amp", L"apos", L"lt", L"gt"};
     int32_t iIndex = 0;
     while (iIndex < 5) {
-      if (memcmp(strString, strName[iIndex], FXSYS_wcslen(strName[iIndex])) ==
-          0) {
+      if (memcmp(strString, strName[iIndex], wcslen(strName[iIndex])) == 0) {
         break;
       }
       ++iIndex;
diff --git a/xfa/fxfa/parser/cxfa_dataexporter.cpp b/xfa/fxfa/parser/cxfa_dataexporter.cpp
index 5433ba7..44b0dca 100644
--- a/xfa/fxfa/parser/cxfa_dataexporter.cpp
+++ b/xfa/fxfa/parser/cxfa_dataexporter.cpp
@@ -399,7 +399,7 @@
     pStream->WriteString(L" xmlns=\"");
 
     const wchar_t* pURI = XFA_GetPacketByIndex(XFA_PACKET_Form)->pURI;
-    pStream->WriteString(WideStringView(pURI, FXSYS_wcslen(pURI)));
+    pStream->WriteString(WideStringView(pURI, wcslen(pURI)));
 
     WideString wsVersionNumber;
     RecognizeXFAVersionNumber(
diff --git a/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp b/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp
index 7d9a218..8bc71f1 100644
--- a/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp
+++ b/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp
@@ -36,7 +36,7 @@
   if (!pStr)
     return ret;
   if (iStrLen < 0)
-    iStrLen = FXSYS_wcslen(pStr);
+    iStrLen = wcslen(pStr);
 
   const wchar_t* pToken = pStr;
   const wchar_t* pEnd = pStr + iStrLen;
