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) {