Clean up CPDF_CMapParser.

- Change |m_Status| to an enum.
- Move |g_CharsetNames| closer to where used.
- Replace a NOTREACHED() with a static_assert().
- Fix nits.

Change-Id: I38f1f014073ba03558d54089e5ec5486cbeee0fc
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/59490
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
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;