diff --git a/cpp/core/src/zxing/oned/CodaBarReader.cpp b/cpp/core/src/zxing/oned/CodaBarReader.cpp index 8fe73c112..b8f85fbcd 100644 --- a/cpp/core/src/zxing/oned/CodaBarReader.cpp +++ b/cpp/core/src/zxing/oned/CodaBarReader.cpp @@ -74,12 +74,13 @@ const int CodaBarReader::PADDING = CodaBarReader::CodaBarReader() : counters(80, 0), counterLength(0) {} -using namespace std; +Ref CodaBarReader::decodeRow(int rowNumber, Ref row) { -Ref CodaBarReader::decodeRow(int rowNumber, - Ref row) { + { // Arrays.fill(counters, 0); + int size = counters.size(); + counters.resize(0); + counters.resize(size); } - // cerr << "cbr " << rowNumber << " " << *row << endl; setCounters(row); int startOffset = findStartPattern(); int nextStart = startOffset; diff --git a/cpp/core/src/zxing/oned/Code39Reader.cpp b/cpp/core/src/zxing/oned/Code39Reader.cpp index 33e8086e6..18fbf111f 100644 --- a/cpp/core/src/zxing/oned/Code39Reader.cpp +++ b/cpp/core/src/zxing/oned/Code39Reader.cpp @@ -53,6 +53,15 @@ namespace { int ASTERISK_ENCODING = 0x094; const char* ALPHABET_STRING = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. *$/+%"; + + std::string alphabet_string (ALPHABET_STRING); +} + +void Code39Reader::init(bool usingCheckDigit_, bool extendedMode_) { + usingCheckDigit = usingCheckDigit_; + extendedMode = extendedMode_; + decodeRowResult.reserve(20); + counters.resize(9); } /** @@ -60,9 +69,8 @@ namespace { * the final character as a check digit. It will not decoded "extended * Code 39" sequences. */ -Code39Reader::Code39Reader() : alphabet_string(ALPHABET_STRING), - usingCheckDigit(false), - extendedMode(false) { +Code39Reader::Code39Reader() { + init(); } /** @@ -72,27 +80,26 @@ Code39Reader::Code39Reader() : alphabet_string(ALPHABET_STRING), * @param usingCheckDigit if true, treat the last data character as a check * digit, not data, and verify that the checksum passes. */ -Code39Reader::Code39Reader(bool usingCheckDigit_) : - alphabet_string(ALPHABET_STRING), - usingCheckDigit(usingCheckDigit_), - extendedMode(false) { +Code39Reader::Code39Reader(bool usingCheckDigit_) { + init(usingCheckDigit_); } - -Code39Reader::Code39Reader(bool usingCheckDigit_, bool extendedMode_) : - alphabet_string(ALPHABET_STRING), - usingCheckDigit(usingCheckDigit_), - extendedMode(extendedMode_) { - } +Code39Reader::Code39Reader(bool usingCheckDigit_, bool extendedMode_) { + init(usingCheckDigit_, extendedMode_); +} Ref Code39Reader::decodeRow(int rowNumber, Ref row) { - vector counters (9, 0); + { // Arrays.fill(counters, 0); + int size = counters.size(); + counters.resize(0); + counters.resize(size); } + decodeRowResult.clear(); + vector start (findAsteriskPattern(row, counters)); // Read off white space int nextStart = row->getNextSet(start[1]); int end = row->getSize(); - std::string result; char decodedChar; int lastStart; do { @@ -102,7 +109,7 @@ Ref Code39Reader::decodeRow(int rowNumber, Ref row) { throw NotFoundException();; } decodedChar = patternToChar(pattern); - result.append(1, decodedChar); + decodeRowResult.append(1, decodedChar); lastStart = nextStart; for (int i = 0, end=counters.size(); i < end; i++) { nextStart += counters[i]; @@ -111,7 +118,7 @@ Ref Code39Reader::decodeRow(int rowNumber, Ref row) { nextStart = row->getNextSet(nextStart); } while (decodedChar != '*'); - result.resize(result.length()-1);// remove asterisk + decodeRowResult.resize(decodeRowResult.length()-1);// remove asterisk // Look for whitespace after pattern: int lastPatternSize = 0; @@ -126,27 +133,27 @@ Ref Code39Reader::decodeRow(int rowNumber, Ref row) { } if (usingCheckDigit) { - int max = result.length() - 1; + int max = decodeRowResult.length() - 1; int total = 0; for (int i = 0; i < max; i++) { - total += alphabet_string.find_first_of(result[i], 0); + total += alphabet_string.find_first_of(decodeRowResult[i], 0); } - if (result[max] != ALPHABET[total % 43]) { + if (decodeRowResult[max] != ALPHABET[total % 43]) { throw ChecksumException(); } - result.resize(max); + decodeRowResult.resize(max); } - if (result.length() == 0) { + if (decodeRowResult.length() == 0) { // Almost false positive throw NotFoundException(); } Ref resultString; if (extendedMode) { - resultString = decodeExtended(result); + resultString = decodeExtended(decodeRowResult); } else { - resultString = Ref(new String(result)); + resultString = Ref(new String(decodeRowResult)); } float left = (float) (start[1] + start[0]) / 2.0f; @@ -163,8 +170,7 @@ Ref Code39Reader::decodeRow(int rowNumber, Ref row) { ); } -vector Code39Reader::findAsteriskPattern(Ref row, - vector& counters){ +vector Code39Reader::findAsteriskPattern(Ref row, vector& counters){ int width = row->getSize(); int rowOffset = row->getNextSet(0); diff --git a/cpp/core/src/zxing/oned/Code39Reader.h b/cpp/core/src/zxing/oned/Code39Reader.h index c68204813..03ce7291e 100644 --- a/cpp/core/src/zxing/oned/Code39Reader.h +++ b/cpp/core/src/zxing/oned/Code39Reader.h @@ -25,9 +25,9 @@ #include namespace zxing { - namespace oned { - class Code39Reader; - } + namespace oned { + class Code39Reader; + } } /** @@ -36,26 +36,28 @@ namespace zxing { * @author Lukasz Warchol */ class zxing::oned::Code39Reader : public OneDReader { - private: - std::string alphabet_string; + bool usingCheckDigit; + bool extendedMode; + std::string decodeRowResult; + std::vector counters; + + void init(bool usingCheckDigit = false, bool extendedMode = false); - bool usingCheckDigit; - bool extendedMode; + static std::vector findAsteriskPattern(Ref row, + std::vector& counters); + static int toNarrowWidePattern(std::vector& counters); + static char patternToChar(int pattern); + static Ref decodeExtended(std::string encoded); - static std::vector findAsteriskPattern(Ref row, - std::vector& counters); - static int toNarrowWidePattern(std::vector& counters); - static char patternToChar(int pattern); - static Ref decodeExtended(std::string encoded); - - void append(char* s, char c); + void append(char* s, char c); + public: - Code39Reader(); - Code39Reader(bool usingCheckDigit_); - Code39Reader(bool usingCheckDigit_, bool extendedMode_); + Code39Reader(); + Code39Reader(bool usingCheckDigit_); + Code39Reader(bool usingCheckDigit_, bool extendedMode_); - Ref decodeRow(int rowNumber, Ref row); + Ref decodeRow(int rowNumber, Ref row); }; #endif