diff --git a/core/fpdfapi/font/cpdf_cmapparser.cpp b/core/fpdfapi/font/cpdf_cmapparser.cpp
index a16d008..1f7c0bc 100644
--- a/core/fpdfapi/font/cpdf_cmapparser.cpp
+++ b/core/fpdfapi/font/cpdf_cmapparser.cpp
@@ -18,17 +18,6 @@
 
 namespace {
 
-const char* const g_CharsetNames[CIDSET_NUM_SETS] = {nullptr,  "GB1",    "CNS1",
-                                                     "Japan1", "Korea1", "UCS"};
-
-CIDSet CIDSetFromSizeT(size_t index) {
-  if (index >= CIDSET_NUM_SETS) {
-    NOTREACHED();
-    return CIDSET_UNKNOWN;
-  }
-  return static_cast<CIDSet>(index);
-}
-
 ByteStringView CMap_GetString(ByteStringView word) {
   if (word.GetLength() <= 2)
     return ByteStringView();
@@ -37,50 +26,50 @@
 
 }  // namespace
 
-CPDF_CMapParser::CPDF_CMapParser(CPDF_CMap* pCMap)
-    : m_pCMap(pCMap), m_Status(0), m_CodeSeq(0) {}
+CPDF_CMapParser::CPDF_CMapParser(CPDF_CMap* pCMap) : m_pCMap(pCMap) {}
 
-CPDF_CMapParser::~CPDF_CMapParser() {}
+CPDF_CMapParser::~CPDF_CMapParser() = default;
 
 void CPDF_CMapParser::ParseWord(ByteStringView word) {
-  if (word.IsEmpty()) {
+  if (word.IsEmpty())
     return;
-  }
+
   if (word == "begincidchar") {
-    m_Status = 1;
+    m_Status = kProcessingCidChar;
     m_CodeSeq = 0;
   } else if (word == "begincidrange") {
-    m_Status = 2;
+    m_Status = kProcessingCidRange;
     m_CodeSeq = 0;
   } else if (word == "endcidrange" || word == "endcidchar") {
-    m_Status = 0;
+    m_Status = kStart;
   } else if (word == "/WMode") {
-    m_Status = 6;
+    m_Status = kProcessingWMode;
   } else if (word == "/Registry") {
-    m_Status = 3;
+    m_Status = kProcessingRegistry;
   } else if (word == "/Ordering") {
-    m_Status = 4;
+    m_Status = kProcessingOrdering;
   } else if (word == "/Supplement") {
-    m_Status = 5;
+    m_Status = kProcessingSupplement;
   } else if (word == "begincodespacerange") {
-    m_Status = 7;
+    m_Status = kProcessingCodeSpaceRange;
     m_CodeSeq = 0;
   } else if (word == "usecmap") {
-  } else if (m_Status == 1 || m_Status == 2) {
+  } else if (m_Status == kProcessingCidChar ||
+             m_Status == kProcessingCidRange) {
     m_CodePoints[m_CodeSeq] = GetCode(word);
     m_CodeSeq++;
     uint32_t StartCode, EndCode;
     uint16_t StartCID;
-    if (m_Status == 1) {
-      if (m_CodeSeq < 2) {
+    if (m_Status == kProcessingCidChar) {
+      if (m_CodeSeq < 2)
         return;
-      }
+
       EndCode = StartCode = m_CodePoints[0];
       StartCID = (uint16_t)m_CodePoints[1];
     } else {
-      if (m_CodeSeq < 3) {
+      if (m_CodeSeq < 3)
         return;
-      }
+
       StartCode = m_CodePoints[0];
       EndCode = m_CodePoints[1];
       StartCID = (uint16_t)m_CodePoints[2];
@@ -95,17 +84,17 @@
           {StartCode, EndCode, StartCID});
     }
     m_CodeSeq = 0;
-  } else if (m_Status == 3) {
-    m_Status = 0;
-  } else if (m_Status == 4) {
+  } else if (m_Status == kProcessingRegistry) {
+    m_Status = kStart;
+  } else if (m_Status == kProcessingOrdering) {
     m_pCMap->SetCharset(CharsetFromOrdering(CMap_GetString(word)));
-    m_Status = 0;
-  } else if (m_Status == 5) {
-    m_Status = 0;
-  } else if (m_Status == 6) {
+    m_Status = kStart;
+  } else if (m_Status == kProcessingSupplement) {
+    m_Status = kStart;
+  } else if (m_Status == kProcessingWMode) {
     m_pCMap->SetVertical(GetCode(word) != 0);
-    m_Status = 0;
-  } else if (m_Status == 7) {
+    m_Status = kStart;
+  } else if (m_Status == kProcessingCodeSpaceRange) {
     if (word == "endcodespacerange") {
       const auto& code_ranges = m_pCMap->GetMixedFourByteLeadingRanges();
       size_t nSegs = code_ranges.size() + m_PendingRanges.size();
@@ -121,11 +110,11 @@
           m_pCMap->AppendMixedFourByteLeadingRanges(range);
         m_PendingRanges.clear();
       }
-      m_Status = 0;
+      m_Status = kStart;
     } else {
-      if (word.GetLength() == 0 || word[0] != '<') {
+      if (word.GetLength() == 0 || word[0] != '<')
         return;
-      }
+
       if (m_CodeSeq % 2) {
         CPDF_CMap::CodeRange range;
         if (GetCodeRange(range, m_LastWord.AsStringView(), word))
@@ -167,9 +156,8 @@
 
   size_t i;
   for (i = 1; i < first.GetLength(); ++i) {
-    if (first[i] == '>') {
+    if (first[i] == '>')
       break;
-    }
   }
   range.m_CharSize = (i - 1) / 2;
   if (range.m_CharSize > 4)
@@ -184,8 +172,10 @@
 
   size_t size = second.GetLength();
   for (i = 0; i < range.m_CharSize; ++i) {
-    uint8_t digit1 = (i * 2 + 1 < size) ? second[i * 2 + 1] : '0';
-    uint8_t digit2 = (i * 2 + 2 < size) ? second[i * 2 + 2] : '0';
+    size_t i1 = i * 2 + 1;
+    size_t i2 = i1 + 1;
+    uint8_t digit1 = i1 < size ? second[i1] : '0';
+    uint8_t digit2 = i2 < size ? second[i2] : '0';
     range.m_Upper[i] =
         FXSYS_HexCharToInt(digit1) * 16 + FXSYS_HexCharToInt(digit2);
   }
@@ -194,9 +184,14 @@
 
 // static
 CIDSet CPDF_CMapParser::CharsetFromOrdering(ByteStringView ordering) {
-  for (size_t charset = 1; charset < FX_ArraySize(g_CharsetNames); ++charset) {
-    if (ordering == g_CharsetNames[charset])
-      return CIDSetFromSizeT(charset);
+  static const char* const kCharsetNames[CIDSET_NUM_SETS] = {
+      nullptr, "GB1", "CNS1", "Japan1", "Korea1", "UCS"};
+  static_assert(FX_ArraySize(kCharsetNames) == CIDSET_NUM_SETS,
+                "Too many CID sets");
+
+  for (size_t charset = 1; charset < FX_ArraySize(kCharsetNames); ++charset) {
+    if (ordering == kCharsetNames[charset])
+      return static_cast<CIDSet>(charset);
   }
   return CIDSET_UNKNOWN;
 }
diff --git a/core/fpdfapi/font/cpdf_cmapparser.h b/core/fpdfapi/font/cpdf_cmapparser.h
index b62985d..5c8db40 100644
--- a/core/fpdfapi/font/cpdf_cmapparser.h
+++ b/core/fpdfapi/font/cpdf_cmapparser.h
@@ -35,9 +35,20 @@
   static CIDSet CharsetFromOrdering(ByteStringView ordering);
 
  private:
+  enum Status {
+    kStart,
+    kProcessingCidChar,
+    kProcessingCidRange,
+    kProcessingRegistry,
+    kProcessingOrdering,
+    kProcessingSupplement,
+    kProcessingWMode,
+    kProcessingCodeSpaceRange,
+  };
+
+  Status m_Status = kStart;
+  int m_CodeSeq = 0;
   UnownedPtr<CPDF_CMap> const m_pCMap;
-  int m_Status;
-  int m_CodeSeq;
   std::vector<CPDF_CMap::CodeRange> m_PendingRanges;
   std::vector<CPDF_CMap::CIDRange> m_AdditionalCharcodeToCIDMappings;
   ByteString m_LastWord;
