C++ port: some memory leak cleanups
[zxing.git] / cpp / core / src / zxing / oned / EAN8Reader.cpp
index e3c0e2a..f54d0cf 100644 (file)
 #include <zxing/ReaderException.h>
 
 namespace zxing {
-       namespace oned {
-               
-               EAN8Reader::EAN8Reader(){ }
-               
-               int EAN8Reader::decodeMiddle(Ref<BitArray> row, int startRange[], int startRangeLen, std::string& resultString){
-                       const int countersLen = 4;
-                       int counters[countersLen] = { 0, 0, 0, 0 };
-                       
-                       int end = row->getSize();
-                       int rowOffset = startRange[1];
-                       
-                       for (int x = 0; x < 4 && rowOffset < end; x++) {
-                               int bestMatch = decodeDigit(row, counters, countersLen, rowOffset, UPC_EAN_PATTERNS_L_PATTERNS);
-                               resultString.append(1, (char) ('0' + bestMatch));
-                               for (int i = 0; i < countersLen; i++) {
-                                       rowOffset += counters[i];
-                               }
-                       }
-                       
-                       int* middleRange = findGuardPattern(row, rowOffset, true, (int*)getMIDDLE_PATTERN(), getMIDDLE_PATTERN_LEN());
-                       rowOffset = middleRange[1];
-                       
-                       for (int x = 0; x < 4 && rowOffset < end; x++) {
-                               int bestMatch = decodeDigit(row, counters, countersLen, rowOffset, UPC_EAN_PATTERNS_L_PATTERNS);
-                               resultString.append(1, (char) ('0' + bestMatch));
-                               for (int i = 0; i < countersLen; i++) {
-                                       rowOffset += counters[i];
-                               }
-                       }
-                       
-                       return rowOffset;
-               }
-               
-               BarcodeFormat EAN8Reader::getBarcodeFormat(){
-                       return BarcodeFormat_EAN_8;
-               }
-       }
+  namespace oned {
+    
+    EAN8Reader::EAN8Reader(){ }
+    
+    int EAN8Reader::decodeMiddle(Ref<BitArray> row, int startRange[], int startRangeLen, std::string& resultString){
+      const int countersLen = 4;
+      int counters[countersLen] = { 0, 0, 0, 0 };
+      
+      int end = row->getSize();
+      int rowOffset = startRange[1];
+      
+      for (int x = 0; x < 4 && rowOffset < end; x++) {
+        int bestMatch = decodeDigit(row, counters, countersLen, rowOffset, UPC_EAN_PATTERNS_L_PATTERNS);
+        resultString.append(1, (char) ('0' + bestMatch));
+        for (int i = 0; i < countersLen; i++) {
+          rowOffset += counters[i];
+        }
+      }
+      
+                        int* middleRange = 0;
+                        try { 
+                                middleRange = findGuardPattern(row, rowOffset, true, (int*)getMIDDLE_PATTERN(), getMIDDLE_PATTERN_LEN());
+                                rowOffset = middleRange[1];
+      
+                                for (int x = 0; x < 4 && rowOffset < end; x++) {
+                                        int bestMatch = decodeDigit(row, counters, countersLen, rowOffset, UPC_EAN_PATTERNS_L_PATTERNS);
+                                        resultString.append(1, (char) ('0' + bestMatch));
+                                        for (int i = 0; i < countersLen; i++) {
+                                                rowOffset += counters[i];
+                                        }
+                                }
+
+                                delete [] middleRange;
+                                return rowOffset;
+                        } catch (ReaderException const& re) {
+                                delete [] middleRange;
+                                throw re;
+                        }
+    }
+    
+    BarcodeFormat EAN8Reader::getBarcodeFormat(){
+      return BarcodeFormat_EAN_8;
+    }
+  }
 }