Fixing some issues in C++ port regarding 1D barcode readers
[zxing.git] / cpp / core / src / zxing / oned / Code128Reader.cpp
index 6f638d5..36ab5dc 100644 (file)
@@ -24,6 +24,7 @@
 #include <zxing/ReaderException.h>
 #include <math.h>
 #include <string.h>
+#include <sstream>
 
 namespace zxing {
        namespace oned {
@@ -166,10 +167,10 @@ namespace zxing {
                                        counters[counterPosition]++;
                                } else {
                                        if (counterPosition == patternLength - 1) {
-                                               int bestVariance = MAX_AVG_VARIANCE;
+                                               unsigned int bestVariance = MAX_AVG_VARIANCE;
                                                int bestMatch = -1;
                                                for (int startCode = CODE_START_A; startCode <= CODE_START_C; startCode++) {
-                                                       int variance = patternMatchVariance(counters, sizeof(counters)/sizeof(int), CODE_PATTERNS[startCode], MAX_INDIVIDUAL_VARIANCE);
+                                                       unsigned int variance = patternMatchVariance(counters, sizeof(counters)/sizeof(int), CODE_PATTERNS[startCode], MAX_INDIVIDUAL_VARIANCE);
                                                        if (variance < bestVariance) {
                                                                bestVariance = variance;
                                                                bestMatch = startCode;
@@ -204,7 +205,7 @@ namespace zxing {
                
                int Code128Reader::decodeCode(Ref<BitArray> row, int counters[], int countersCount, int rowOffset){
                        recordPattern(row, rowOffset, counters, countersCount);
-                       int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept
+                       unsigned int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept
                        int bestMatch = -1;
                        for (int d = 0; d < CODE_PATTERNS_LENGTH; d++) {
                                int pattern[countersLength];
@@ -213,7 +214,7 @@ namespace zxing {
                                        pattern[ind] = CODE_PATTERNS[d][ind];
                                }
 //                             memcpy(pattern, CODE_PATTERNS[d], countersLength);
-                               int variance = patternMatchVariance(counters, countersCount, pattern, MAX_INDIVIDUAL_VARIANCE);
+                               unsigned int variance = patternMatchVariance(counters, countersCount, pattern, MAX_INDIVIDUAL_VARIANCE);
                                if (variance < bestVariance) {
                                        bestVariance = variance;
                                        bestMatch = d;
@@ -251,7 +252,7 @@ namespace zxing {
                        bool isNextShifted = false;
                        
                        std::string tmpResultString;
-
+                       std::stringstream tmpResultSStr; // used if its Code 128C
                        
                        int lastStart = startPatternInfo[0];
                        int nextStart = startPatternInfo[1];
@@ -373,11 +374,11 @@ namespace zxing {
                                                }
                                                break;
                                        case CODE_CODE_C:
+                                       // the code read in this case is the number encoded directly
                                                if (code < 100) {
-                                                       if (code < 10) {
-                                                               tmpResultString.append(1, '0');
-                                                       }
-                                                       tmpResultString.append(1, code);
+                                                       if (code < 10) 
+                                                       tmpResultSStr << '0';
+                                               tmpResultSStr << code;
                                                } else {
                                                        if (code != CODE_STOP) {
                                                                lastCharacterWasPrintable = false;
@@ -437,6 +438,9 @@ namespace zxing {
                                throw ReaderException("");
                        }
                        
+                       if (codeSet == CODE_CODE_C)
+                               tmpResultString.append(tmpResultSStr.str());
+                       
                        // Need to pull out the check digits from string
                        int resultLength = tmpResultString.length();
                        // Only bother if the result had at least one character, and if the checksum digit happened to