diff options
Diffstat (limited to 'fxbarcode/datamatrix')
-rw-r--r-- | fxbarcode/datamatrix/BC_ASCIIEncoder.cpp | 112 | ||||
-rw-r--r-- | fxbarcode/datamatrix/BC_ASCIIEncoder.h | 3 |
2 files changed, 61 insertions, 54 deletions
diff --git a/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp b/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp index e6b7a2b35b..813c31ec0b 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 6eb3a50669..35d4c5f82f 100644 --- a/fxbarcode/datamatrix/BC_ASCIIEncoder.h +++ b/fxbarcode/datamatrix/BC_ASCIIEncoder.h @@ -19,9 +19,6 @@ class CBC_ASCIIEncoder : public CBC_Encoder { // 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_ |