Cleanup casting of FX_Alloc() return values.
[pdfium.git] / core / src / fxcodec / jbig2 / JBig2_HuffmanTable.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #include "JBig2_HuffmanTable.h"
8
9 #include <string.h>
10
11 #include "../../../include/fxcrt/fx_memory.h"
12 #include "JBig2_BitStream.h"
13
14 CJBig2_HuffmanTable::CJBig2_HuffmanTable(const JBig2TableLine* pTable,
15                                          int nLines,
16                                          FX_BOOL bHTOOB) {
17   init();
18   m_bOK = parseFromStandardTable(pTable, nLines, bHTOOB);
19 }
20
21 CJBig2_HuffmanTable::CJBig2_HuffmanTable(CJBig2_BitStream* pStream) {
22   init();
23   m_bOK = parseFromCodedBuffer(pStream);
24 }
25
26 CJBig2_HuffmanTable::~CJBig2_HuffmanTable() {
27   FX_Free(CODES);
28   FX_Free(PREFLEN);
29   FX_Free(RANGELEN);
30   FX_Free(RANGELOW);
31 }
32 void CJBig2_HuffmanTable::init() {
33   HTOOB = FALSE;
34   NTEMP = 0;
35   CODES = NULL;
36   PREFLEN = NULL;
37   RANGELEN = NULL;
38   RANGELOW = NULL;
39 }
40 int CJBig2_HuffmanTable::parseFromStandardTable(const JBig2TableLine* pTable,
41                                                 int nLines,
42                                                 FX_BOOL bHTOOB) {
43   int CURLEN, LENMAX, CURCODE, CURTEMP, i;
44   int* LENCOUNT;
45   int* FIRSTCODE;
46   HTOOB = bHTOOB;
47   NTEMP = nLines;
48   CODES = FX_Alloc(int, NTEMP);
49   PREFLEN = FX_Alloc(int, NTEMP);
50   RANGELEN = FX_Alloc(int, NTEMP);
51   RANGELOW = FX_Alloc(int, NTEMP);
52   LENMAX = 0;
53   for (i = 0; i < NTEMP; i++) {
54     PREFLEN[i] = pTable[i].PREFLEN;
55     RANGELEN[i] = pTable[i].RANDELEN;
56     RANGELOW[i] = pTable[i].RANGELOW;
57     if (PREFLEN[i] > LENMAX) {
58       LENMAX = PREFLEN[i];
59     }
60   }
61   LENCOUNT = FX_Alloc(int, LENMAX + 1);
62   JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));
63   FIRSTCODE = FX_Alloc(int, LENMAX + 1);
64   for (i = 0; i < NTEMP; i++) {
65     LENCOUNT[PREFLEN[i]]++;
66   }
67   CURLEN = 1;
68   FIRSTCODE[0] = 0;
69   LENCOUNT[0] = 0;
70   while (CURLEN <= LENMAX) {
71     FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1;
72     CURCODE = FIRSTCODE[CURLEN];
73     CURTEMP = 0;
74     while (CURTEMP < NTEMP) {
75       if (PREFLEN[CURTEMP] == CURLEN) {
76         CODES[CURTEMP] = CURCODE;
77         CURCODE = CURCODE + 1;
78       }
79       CURTEMP = CURTEMP + 1;
80     }
81     CURLEN = CURLEN + 1;
82   }
83   FX_Free(LENCOUNT);
84   FX_Free(FIRSTCODE);
85   return 1;
86 }
87
88 #define HT_CHECK_MEMORY_ADJUST                   \
89   if (NTEMP >= nSize) {                          \
90     nSize += 16;                                 \
91     PREFLEN = FX_Realloc(int, PREFLEN, nSize);   \
92     RANGELEN = FX_Realloc(int, RANGELEN, nSize); \
93     RANGELOW = FX_Realloc(int, RANGELOW, nSize); \
94   }
95 int CJBig2_HuffmanTable::parseFromCodedBuffer(CJBig2_BitStream* pStream) {
96   unsigned char HTPS, HTRS;
97   FX_DWORD HTLOW, HTHIGH;
98   FX_DWORD CURRANGELOW;
99   FX_DWORD nSize = 16;
100   int CURLEN, LENMAX, CURCODE, CURTEMP;
101   int* LENCOUNT;
102   int* FIRSTCODE;
103   unsigned char cTemp;
104   if (pStream->read1Byte(&cTemp) == -1) {
105     goto failed;
106   }
107   HTOOB = cTemp & 0x01;
108   HTPS = ((cTemp >> 1) & 0x07) + 1;
109   HTRS = ((cTemp >> 4) & 0x07) + 1;
110   if (pStream->readInteger(&HTLOW) == -1 ||
111       pStream->readInteger(&HTHIGH) == -1 || HTLOW > HTHIGH) {
112     goto failed;
113   }
114   PREFLEN = FX_Alloc(int, nSize);
115   RANGELEN = FX_Alloc(int, nSize);
116   RANGELOW = FX_Alloc(int, nSize);
117   CURRANGELOW = HTLOW;
118   NTEMP = 0;
119   do {
120     HT_CHECK_MEMORY_ADJUST
121     if ((pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) ||
122         (pStream->readNBits(HTRS, &RANGELEN[NTEMP]) == -1)) {
123       goto failed;
124     }
125     RANGELOW[NTEMP] = CURRANGELOW;
126     CURRANGELOW = CURRANGELOW + (1 << RANGELEN[NTEMP]);
127     NTEMP = NTEMP + 1;
128   } while (CURRANGELOW < HTHIGH);
129   HT_CHECK_MEMORY_ADJUST
130   if (pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {
131     goto failed;
132   }
133   RANGELEN[NTEMP] = 32;
134   RANGELOW[NTEMP] = HTLOW - 1;
135   NTEMP = NTEMP + 1;
136   HT_CHECK_MEMORY_ADJUST
137   if (pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {
138     goto failed;
139   }
140   RANGELEN[NTEMP] = 32;
141   RANGELOW[NTEMP] = HTHIGH;
142   NTEMP = NTEMP + 1;
143   if (HTOOB) {
144     HT_CHECK_MEMORY_ADJUST
145     if (pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {
146       goto failed;
147     }
148     NTEMP = NTEMP + 1;
149   }
150   CODES = FX_Alloc(int, NTEMP);
151   LENMAX = 0;
152   for (int i = 0; i < NTEMP; i++) {
153     if (PREFLEN[i] > LENMAX) {
154       LENMAX = PREFLEN[i];
155     }
156   }
157   LENCOUNT = FX_Alloc(int, (LENMAX + 1));
158   JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));
159   FIRSTCODE = FX_Alloc(int, (LENMAX + 1));
160   for (int i = 0; i < NTEMP; i++) {
161     LENCOUNT[PREFLEN[i]]++;
162   }
163   CURLEN = 1;
164   FIRSTCODE[0] = 0;
165   LENCOUNT[0] = 0;
166   while (CURLEN <= LENMAX) {
167     FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1;
168     CURCODE = FIRSTCODE[CURLEN];
169     CURTEMP = 0;
170     while (CURTEMP < NTEMP) {
171       if (PREFLEN[CURTEMP] == CURLEN) {
172         CODES[CURTEMP] = CURCODE;
173         CURCODE = CURCODE + 1;
174       }
175       CURTEMP = CURTEMP + 1;
176     }
177     CURLEN = CURLEN + 1;
178   }
179   FX_Free(LENCOUNT);
180   FX_Free(FIRSTCODE);
181   return TRUE;
182 failed:
183   return FALSE;
184 }