Merge to XFA: Correctly extracting email addresses

An email address contains user name part and host name part.
User name allows dash or underscore, but not leading/ending/double
period. Host name doesn't allow leading/ending/double
period either.

BUG=489107
TBR=thestig@chromium.org

Review URL: https://codereview.chromium.org/1530763005 .

(cherry picked from commit cc70b7b55c9edcd0ff038f59080699060fbbede1)

Review URL: https://codereview.chromium.org/1532303002 .
diff --git a/core/include/fxcrt/fx_ext.h b/core/include/fxcrt/fx_ext.h
index 6cba8ee..3f4f668 100644
--- a/core/include/fxcrt/fx_ext.h
+++ b/core/include/fxcrt/fx_ext.h
@@ -36,6 +36,15 @@
 inline int32_t FXSYS_toupper(int32_t ch) {
   return ch < 'a' || ch > 'z' ? ch : (ch - 0x20);
 }
+inline FX_BOOL FXSYS_iswalpha(wchar_t wch) {
+  return (wch >= L'A' && wch <= L'Z') || (wch >= L'a' && wch <= L'z');
+}
+inline FX_BOOL FXSYS_iswdigit(wchar_t wch) {
+  return wch >= L'0' && wch <= L'9';
+}
+inline FX_BOOL FXSYS_iswalnum(wchar_t wch) {
+  return FXSYS_iswalpha(wch) || FXSYS_iswdigit(wch);
+}
 
 inline int FXSYS_toHexDigit(const FX_CHAR c) {
   if (!std::isxdigit(c))