Remove redundant loop in CFX_CSSSyntaxParser

Change-Id: Ie62d07462eb1f6fecaf49a0fa0d89cd82013ce8e
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/66490
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxcrt/css/cfx_csssyntaxparser.cpp b/core/fxcrt/css/cfx_csssyntaxparser.cpp
index 8c92de4..6b05b3f 100644
--- a/core/fxcrt/css/cfx_csssyntaxparser.cpp
+++ b/core/fxcrt/css/cfx_csssyntaxparser.cpp
@@ -38,145 +38,139 @@
 }
 
 CFX_CSSSyntaxStatus CFX_CSSSyntaxParser::DoSyntaxParse() {
-  while (m_eStatus >= CFX_CSSSyntaxStatus::kNone) {
-    if (m_Input.IsEOF()) {
-      if (m_eMode == SyntaxMode::kPropertyValue && m_Output.GetLength() > 0) {
-        SaveTextData();
-        m_eStatus = CFX_CSSSyntaxStatus::kPropertyValue;
-        return m_eStatus;
-      }
-      m_eStatus = CFX_CSSSyntaxStatus::kEOS;
-      return m_eStatus;
-    }
-    wchar_t wch;
-    while (!m_Input.IsEOF()) {
-      wch = m_Input.GetChar();
-      switch (m_eMode) {
-        case SyntaxMode::kRuleSet:
-          switch (wch) {
-            case '}':
-              m_Input.MoveNext();
-              if (RestoreMode())
-                return CFX_CSSSyntaxStatus::kDeclClose;
+  if (m_bError)
+    return CFX_CSSSyntaxStatus::kError;
 
-              m_eStatus = CFX_CSSSyntaxStatus::kError;
-              return m_eStatus;
-            case '/':
-              if (m_Input.GetNextChar() == '*') {
-                m_ModeStack.push(m_eMode);
-                SwitchMode(SyntaxMode::kComment);
-                break;
-              }
-              FALLTHROUGH;
-            default:
-              if (wch <= ' ') {
-                m_Input.MoveNext();
-              } else if (IsSelectorStart(wch)) {
-                SwitchMode(SyntaxMode::kSelector);
-                return CFX_CSSSyntaxStatus::kStyleRule;
-              } else {
-                m_eStatus = CFX_CSSSyntaxStatus::kError;
-                return m_eStatus;
-              }
-              break;
-          }
-          break;
-        case SyntaxMode::kSelector:
-          switch (wch) {
-            case ',':
-              m_Input.MoveNext();
-              SwitchMode(SyntaxMode::kSelector);
-              if (m_iTextDataLen > 0)
-                return CFX_CSSSyntaxStatus::kSelector;
-              break;
-            case '{':
-              if (m_Output.GetLength() > 0) {
-                SaveTextData();
-                return CFX_CSSSyntaxStatus::kSelector;
-              }
-              m_Input.MoveNext();
-              m_ModeStack.push(SyntaxMode::kRuleSet);
-              SwitchMode(SyntaxMode::kPropertyName);
-              return CFX_CSSSyntaxStatus::kDeclOpen;
-            case '/':
-              if (m_Input.GetNextChar() == '*') {
-                if (SwitchToComment() > 0)
-                  return CFX_CSSSyntaxStatus::kSelector;
-                break;
-              }
-              FALLTHROUGH;
-            default:
-              AppendCharIfNotLeadingBlank(wch);
-              m_Input.MoveNext();
-              break;
-          }
-          break;
-        case SyntaxMode::kPropertyName:
-          switch (wch) {
-            case ':':
-              m_Input.MoveNext();
-              SwitchMode(SyntaxMode::kPropertyValue);
-              return CFX_CSSSyntaxStatus::kPropertyName;
-            case '}':
-              m_Input.MoveNext();
-              if (RestoreMode())
-                return CFX_CSSSyntaxStatus::kDeclClose;
-
-              m_eStatus = CFX_CSSSyntaxStatus::kError;
-              return m_eStatus;
-            case '/':
-              if (m_Input.GetNextChar() == '*') {
-                if (SwitchToComment() > 0)
-                  return CFX_CSSSyntaxStatus::kPropertyName;
-                break;
-              }
-              FALLTHROUGH;
-            default:
-              AppendCharIfNotLeadingBlank(wch);
-              m_Input.MoveNext();
-              break;
-          }
-          break;
-        case SyntaxMode::kPropertyValue:
-          switch (wch) {
-            case ';':
-              m_Input.MoveNext();
-              FALLTHROUGH;
-            case '}':
-              SwitchMode(SyntaxMode::kPropertyName);
-              return CFX_CSSSyntaxStatus::kPropertyValue;
-            case '/':
-              if (m_Input.GetNextChar() == '*') {
-                if (SwitchToComment() > 0)
-                  return CFX_CSSSyntaxStatus::kPropertyValue;
-                break;
-              }
-              FALLTHROUGH;
-            default:
-              AppendCharIfNotLeadingBlank(wch);
-              m_Input.MoveNext();
-              break;
-          }
-          break;
-        case SyntaxMode::kComment:
-          if (wch == '*' && m_Input.GetNextChar() == '/') {
-            RestoreMode();
+  while (!m_Input.IsEOF()) {
+    wchar_t wch = m_Input.GetChar();
+    switch (m_eMode) {
+      case SyntaxMode::kRuleSet:
+        switch (wch) {
+          case '}':
             m_Input.MoveNext();
-          }
+            if (RestoreMode())
+              return CFX_CSSSyntaxStatus::kDeclClose;
+            m_bError = true;
+            return CFX_CSSSyntaxStatus::kError;
+          case '/':
+            if (m_Input.GetNextChar() == '*') {
+              m_ModeStack.push(m_eMode);
+              SwitchMode(SyntaxMode::kComment);
+              break;
+            }
+            FALLTHROUGH;
+          default:
+            if (wch <= ' ') {
+              m_Input.MoveNext();
+            } else if (IsSelectorStart(wch)) {
+              SwitchMode(SyntaxMode::kSelector);
+              return CFX_CSSSyntaxStatus::kStyleRule;
+            } else {
+              m_bError = true;
+              return CFX_CSSSyntaxStatus::kError;
+            }
+            break;
+        }
+        break;
+      case SyntaxMode::kSelector:
+        switch (wch) {
+          case ',':
+            m_Input.MoveNext();
+            SwitchMode(SyntaxMode::kSelector);
+            if (m_iTextDataLen > 0)
+              return CFX_CSSSyntaxStatus::kSelector;
+            break;
+          case '{':
+            if (m_Output.GetLength() > 0) {
+              SaveTextData();
+              return CFX_CSSSyntaxStatus::kSelector;
+            }
+            m_Input.MoveNext();
+            m_ModeStack.push(SyntaxMode::kRuleSet);
+            SwitchMode(SyntaxMode::kPropertyName);
+            return CFX_CSSSyntaxStatus::kDeclOpen;
+          case '/':
+            if (m_Input.GetNextChar() == '*') {
+              if (SwitchToComment() > 0)
+                return CFX_CSSSyntaxStatus::kSelector;
+              break;
+            }
+            FALLTHROUGH;
+          default:
+            AppendCharIfNotLeadingBlank(wch);
+            m_Input.MoveNext();
+            break;
+        }
+        break;
+      case SyntaxMode::kPropertyName:
+        switch (wch) {
+          case ':':
+            m_Input.MoveNext();
+            SwitchMode(SyntaxMode::kPropertyValue);
+            return CFX_CSSSyntaxStatus::kPropertyName;
+          case '}':
+            m_Input.MoveNext();
+            if (RestoreMode())
+              return CFX_CSSSyntaxStatus::kDeclClose;
+
+            m_bError = true;
+            return CFX_CSSSyntaxStatus::kError;
+          case '/':
+            if (m_Input.GetNextChar() == '*') {
+              if (SwitchToComment() > 0)
+                return CFX_CSSSyntaxStatus::kPropertyName;
+              break;
+            }
+            FALLTHROUGH;
+          default:
+            AppendCharIfNotLeadingBlank(wch);
+            m_Input.MoveNext();
+            break;
+        }
+        break;
+      case SyntaxMode::kPropertyValue:
+        switch (wch) {
+          case ';':
+            m_Input.MoveNext();
+            FALLTHROUGH;
+          case '}':
+            SwitchMode(SyntaxMode::kPropertyName);
+            return CFX_CSSSyntaxStatus::kPropertyValue;
+          case '/':
+            if (m_Input.GetNextChar() == '*') {
+              if (SwitchToComment() > 0)
+                return CFX_CSSSyntaxStatus::kPropertyValue;
+              break;
+            }
+            FALLTHROUGH;
+          default:
+            AppendCharIfNotLeadingBlank(wch);
+            m_Input.MoveNext();
+            break;
+        }
+        break;
+      case SyntaxMode::kComment:
+        if (wch == '*' && m_Input.GetNextChar() == '/') {
+          RestoreMode();
           m_Input.MoveNext();
-          break;
-        case SyntaxMode::kUnknownRule:
-          if (wch == ';')
-            SwitchMode(SyntaxMode::kRuleSet);
-          m_Input.MoveNext();
-          break;
-        default:
-          NOTREACHED();
-          break;
-      }
+        }
+        m_Input.MoveNext();
+        break;
+      case SyntaxMode::kUnknownRule:
+        if (wch == ';')
+          SwitchMode(SyntaxMode::kRuleSet);
+        m_Input.MoveNext();
+        break;
+      default:
+        NOTREACHED();
+        break;
     }
   }
-  return m_eStatus;
+  if (m_eMode == SyntaxMode::kPropertyValue && m_Output.GetLength() > 0) {
+    SaveTextData();
+    return CFX_CSSSyntaxStatus::kPropertyValue;
+  }
+  return CFX_CSSSyntaxStatus::kEOS;
 }
 
 void CFX_CSSSyntaxParser::AppendCharIfNotLeadingBlank(wchar_t wch) {
diff --git a/core/fxcrt/css/cfx_csssyntaxparser.h b/core/fxcrt/css/cfx_csssyntaxparser.h
index ed3db85..ba64add 100644
--- a/core/fxcrt/css/cfx_csssyntaxparser.h
+++ b/core/fxcrt/css/cfx_csssyntaxparser.h
@@ -54,8 +54,8 @@
   void AppendCharIfNotLeadingBlank(wchar_t wch);
   void SaveTextData();
 
+  bool m_bError = false;
   SyntaxMode m_eMode = SyntaxMode::kRuleSet;
-  CFX_CSSSyntaxStatus m_eStatus = CFX_CSSSyntaxStatus::kNone;
   int32_t m_iTextDataLen = 0;
   CFX_CSSTextBuf m_Output;
   CFX_CSSExtTextBuf m_Input;