Clean up CBC_ASCIIEncoder.

Get rid of a few more fxbarcode exception codes.

Change-Id: Ia9c9cdcef581174e25be8dc2fba181915dc6d729
Reviewed-on: https://pdfium-review.googlesource.com/32471
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
diff --git a/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp b/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp
index e6b7a2b..813c31e 100644
--- a/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp
+++ b/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp
@@ -27,71 +27,81 @@
 #include "fxbarcode/datamatrix/BC_HighLevelEncoder.h"
 #include "fxbarcode/datamatrix/BC_SymbolInfo.h"
 #include "fxbarcode/utils.h"
+#include "third_party/base/optional.h"
+
+namespace {
+
+Optional<wchar_t> EncodeASCIIDigits(wchar_t digit1, wchar_t digit2) {
+  if (!CBC_HighLevelEncoder::isDigit(digit1) ||
+      !CBC_HighLevelEncoder::isDigit(digit2)) {
+    // This could potentially return 0 as a sentinel value. Then this function
+    // can just return wchar_t instead of Optional<wchar_t>.
+    return {};
+  }
+  return static_cast<wchar_t>((digit1 - 48) * 10 + (digit2 - 48) + 130);
+}
+
+}  // namespace
 
 CBC_ASCIIEncoder::CBC_ASCIIEncoder() {}
+
 CBC_ASCIIEncoder::~CBC_ASCIIEncoder() {}
+
 int32_t CBC_ASCIIEncoder::getEncodingMode() {
   return ASCII_ENCODATION;
 }
+
 void CBC_ASCIIEncoder::Encode(CBC_EncoderContext& context, int32_t& e) {
   int32_t n = CBC_HighLevelEncoder::determineConsecutiveDigitCount(
       context.m_msg, context.m_pos);
   if (n >= 2) {
-    wchar_t code = encodeASCIIDigits(context.m_msg[context.m_pos],
-                                     context.m_msg[context.m_pos + 1], e);
-    if (e != BCExceptionNO) {
+    Optional<wchar_t> code = EncodeASCIIDigits(
+        context.m_msg[context.m_pos], context.m_msg[context.m_pos + 1]);
+    if (!code) {
+      e = BCExceptionGeneric;
       return;
     }
-    context.writeCodeword(code);
+    context.writeCodeword(*code);
     context.m_pos += 2;
-  } else {
-    wchar_t c = context.getCurrentChar();
-    int32_t newMode = CBC_HighLevelEncoder::lookAheadTest(
-        context.m_msg, context.m_pos, getEncodingMode());
-    if (newMode != getEncodingMode()) {
-      switch (newMode) {
-        case BASE256_ENCODATION:
-          context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_BASE256);
-          context.signalEncoderChange(BASE256_ENCODATION);
-          return;
-        case C40_ENCODATION:
-          context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_C40);
-          context.signalEncoderChange(C40_ENCODATION);
-          return;
-        case X12_ENCODATION:
-          context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_ANSIX12);
-          context.signalEncoderChange(X12_ENCODATION);
-          break;
-        case TEXT_ENCODATION:
-          context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_TEXT);
-          context.signalEncoderChange(TEXT_ENCODATION);
-          break;
-        case EDIFACT_ENCODATION:
-          context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_EDIFACT);
-          context.signalEncoderChange(EDIFACT_ENCODATION);
-          break;
-        default:
-          e = BCExceptionIllegalStateIllegalMode;
-          return;
-      }
-    } else if (CBC_HighLevelEncoder::isExtendedASCII(c)) {
-      context.writeCodeword(CBC_HighLevelEncoder::UPPER_SHIFT);
-      context.writeCodeword((wchar_t)(c - 128 + 1));
-      context.m_pos++;
-    } else {
-      context.writeCodeword((wchar_t)(c + 1));
-      context.m_pos++;
+    return;
+  }
+
+  wchar_t c = context.getCurrentChar();
+  int32_t newMode = CBC_HighLevelEncoder::lookAheadTest(
+      context.m_msg, context.m_pos, getEncodingMode());
+  if (newMode != getEncodingMode()) {
+    switch (newMode) {
+      case BASE256_ENCODATION:
+        context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_BASE256);
+        context.signalEncoderChange(BASE256_ENCODATION);
+        return;
+      case C40_ENCODATION:
+        context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_C40);
+        context.signalEncoderChange(C40_ENCODATION);
+        return;
+      case X12_ENCODATION:
+        context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_ANSIX12);
+        context.signalEncoderChange(X12_ENCODATION);
+        return;
+      case TEXT_ENCODATION:
+        context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_TEXT);
+        context.signalEncoderChange(TEXT_ENCODATION);
+        return;
+      case EDIFACT_ENCODATION:
+        context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_EDIFACT);
+        context.signalEncoderChange(EDIFACT_ENCODATION);
+        return;
+      default:
+        e = BCExceptionGeneric;
+        return;
     }
   }
-}
-wchar_t CBC_ASCIIEncoder::encodeASCIIDigits(wchar_t digit1,
-                                            wchar_t digit2,
-                                            int32_t& e) {
-  if (CBC_HighLevelEncoder::isDigit(digit1) &&
-      CBC_HighLevelEncoder::isDigit(digit2)) {
-    int32_t num = (digit1 - 48) * 10 + (digit2 - 48);
-    return (wchar_t)(num + 130);
+
+  if (CBC_HighLevelEncoder::isExtendedASCII(c)) {
+    context.writeCodeword(CBC_HighLevelEncoder::UPPER_SHIFT);
+    context.writeCodeword(static_cast<wchar_t>(c - 128 + 1));
+  } else {
+    context.writeCodeword(static_cast<wchar_t>(c + 1));
   }
-  e = BCExceptionIllegalArgumentNotGigits;
-  return 0;
+  context.m_pos++;
 }
diff --git a/fxbarcode/datamatrix/BC_ASCIIEncoder.h b/fxbarcode/datamatrix/BC_ASCIIEncoder.h
index 6eb3a50..35d4c5f 100644
--- a/fxbarcode/datamatrix/BC_ASCIIEncoder.h
+++ b/fxbarcode/datamatrix/BC_ASCIIEncoder.h
@@ -19,9 +19,6 @@
   // CBC_Encoder
   int32_t getEncodingMode() override;
   void Encode(CBC_EncoderContext& context, int32_t& e) override;
-
- private:
-  static wchar_t encodeASCIIDigits(wchar_t digit1, wchar_t digit2, int32_t& e);
 };
 
 #endif  // FXBARCODE_DATAMATRIX_BC_ASCIIENCODER_H_
diff --git a/fxbarcode/utils.h b/fxbarcode/utils.h
index 2303af4..a806029 100644
--- a/fxbarcode/utils.h
+++ b/fxbarcode/utils.h
@@ -62,8 +62,6 @@
 #define BCExceptionIllegalDataCodewords 88
 #define BCExceptionIllegalStateUnexpectedCase 90
 #define BCExceptionIllegalStateMessageLengthInvalid 92
-#define BCExceptionIllegalArgumentNotGigits 93
-#define BCExceptionIllegalStateIllegalMode 94
 #define BCExceptionNonEncodableCharacterDetected 96
 #define BCExceptionGeneric 107