summaryrefslogtreecommitdiff
path: root/fxbarcode/datamatrix
diff options
context:
space:
mode:
Diffstat (limited to 'fxbarcode/datamatrix')
-rw-r--r--fxbarcode/datamatrix/BC_ASCIIEncoder.cpp112
-rw-r--r--fxbarcode/datamatrix/BC_ASCIIEncoder.h3
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_