diff --git a/cpp/SConscript b/cpp/SConscript index 22bb17e53..d3245452e 100644 --- a/cpp/SConscript +++ b/cpp/SConscript @@ -1,42 +1,42 @@ -Decider('MD5') - -env = Environment() - -debug = True -compile_options = {} -flags = [] -if debug: - #compile_options['CPPDEFINES'] = "-DDEBUG" - flags.append("-O0 -g3 -Wall") -compile_options['CXXFLAGS'] = ' '.join(flags) - - -def all_files(dir, ext='.cpp', level=5): - files = [] - for i in range(level): - files += Glob(dir + ('/*' * i) + ext) - return files - - - -magick_include = ['/usr/include/ImageMagick/'] -magick_libs = ['Magick++', 'MagickWand', 'MagickCore'] - -cppunit_libs = ['cppunit'] - -zxing_files = all_files('core/src') - -zxing_include = ['core/src'] -zxing_libs = env.Library('zxing', source=zxing_files, CPPPATH=zxing_include, **compile_options) - -app_files = all_files('magick/src') -app_executable = env.Program('zxing', app_files, CPPPATH=magick_include + zxing_include, LIBS=magick_libs + zxing_libs, **compile_options) - -test_files = all_files('core/tests/src') -test_executable = env.Program('testrunner', test_files, CPPPATH=zxing_include, LIBS=zxing_libs + cppunit_libs, **compile_options) - - -Alias('lib', zxing_libs) -Alias('tests', test_executable) -Alias('zxing', app_executable) - +Decider('MD5') + +env = Environment() + +debug = True +compile_options = {} +flags = [] +if debug: + #compile_options['CPPDEFINES'] = "-DDEBUG" + flags.append("-O0 -g3 -Wall") +compile_options['CXXFLAGS'] = ' '.join(flags) + + +def all_files(dir, ext='.cpp', level=5): + files = [] + for i in range(1, level): + files += Glob(dir + ('/*' * i) + ext) + return files + + + +magick_include = ['/usr/include/ImageMagick/'] +magick_libs = ['Magick++', 'MagickWand', 'MagickCore'] + +cppunit_libs = ['cppunit'] + +zxing_files = all_files('core/src') + +zxing_include = ['core/src'] +zxing_libs = env.Library('zxing', source=zxing_files, CPPPATH=zxing_include, **compile_options) + +app_files = all_files('magick/src') +app_executable = env.Program('zxing', app_files, CPPPATH=magick_include + zxing_include, LIBS=magick_libs + zxing_libs, **compile_options) + +test_files = all_files('core/tests/src') +test_executable = env.Program('testrunner', test_files, CPPPATH=zxing_include, LIBS=zxing_libs + cppunit_libs, **compile_options) + + +Alias('lib', zxing_libs) +Alias('tests', test_executable) +Alias('zxing', app_executable) + diff --git a/cpp/core/src/zxing/common/Array.h b/cpp/core/src/zxing/common/Array.h index 150819db9..39b178607 100644 --- a/cpp/core/src/zxing/common/Array.h +++ b/cpp/core/src/zxing/common/Array.h @@ -1,209 +1,209 @@ -#ifndef __ARRAY_H__ -#define __ARRAY_H__ - -/* - * Array.h - * zxing - * - * Created by Christian Brunschen on 07/05/2008. - * Copyright 2008 Google UK. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include - -#ifdef DEBUG_COUNTING -#include -#include -#endif - -#include "Counted.h" - - -namespace zxing { - -template class Array : public Counted { -protected: -public: - std::valarray values_; - Array(size_t n) : - Counted(), values_(T(), n) { - } - Array(T *ts, size_t n) : - Counted(), values_(ts, n) { - } - Array(T v, size_t n) : - Counted(), values_(v, n) { - } - Array(std::valarray &v) : - Counted(), values_(v) { - } - Array(Array &other) : - Counted(), values_(other.values_) { - } - Array(Array *other) : - Counted(), values_(other->values_) { - } - virtual ~Array() { - } - Array& operator=(const Array &other) { -#ifdef DEBUG_COUNTING - cout << "assigning values from Array " << &other << " to this Array " << this << ", "; -#endif - values_ = other.values_; -#ifdef DEBUG_COUNTING - cout << "new size = " << values_.size() << "\n"; -#endif - return *this; - } - Array& operator=(const std::valarray &array) { -#ifdef DEBUG_COUNTING - cout << "assigning values from Array " << &array << " to this Array " << this << ", "; -#endif - values_ = array; -#ifdef DEBUG_COUNTING - cout << "new size = " << values_.size() << "\n"; -#endif - return *this; - } - T operator[](size_t i) const { - return values_[i]; - } - T& operator[](size_t i) { - return values_[i]; - } - size_t size() const { - return values_.size(); - } - std::valarray values() const { - return values_; - } - std::valarray& values() { - return values_; - } -}; - -template class ArrayRef { -private: -public: - Array *array_; - ArrayRef() : - array_(0) { -#ifdef DEBUG_COUNTING - cout << "instantiating empty ArrayRef " << this << "\n"; -#endif - } - ArrayRef(size_t n) : - array_(0) { -#ifdef DEBUG_COUNTING - cout << "instantiating ArrayRef " << this << "with size " << n << "\n"; -#endif - reset(new Array (n)); - } - ArrayRef(T *ts, size_t n) : - array_(0) { -#ifdef DEBUG_COUNTING - cout << "instantiating ArrayRef " << this << "with " << n << " elements at " << (void *)ts << "\n"; -#endif - reset(new Array (ts, n)); - } - ArrayRef(Array *a) : - array_(0) { -#ifdef DEBUG_COUNTING - cout << "instantiating ArrayRef " << this << " from pointer:\n"; -#endif - reset(a); - } - ArrayRef(const Array &a) : - array_(0) { -#ifdef DEBUG_COUNTING - cout << "instantiating ArrayRef " << this << " from reference to Array " << (void *)&a << ":\n"; -#endif - reset(const_cast *>(&a)); - } - ArrayRef(const ArrayRef &other) : - array_(0) { -#ifdef DEBUG_COUNTING - cout << "instantiating ArrayRef " << this << " from ArrayRef " << &other << ":\n"; -#endif - reset(other.array_); - } - - template - ArrayRef(const ArrayRef &other) : - array_(0) { -#ifdef DEBUG_COUNTING - cout << "instantiating ArrayRef " << this << " from ArrayRef " << &other << ":\n"; -#endif - reset(static_cast *>(other.array_)); - } - - ~ArrayRef() { -#ifdef DEBUG_COUNTING - cout << "destroying ArrayRef " << this << " with " << (array_ ? typeid(*array_).name() : "NULL") << " " - << array_ << "\n"; -#endif - if (array_) { - array_->release(); - } - array_ = 0; - } - - T operator[](size_t i) const { - return (*array_)[i]; - } - T& operator[](size_t i) { - return (*array_)[i]; - } - size_t size() const { - return array_->size(); - } - - void reset(Array *a) { -#ifdef DEBUG_COUNTING - cout << "resetting ArrayRef " << this << " from " << (array_ ? typeid(*array_).name() : "NULL") << " " - << array_ << " to " << (a ? typeid(*a).name() : "NULL") << " " << a << "\n"; -#endif - if (a) { - a->retain(); - } - if (array_) { - array_->release(); - } - array_ = a; - } - void reset(const ArrayRef &other) { - reset(other.array_); - } - ArrayRef& operator=(const ArrayRef &other) { - reset(other); - return *this; - } - ArrayRef& operator=(Array *a) { - reset(a); - return *this; - } - - Array& operator*() { - return *array_; - } - Array* operator->() { - return array_; - } -}; - -} // namespace zxing - -#endif // __ARRAY_H__ +#ifndef __ARRAY_H__ +#define __ARRAY_H__ + +/* + * Array.h + * zxing + * + * Created by Christian Brunschen on 07/05/2008. + * Copyright 2008 Google UK. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#ifdef DEBUG_COUNTING +#include +#include +#endif + +#include + + +namespace zxing { + +template class Array : public Counted { +protected: +public: + std::valarray values_; + Array(size_t n) : + Counted(), values_(T(), n) { + } + Array(T *ts, size_t n) : + Counted(), values_(ts, n) { + } + Array(T v, size_t n) : + Counted(), values_(v, n) { + } + Array(std::valarray &v) : + Counted(), values_(v) { + } + Array(Array &other) : + Counted(), values_(other.values_) { + } + Array(Array *other) : + Counted(), values_(other->values_) { + } + virtual ~Array() { + } + Array& operator=(const Array &other) { +#ifdef DEBUG_COUNTING + cout << "assigning values from Array " << &other << " to this Array " << this << ", "; +#endif + values_ = other.values_; +#ifdef DEBUG_COUNTING + cout << "new size = " << values_.size() << "\n"; +#endif + return *this; + } + Array& operator=(const std::valarray &array) { +#ifdef DEBUG_COUNTING + cout << "assigning values from Array " << &array << " to this Array " << this << ", "; +#endif + values_ = array; +#ifdef DEBUG_COUNTING + cout << "new size = " << values_.size() << "\n"; +#endif + return *this; + } + T operator[](size_t i) const { + return values_[i]; + } + T& operator[](size_t i) { + return values_[i]; + } + size_t size() const { + return values_.size(); + } + std::valarray values() const { + return values_; + } + std::valarray& values() { + return values_; + } +}; + +template class ArrayRef { +private: +public: + Array *array_; + ArrayRef() : + array_(0) { +#ifdef DEBUG_COUNTING + cout << "instantiating empty ArrayRef " << this << "\n"; +#endif + } + ArrayRef(size_t n) : + array_(0) { +#ifdef DEBUG_COUNTING + cout << "instantiating ArrayRef " << this << "with size " << n << "\n"; +#endif + reset(new Array (n)); + } + ArrayRef(T *ts, size_t n) : + array_(0) { +#ifdef DEBUG_COUNTING + cout << "instantiating ArrayRef " << this << "with " << n << " elements at " << (void *)ts << "\n"; +#endif + reset(new Array (ts, n)); + } + ArrayRef(Array *a) : + array_(0) { +#ifdef DEBUG_COUNTING + cout << "instantiating ArrayRef " << this << " from pointer:\n"; +#endif + reset(a); + } + ArrayRef(const Array &a) : + array_(0) { +#ifdef DEBUG_COUNTING + cout << "instantiating ArrayRef " << this << " from reference to Array " << (void *)&a << ":\n"; +#endif + reset(const_cast *>(&a)); + } + ArrayRef(const ArrayRef &other) : + array_(0) { +#ifdef DEBUG_COUNTING + cout << "instantiating ArrayRef " << this << " from ArrayRef " << &other << ":\n"; +#endif + reset(other.array_); + } + + template + ArrayRef(const ArrayRef &other) : + array_(0) { +#ifdef DEBUG_COUNTING + cout << "instantiating ArrayRef " << this << " from ArrayRef " << &other << ":\n"; +#endif + reset(static_cast *>(other.array_)); + } + + ~ArrayRef() { +#ifdef DEBUG_COUNTING + cout << "destroying ArrayRef " << this << " with " << (array_ ? typeid(*array_).name() : "NULL") << " " + << array_ << "\n"; +#endif + if (array_) { + array_->release(); + } + array_ = 0; + } + + T operator[](size_t i) const { + return (*array_)[i]; + } + T& operator[](size_t i) { + return (*array_)[i]; + } + size_t size() const { + return array_->size(); + } + + void reset(Array *a) { +#ifdef DEBUG_COUNTING + cout << "resetting ArrayRef " << this << " from " << (array_ ? typeid(*array_).name() : "NULL") << " " + << array_ << " to " << (a ? typeid(*a).name() : "NULL") << " " << a << "\n"; +#endif + if (a) { + a->retain(); + } + if (array_) { + array_->release(); + } + array_ = a; + } + void reset(const ArrayRef &other) { + reset(other.array_); + } + ArrayRef& operator=(const ArrayRef &other) { + reset(other); + return *this; + } + ArrayRef& operator=(Array *a) { + reset(a); + return *this; + } + + Array& operator*() { + return *array_; + } + Array* operator->() { + return array_; + } +}; + +} // namespace zxing + +#endif // __ARRAY_H__ diff --git a/cpp/core/src/zxing/qrcode/decoder/DecodedBitStreamParser.cpp b/cpp/core/src/zxing/qrcode/decoder/DecodedBitStreamParser.cpp index d21d2e957..e4766edae 100644 --- a/cpp/core/src/zxing/qrcode/decoder/DecodedBitStreamParser.cpp +++ b/cpp/core/src/zxing/qrcode/decoder/DecodedBitStreamParser.cpp @@ -23,6 +23,11 @@ #include // Required for compatibility. TODO: test on Symbian +#ifdef ZXING_ICONV_CONST +#undef ICONV_CONST +#define ICONV_CONST const +#endif + #ifndef ICONV_CONST #define ICONV_CONST /**/ #endif @@ -51,8 +56,8 @@ void DecodedBitStreamParser::append(ostream &ost, const unsigned char *bufIn, si } iconv_t cd = iconv_open(UTF8, src); - int maxOut = 4 * nIn + 1; - unsigned char bufOut[maxOut]; + const int maxOut = 4 * nIn + 1; + unsigned char* bufOut = new unsigned char[maxOut]; ICONV_CONST char *fromPtr = (ICONV_CONST char *)bufIn; size_t nFrom = nIn; @@ -63,6 +68,7 @@ void DecodedBitStreamParser::append(ostream &ost, const unsigned char *bufIn, si size_t oneway = iconv(cd, &fromPtr, &nFrom, &toPtr, &nTo); if (oneway == (size_t)(-1)) { iconv_close(cd); + delete[] bufOut; throw ReaderException("error converting characters"); } } @@ -72,13 +78,14 @@ void DecodedBitStreamParser::append(ostream &ost, const unsigned char *bufIn, si bufOut[nResult] = '\0'; ost << bufOut; + delete[] bufOut; } void DecodedBitStreamParser::decodeKanjiSegment(Ref bits, ostringstream &result, int count) { // Each character will require 2 bytes. Read the characters as 2-byte pairs // and decode as Shift_JIS afterwards size_t nBytes = 2 * count; - unsigned char buffer[nBytes]; + unsigned char* buffer = new unsigned char[nBytes]; int offset = 0; while (count > 0) { // Each 13 bits encodes a 2-byte character @@ -99,14 +106,16 @@ void DecodedBitStreamParser::decodeKanjiSegment(Ref bits, ostringstre } append(result, buffer, nBytes, SHIFT_JIS); + delete[] buffer; } void DecodedBitStreamParser::decodeByteSegment(Ref bits, ostringstream &result, int count) { int nBytes = count; - unsigned char readBytes[nBytes]; + unsigned char* readBytes = new unsigned char[nBytes]; if (count << 3 > bits->available()) { ostringstream s; s << "Count too large: " << count; + delete[] readBytes; throw ReaderException(s.str().c_str()); } for (int i = 0; i < count; i++) { @@ -119,11 +128,12 @@ void DecodedBitStreamParser::decodeByteSegment(Ref bits, ostringstrea // give a hint. const char *encoding = guessEncoding(readBytes, nBytes); append(result, readBytes, nBytes, encoding); + delete[] readBytes; } void DecodedBitStreamParser::decodeNumericSegment(Ref bits, ostringstream &result, int count) { int nBytes = count; - unsigned char bytes[nBytes]; + unsigned char* bytes = new unsigned char[nBytes]; int i = 0; // Read three digits at a time while (count >= 3) { @@ -132,6 +142,7 @@ void DecodedBitStreamParser::decodeNumericSegment(Ref bits, ostringst if (threeDigitsBits >= 1000) { ostringstream s; s << "Illegal value for 3-digit unit: " << threeDigitsBits; + delete[] bytes; throw ReaderException(s.str().c_str()); } bytes[i++] = ALPHANUMERIC_CHARS[threeDigitsBits / 100]; @@ -145,6 +156,7 @@ void DecodedBitStreamParser::decodeNumericSegment(Ref bits, ostringst if (twoDigitsBits >= 100) { ostringstream s; s << "Illegal value for 2-digit unit: " << twoDigitsBits; + delete[] bytes; throw ReaderException(s.str().c_str()); } bytes[i++] = ALPHANUMERIC_CHARS[twoDigitsBits / 10]; @@ -155,16 +167,18 @@ void DecodedBitStreamParser::decodeNumericSegment(Ref bits, ostringst if (digitBits >= 10) { ostringstream s; s << "Illegal value for digit unit: " << digitBits; + delete[] bytes; throw ReaderException(s.str().c_str()); } bytes[i++] = ALPHANUMERIC_CHARS[digitBits]; } append(result, bytes, nBytes, ASCII); + delete[] bytes; } void DecodedBitStreamParser::decodeAlphanumericSegment(Ref bits, ostringstream &result, int count) { int nBytes = count; - unsigned char bytes[nBytes]; + unsigned char* bytes = new unsigned char[nBytes]; int i = 0; // Read two characters at a time while (count > 1) { @@ -177,6 +191,7 @@ void DecodedBitStreamParser::decodeAlphanumericSegment(Ref bits, ostr bytes[i++] = ALPHANUMERIC_CHARS[bits->readBits(6)]; } append(result, bytes, nBytes, ASCII); + delete[] bytes; } const char * diff --git a/cpp/core/src/zxing/qrcode/detector/AlignmentPatternFinder.cpp b/cpp/core/src/zxing/qrcode/detector/AlignmentPatternFinder.cpp index 87af79edf..029f5b883 100644 --- a/cpp/core/src/zxing/qrcode/detector/AlignmentPatternFinder.cpp +++ b/cpp/core/src/zxing/qrcode/detector/AlignmentPatternFinder.cpp @@ -46,7 +46,7 @@ bool AlignmentPatternFinder::foundPatternCross(valarray &stateCount) { float AlignmentPatternFinder::crossCheckVertical(size_t startI, size_t centerJ, int maxCount, int originalStateCountTotal) { int maxI = image_->getHeight(); - valarray stateCount(3); + valarray stateCount(0, 3); // Start counting up from center @@ -136,7 +136,7 @@ Ref AlignmentPatternFinder::find() { // Ref luminanceRow(new BitArray(width_)); // We are looking for black/white/black modules in 1:1:1 ratio; // this tracks the number of black/white/black modules seen so far - valarray stateCount(3); + valarray stateCount(0, 3); for (size_t iGen = 0; iGen < height_; iGen++) { // Search from middle outwards size_t i = middleI + ((iGen & 0x01) == 0 ? ((iGen + 1) >> 1) : -((iGen + 1) >> 1));