Add FXSYS_IsUpperASCII().

Add FXSYS_IsUpperASCII() to check whether a character is an uppercase
ASCII letter.

This is a follow-up CL for
https://pdfium-review.googlesource.com/65752/. This new function helps
limit IsStrUpper() to only check for uppercase ASCII letters instead of
all uppercase Unicode characters.

This CL adds more callers for FXSYS_IsUpperASCII() to replace all
uppercase ASCII character checks across PDFium and adds a matching unit
test for the function.

Bug: pdfium:1475
Change-Id: I67d12acebcbe3c595fb888ae8fbf6c08432b80ed
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/67172
Commit-Queue: Hui Yingst <nigi@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxcrt/fx_extension.h b/core/fxcrt/fx_extension.h
index 28b23cf..fba9544 100644
--- a/core/fxcrt/fx_extension.h
+++ b/core/fxcrt/fx_extension.h
@@ -48,6 +48,10 @@
   return u_toupper(c);
 }
 
+inline bool FXSYS_IsUpperASCII(int32_t c) {
+  return c >= 'A' && c <= 'Z';
+}
+
 inline char FXSYS_ToUpperASCII(char c) {
   return (c >= 'a' && c <= 'z') ? (c + ('A' - 'a')) : c;
 }
diff --git a/core/fxcrt/fx_extension_unittest.cpp b/core/fxcrt/fx_extension_unittest.cpp
index 81fc4f7..125612b 100644
--- a/core/fxcrt/fx_extension_unittest.cpp
+++ b/core/fxcrt/fx_extension_unittest.cpp
@@ -8,6 +8,27 @@
 
 #include "testing/gtest/include/gtest/gtest.h"
 
+TEST(fxcrt, FXSYS_IsUpperASCII) {
+  EXPECT_TRUE(FXSYS_IsUpperASCII('A'));
+  EXPECT_TRUE(FXSYS_IsUpperASCII(L'A'));
+  EXPECT_TRUE(FXSYS_IsUpperASCII('B'));
+  EXPECT_TRUE(FXSYS_IsUpperASCII(L'B'));
+  EXPECT_TRUE(FXSYS_IsUpperASCII('Y'));
+  EXPECT_TRUE(FXSYS_IsUpperASCII(L'Y'));
+  EXPECT_TRUE(FXSYS_IsUpperASCII('Z'));
+  EXPECT_TRUE(FXSYS_IsUpperASCII(L'Z'));
+  EXPECT_FALSE(FXSYS_IsUpperASCII('@'));
+  EXPECT_FALSE(FXSYS_IsUpperASCII(L'@'));
+  EXPECT_FALSE(FXSYS_IsUpperASCII('['));
+  EXPECT_FALSE(FXSYS_IsUpperASCII(L'['));
+  EXPECT_FALSE(FXSYS_IsUpperASCII('z'));
+  EXPECT_FALSE(FXSYS_IsUpperASCII(L'z'));
+  EXPECT_FALSE(FXSYS_IsUpperASCII('7'));
+  EXPECT_FALSE(FXSYS_IsUpperASCII(L'7'));
+  EXPECT_FALSE(FXSYS_IsUpperASCII(static_cast<char>(-78)));
+  EXPECT_FALSE(FXSYS_IsUpperASCII(static_cast<wchar_t>(0xb2)));
+}
+
 TEST(fxcrt, FXSYS_HexCharToInt) {
   EXPECT_EQ(10, FXSYS_HexCharToInt('a'));
   EXPECT_EQ(10, FXSYS_HexCharToInt('A'));
diff --git a/core/fxge/cfx_fontmapper.cpp b/core/fxge/cfx_fontmapper.cpp
index 58ebaec..024594f 100644
--- a/core/fxge/cfx_fontmapper.cpp
+++ b/core/fxge/cfx_fontmapper.cpp
@@ -259,7 +259,7 @@
 
 bool IsStrUpper(const ByteString& str) {
   for (size_t i = 0; i < str.GetLength(); ++i) {
-    if (!FXSYS_iswupper(str[i]))
+    if (!FXSYS_IsUpperASCII(str[i]))
       return false;
   }
   return true;
diff --git a/fxbarcode/datamatrix/BC_C40Encoder.cpp b/fxbarcode/datamatrix/BC_C40Encoder.cpp
index 9f20a35..9e18a76 100644
--- a/fxbarcode/datamatrix/BC_C40Encoder.cpp
+++ b/fxbarcode/datamatrix/BC_C40Encoder.cpp
@@ -149,7 +149,7 @@
     *sb += (wchar_t)(c - 48 + 4);
     return 1;
   }
-  if ((c >= 'A') && (c <= 'Z')) {
+  if (FXSYS_IsUpperASCII(c)) {
     *sb += (wchar_t)(c - 65 + 14);
     return 1;
   }
diff --git a/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp b/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp
index fbc4262..b833ac0 100644
--- a/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp
+++ b/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp
@@ -91,7 +91,7 @@
 }
 
 bool IsNativeC40(wchar_t ch) {
-  return (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z');
+  return (ch == ' ') || (ch >= '0' && ch <= '9') || FXSYS_IsUpperASCII(ch);
 }
 
 bool IsNativeText(wchar_t ch) {
@@ -104,7 +104,7 @@
 
 bool IsNativeX12(wchar_t ch) {
   return IsX12TermSep(ch) || (ch == ' ') || (ch >= '0' && ch <= '9') ||
-         (ch >= 'A' && ch <= 'Z');
+         FXSYS_IsUpperASCII(ch);
 }
 
 bool IsNativeEDIFACT(wchar_t ch) {
diff --git a/fxbarcode/datamatrix/BC_TextEncoder.cpp b/fxbarcode/datamatrix/BC_TextEncoder.cpp
index bf87afa..10ee1d0 100644
--- a/fxbarcode/datamatrix/BC_TextEncoder.cpp
+++ b/fxbarcode/datamatrix/BC_TextEncoder.cpp
@@ -76,7 +76,7 @@
     *sb += (wchar_t)(c - 96);
     return 2;
   }
-  if (c >= 'A' && c <= 'Z') {
+  if (FXSYS_IsUpperASCII(c)) {
     *sb += (wchar_t)'\2';
     *sb += (wchar_t)(c - 65 + 1);
     return 2;
diff --git a/fxbarcode/datamatrix/BC_X12Encoder.cpp b/fxbarcode/datamatrix/BC_X12Encoder.cpp
index 37180ea..6dba27b 100644
--- a/fxbarcode/datamatrix/BC_X12Encoder.cpp
+++ b/fxbarcode/datamatrix/BC_X12Encoder.cpp
@@ -94,7 +94,7 @@
     *sb += (wchar_t)'\3';
   else if (FXSYS_IsDecimalDigit(c))
     *sb += (wchar_t)(c - 48 + 4);
-  else if (c >= 'A' && c <= 'Z')
+  else if (FXSYS_IsUpperASCII(c))
     *sb += (wchar_t)(c - 65 + 14);
   else
     return 0;
diff --git a/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp b/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp
index 09cac1b..29e559a 100644
--- a/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp
+++ b/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp
@@ -52,7 +52,7 @@
     -1, -1, -1, -1, -1, -1, -1, -1, -1, 26, 21, 27, 9,  -1};
 
 bool IsAlphaUpperOrSpace(wchar_t ch) {
-  return ch == ' ' || (ch >= 'A' && ch <= 'Z');
+  return ch == ' ' || FXSYS_IsUpperASCII(ch);
 }
 
 bool IsAlphaLowerOrSpace(wchar_t ch) {