Remove gotos in JBig2 code.
authorLei Zhang <thestig@chromium.org>
Wed, 7 Oct 2015 17:37:07 +0000 (10:37 -0700)
committerLei Zhang <thestig@chromium.org>
Wed, 7 Oct 2015 17:37:07 +0000 (10:37 -0700)
R=tsepez@chromium.org

Review URL: https://codereview.chromium.org/1382613003 .

core/src/fxcodec/jbig2/JBig2_Context.cpp
core/src/fxcodec/jbig2/JBig2_Context.h
core/src/fxcodec/jbig2/JBig2_GsidProc.cpp
core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp

index ca895e5..3e0ebb3 100644 (file)
 #include "JBig2_SddProc.h"
 #include "JBig2_TrdProc.h"
 
+namespace {
+
+size_t GetHuffContextSize(uint8_t val) {
+  return val == 0 ? 65536 : val == 1 ? 8192 : 1024;
+}
+
+size_t GetRefAggContextSize(FX_BOOL val) {
+  return val ? 1024 : 8192;
+}
+
+}  // namespace
+
 // Implement a very small least recently used (LRU) cache. It is very
 // common for a JBIG2 dictionary to span multiple pages in a PDF file,
 // and we do not want to decode the same dictionary over and over
@@ -57,7 +69,6 @@ CJBig2_Context::CJBig2_Context(const uint8_t* pGlobalData,
       m_PauseStep(10),
       m_pPause(pPause),
       m_ProcessingStatus(FXCODEC_STATUS_FRAME_READY),
-      m_pArithDecoder(NULL),
       m_gbContext(NULL),
       m_dwOffset(0),
       m_pSymbolDictCache(pSymbolDictCache) {
@@ -72,8 +83,6 @@ CJBig2_Context::CJBig2_Context(const uint8_t* pGlobalData,
 }
 
 CJBig2_Context::~CJBig2_Context() {
-  delete m_pArithDecoder;
-  m_pArithDecoder = NULL;
   FX_Free(m_gbContext);
   m_gbContext = NULL;
   delete m_pGlobalContext;
@@ -101,7 +110,7 @@ int32_t CJBig2_Context::decode_SquentialOrgnazation(IFX_Pause* pPause) {
       m_PauseStep = 2;
       return JBIG2_SUCCESS;
     }
-    if ((nRet == JBIG2_END_OF_PAGE) || (nRet == JBIG2_END_OF_FILE)) {
+    if (nRet == JBIG2_END_OF_PAGE || nRet == JBIG2_END_OF_FILE) {
       m_pSegment.reset();
       return JBIG2_SUCCESS;
     }
@@ -152,7 +161,7 @@ int32_t CJBig2_Context::decode_RandomOrgnazation(IFX_Pause* pPause) {
   for (; m_nSegmentDecoded < m_SegmentList.size(); ++m_nSegmentDecoded) {
     int32_t nRet =
         parseSegmentData(m_SegmentList.get(m_nSegmentDecoded), pPause);
-    if ((nRet == JBIG2_END_OF_PAGE) || (nRet == JBIG2_END_OF_FILE))
+    if (nRet == JBIG2_END_OF_PAGE || nRet == JBIG2_END_OF_FILE)
       return JBIG2_SUCCESS;
 
     if (nRet != JBIG2_SUCCESS)
@@ -221,15 +230,14 @@ int32_t CJBig2_Context::Continue(IFX_Pause* pPause) {
 }
 
 CJBig2_Segment* CJBig2_Context::findSegmentByNumber(FX_DWORD dwNumber) {
-  CJBig2_Segment* pSeg;
   if (m_pGlobalContext) {
-    pSeg = m_pGlobalContext->findSegmentByNumber(dwNumber);
+    CJBig2_Segment* pSeg = m_pGlobalContext->findSegmentByNumber(dwNumber);
     if (pSeg) {
       return pSeg;
     }
   }
   for (size_t i = 0; i < m_SegmentList.size(); ++i) {
-    pSeg = m_SegmentList.get(i);
+    CJBig2_Segment* pSeg = m_SegmentList.get(i);
     if (pSeg->m_dwNumber == dwNumber) {
       return pSeg;
     }
@@ -240,24 +248,21 @@ CJBig2_Segment* CJBig2_Context::findReferredSegmentByTypeAndIndex(
     CJBig2_Segment* pSegment,
     uint8_t cType,
     int32_t nIndex) {
-  CJBig2_Segment* pSeg;
-  int32_t i, count;
-  count = 0;
-  for (i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
-    pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);
+  int32_t count = 0;
+  for (int32_t i = 0; i < pSegment->m_nReferred_to_segment_count; ++i) {
+    CJBig2_Segment* pSeg =
+        findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);
     if (pSeg && pSeg->m_cFlags.s.type == cType) {
-      if (count == nIndex) {
+      if (count == nIndex)
         return pSeg;
-      } else {
-        count++;
-      }
+      ++count;
     }
   }
   return NULL;
 }
 int32_t CJBig2_Context::parseSegmentHeader(CJBig2_Segment* pSegment) {
-  if ((m_pStream->readInteger(&pSegment->m_dwNumber) != 0) ||
-      (m_pStream->read1Byte(&pSegment->m_cFlags.c) != 0)) {
+  if (m_pStream->readInteger(&pSegment->m_dwNumber) != 0 ||
+      m_pStream->read1Byte(&pSegment->m_cFlags.c) != 0) {
     return JBIG2_ERROR_TOO_SHORT;
   }
 
@@ -287,7 +292,7 @@ int32_t CJBig2_Context::parseSegmentHeader(CJBig2_Segment* pSegment) {
   if (pSegment->m_nReferred_to_segment_count) {
     pSegment->m_pReferred_to_segment_numbers =
         FX_Alloc(FX_DWORD, pSegment->m_nReferred_to_segment_count);
-    for (int32_t i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
+    for (int32_t i = 0; i < pSegment->m_nReferred_to_segment_count; ++i) {
       switch (cSSize) {
         case 1:
           if (m_pStream->read1Byte(&cTemp) != 0)
@@ -374,12 +379,12 @@ int32_t CJBig2_Context::ProcessingParseSegmentData(CJBig2_Segment* pSegment,
     case 48: {
       FX_WORD wTemp;
       nonstd::unique_ptr<JBig2PageInfo> pPageInfo(new JBig2PageInfo);
-      if ((m_pStream->readInteger(&pPageInfo->m_dwWidth) != 0) ||
-          (m_pStream->readInteger(&pPageInfo->m_dwHeight) != 0) ||
-          (m_pStream->readInteger(&pPageInfo->m_dwResolutionX) != 0) ||
-          (m_pStream->readInteger(&pPageInfo->m_dwResolutionY) != 0) ||
-          (m_pStream->read1Byte(&pPageInfo->m_cFlags) != 0) ||
-          (m_pStream->readShortInteger(&wTemp) != 0)) {
+      if (m_pStream->readInteger(&pPageInfo->m_dwWidth) != 0 ||
+          m_pStream->readInteger(&pPageInfo->m_dwHeight) != 0 ||
+          m_pStream->readInteger(&pPageInfo->m_dwResolutionX) != 0 ||
+          m_pStream->readInteger(&pPageInfo->m_dwResolutionY) != 0 ||
+          m_pStream->read1Byte(&pPageInfo->m_cFlags) != 0 ||
+          m_pStream->readShortInteger(&wTemp) != 0) {
         return JBIG2_ERROR_TOO_SHORT;
       }
       pPageInfo->m_bIsStriped = ((wTemp >> 15) & 1) ? TRUE : FALSE;
@@ -428,200 +433,175 @@ int32_t CJBig2_Context::ProcessingParseSegmentData(CJBig2_Segment* pSegment,
 
 int32_t CJBig2_Context::parseSymbolDict(CJBig2_Segment* pSegment,
                                         IFX_Pause* pPause) {
-  FX_DWORD dwTemp;
   FX_WORD wFlags;
-  uint8_t cSDHUFFDH, cSDHUFFDW, cSDHUFFBMSIZE, cSDHUFFAGGINST;
-  CJBig2_HuffmanTable* Table_B1 = nullptr;
-  CJBig2_HuffmanTable* Table_B2 = nullptr;
-  CJBig2_HuffmanTable* Table_B3 = nullptr;
-  CJBig2_HuffmanTable* Table_B4 = nullptr;
-  CJBig2_HuffmanTable* Table_B5 = nullptr;
-  int32_t i, nIndex, nRet;
-  CJBig2_Segment* pSeg = nullptr;
-  CJBig2_Segment* pLRSeg = nullptr;
-  FX_BOOL bUsed;
-  CJBig2_Image** SDINSYMS = nullptr;
-  JBig2ArithCtx* gbContext = nullptr;
-  JBig2ArithCtx* grContext = nullptr;
-  CJBig2_ArithDecoder* pArithDecoder;
-  CJBig2_SDDProc* pSymbolDictDecoder = new CJBig2_SDDProc();
-  const uint8_t* key = pSegment->m_pData;
-  FX_BOOL cache_hit = false;
-  if (m_pStream->readShortInteger(&wFlags) != 0) {
-    nRet = JBIG2_ERROR_TOO_SHORT;
-    goto failed;
-  }
+  if (m_pStream->readShortInteger(&wFlags) != 0)
+    return JBIG2_ERROR_TOO_SHORT;
+
+  nonstd::unique_ptr<CJBig2_SDDProc> pSymbolDictDecoder(new CJBig2_SDDProc);
   pSymbolDictDecoder->SDHUFF = wFlags & 0x0001;
   pSymbolDictDecoder->SDREFAGG = (wFlags >> 1) & 0x0001;
   pSymbolDictDecoder->SDTEMPLATE = (wFlags >> 10) & 0x0003;
   pSymbolDictDecoder->SDRTEMPLATE = (wFlags >> 12) & 0x0003;
-  cSDHUFFDH = (wFlags >> 2) & 0x0003;
-  cSDHUFFDW = (wFlags >> 4) & 0x0003;
-  cSDHUFFBMSIZE = (wFlags >> 6) & 0x0001;
-  cSDHUFFAGGINST = (wFlags >> 7) & 0x0001;
+  uint8_t cSDHUFFDH = (wFlags >> 2) & 0x0003;
+  uint8_t cSDHUFFDW = (wFlags >> 4) & 0x0003;
+  uint8_t cSDHUFFBMSIZE = (wFlags >> 6) & 0x0001;
+  uint8_t cSDHUFFAGGINST = (wFlags >> 7) & 0x0001;
   if (pSymbolDictDecoder->SDHUFF == 0) {
-    if (pSymbolDictDecoder->SDTEMPLATE == 0) {
-      dwTemp = 8;
-    } else {
-      dwTemp = 2;
-    }
-    for (i = 0; i < (int32_t)dwTemp; i++) {
-      if (m_pStream->read1Byte((uint8_t*)&pSymbolDictDecoder->SDAT[i]) != 0) {
-        nRet = JBIG2_ERROR_TOO_SHORT;
-        goto failed;
-      }
+    const FX_DWORD dwTemp = (pSymbolDictDecoder->SDTEMPLATE == 0) ? 8 : 2;
+    for (FX_DWORD i = 0; i < dwTemp; ++i) {
+      if (m_pStream->read1Byte((uint8_t*)&pSymbolDictDecoder->SDAT[i]) != 0)
+        return JBIG2_ERROR_TOO_SHORT;
     }
   }
-  if ((pSymbolDictDecoder->SDREFAGG == 1) &&
-      (pSymbolDictDecoder->SDRTEMPLATE == 0)) {
-    for (i = 0; i < 4; i++) {
-      if (m_pStream->read1Byte((uint8_t*)&pSymbolDictDecoder->SDRAT[i]) != 0) {
-        nRet = JBIG2_ERROR_TOO_SHORT;
-        goto failed;
-      }
+  if (pSymbolDictDecoder->SDREFAGG == 1 &&
+      pSymbolDictDecoder->SDRTEMPLATE == 0) {
+    for (int32_t i = 0; i < 4; ++i) {
+      if (m_pStream->read1Byte((uint8_t*)&pSymbolDictDecoder->SDRAT[i]) != 0)
+        return JBIG2_ERROR_TOO_SHORT;
     }
   }
-  if ((m_pStream->readInteger(&pSymbolDictDecoder->SDNUMEXSYMS) != 0) ||
-      (m_pStream->readInteger(&pSymbolDictDecoder->SDNUMNEWSYMS) != 0)) {
-    nRet = JBIG2_ERROR_TOO_SHORT;
-    goto failed;
+  if (m_pStream->readInteger(&pSymbolDictDecoder->SDNUMEXSYMS) != 0 ||
+      m_pStream->readInteger(&pSymbolDictDecoder->SDNUMNEWSYMS) != 0) {
+    return JBIG2_ERROR_TOO_SHORT;
   }
   if (pSymbolDictDecoder->SDNUMEXSYMS > JBIG2_MAX_EXPORT_SYSMBOLS ||
       pSymbolDictDecoder->SDNUMNEWSYMS > JBIG2_MAX_NEW_SYSMBOLS) {
-    nRet = JBIG2_ERROR_LIMIT;
-    goto failed;
+    return JBIG2_ERROR_LIMIT;
   }
-  for (i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
-    if (!findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i])) {
-      nRet = JBIG2_ERROR_FATAL;
-      goto failed;
-    }
+  for (int32_t i = 0; i < pSegment->m_nReferred_to_segment_count; ++i) {
+    if (!findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]))
+      return JBIG2_ERROR_FATAL;
   }
+  CJBig2_Segment* pLRSeg = nullptr;
   pSymbolDictDecoder->SDNUMINSYMS = 0;
-  for (i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
-    pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);
+  for (int32_t i = 0; i < pSegment->m_nReferred_to_segment_count; ++i) {
+    CJBig2_Segment* pSeg =
+        findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);
     if (pSeg->m_cFlags.s.type == 0) {
       pSymbolDictDecoder->SDNUMINSYMS += pSeg->m_Result.sd->SDNUMEXSYMS;
       pLRSeg = pSeg;
     }
   }
-  if (pSymbolDictDecoder->SDNUMINSYMS == 0) {
-    SDINSYMS = NULL;
-  } else {
-    SDINSYMS = FX_Alloc(CJBig2_Image*, pSymbolDictDecoder->SDNUMINSYMS);
-    dwTemp = 0;
-    for (i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
-      pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);
+
+  nonstd::unique_ptr<CJBig2_Image*, FxFreeDeleter> SDINSYMS;
+  if (pSymbolDictDecoder->SDNUMINSYMS != 0) {
+    SDINSYMS.reset(FX_Alloc(CJBig2_Image*, pSymbolDictDecoder->SDNUMINSYMS));
+    FX_DWORD dwTemp = 0;
+    for (int32_t i = 0; i < pSegment->m_nReferred_to_segment_count; ++i) {
+      CJBig2_Segment* pSeg =
+          findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);
       if (pSeg->m_cFlags.s.type == 0) {
-        JBIG2_memcpy(SDINSYMS + dwTemp, pSeg->m_Result.sd->SDEXSYMS,
+        JBIG2_memcpy(SDINSYMS.get() + dwTemp, pSeg->m_Result.sd->SDEXSYMS,
                      pSeg->m_Result.sd->SDNUMEXSYMS * sizeof(CJBig2_Image*));
         dwTemp += pSeg->m_Result.sd->SDNUMEXSYMS;
       }
     }
   }
-  pSymbolDictDecoder->SDINSYMS = SDINSYMS;
+  pSymbolDictDecoder->SDINSYMS = SDINSYMS.get();
+
+  nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B1;
+  nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B2;
+  nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B3;
+  nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B4;
+  nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B5;
   if (pSymbolDictDecoder->SDHUFF == 1) {
-    if ((cSDHUFFDH == 2) || (cSDHUFFDW == 2)) {
-      nRet = JBIG2_ERROR_FATAL;
-      goto failed;
-    }
-    nIndex = 0;
+    if (cSDHUFFDH == 2 || cSDHUFFDW == 2)
+      return JBIG2_ERROR_FATAL;
+
+    int32_t nIndex = 0;
     if (cSDHUFFDH == 0) {
-      Table_B4 = new CJBig2_HuffmanTable(HuffmanTable_B4,
-                                         FX_ArraySize(HuffmanTable_B4),
-                                         HuffmanTable_HTOOB_B4);
-      pSymbolDictDecoder->SDHUFFDH = Table_B4;
+      Table_B4.reset(new CJBig2_HuffmanTable(HuffmanTable_B4,
+                                             FX_ArraySize(HuffmanTable_B4),
+                                             HuffmanTable_HTOOB_B4));
+      pSymbolDictDecoder->SDHUFFDH = Table_B4.get();
     } else if (cSDHUFFDH == 1) {
-      Table_B5 = new CJBig2_HuffmanTable(HuffmanTable_B5,
-                                         FX_ArraySize(HuffmanTable_B5),
-                                         HuffmanTable_HTOOB_B5);
-      pSymbolDictDecoder->SDHUFFDH = Table_B5;
+      Table_B5.reset(new CJBig2_HuffmanTable(HuffmanTable_B5,
+                                             FX_ArraySize(HuffmanTable_B5),
+                                             HuffmanTable_HTOOB_B5));
+      pSymbolDictDecoder->SDHUFFDH = Table_B5.get();
     } else {
-      pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
-      if (!pSeg) {
-        nRet = JBIG2_ERROR_FATAL;
-        goto failed;
-      }
+      CJBig2_Segment* pSeg =
+          findReferredSegmentByTypeAndIndex(pSegment, 53, ++nIndex);
+      if (!pSeg)
+        return JBIG2_ERROR_FATAL;
       pSymbolDictDecoder->SDHUFFDH = pSeg->m_Result.ht;
     }
     if (cSDHUFFDW == 0) {
-      Table_B2 = new CJBig2_HuffmanTable(HuffmanTable_B2,
-                                         FX_ArraySize(HuffmanTable_B2),
-                                         HuffmanTable_HTOOB_B2);
-      pSymbolDictDecoder->SDHUFFDW = Table_B2;
+      Table_B2.reset(new CJBig2_HuffmanTable(HuffmanTable_B2,
+                                             FX_ArraySize(HuffmanTable_B2),
+                                             HuffmanTable_HTOOB_B2));
+      pSymbolDictDecoder->SDHUFFDW = Table_B2.get();
     } else if (cSDHUFFDW == 1) {
-      Table_B3 = new CJBig2_HuffmanTable(HuffmanTable_B3,
-                                         FX_ArraySize(HuffmanTable_B3),
-                                         HuffmanTable_HTOOB_B3);
-      pSymbolDictDecoder->SDHUFFDW = Table_B3;
+      Table_B3.reset(new CJBig2_HuffmanTable(HuffmanTable_B3,
+                                             FX_ArraySize(HuffmanTable_B3),
+                                             HuffmanTable_HTOOB_B3));
+      pSymbolDictDecoder->SDHUFFDW = Table_B3.get();
     } else {
-      pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
-      if (!pSeg) {
-        nRet = JBIG2_ERROR_FATAL;
-        goto failed;
-      }
+      CJBig2_Segment* pSeg =
+          findReferredSegmentByTypeAndIndex(pSegment, 53, ++nIndex);
+      if (!pSeg)
+        return JBIG2_ERROR_FATAL;
       pSymbolDictDecoder->SDHUFFDW = pSeg->m_Result.ht;
     }
     if (cSDHUFFBMSIZE == 0) {
-      Table_B1 = new CJBig2_HuffmanTable(HuffmanTable_B1,
-                                         FX_ArraySize(HuffmanTable_B1),
-                                         HuffmanTable_HTOOB_B1);
-      pSymbolDictDecoder->SDHUFFBMSIZE = Table_B1;
+      Table_B1.reset(new CJBig2_HuffmanTable(HuffmanTable_B1,
+                                             FX_ArraySize(HuffmanTable_B1),
+                                             HuffmanTable_HTOOB_B1));
+      pSymbolDictDecoder->SDHUFFBMSIZE = Table_B1.get();
     } else {
-      pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
-      if (!pSeg) {
-        nRet = JBIG2_ERROR_FATAL;
-        goto failed;
-      }
+      CJBig2_Segment* pSeg =
+          findReferredSegmentByTypeAndIndex(pSegment, 53, ++nIndex);
+      if (!pSeg)
+        return JBIG2_ERROR_FATAL;
       pSymbolDictDecoder->SDHUFFBMSIZE = pSeg->m_Result.ht;
     }
     if (pSymbolDictDecoder->SDREFAGG == 1) {
       if (cSDHUFFAGGINST == 0) {
         if (!Table_B1) {
-          Table_B1 = new CJBig2_HuffmanTable(HuffmanTable_B1,
-                                             FX_ArraySize(HuffmanTable_B1),
-                                             HuffmanTable_HTOOB_B1);
+          Table_B1.reset(new CJBig2_HuffmanTable(HuffmanTable_B1,
+                                                 FX_ArraySize(HuffmanTable_B1),
+                                                 HuffmanTable_HTOOB_B1));
         }
-        pSymbolDictDecoder->SDHUFFAGGINST = Table_B1;
+        pSymbolDictDecoder->SDHUFFAGGINST = Table_B1.get();
       } else {
-        pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
-        if (!pSeg) {
-          nRet = JBIG2_ERROR_FATAL;
-          goto failed;
-        }
+        CJBig2_Segment* pSeg =
+            findReferredSegmentByTypeAndIndex(pSegment, 53, ++nIndex);
+        if (!pSeg)
+          return JBIG2_ERROR_FATAL;
         pSymbolDictDecoder->SDHUFFAGGINST = pSeg->m_Result.ht;
       }
     }
   }
+
+  nonstd::unique_ptr<JBig2ArithCtx, FxFreeDeleter> gbContext;
+  nonstd::unique_ptr<JBig2ArithCtx, FxFreeDeleter> grContext;
   if ((wFlags & 0x0100) && pLRSeg && pLRSeg->m_Result.sd->m_bContextRetained) {
     if (pSymbolDictDecoder->SDHUFF == 0) {
-      dwTemp = pSymbolDictDecoder->SDTEMPLATE == 0
-                   ? 65536
-                   : pSymbolDictDecoder->SDTEMPLATE == 1 ? 8192 : 1024;
-      gbContext = FX_Alloc(JBig2ArithCtx, dwTemp);
-      JBIG2_memcpy(gbContext, pLRSeg->m_Result.sd->m_gbContext,
-                   sizeof(JBig2ArithCtx) * dwTemp);
+      const size_t size = GetHuffContextSize(pSymbolDictDecoder->SDTEMPLATE);
+      gbContext.reset(FX_Alloc(JBig2ArithCtx, size));
+      JBIG2_memcpy(gbContext.get(), pLRSeg->m_Result.sd->m_gbContext,
+                   sizeof(JBig2ArithCtx) * size);
     }
     if (pSymbolDictDecoder->SDREFAGG == 1) {
-      dwTemp = pSymbolDictDecoder->SDRTEMPLATE ? 1 << 10 : 1 << 13;
-      grContext = FX_Alloc(JBig2ArithCtx, dwTemp);
-      JBIG2_memcpy(grContext, pLRSeg->m_Result.sd->m_grContext,
-                   sizeof(JBig2ArithCtx) * dwTemp);
+      const size_t size = GetRefAggContextSize(pSymbolDictDecoder->SDRTEMPLATE);
+      grContext.reset(FX_Alloc(JBig2ArithCtx, size));
+      JBIG2_memcpy(grContext.get(), pLRSeg->m_Result.sd->m_grContext,
+                   sizeof(JBig2ArithCtx) * size);
     }
   } else {
     if (pSymbolDictDecoder->SDHUFF == 0) {
-      dwTemp = pSymbolDictDecoder->SDTEMPLATE == 0
-                   ? 65536
-                   : pSymbolDictDecoder->SDTEMPLATE == 1 ? 8192 : 1024;
-      gbContext = FX_Alloc(JBig2ArithCtx, dwTemp);
-      JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx) * dwTemp);
+      const size_t size = GetHuffContextSize(pSymbolDictDecoder->SDTEMPLATE);
+      gbContext.reset(FX_Alloc(JBig2ArithCtx, size));
+      JBIG2_memset(gbContext.get(), 0, sizeof(JBig2ArithCtx) * size);
     }
     if (pSymbolDictDecoder->SDREFAGG == 1) {
-      dwTemp = pSymbolDictDecoder->SDRTEMPLATE ? 1 << 10 : 1 << 13;
-      grContext = FX_Alloc(JBig2ArithCtx, dwTemp);
-      JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx) * dwTemp);
+      const size_t size = GetRefAggContextSize(pSymbolDictDecoder->SDRTEMPLATE);
+      grContext.reset(FX_Alloc(JBig2ArithCtx, size));
+      JBIG2_memset(grContext.get(), 0, sizeof(JBig2ArithCtx) * size);
     }
   }
+  const uint8_t* key = pSegment->m_pData;
+  FX_BOOL cache_hit = false;
   pSegment->m_nResultType = JBIG2_SYMBOL_DICT_POINTER;
   for (std::list<CJBig2_CachePair>::iterator it = m_pSymbolDictCache->begin();
        it != m_pSymbolDictCache->end(); ++it) {
@@ -636,23 +616,20 @@ int32_t CJBig2_Context::parseSymbolDict(CJBig2_Segment* pSegment,
   }
   if (!cache_hit) {
     if (pSymbolDictDecoder->SDHUFF == 0) {
-      pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get());
-      pSegment->m_Result.sd =
-          pSymbolDictDecoder->decode_Arith(pArithDecoder, gbContext, grContext);
-      delete pArithDecoder;
-      if (pSegment->m_Result.sd == NULL) {
-        nRet = JBIG2_ERROR_FATAL;
-        goto failed;
-      }
+      nonstd::unique_ptr<CJBig2_ArithDecoder> pArithDecoder(
+          new CJBig2_ArithDecoder(m_pStream.get()));
+      pSegment->m_Result.sd = pSymbolDictDecoder->decode_Arith(
+          pArithDecoder.get(), gbContext.get(), grContext.get());
+      if (!pSegment->m_Result.sd)
+        return JBIG2_ERROR_FATAL;
+
       m_pStream->alignByte();
       m_pStream->offset(2);
     } else {
       pSegment->m_Result.sd = pSymbolDictDecoder->decode_Huffman(
-          m_pStream.get(), gbContext, grContext, pPause);
-      if (pSegment->m_Result.sd == NULL) {
-        nRet = JBIG2_ERROR_FATAL;
-        goto failed;
-      }
+          m_pStream.get(), gbContext.get(), grContext.get(), pPause);
+      if (!pSegment->m_Result.sd)
+        return JBIG2_ERROR_FATAL;
       m_pStream->alignByte();
     }
 #ifndef DISABLE_SYMBOL_CACHE
@@ -670,74 +647,29 @@ int32_t CJBig2_Context::parseSymbolDict(CJBig2_Segment* pSegment,
   if (wFlags & 0x0200) {
     pSegment->m_Result.sd->m_bContextRetained = TRUE;
     if (pSymbolDictDecoder->SDHUFF == 0) {
-      pSegment->m_Result.sd->m_gbContext = gbContext;
+      pSegment->m_Result.sd->m_gbContext = gbContext.release();
     }
     if (pSymbolDictDecoder->SDREFAGG == 1) {
-      pSegment->m_Result.sd->m_grContext = grContext;
+      pSegment->m_Result.sd->m_grContext = grContext.release();
     }
-    bUsed = TRUE;
-  } else {
-    bUsed = FALSE;
-  }
-  delete pSymbolDictDecoder;
-  FX_Free(SDINSYMS);
-  delete Table_B1;
-  delete Table_B2;
-  delete Table_B3;
-  delete Table_B4;
-  delete Table_B5;
-  if (bUsed == FALSE) {
-    FX_Free(gbContext);
-    FX_Free(grContext);
   }
   return JBIG2_SUCCESS;
-failed:
-  delete pSymbolDictDecoder;
-  FX_Free(SDINSYMS);
-  delete Table_B1;
-  delete Table_B2;
-  delete Table_B3;
-  delete Table_B4;
-  delete Table_B5;
-  FX_Free(gbContext);
-  FX_Free(grContext);
-  return nRet;
 }
 
 int32_t CJBig2_Context::parseTextRegion(CJBig2_Segment* pSegment) {
-  FX_DWORD dwTemp;
   FX_WORD wFlags;
-  int32_t i, nIndex, nRet;
   JBig2RegionInfo ri;
-  CJBig2_Segment* pSeg;
-  CJBig2_Image** SBSYMS = nullptr;
-  JBig2HuffmanCode* SBSYMCODES = nullptr;
-  uint8_t cSBHUFFFS, cSBHUFFDS, cSBHUFFDT, cSBHUFFRDW, cSBHUFFRDH, cSBHUFFRDX,
-      cSBHUFFRDY, cSBHUFFRSIZE;
-  CJBig2_HuffmanTable* Table_B1 = nullptr;
-  CJBig2_HuffmanTable* Table_B6 = nullptr;
-  CJBig2_HuffmanTable* Table_B7 = nullptr;
-  CJBig2_HuffmanTable* Table_B8 = nullptr;
-  CJBig2_HuffmanTable* Table_B9 = nullptr;
-  CJBig2_HuffmanTable* Table_B10 = nullptr;
-  CJBig2_HuffmanTable* Table_B11 = nullptr;
-  CJBig2_HuffmanTable* Table_B12 = nullptr;
-  CJBig2_HuffmanTable* Table_B13 = nullptr;
-  CJBig2_HuffmanTable* Table_B14 = nullptr;
-  CJBig2_HuffmanTable* Table_B15 = nullptr;
-  JBig2ArithCtx* grContext = nullptr;
-  CJBig2_ArithDecoder* pArithDecoder;
-  CJBig2_TRDProc* pTRD = new CJBig2_TRDProc();
-  if ((parseRegionInfo(&ri) != JBIG2_SUCCESS) ||
-      (m_pStream->readShortInteger(&wFlags) != 0)) {
-    nRet = JBIG2_ERROR_TOO_SHORT;
-    goto failed;
+  if (parseRegionInfo(&ri) != JBIG2_SUCCESS ||
+      m_pStream->readShortInteger(&wFlags) != 0) {
+    return JBIG2_ERROR_TOO_SHORT;
   }
+
+  nonstd::unique_ptr<CJBig2_TRDProc> pTRD(new CJBig2_TRDProc);
   pTRD->SBW = ri.width;
   pTRD->SBH = ri.height;
   pTRD->SBHUFF = wFlags & 0x0001;
   pTRD->SBREFINE = (wFlags >> 1) & 0x0001;
-  dwTemp = (wFlags >> 2) & 0x0003;
+  FX_DWORD dwTemp = (wFlags >> 2) & 0x0003;
   pTRD->SBSTRIPS = 1 << dwTemp;
   pTRD->REFCORNER = (JBig2Corner)((wFlags >> 4) & 0x0003);
   pTRD->TRANSPOSED = (wFlags >> 6) & 0x0001;
@@ -748,11 +680,19 @@ int32_t CJBig2_Context::parseTextRegion(CJBig2_Segment* pSegment) {
     pTRD->SBDSOFFSET = pTRD->SBDSOFFSET - 0x0020;
   }
   pTRD->SBRTEMPLATE = (wFlags >> 15) & 0x0001;
+
+  uint8_t cSBHUFFFS;
+  uint8_t cSBHUFFDS;
+  uint8_t cSBHUFFDT;
+  uint8_t cSBHUFFRDW;
+  uint8_t cSBHUFFRDH;
+  uint8_t cSBHUFFRDX;
+  uint8_t cSBHUFFRDY;
+  uint8_t cSBHUFFRSIZE;
   if (pTRD->SBHUFF == 1) {
-    if (m_pStream->readShortInteger(&wFlags) != 0) {
-      nRet = JBIG2_ERROR_TOO_SHORT;
-      goto failed;
-    }
+    if (m_pStream->readShortInteger(&wFlags) != 0)
+      return JBIG2_ERROR_TOO_SHORT;
+
     cSBHUFFFS = wFlags & 0x0003;
     cSBHUFFDS = (wFlags >> 2) & 0x0003;
     cSBHUFFDT = (wFlags >> 4) & 0x0003;
@@ -762,253 +702,257 @@ int32_t CJBig2_Context::parseTextRegion(CJBig2_Segment* pSegment) {
     cSBHUFFRDY = (wFlags >> 12) & 0x0003;
     cSBHUFFRSIZE = (wFlags >> 14) & 0x0001;
   }
-  if ((pTRD->SBREFINE == 1) && (pTRD->SBRTEMPLATE == 0)) {
-    for (i = 0; i < 4; i++) {
-      if (m_pStream->read1Byte((uint8_t*)&pTRD->SBRAT[i]) != 0) {
-        nRet = JBIG2_ERROR_TOO_SHORT;
-        goto failed;
-      }
+  if (pTRD->SBREFINE == 1 && pTRD->SBRTEMPLATE == 0) {
+    for (int32_t i = 0; i < 4; ++i) {
+      if (m_pStream->read1Byte((uint8_t*)&pTRD->SBRAT[i]) != 0)
+        return JBIG2_ERROR_TOO_SHORT;
     }
   }
-  if (m_pStream->readInteger(&pTRD->SBNUMINSTANCES) != 0) {
-    nRet = JBIG2_ERROR_TOO_SHORT;
-    goto failed;
-  }
-  for (i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
-    if (!findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i])) {
-      nRet = JBIG2_ERROR_FATAL;
-      goto failed;
-    }
+  if (m_pStream->readInteger(&pTRD->SBNUMINSTANCES) != 0)
+    return JBIG2_ERROR_TOO_SHORT;
+
+  for (int32_t i = 0; i < pSegment->m_nReferred_to_segment_count; ++i) {
+    if (!findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]))
+      return JBIG2_ERROR_FATAL;
   }
+
   pTRD->SBNUMSYMS = 0;
-  for (i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
-    pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);
+  for (int32_t i = 0; i < pSegment->m_nReferred_to_segment_count; ++i) {
+    CJBig2_Segment* pSeg =
+        findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);
     if (pSeg->m_cFlags.s.type == 0) {
       pTRD->SBNUMSYMS += pSeg->m_Result.sd->SDNUMEXSYMS;
     }
   }
+
+  nonstd::unique_ptr<CJBig2_Image*, FxFreeDeleter> SBSYMS;
   if (pTRD->SBNUMSYMS > 0) {
-    SBSYMS = FX_Alloc(CJBig2_Image*, pTRD->SBNUMSYMS);
+    SBSYMS.reset(FX_Alloc(CJBig2_Image*, pTRD->SBNUMSYMS));
     dwTemp = 0;
-    for (i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
-      pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);
+    for (int32_t i = 0; i < pSegment->m_nReferred_to_segment_count; ++i) {
+      CJBig2_Segment* pSeg =
+          findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);
       if (pSeg->m_cFlags.s.type == 0) {
-        JBIG2_memcpy(SBSYMS + dwTemp, pSeg->m_Result.sd->SDEXSYMS,
+        JBIG2_memcpy(SBSYMS.get() + dwTemp, pSeg->m_Result.sd->SDEXSYMS,
                      pSeg->m_Result.sd->SDNUMEXSYMS * sizeof(CJBig2_Image*));
         dwTemp += pSeg->m_Result.sd->SDNUMEXSYMS;
       }
     }
-    pTRD->SBSYMS = SBSYMS;
+    pTRD->SBSYMS = SBSYMS.get();
   } else {
     pTRD->SBSYMS = NULL;
   }
+
+  nonstd::unique_ptr<JBig2HuffmanCode, FxFreeDeleter> SBSYMCODES;
   if (pTRD->SBHUFF == 1) {
-    SBSYMCODES = decodeSymbolIDHuffmanTable(m_pStream.get(), pTRD->SBNUMSYMS);
-    if (SBSYMCODES == NULL) {
-      nRet = JBIG2_ERROR_FATAL;
-      goto failed;
-    }
+    SBSYMCODES.reset(
+        decodeSymbolIDHuffmanTable(m_pStream.get(), pTRD->SBNUMSYMS));
+    if (!SBSYMCODES)
+      return JBIG2_ERROR_FATAL;
+
     m_pStream->alignByte();
-    pTRD->SBSYMCODES = SBSYMCODES;
+    pTRD->SBSYMCODES = SBSYMCODES.get();
   } else {
     dwTemp = 0;
     while ((FX_DWORD)(1 << dwTemp) < pTRD->SBNUMSYMS) {
-      dwTemp++;
+      ++dwTemp;
     }
     pTRD->SBSYMCODELEN = (uint8_t)dwTemp;
   }
+
+  nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B1;
+  nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B6;
+  nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B7;
+  nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B8;
+  nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B9;
+  nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B10;
+  nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B11;
+  nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B12;
+  nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B13;
+  nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B14;
+  nonstd::unique_ptr<CJBig2_HuffmanTable> Table_B15;
   if (pTRD->SBHUFF == 1) {
-    if ((cSBHUFFFS == 2) || (cSBHUFFRDW == 2) || (cSBHUFFRDH == 2) ||
-        (cSBHUFFRDX == 2) || (cSBHUFFRDY == 2)) {
-      nRet = JBIG2_ERROR_FATAL;
-      goto failed;
+    if (cSBHUFFFS == 2 || cSBHUFFRDW == 2 || cSBHUFFRDH == 2 ||
+        cSBHUFFRDX == 2 || cSBHUFFRDY == 2) {
+      return JBIG2_ERROR_FATAL;
     }
-    nIndex = 0;
+    int32_t nIndex = 0;
     if (cSBHUFFFS == 0) {
-      Table_B6 = new CJBig2_HuffmanTable(HuffmanTable_B6,
-                                         FX_ArraySize(HuffmanTable_B6),
-                                         HuffmanTable_HTOOB_B6);
-      pTRD->SBHUFFFS = Table_B6;
+      Table_B6.reset(new CJBig2_HuffmanTable(HuffmanTable_B6,
+                                             FX_ArraySize(HuffmanTable_B6),
+                                             HuffmanTable_HTOOB_B6));
+      pTRD->SBHUFFFS = Table_B6.get();
     } else if (cSBHUFFFS == 1) {
-      Table_B7 = new CJBig2_HuffmanTable(HuffmanTable_B7,
-                                         FX_ArraySize(HuffmanTable_B7),
-                                         HuffmanTable_HTOOB_B7);
-      pTRD->SBHUFFFS = Table_B7;
+      Table_B7.reset(new CJBig2_HuffmanTable(HuffmanTable_B7,
+                                             FX_ArraySize(HuffmanTable_B7),
+                                             HuffmanTable_HTOOB_B7));
+      pTRD->SBHUFFFS = Table_B7.get();
     } else {
-      pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
-      if (!pSeg) {
-        nRet = JBIG2_ERROR_FATAL;
-        goto failed;
-      }
+      CJBig2_Segment* pSeg =
+          findReferredSegmentByTypeAndIndex(pSegment, 53, ++nIndex);
+      if (!pSeg)
+        return JBIG2_ERROR_FATAL;
       pTRD->SBHUFFFS = pSeg->m_Result.ht;
     }
     if (cSBHUFFDS == 0) {
-      Table_B8 = new CJBig2_HuffmanTable(HuffmanTable_B8,
-                                         FX_ArraySize(HuffmanTable_B8),
-                                         HuffmanTable_HTOOB_B8);
-      pTRD->SBHUFFDS = Table_B8;
+      Table_B8.reset(new CJBig2_HuffmanTable(HuffmanTable_B8,
+                                             FX_ArraySize(HuffmanTable_B8),
+                                             HuffmanTable_HTOOB_B8));
+      pTRD->SBHUFFDS = Table_B8.get();
     } else if (cSBHUFFDS == 1) {
-      Table_B9 = new CJBig2_HuffmanTable(HuffmanTable_B9,
-                                         FX_ArraySize(HuffmanTable_B9),
-                                         HuffmanTable_HTOOB_B9);
-      pTRD->SBHUFFDS = Table_B9;
+      Table_B9.reset(new CJBig2_HuffmanTable(HuffmanTable_B9,
+                                             FX_ArraySize(HuffmanTable_B9),
+                                             HuffmanTable_HTOOB_B9));
+      pTRD->SBHUFFDS = Table_B9.get();
     } else if (cSBHUFFDS == 2) {
-      Table_B10 = new CJBig2_HuffmanTable(HuffmanTable_B10,
-                                          FX_ArraySize(HuffmanTable_B10),
-                                          HuffmanTable_HTOOB_B10);
-      pTRD->SBHUFFDS = Table_B10;
+      Table_B10.reset(new CJBig2_HuffmanTable(HuffmanTable_B10,
+                                              FX_ArraySize(HuffmanTable_B10),
+                                              HuffmanTable_HTOOB_B10));
+      pTRD->SBHUFFDS = Table_B10.get();
     } else {
-      pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
-      if (!pSeg) {
-        nRet = JBIG2_ERROR_FATAL;
-        goto failed;
-      }
+      CJBig2_Segment* pSeg =
+          findReferredSegmentByTypeAndIndex(pSegment, 53, ++nIndex);
+      if (!pSeg)
+        return JBIG2_ERROR_FATAL;
       pTRD->SBHUFFDS = pSeg->m_Result.ht;
     }
     if (cSBHUFFDT == 0) {
-      Table_B11 = new CJBig2_HuffmanTable(HuffmanTable_B11,
-                                          FX_ArraySize(HuffmanTable_B11),
-                                          HuffmanTable_HTOOB_B11);
-      pTRD->SBHUFFDT = Table_B11;
+      Table_B11.reset(new CJBig2_HuffmanTable(HuffmanTable_B11,
+                                              FX_ArraySize(HuffmanTable_B11),
+                                              HuffmanTable_HTOOB_B11));
+      pTRD->SBHUFFDT = Table_B11.get();
     } else if (cSBHUFFDT == 1) {
-      Table_B12 = new CJBig2_HuffmanTable(HuffmanTable_B12,
-                                          FX_ArraySize(HuffmanTable_B12),
-                                          HuffmanTable_HTOOB_B12);
-      pTRD->SBHUFFDT = Table_B12;
+      Table_B12.reset(new CJBig2_HuffmanTable(HuffmanTable_B12,
+                                              FX_ArraySize(HuffmanTable_B12),
+                                              HuffmanTable_HTOOB_B12));
+      pTRD->SBHUFFDT = Table_B12.get();
     } else if (cSBHUFFDT == 2) {
-      Table_B13 = new CJBig2_HuffmanTable(HuffmanTable_B13,
-                                          FX_ArraySize(HuffmanTable_B13),
-                                          HuffmanTable_HTOOB_B13);
-      pTRD->SBHUFFDT = Table_B13;
+      Table_B13.reset(new CJBig2_HuffmanTable(HuffmanTable_B13,
+                                              FX_ArraySize(HuffmanTable_B13),
+                                              HuffmanTable_HTOOB_B13));
+      pTRD->SBHUFFDT = Table_B13.get();
     } else {
-      pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
-      if (!pSeg) {
-        nRet = JBIG2_ERROR_FATAL;
-        goto failed;
-      }
+      CJBig2_Segment* pSeg =
+          findReferredSegmentByTypeAndIndex(pSegment, 53, ++nIndex);
+      if (!pSeg)
+        return JBIG2_ERROR_FATAL;
       pTRD->SBHUFFDT = pSeg->m_Result.ht;
     }
     if (cSBHUFFRDW == 0) {
-      Table_B14 = new CJBig2_HuffmanTable(HuffmanTable_B14,
-                                          FX_ArraySize(HuffmanTable_B14),
-                                          HuffmanTable_HTOOB_B14);
-      pTRD->SBHUFFRDW = Table_B14;
+      Table_B14.reset(new CJBig2_HuffmanTable(HuffmanTable_B14,
+                                              FX_ArraySize(HuffmanTable_B14),
+                                              HuffmanTable_HTOOB_B14));
+      pTRD->SBHUFFRDW = Table_B14.get();
     } else if (cSBHUFFRDW == 1) {
-      Table_B15 = new CJBig2_HuffmanTable(HuffmanTable_B15,
-                                          FX_ArraySize(HuffmanTable_B15),
-                                          HuffmanTable_HTOOB_B15);
-      pTRD->SBHUFFRDW = Table_B15;
+      Table_B15.reset(new CJBig2_HuffmanTable(HuffmanTable_B15,
+                                              FX_ArraySize(HuffmanTable_B15),
+                                              HuffmanTable_HTOOB_B15));
+      pTRD->SBHUFFRDW = Table_B15.get();
     } else {
-      pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
-      if (!pSeg) {
-        nRet = JBIG2_ERROR_FATAL;
-        goto failed;
-      }
+      CJBig2_Segment* pSeg =
+          findReferredSegmentByTypeAndIndex(pSegment, 53, ++nIndex);
+      if (!pSeg)
+        return JBIG2_ERROR_FATAL;
       pTRD->SBHUFFRDW = pSeg->m_Result.ht;
     }
     if (cSBHUFFRDH == 0) {
       if (!Table_B14) {
-        Table_B14 = new CJBig2_HuffmanTable(HuffmanTable_B14,
-                                            FX_ArraySize(HuffmanTable_B14),
-                                            HuffmanTable_HTOOB_B14);
+        Table_B14.reset(new CJBig2_HuffmanTable(HuffmanTable_B14,
+                                                FX_ArraySize(HuffmanTable_B14),
+                                                HuffmanTable_HTOOB_B14));
       }
-      pTRD->SBHUFFRDH = Table_B14;
+      pTRD->SBHUFFRDH = Table_B14.get();
     } else if (cSBHUFFRDH == 1) {
       if (!Table_B15) {
-        Table_B15 = new CJBig2_HuffmanTable(HuffmanTable_B15,
-                                            FX_ArraySize(HuffmanTable_B15),
-                                            HuffmanTable_HTOOB_B15);
+        Table_B15.reset(new CJBig2_HuffmanTable(HuffmanTable_B15,
+                                                FX_ArraySize(HuffmanTable_B15),
+                                                HuffmanTable_HTOOB_B15));
       }
-      pTRD->SBHUFFRDH = Table_B15;
+      pTRD->SBHUFFRDH = Table_B15.get();
     } else {
-      pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
-      if (!pSeg) {
-        nRet = JBIG2_ERROR_FATAL;
-        goto failed;
-      }
+      CJBig2_Segment* pSeg =
+          findReferredSegmentByTypeAndIndex(pSegment, 53, ++nIndex);
+      if (!pSeg)
+        return JBIG2_ERROR_FATAL;
       pTRD->SBHUFFRDH = pSeg->m_Result.ht;
     }
     if (cSBHUFFRDX == 0) {
       if (!Table_B14) {
-        Table_B14 = new CJBig2_HuffmanTable(HuffmanTable_B14,
-                                            FX_ArraySize(HuffmanTable_B14),
-                                            HuffmanTable_HTOOB_B14);
+        Table_B14.reset(new CJBig2_HuffmanTable(HuffmanTable_B14,
+                                                FX_ArraySize(HuffmanTable_B14),
+                                                HuffmanTable_HTOOB_B14));
       }
-      pTRD->SBHUFFRDX = Table_B14;
+      pTRD->SBHUFFRDX = Table_B14.get();
     } else if (cSBHUFFRDX == 1) {
       if (!Table_B15) {
-        Table_B15 = new CJBig2_HuffmanTable(HuffmanTable_B15,
-                                            FX_ArraySize(HuffmanTable_B15),
-                                            HuffmanTable_HTOOB_B15);
+        Table_B15.reset(new CJBig2_HuffmanTable(HuffmanTable_B15,
+                                                FX_ArraySize(HuffmanTable_B15),
+                                                HuffmanTable_HTOOB_B15));
       }
-      pTRD->SBHUFFRDX = Table_B15;
+      pTRD->SBHUFFRDX = Table_B15.get();
     } else {
-      pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
-      if (!pSeg) {
-        nRet = JBIG2_ERROR_FATAL;
-        goto failed;
-      }
+      CJBig2_Segment* pSeg =
+          findReferredSegmentByTypeAndIndex(pSegment, 53, ++nIndex);
+      if (!pSeg)
+        return JBIG2_ERROR_FATAL;
       pTRD->SBHUFFRDX = pSeg->m_Result.ht;
     }
     if (cSBHUFFRDY == 0) {
       if (!Table_B14) {
-        Table_B14 = new CJBig2_HuffmanTable(HuffmanTable_B14,
-                                            FX_ArraySize(HuffmanTable_B14),
-                                            HuffmanTable_HTOOB_B14);
+        Table_B14.reset(new CJBig2_HuffmanTable(HuffmanTable_B14,
+                                                FX_ArraySize(HuffmanTable_B14),
+                                                HuffmanTable_HTOOB_B14));
       }
-      pTRD->SBHUFFRDY = Table_B14;
+      pTRD->SBHUFFRDY = Table_B14.get();
     } else if (cSBHUFFRDY == 1) {
       if (!Table_B15) {
-        Table_B15 = new CJBig2_HuffmanTable(HuffmanTable_B15,
-                                            FX_ArraySize(HuffmanTable_B15),
-                                            HuffmanTable_HTOOB_B15);
+        Table_B15.reset(new CJBig2_HuffmanTable(HuffmanTable_B15,
+                                                FX_ArraySize(HuffmanTable_B15),
+                                                HuffmanTable_HTOOB_B15));
       }
-      pTRD->SBHUFFRDY = Table_B15;
+      pTRD->SBHUFFRDY = Table_B15.get();
     } else {
-      pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
-      if (!pSeg) {
-        nRet = JBIG2_ERROR_FATAL;
-        goto failed;
-      }
+      CJBig2_Segment* pSeg =
+          findReferredSegmentByTypeAndIndex(pSegment, 53, ++nIndex);
+      if (!pSeg)
+        return JBIG2_ERROR_FATAL;
       pTRD->SBHUFFRDY = pSeg->m_Result.ht;
     }
     if (cSBHUFFRSIZE == 0) {
-      Table_B1 = new CJBig2_HuffmanTable(HuffmanTable_B1,
-                                         FX_ArraySize(HuffmanTable_B1),
-                                         HuffmanTable_HTOOB_B1);
-      pTRD->SBHUFFRSIZE = Table_B1;
+      Table_B1.reset(new CJBig2_HuffmanTable(HuffmanTable_B1,
+                                             FX_ArraySize(HuffmanTable_B1),
+                                             HuffmanTable_HTOOB_B1));
+      pTRD->SBHUFFRSIZE = Table_B1.get();
     } else {
-      pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
-      if (!pSeg) {
-        nRet = JBIG2_ERROR_FATAL;
-        goto failed;
-      }
+      CJBig2_Segment* pSeg =
+          findReferredSegmentByTypeAndIndex(pSegment, 53, ++nIndex);
+      if (!pSeg)
+        return JBIG2_ERROR_FATAL;
       pTRD->SBHUFFRSIZE = pSeg->m_Result.ht;
     }
   }
+  nonstd::unique_ptr<JBig2ArithCtx, FxFreeDeleter> grContext;
   if (pTRD->SBREFINE == 1) {
-    dwTemp = pTRD->SBRTEMPLATE ? 1 << 10 : 1 << 13;
-    grContext = FX_Alloc(JBig2ArithCtx, dwTemp);
-    JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx) * dwTemp);
+    const size_t size = GetRefAggContextSize(pTRD->SBRTEMPLATE);
+    grContext.reset(FX_Alloc(JBig2ArithCtx, size));
+    JBIG2_memset(grContext.get(), 0, sizeof(JBig2ArithCtx) * size);
   }
   if (pTRD->SBHUFF == 0) {
-    pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get());
+    nonstd::unique_ptr<CJBig2_ArithDecoder> pArithDecoder(
+        new CJBig2_ArithDecoder(m_pStream.get()));
     pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
-    pSegment->m_Result.im = pTRD->decode_Arith(pArithDecoder, grContext);
-    delete pArithDecoder;
-    if (pSegment->m_Result.im == NULL) {
-      nRet = JBIG2_ERROR_FATAL;
-      goto failed;
-    }
+    pSegment->m_Result.im =
+        pTRD->decode_Arith(pArithDecoder.get(), grContext.get());
+    if (!pSegment->m_Result.im)
+      return JBIG2_ERROR_FATAL;
     m_pStream->alignByte();
     m_pStream->offset(2);
   } else {
     pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
-    pSegment->m_Result.im = pTRD->decode_Huffman(m_pStream.get(), grContext);
-    if (pSegment->m_Result.im == NULL) {
-      nRet = JBIG2_ERROR_FATAL;
-      goto failed;
-    }
+    pSegment->m_Result.im =
+        pTRD->decode_Huffman(m_pStream.get(), grContext.get());
+    if (!pSegment->m_Result.im)
+      return JBIG2_ERROR_FATAL;
     m_pStream->alignByte();
   }
   if (pSegment->m_cFlags.s.type != 4) {
@@ -1024,121 +968,67 @@ int32_t CJBig2_Context::parseTextRegion(CJBig2_Segment* pSegment) {
     delete pSegment->m_Result.im;
     pSegment->m_Result.im = NULL;
   }
-  delete pTRD;
-  FX_Free(SBSYMS);
-  FX_Free(SBSYMCODES);
-  FX_Free(grContext);
-  delete Table_B1;
-  delete Table_B6;
-  delete Table_B7;
-  delete Table_B8;
-  delete Table_B9;
-  delete Table_B10;
-  delete Table_B11;
-  delete Table_B12;
-  delete Table_B13;
-  delete Table_B14;
-  delete Table_B15;
   return JBIG2_SUCCESS;
-failed:
-  delete pTRD;
-  FX_Free(SBSYMS);
-  FX_Free(SBSYMCODES);
-  FX_Free(grContext);
-  delete Table_B1;
-  delete Table_B6;
-  delete Table_B7;
-  delete Table_B8;
-  delete Table_B9;
-  delete Table_B10;
-  delete Table_B11;
-  delete Table_B12;
-  delete Table_B13;
-  delete Table_B14;
-  delete Table_B15;
-  return nRet;
 }
 
 int32_t CJBig2_Context::parsePatternDict(CJBig2_Segment* pSegment,
                                          IFX_Pause* pPause) {
-  FX_DWORD dwTemp;
   uint8_t cFlags;
-  JBig2ArithCtx* gbContext;
-  CJBig2_ArithDecoder* pArithDecoder;
-  int32_t nRet;
-  CJBig2_PDDProc* pPDD = new CJBig2_PDDProc();
-  if ((m_pStream->read1Byte(&cFlags) != 0) ||
-      (m_pStream->read1Byte(&pPDD->HDPW) != 0) ||
-      (m_pStream->read1Byte(&pPDD->HDPH) != 0) ||
-      (m_pStream->readInteger(&pPDD->GRAYMAX) != 0)) {
-    nRet = JBIG2_ERROR_TOO_SHORT;
-    goto failed;
-  }
-  if (pPDD->GRAYMAX > JBIG2_MAX_PATTERN_INDEX) {
-    nRet = JBIG2_ERROR_LIMIT;
-    goto failed;
+  nonstd::unique_ptr<CJBig2_PDDProc> pPDD(new CJBig2_PDDProc);
+  if (m_pStream->read1Byte(&cFlags) != 0 ||
+      m_pStream->read1Byte(&pPDD->HDPW) != 0 ||
+      m_pStream->read1Byte(&pPDD->HDPH) != 0 ||
+      m_pStream->readInteger(&pPDD->GRAYMAX) != 0) {
+    return JBIG2_ERROR_TOO_SHORT;
   }
+  if (pPDD->GRAYMAX > JBIG2_MAX_PATTERN_INDEX)
+    return JBIG2_ERROR_LIMIT;
+
   pPDD->HDMMR = cFlags & 0x01;
   pPDD->HDTEMPLATE = (cFlags >> 1) & 0x03;
   pSegment->m_nResultType = JBIG2_PATTERN_DICT_POINTER;
   if (pPDD->HDMMR == 0) {
-    dwTemp =
-        pPDD->HDTEMPLATE == 0 ? 65536 : pPDD->HDTEMPLATE == 1 ? 8192 : 1024;
-    gbContext = FX_Alloc(JBig2ArithCtx, dwTemp);
-    JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx) * dwTemp);
-    pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get());
+    const size_t size = GetHuffContextSize(pPDD->HDTEMPLATE);
+    nonstd::unique_ptr<JBig2ArithCtx, FxFreeDeleter> gbContext(
+        FX_Alloc(JBig2ArithCtx, size));
+    JBIG2_memset(gbContext.get(), 0, sizeof(JBig2ArithCtx) * size);
+    nonstd::unique_ptr<CJBig2_ArithDecoder> pArithDecoder(
+        new CJBig2_ArithDecoder(m_pStream.get()));
     pSegment->m_Result.pd =
-        pPDD->decode_Arith(pArithDecoder, gbContext, pPause);
-    delete pArithDecoder;
-    if (pSegment->m_Result.pd == NULL) {
-      FX_Free(gbContext);
-      nRet = JBIG2_ERROR_FATAL;
-      goto failed;
-    }
-    FX_Free(gbContext);
+        pPDD->decode_Arith(pArithDecoder.get(), gbContext.get(), pPause);
+    if (!pSegment->m_Result.pd)
+      return JBIG2_ERROR_FATAL;
+
     m_pStream->alignByte();
     m_pStream->offset(2);
   } else {
     pSegment->m_Result.pd = pPDD->decode_MMR(m_pStream.get(), pPause);
-    if (pSegment->m_Result.pd == NULL) {
-      nRet = JBIG2_ERROR_FATAL;
-      goto failed;
-    }
+    if (!pSegment->m_Result.pd)
+      return JBIG2_ERROR_FATAL;
     m_pStream->alignByte();
   }
-  delete pPDD;
   return JBIG2_SUCCESS;
-failed:
-  delete pPDD;
-  return nRet;
 }
+
 int32_t CJBig2_Context::parseHalftoneRegion(CJBig2_Segment* pSegment,
                                             IFX_Pause* pPause) {
-  FX_DWORD dwTemp;
   uint8_t cFlags;
   JBig2RegionInfo ri;
-  CJBig2_Segment* pSeg;
-  CJBig2_PatternDict* pPatternDict;
-  JBig2ArithCtx* gbContext;
-  CJBig2_ArithDecoder* pArithDecoder;
-  int32_t nRet;
-  CJBig2_HTRDProc* pHRD = new CJBig2_HTRDProc();
-  if ((parseRegionInfo(&ri) != JBIG2_SUCCESS) ||
-      (m_pStream->read1Byte(&cFlags) != 0) ||
-      (m_pStream->readInteger(&pHRD->HGW) != 0) ||
-      (m_pStream->readInteger(&pHRD->HGH) != 0) ||
-      (m_pStream->readInteger((FX_DWORD*)&pHRD->HGX) != 0) ||
-      (m_pStream->readInteger((FX_DWORD*)&pHRD->HGY) != 0) ||
-      (m_pStream->readShortInteger(&pHRD->HRX) != 0) ||
-      (m_pStream->readShortInteger(&pHRD->HRY) != 0)) {
-    nRet = JBIG2_ERROR_TOO_SHORT;
-    goto failed;
-  }
-  if (pHRD->HGW == 0 || pHRD->HGH == 0) {
-    nRet = JBIG2_ERROR_FATAL;
-    goto failed;
+  nonstd::unique_ptr<CJBig2_HTRDProc> pHRD(new CJBig2_HTRDProc);
+  if (parseRegionInfo(&ri) != JBIG2_SUCCESS ||
+      m_pStream->read1Byte(&cFlags) != 0 ||
+      m_pStream->readInteger(&pHRD->HGW) != 0 ||
+      m_pStream->readInteger(&pHRD->HGH) != 0 ||
+      m_pStream->readInteger((FX_DWORD*)&pHRD->HGX) != 0 ||
+      m_pStream->readInteger((FX_DWORD*)&pHRD->HGY) != 0 ||
+      m_pStream->readShortInteger(&pHRD->HRX) != 0 ||
+      m_pStream->readShortInteger(&pHRD->HRY) != 0) {
+    return JBIG2_ERROR_TOO_SHORT;
   }
 
+  if (pHRD->HGW == 0 || pHRD->HGH == 0)
+    return JBIG2_ERROR_FATAL;
+
   pHRD->HBW = ri.width;
   pHRD->HBH = ri.height;
   pHRD->HMMR = cFlags & 0x01;
@@ -1146,54 +1036,48 @@ int32_t CJBig2_Context::parseHalftoneRegion(CJBig2_Segment* pSegment,
   pHRD->HENABLESKIP = (cFlags >> 3) & 0x01;
   pHRD->HCOMBOP = (JBig2ComposeOp)((cFlags >> 4) & 0x07);
   pHRD->HDEFPIXEL = (cFlags >> 7) & 0x01;
-  if (pSegment->m_nReferred_to_segment_count != 1) {
-    nRet = JBIG2_ERROR_FATAL;
-    goto failed;
-  }
-  pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[0]);
-  if ((pSeg == NULL) || (pSeg->m_cFlags.s.type != 16)) {
-    nRet = JBIG2_ERROR_FATAL;
-    goto failed;
-  }
-  pPatternDict = pSeg->m_Result.pd;
-  if ((pPatternDict == NULL) || (pPatternDict->NUMPATS == 0)) {
-    nRet = JBIG2_ERROR_FATAL;
-    goto failed;
-  }
+  if (pSegment->m_nReferred_to_segment_count != 1)
+    return JBIG2_ERROR_FATAL;
+
+  CJBig2_Segment* pSeg =
+      findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[0]);
+  if (!pSeg || (pSeg->m_cFlags.s.type != 16))
+    return JBIG2_ERROR_FATAL;
+
+  CJBig2_PatternDict* pPatternDict = pSeg->m_Result.pd;
+  if (!pPatternDict || (pPatternDict->NUMPATS == 0))
+    return JBIG2_ERROR_FATAL;
+
   pHRD->HNUMPATS = pPatternDict->NUMPATS;
   pHRD->HPATS = pPatternDict->HDPATS;
   pHRD->HPW = pPatternDict->HDPATS[0]->m_nWidth;
   pHRD->HPH = pPatternDict->HDPATS[0]->m_nHeight;
   pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
   if (pHRD->HMMR == 0) {
-    dwTemp = pHRD->HTEMPLATE == 0 ? 65536 : pHRD->HTEMPLATE == 1 ? 8192 : 1024;
-    gbContext = FX_Alloc(JBig2ArithCtx, dwTemp);
-    JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx) * dwTemp);
-    pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get());
+    const size_t size = GetHuffContextSize(pHRD->HTEMPLATE);
+    nonstd::unique_ptr<JBig2ArithCtx, FxFreeDeleter> gbContext(
+        FX_Alloc(JBig2ArithCtx, size));
+    JBIG2_memset(gbContext.get(), 0, sizeof(JBig2ArithCtx) * size);
+    nonstd::unique_ptr<CJBig2_ArithDecoder> pArithDecoder(
+        new CJBig2_ArithDecoder(m_pStream.get()));
     pSegment->m_Result.im =
-        pHRD->decode_Arith(pArithDecoder, gbContext, pPause);
-    delete pArithDecoder;
-    if (pSegment->m_Result.im == NULL) {
-      FX_Free(gbContext);
-      nRet = JBIG2_ERROR_FATAL;
-      goto failed;
-    }
-    FX_Free(gbContext);
+        pHRD->decode_Arith(pArithDecoder.get(), gbContext.get(), pPause);
+    if (!pSegment->m_Result.im)
+      return JBIG2_ERROR_FATAL;
+
     m_pStream->alignByte();
     m_pStream->offset(2);
   } else {
     pSegment->m_Result.im = pHRD->decode_MMR(m_pStream.get(), pPause);
-    if (pSegment->m_Result.im == NULL) {
-      nRet = JBIG2_ERROR_FATAL;
-      goto failed;
-    }
+    if (!pSegment->m_Result.im)
+      return JBIG2_ERROR_FATAL;
     m_pStream->alignByte();
   }
   if (pSegment->m_cFlags.s.type != 20) {
     if (!m_bBufSpecified) {
       JBig2PageInfo* pPageInfo = m_PageInfoList.back();
-      if ((pPageInfo->m_bIsStriped == 1) &&
-          (ri.y + ri.height > m_pPage->m_nHeight)) {
+      if (pPageInfo->m_bIsStriped == 1 &&
+          ri.y + ri.height > m_pPage->m_nHeight) {
         m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);
       }
     }
@@ -1202,65 +1086,55 @@ int32_t CJBig2_Context::parseHalftoneRegion(CJBig2_Segment* pSegment,
     delete pSegment->m_Result.im;
     pSegment->m_Result.im = NULL;
   }
-  delete pHRD;
   return JBIG2_SUCCESS;
-failed:
-  delete pHRD;
-  return nRet;
 }
 
 int32_t CJBig2_Context::parseGenericRegion(CJBig2_Segment* pSegment,
                                            IFX_Pause* pPause) {
-  FX_DWORD dwTemp;
-  uint8_t cFlags;
-  int32_t i, nRet;
   if (!m_pGRD) {
-    m_pGRD.reset(new CJBig2_GRDProc);
-    if ((parseRegionInfo(&m_ri) != JBIG2_SUCCESS) ||
-        (m_pStream->read1Byte(&cFlags) != 0)) {
-      nRet = JBIG2_ERROR_TOO_SHORT;
-      goto failed;
-    }
-    if (m_ri.height < 0 || m_ri.width < 0) {
-      nRet = JBIG2_FAILED;
-      goto failed;
-    }
-    m_pGRD->GBW = m_ri.width;
-    m_pGRD->GBH = m_ri.height;
-    m_pGRD->MMR = cFlags & 0x01;
-    m_pGRD->GBTEMPLATE = (cFlags >> 1) & 0x03;
-    m_pGRD->TPGDON = (cFlags >> 3) & 0x01;
-    if (m_pGRD->MMR == 0) {
-      if (m_pGRD->GBTEMPLATE == 0) {
-        for (i = 0; i < 8; i++) {
-          if (m_pStream->read1Byte((uint8_t*)&m_pGRD->GBAT[i]) != 0) {
-            nRet = JBIG2_ERROR_TOO_SHORT;
-            goto failed;
+    nonstd::unique_ptr<CJBig2_GRDProc> pGRD(new CJBig2_GRDProc);
+    uint8_t cFlags;
+    if (parseRegionInfo(&m_ri) != JBIG2_SUCCESS ||
+        m_pStream->read1Byte(&cFlags) != 0) {
+      return JBIG2_ERROR_TOO_SHORT;
+    }
+    if (m_ri.height < 0 || m_ri.width < 0)
+      return JBIG2_FAILED;
+
+    pGRD->GBW = m_ri.width;
+    pGRD->GBH = m_ri.height;
+    pGRD->MMR = cFlags & 0x01;
+    pGRD->GBTEMPLATE = (cFlags >> 1) & 0x03;
+    pGRD->TPGDON = (cFlags >> 3) & 0x01;
+    if (pGRD->MMR == 0) {
+      if (pGRD->GBTEMPLATE == 0) {
+        for (int32_t i = 0; i < 8; ++i) {
+          if (m_pStream->read1Byte((uint8_t*)&pGRD->GBAT[i]) != 0) {
+            return JBIG2_ERROR_TOO_SHORT;
           }
         }
       } else {
-        for (i = 0; i < 2; i++) {
-          if (m_pStream->read1Byte((uint8_t*)&m_pGRD->GBAT[i]) != 0) {
-            nRet = JBIG2_ERROR_TOO_SHORT;
-            goto failed;
+        for (int32_t i = 0; i < 2; ++i) {
+          if (m_pStream->read1Byte((uint8_t*)&pGRD->GBAT[i]) != 0) {
+            return JBIG2_ERROR_TOO_SHORT;
           }
         }
       }
     }
-    m_pGRD->USESKIP = 0;
+    pGRD->USESKIP = 0;
+    m_pGRD = nonstd::move(pGRD);
   }
   pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
   if (m_pGRD->MMR == 0) {
-    dwTemp =
-        m_pGRD->GBTEMPLATE == 0 ? 65536 : m_pGRD->GBTEMPLATE == 1 ? 8192 : 1024;
-    if (m_gbContext == NULL) {
-      m_gbContext = FX_Alloc(JBig2ArithCtx, dwTemp);
-      JBIG2_memset(m_gbContext, 0, sizeof(JBig2ArithCtx) * dwTemp);
-    }
-    if (m_pArithDecoder == NULL) {
-      m_pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get());
+    if (!m_gbContext) {
+      const size_t size = GetHuffContextSize(m_pGRD->GBTEMPLATE);
+      m_gbContext = FX_Alloc(JBig2ArithCtx, size);
+      JBIG2_memset(m_gbContext, 0, sizeof(JBig2ArithCtx) * size);
+    }
+    if (!m_pArithDecoder) {
+      m_pArithDecoder.reset(new CJBig2_ArithDecoder(m_pStream.get()));
       m_ProcessingStatus = m_pGRD->Start_decode_Arith(
-          &pSegment->m_Result.im, m_pArithDecoder, m_gbContext, pPause);
+          &pSegment->m_Result.im, m_pArithDecoder.get(), m_gbContext, pPause);
     } else {
       m_ProcessingStatus = m_pGRD->Continue_decode(pPause);
     }
@@ -1281,17 +1155,14 @@ int32_t CJBig2_Context::parseGenericRegion(CJBig2_Segment* pSegment,
       }
       return JBIG2_SUCCESS;
     } else {
-      delete m_pArithDecoder;
-      m_pArithDecoder = NULL;
-      if (pSegment->m_Result.im == NULL) {
-        FX_Free(m_gbContext);
-        nRet = JBIG2_ERROR_FATAL;
-        m_gbContext = NULL;
-        m_ProcessingStatus = FXCODEC_STATUS_ERROR;
-        goto failed;
-      }
+      m_pArithDecoder.reset();
       FX_Free(m_gbContext);
       m_gbContext = NULL;
+      if (!pSegment->m_Result.im) {
+        m_ProcessingStatus = FXCODEC_STATUS_ERROR;
+        m_pGRD.reset();
+        return JBIG2_ERROR_FATAL;
+      }
       m_pStream->alignByte();
       m_pStream->offset(2);
     }
@@ -1301,9 +1172,9 @@ int32_t CJBig2_Context::parseGenericRegion(CJBig2_Segment* pSegment,
     while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
       m_pGRD->Continue_decode(pPause);
     }
-    if (pSegment->m_Result.im == NULL) {
-      nRet = JBIG2_ERROR_FATAL;
-      goto failed;
+    if (!pSegment->m_Result.im) {
+      m_pGRD.reset();
+      return JBIG2_ERROR_FATAL;
     }
     m_pStream->alignByte();
   }
@@ -1325,73 +1196,59 @@ int32_t CJBig2_Context::parseGenericRegion(CJBig2_Segment* pSegment,
   }
   m_pGRD.reset();
   return JBIG2_SUCCESS;
-failed:
-  m_pGRD.reset();
-  return nRet;
 }
 
 int32_t CJBig2_Context::parseGenericRefinementRegion(CJBig2_Segment* pSegment) {
-  FX_DWORD dwTemp;
   JBig2RegionInfo ri;
-  CJBig2_Segment* pSeg;
-  int32_t i, nRet;
   uint8_t cFlags;
-  JBig2ArithCtx* grContext;
-  CJBig2_ArithDecoder* pArithDecoder;
-  CJBig2_GRRDProc* pGRRD = new CJBig2_GRRDProc();
-  if ((parseRegionInfo(&ri) != JBIG2_SUCCESS) ||
-      (m_pStream->read1Byte(&cFlags) != 0)) {
-    nRet = JBIG2_ERROR_TOO_SHORT;
-    goto failed;
+  if (parseRegionInfo(&ri) != JBIG2_SUCCESS ||
+      m_pStream->read1Byte(&cFlags) != 0) {
+    return JBIG2_ERROR_TOO_SHORT;
   }
+  nonstd::unique_ptr<CJBig2_GRRDProc> pGRRD(new CJBig2_GRRDProc);
   pGRRD->GRW = ri.width;
   pGRRD->GRH = ri.height;
   pGRRD->GRTEMPLATE = cFlags & 0x01;
   pGRRD->TPGRON = (cFlags >> 1) & 0x01;
   if (pGRRD->GRTEMPLATE == 0) {
-    for (i = 0; i < 4; i++) {
-      if (m_pStream->read1Byte((uint8_t*)&pGRRD->GRAT[i]) != 0) {
-        nRet = JBIG2_ERROR_TOO_SHORT;
-        goto failed;
-      }
+    for (int32_t i = 0; i < 4; ++i) {
+      if (m_pStream->read1Byte((uint8_t*)&pGRRD->GRAT[i]) != 0)
+        return JBIG2_ERROR_TOO_SHORT;
     }
   }
-  pSeg = NULL;
+  CJBig2_Segment* pSeg = nullptr;
   if (pSegment->m_nReferred_to_segment_count > 0) {
-    for (i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
+    int32_t i;
+    for (i = 0; i < pSegment->m_nReferred_to_segment_count; ++i) {
       pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[0]);
-      if (pSeg == NULL) {
-        nRet = JBIG2_ERROR_FATAL;
-        goto failed;
-      }
-      if ((pSeg->m_cFlags.s.type == 4) || (pSeg->m_cFlags.s.type == 20) ||
-          (pSeg->m_cFlags.s.type == 36) || (pSeg->m_cFlags.s.type == 40)) {
+      if (!pSeg)
+        return JBIG2_ERROR_FATAL;
+
+      if (pSeg->m_cFlags.s.type == 4 || pSeg->m_cFlags.s.type == 20 ||
+          pSeg->m_cFlags.s.type == 36 || pSeg->m_cFlags.s.type == 40) {
         break;
       }
     }
-    if (i >= pSegment->m_nReferred_to_segment_count) {
-      nRet = JBIG2_ERROR_FATAL;
-      goto failed;
-    }
+    if (i >= pSegment->m_nReferred_to_segment_count)
+      return JBIG2_ERROR_FATAL;
+
     pGRRD->GRREFERENCE = pSeg->m_Result.im;
   } else {
     pGRRD->GRREFERENCE = m_pPage.get();
   }
   pGRRD->GRREFERENCEDX = 0;
   pGRRD->GRREFERENCEDY = 0;
-  dwTemp = pGRRD->GRTEMPLATE ? 1 << 10 : 1 << 13;
-  grContext = FX_Alloc(JBig2ArithCtx, dwTemp);
-  JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx) * dwTemp);
-  pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get());
+  const size_t size = GetRefAggContextSize(pGRRD->GRTEMPLATE);
+  nonstd::unique_ptr<JBig2ArithCtx, FxFreeDeleter> grContext(
+      FX_Alloc(JBig2ArithCtx, size));
+  JBIG2_memset(grContext.get(), 0, sizeof(JBig2ArithCtx) * size);
+  nonstd::unique_ptr<CJBig2_ArithDecoder> pArithDecoder(
+      new CJBig2_ArithDecoder(m_pStream.get()));
   pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
-  pSegment->m_Result.im = pGRRD->decode(pArithDecoder, grContext);
-  delete pArithDecoder;
-  if (pSegment->m_Result.im == NULL) {
-    FX_Free(grContext);
-    nRet = JBIG2_ERROR_FATAL;
-    goto failed;
-  }
-  FX_Free(grContext);
+  pSegment->m_Result.im = pGRRD->decode(pArithDecoder.get(), grContext.get());
+  if (!pSegment->m_Result.im)
+    return JBIG2_ERROR_FATAL;
+
   m_pStream->alignByte();
   m_pStream->offset(2);
   if (pSegment->m_cFlags.s.type != 40) {
@@ -1407,12 +1264,9 @@ int32_t CJBig2_Context::parseGenericRefinementRegion(CJBig2_Segment* pSegment) {
     delete pSegment->m_Result.im;
     pSegment->m_Result.im = NULL;
   }
-  delete pGRRD;
   return JBIG2_SUCCESS;
-failed:
-  delete pGRRD;
-  return nRet;
 }
+
 int32_t CJBig2_Context::parseTable(CJBig2_Segment* pSegment) {
   pSegment->m_nResultType = JBIG2_HUFFMAN_TABLE_POINTER;
   pSegment->m_Result.ht = new CJBig2_HuffmanTable(m_pStream.get());
@@ -1424,103 +1278,97 @@ int32_t CJBig2_Context::parseTable(CJBig2_Segment* pSegment) {
   m_pStream->alignByte();
   return JBIG2_SUCCESS;
 }
+
 int32_t CJBig2_Context::parseRegionInfo(JBig2RegionInfo* pRI) {
-  if ((m_pStream->readInteger((FX_DWORD*)&pRI->width) != 0) ||
-      (m_pStream->readInteger((FX_DWORD*)&pRI->height) != 0) ||
-      (m_pStream->readInteger((FX_DWORD*)&pRI->x) != 0) ||
-      (m_pStream->readInteger((FX_DWORD*)&pRI->y) != 0) ||
-      (m_pStream->read1Byte(&pRI->flags) != 0)) {
+  if (m_pStream->readInteger((FX_DWORD*)&pRI->width) != 0 ||
+      m_pStream->readInteger((FX_DWORD*)&pRI->height) != 0 ||
+      m_pStream->readInteger((FX_DWORD*)&pRI->x) != 0 ||
+      m_pStream->readInteger((FX_DWORD*)&pRI->y) != 0 ||
+      m_pStream->read1Byte(&pRI->flags) != 0) {
     return JBIG2_ERROR_TOO_SHORT;
   }
   return JBIG2_SUCCESS;
 }
+
 JBig2HuffmanCode* CJBig2_Context::decodeSymbolIDHuffmanTable(
     CJBig2_BitStream* pStream,
     FX_DWORD SBNUMSYMS) {
-  JBig2HuffmanCode* SBSYMCODES;
-  int32_t runcodes[35];
-  int32_t runcodes_len[35];
-  int32_t runcode;
-  int32_t i;
-  int32_t j;
-  int32_t nVal;
-  int32_t nBits;
+  size_t kRunCodesSize = 35;
+  int32_t runcodes[kRunCodesSize];
+  int32_t runcodes_len[kRunCodesSize];
+  for (int32_t i = 0; i < kRunCodesSize; ++i) {
+    if (pStream->readNBits(4, &runcodes_len[i]) != 0)
+      return nullptr;
+  }
+  huffman_assign_code(runcodes, runcodes_len, kRunCodesSize);
+
+  nonstd::unique_ptr<JBig2HuffmanCode, FxFreeDeleter> SBSYMCODES(
+      FX_Alloc(JBig2HuffmanCode, SBNUMSYMS));
   int32_t run;
-  FX_DWORD nTemp;
-  SBSYMCODES = FX_Alloc(JBig2HuffmanCode, SBNUMSYMS);
-  for (i = 0; i < 35; i++) {
-    if (pStream->readNBits(4, &runcodes_len[i]) != 0) {
-      goto failed;
-    }
-  }
-  huffman_assign_code(runcodes, runcodes_len, 35);
-  i = 0;
+  int32_t i = 0;
   while (i < (int)SBNUMSYMS) {
-    nVal = 0;
-    nBits = 0;
-    for (;;) {
-      if (pStream->read1Bit(&nTemp) != 0) {
-        goto failed;
-      }
+    int32_t j;
+    int32_t nVal = 0;
+    int32_t nBits = 0;
+    FX_DWORD nTemp;
+    while (true) {
+      if (pStream->read1Bit(&nTemp) != 0)
+        return nullptr;
+
       nVal = (nVal << 1) | nTemp;
-      nBits++;
-      for (j = 0; j < 35; j++) {
-        if ((nBits == runcodes_len[j]) && (nVal == runcodes[j])) {
+      ++nBits;
+      for (j = 0; j < kRunCodesSize; ++j) {
+        if (nBits == runcodes_len[j] && nVal == runcodes[j]) {
           break;
         }
       }
-      if (j < 35) {
+      if (j < kRunCodesSize) {
         break;
       }
     }
-    runcode = j;
+    int32_t runcode = j;
     if (runcode < 32) {
-      SBSYMCODES[i].codelen = runcode;
+      SBSYMCODES.get()[i].codelen = runcode;
       run = 0;
     } else if (runcode == 32) {
-      if (pStream->readNBits(2, &nTemp) != 0) {
-        goto failed;
-      }
+      if (pStream->readNBits(2, &nTemp) != 0)
+        return nullptr;
       run = nTemp + 3;
     } else if (runcode == 33) {
-      if (pStream->readNBits(3, &nTemp) != 0) {
-        goto failed;
-      }
+      if (pStream->readNBits(3, &nTemp) != 0)
+        return nullptr;
       run = nTemp + 3;
     } else if (runcode == 34) {
-      if (pStream->readNBits(7, &nTemp) != 0) {
-        goto failed;
-      }
+      if (pStream->readNBits(7, &nTemp) != 0)
+        return nullptr;
       run = nTemp + 11;
     }
     if (run > 0) {
-      if (i + run > (int)SBNUMSYMS) {
-        goto failed;
-      }
-      for (j = 0; j < run; j++) {
+      if (i + run > (int)SBNUMSYMS)
+        return nullptr;
+      for (j = 0; j < run; ++j) {
         if (runcode == 32 && i > 0) {
-          SBSYMCODES[i + j].codelen = SBSYMCODES[i - 1].codelen;
+          SBSYMCODES.get()[i + j].codelen = SBSYMCODES.get()[i - 1].codelen;
         } else {
-          SBSYMCODES[i + j].codelen = 0;
+          SBSYMCODES.get()[i + j].codelen = 0;
         }
       }
       i += run;
     } else {
-      i++;
+      ++i;
     }
   }
-  huffman_assign_code(SBSYMCODES, SBNUMSYMS);
-  return SBSYMCODES;
-failed:
-  FX_Free(SBSYMCODES);
-  return NULL;
+  huffman_assign_code(SBSYMCODES.get(), SBNUMSYMS);
+  return SBSYMCODES.release();
 }
+
 void CJBig2_Context::huffman_assign_code(int* CODES, int* PREFLEN, int NTEMP) {
+  // TODO(thestig) CJBig2_HuffmanTable::parseFromCodedBuffer() has similar code.
   int CURLEN, LENMAX, CURCODE, CURTEMP, i;
   int* LENCOUNT;
   int* FIRSTCODE;
   LENMAX = 0;
-  for (i = 0; i < NTEMP; i++) {
+  for (i = 0; i < NTEMP; ++i) {
     if (PREFLEN[i] > LENMAX) {
       LENMAX = PREFLEN[i];
     }
@@ -1528,8 +1376,8 @@ void CJBig2_Context::huffman_assign_code(int* CODES, int* PREFLEN, int NTEMP) {
   LENCOUNT = FX_Alloc(int, LENMAX + 1);
   JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));
   FIRSTCODE = FX_Alloc(int, LENMAX + 1);
-  for (i = 0; i < NTEMP; i++) {
-    LENCOUNT[PREFLEN[i]]++;
+  for (i = 0; i < NTEMP; ++i) {
+    ++LENCOUNT[PREFLEN[i]];
   }
   CURLEN = 1;
   FIRSTCODE[0] = 0;
@@ -1556,7 +1404,7 @@ void CJBig2_Context::huffman_assign_code(JBig2HuffmanCode* SBSYMCODES,
   int* LENCOUNT;
   int* FIRSTCODE;
   LENMAX = 0;
-  for (i = 0; i < NTEMP; i++) {
+  for (i = 0; i < NTEMP; ++i) {
     if (SBSYMCODES[i].codelen > LENMAX) {
       LENMAX = SBSYMCODES[i].codelen;
     }
@@ -1564,8 +1412,8 @@ void CJBig2_Context::huffman_assign_code(JBig2HuffmanCode* SBSYMCODES,
   LENCOUNT = FX_Alloc(int, (LENMAX + 1));
   JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));
   FIRSTCODE = FX_Alloc(int, (LENMAX + 1));
-  for (i = 0; i < NTEMP; i++) {
-    LENCOUNT[SBSYMCODES[i].codelen]++;
+  for (i = 0; i < NTEMP; ++i) {
+    ++LENCOUNT[SBSYMCODES[i].codelen];
   }
   CURLEN = 1;
   FIRSTCODE[0] = 0;
index 8681609..3c283d1 100644 (file)
@@ -118,7 +118,7 @@ class CJBig2_Context {
   int32_t m_PauseStep;
   IFX_Pause* m_pPause;
   FXCODEC_STATUS m_ProcessingStatus;
-  CJBig2_ArithDecoder* m_pArithDecoder;
+  nonstd::unique_ptr<CJBig2_ArithDecoder> m_pArithDecoder;
   nonstd::unique_ptr<CJBig2_GRDProc> m_pGRD;
   JBig2ArithCtx* m_gbContext;
   nonstd::unique_ptr<CJBig2_Segment> m_pSegment;
index b97a212..d89bb8f 100644 (file)
 FX_DWORD* CJBig2_GSIDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder,
                                         JBig2ArithCtx* gbContext,
                                         IFX_Pause* pPause) {
-  CJBig2_Image** GSPLANES;
-  int32_t J, K;
-  FX_DWORD x, y;
-  FX_DWORD* GSVALS;
-  GSPLANES = FX_Alloc(CJBig2_Image*, GSBPP);
-  GSVALS = FX_Alloc2D(FX_DWORD, GSW, GSH);
-  JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*) * GSBPP);
-  JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD) * GSW * GSH);
-
   nonstd::unique_ptr<CJBig2_GRDProc> pGRD(new CJBig2_GRDProc());
   pGRD->MMR = GSMMR;
   pGRD->GBW = GSW;
@@ -46,105 +37,100 @@ FX_DWORD* CJBig2_GSIDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder,
     pGRD->GBAT[6] = -2;
     pGRD->GBAT[7] = -2;
   }
+
+  nonstd::unique_ptr<CJBig2_Image*, FxFreeDeleter> GSPLANES(
+      FX_Alloc(CJBig2_Image*, GSBPP));
+  JBIG2_memset(GSPLANES.get(), 0, sizeof(CJBig2_Image*) * GSBPP);
   FXCODEC_STATUS status = pGRD->Start_decode_Arith(
-      &GSPLANES[GSBPP - 1], pArithDecoder, gbContext, nullptr);
+      &GSPLANES.get()[GSBPP - 1], pArithDecoder, gbContext, nullptr);
   while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
     pGRD->Continue_decode(pPause);
   }
-  if (!GSPLANES[GSBPP - 1]) {
-    goto failed;
-  }
-  J = GSBPP - 2;
+  if (!GSPLANES.get()[GSBPP - 1])
+    return nullptr;
+
+  int32_t J = GSBPP - 2;
   while (J >= 0) {
     FXCODEC_STATUS status = pGRD->Start_decode_Arith(
-        &GSPLANES[J], pArithDecoder, gbContext, nullptr);
+        &GSPLANES.get()[J], pArithDecoder, gbContext, nullptr);
     while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
       pGRD->Continue_decode(pPause);
     }
-    if (!GSPLANES[J]) {
-      for (K = GSBPP - 1; K > J; K--) {
-        delete GSPLANES[K];
-        goto failed;
+    if (!GSPLANES.get()[J]) {
+      for (int32_t K = GSBPP - 1; K > J; --K) {
+        delete GSPLANES.get()[K];
+        return nullptr;
       }
     }
-    GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR);
+    GSPLANES.get()[J]->composeFrom(0, 0, GSPLANES.get()[J + 1],
+                                   JBIG2_COMPOSE_XOR);
     J = J - 1;
   }
-  for (y = 0; y < GSH; y++) {
-    for (x = 0; x < GSW; x++) {
-      for (J = 0; J < GSBPP; J++) {
-        GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J;
+  nonstd::unique_ptr<FX_DWORD, FxFreeDeleter> GSVALS(
+      FX_Alloc2D(FX_DWORD, GSW, GSH));
+  JBIG2_memset(GSVALS.get(), 0, sizeof(FX_DWORD) * GSW * GSH);
+  for (FX_DWORD y = 0; y < GSH; ++y) {
+    for (FX_DWORD x = 0; x < GSW; ++x) {
+      for (J = 0; J < GSBPP; ++J) {
+        GSVALS.get()[y * GSW + x] |= GSPLANES.get()[J]->getPixel(x, y) << J;
       }
     }
   }
-  for (J = 0; J < GSBPP; J++) {
-    delete GSPLANES[J];
+  for (J = 0; J < GSBPP; ++J) {
+    delete GSPLANES.get()[J];
   }
-  FX_Free(GSPLANES);
-  return GSVALS;
-failed:
-  FX_Free(GSPLANES);
-  FX_Free(GSVALS);
-  return nullptr;
+  return GSVALS.release();
 }
 
 FX_DWORD* CJBig2_GSIDProc::decode_MMR(CJBig2_BitStream* pStream,
                                       IFX_Pause* pPause) {
-  CJBig2_Image** GSPLANES;
-  int32_t J, K;
-  FX_DWORD x, y;
-  FX_DWORD* GSVALS;
-  GSPLANES = FX_Alloc(CJBig2_Image*, GSBPP);
-  GSVALS = FX_Alloc2D(FX_DWORD, GSW, GSH);
-  JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*) * GSBPP);
-  JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD) * GSW * GSH);
-
   nonstd::unique_ptr<CJBig2_GRDProc> pGRD(new CJBig2_GRDProc());
   pGRD->MMR = GSMMR;
   pGRD->GBW = GSW;
   pGRD->GBH = GSH;
+
+  nonstd::unique_ptr<CJBig2_Image*> GSPLANES(FX_Alloc(CJBig2_Image*, GSBPP));
+  JBIG2_memset(GSPLANES.get(), 0, sizeof(CJBig2_Image*) * GSBPP);
   FXCODEC_STATUS status =
-      pGRD->Start_decode_MMR(&GSPLANES[GSBPP - 1], pStream, nullptr);
+      pGRD->Start_decode_MMR(&GSPLANES.get()[GSBPP - 1], pStream, nullptr);
   while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
     pGRD->Continue_decode(pPause);
   }
-  if (!GSPLANES[GSBPP - 1]) {
-    goto failed;
-  }
+  if (!GSPLANES.get()[GSBPP - 1])
+    return nullptr;
+
   pStream->alignByte();
   pStream->offset(3);
-  J = GSBPP - 2;
+  int32_t J = GSBPP - 2;
   while (J >= 0) {
     FXCODEC_STATUS status =
-        pGRD->Start_decode_MMR(&GSPLANES[J], pStream, nullptr);
+        pGRD->Start_decode_MMR(&GSPLANES.get()[J], pStream, nullptr);
     while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
       pGRD->Continue_decode(pPause);
     }
-    if (!GSPLANES[J]) {
-      for (K = GSBPP - 1; K > J; K--) {
-        delete GSPLANES[K];
-        goto failed;
+    if (!GSPLANES.get()[J]) {
+      for (int32_t K = GSBPP - 1; K > J; --K) {
+        delete GSPLANES.get()[K];
+        return nullptr;
       }
     }
     pStream->alignByte();
     pStream->offset(3);
-    GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR);
+    GSPLANES.get()[J]->composeFrom(0, 0, GSPLANES.get()[J + 1],
+                                   JBIG2_COMPOSE_XOR);
     J = J - 1;
   }
-  for (y = 0; y < GSH; y++) {
-    for (x = 0; x < GSW; x++) {
-      for (J = 0; J < GSBPP; J++) {
-        GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J;
+  nonstd::unique_ptr<FX_DWORD> GSVALS(FX_Alloc2D(FX_DWORD, GSW, GSH));
+  JBIG2_memset(GSVALS.get(), 0, sizeof(FX_DWORD) * GSW * GSH);
+  for (FX_DWORD y = 0; y < GSH; ++y) {
+    for (FX_DWORD x = 0; x < GSW; ++x) {
+      for (J = 0; J < GSBPP; ++J) {
+        GSVALS.get()[y * GSW + x] |= GSPLANES.get()[J]->getPixel(x, y) << J;
       }
     }
   }
-  for (J = 0; J < GSBPP; J++) {
-    delete GSPLANES[J];
+  for (J = 0; J < GSBPP; ++J) {
+    delete GSPLANES.get()[J];
   }
-  FX_Free(GSPLANES);
-  return GSVALS;
-failed:
-  FX_Free(GSPLANES);
-  FX_Free(GSVALS);
-  return nullptr;
+  return GSVALS.release();
 }
index 7041458..60b5f3c 100644 (file)
@@ -8,6 +8,8 @@
 
 #include <string.h>
 
+#include <vector>
+
 #include "../../../include/fxcrt/fx_memory.h"
 #include "JBig2_BitStream.h"
 
@@ -40,7 +42,7 @@ void CJBig2_HuffmanTable::init() {
 int CJBig2_HuffmanTable::parseFromStandardTable(const JBig2TableLine* pTable,
                                                 int nLines,
                                                 FX_BOOL bHTOOB) {
-  int CURLEN, LENMAX, CURCODE, CURTEMP, i;
+  int CURLEN, LENMAX, CURCODE, CURTEMP;
   int* LENCOUNT;
   int* FIRSTCODE;
   HTOOB = bHTOOB;
@@ -50,7 +52,7 @@ int CJBig2_HuffmanTable::parseFromStandardTable(const JBig2TableLine* pTable,
   RANGELEN = FX_Alloc(int, NTEMP);
   RANGELOW = FX_Alloc(int, NTEMP);
   LENMAX = 0;
-  for (i = 0; i < NTEMP; i++) {
+  for (int i = 0; i < NTEMP; i++) {
     PREFLEN[i] = pTable[i].PREFLEN;
     RANGELEN[i] = pTable[i].RANDELEN;
     RANGELOW[i] = pTable[i].RANGELOW;
@@ -61,7 +63,7 @@ int CJBig2_HuffmanTable::parseFromStandardTable(const JBig2TableLine* pTable,
   LENCOUNT = FX_Alloc(int, LENMAX + 1);
   JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));
   FIRSTCODE = FX_Alloc(int, LENMAX + 1);
-  for (i = 0; i < NTEMP; i++) {
+  for (int i = 0; i < NTEMP; i++) {
     LENCOUNT[PREFLEN[i]]++;
   }
   CURLEN = 1;
@@ -93,92 +95,77 @@ int CJBig2_HuffmanTable::parseFromStandardTable(const JBig2TableLine* pTable,
     RANGELOW = FX_Realloc(int, RANGELOW, nSize); \
   }
 int CJBig2_HuffmanTable::parseFromCodedBuffer(CJBig2_BitStream* pStream) {
-  unsigned char HTPS, HTRS;
-  FX_DWORD HTLOW, HTHIGH;
-  FX_DWORD CURRANGELOW;
-  FX_DWORD nSize = 16;
-  int CURLEN, LENMAX, CURCODE, CURTEMP;
-  int* LENCOUNT;
-  int* FIRSTCODE;
   unsigned char cTemp;
-  if (pStream->read1Byte(&cTemp) == -1) {
-    goto failed;
-  }
+  if (pStream->read1Byte(&cTemp) == -1)
+    return FALSE;
+
   HTOOB = cTemp & 0x01;
-  HTPS = ((cTemp >> 1) & 0x07) + 1;
-  HTRS = ((cTemp >> 4) & 0x07) + 1;
+  unsigned char HTPS = ((cTemp >> 1) & 0x07) + 1;
+  unsigned char HTRS = ((cTemp >> 4) & 0x07) + 1;
+  FX_DWORD HTLOW;
+  FX_DWORD HTHIGH;
   if (pStream->readInteger(&HTLOW) == -1 ||
       pStream->readInteger(&HTHIGH) == -1 || HTLOW > HTHIGH) {
-    goto failed;
+    return FALSE;
   }
+  FX_DWORD nSize = 16;
   PREFLEN = FX_Alloc(int, nSize);
   RANGELEN = FX_Alloc(int, nSize);
   RANGELOW = FX_Alloc(int, nSize);
-  CURRANGELOW = HTLOW;
+  FX_DWORD CURRANGELOW = HTLOW;
   NTEMP = 0;
   do {
     HT_CHECK_MEMORY_ADJUST
     if ((pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) ||
         (pStream->readNBits(HTRS, &RANGELEN[NTEMP]) == -1)) {
-      goto failed;
+      return FALSE;
     }
     RANGELOW[NTEMP] = CURRANGELOW;
     CURRANGELOW = CURRANGELOW + (1 << RANGELEN[NTEMP]);
     NTEMP = NTEMP + 1;
   } while (CURRANGELOW < HTHIGH);
   HT_CHECK_MEMORY_ADJUST
-  if (pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {
-    goto failed;
-  }
+  if (pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1)
+    return FALSE;
+
   RANGELEN[NTEMP] = 32;
   RANGELOW[NTEMP] = HTLOW - 1;
   NTEMP = NTEMP + 1;
   HT_CHECK_MEMORY_ADJUST
-  if (pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {
-    goto failed;
-  }
+  if (pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1)
+    return FALSE;
+
   RANGELEN[NTEMP] = 32;
   RANGELOW[NTEMP] = HTHIGH;
   NTEMP = NTEMP + 1;
   if (HTOOB) {
     HT_CHECK_MEMORY_ADJUST
-    if (pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {
-      goto failed;
-    }
+    if (pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1)
+      return FALSE;
     NTEMP = NTEMP + 1;
   }
   CODES = FX_Alloc(int, NTEMP);
-  LENMAX = 0;
+  int LENMAX = 0;
   for (int i = 0; i < NTEMP; i++) {
     if (PREFLEN[i] > LENMAX) {
       LENMAX = PREFLEN[i];
     }
   }
-  LENCOUNT = FX_Alloc(int, (LENMAX + 1));
-  JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));
-  FIRSTCODE = FX_Alloc(int, (LENMAX + 1));
-  for (int i = 0; i < NTEMP; i++) {
+
+  std::vector<int> LENCOUNT(LENMAX + 1);
+  for (int i = 0; i < NTEMP; ++i)
     LENCOUNT[PREFLEN[i]]++;
-  }
-  CURLEN = 1;
-  FIRSTCODE[0] = 0;
   LENCOUNT[0] = 0;
-  while (CURLEN <= LENMAX) {
-    FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1;
-    CURCODE = FIRSTCODE[CURLEN];
-    CURTEMP = 0;
-    while (CURTEMP < NTEMP) {
-      if (PREFLEN[CURTEMP] == CURLEN) {
-        CODES[CURTEMP] = CURCODE;
-        CURCODE = CURCODE + 1;
-      }
-      CURTEMP = CURTEMP + 1;
+
+  std::vector<int> FIRSTCODE(LENMAX + 1);
+  FIRSTCODE[0] = 0;
+  for (int i = 0; i <= LENMAX; ++i) {
+    FIRSTCODE[i] = (FIRSTCODE[i - 1] + LENCOUNT[i - 1]) << 1;
+    int CURCODE = FIRSTCODE[i];
+    for (int j = 0; j < NTEMP; ++j) {
+      if (PREFLEN[j] == i)
+        CODES[j] = CURCODE++;
     }
-    CURLEN = CURLEN + 1;
   }
-  FX_Free(LENCOUNT);
-  FX_Free(FIRSTCODE);
   return TRUE;
-failed:
-  return FALSE;
 }