OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "../../include/fxcrt/fx_basic.h" | 7 #include "../../include/fxcrt/fx_basic.h" |
8 #include "../../../third_party/base/numerics/safe_math.h" | 8 #include "../../../third_party/base/numerics/safe_math.h" |
9 | 9 |
10 CFX_BasicArray::CFX_BasicArray(int unit_size) | 10 CFX_BasicArray::CFX_BasicArray(int unit_size) |
11 : m_pData(NULL) | 11 : m_pData(NULL) |
12 , m_nSize(0) | 12 , m_nSize(0) |
13 , m_nMaxSize(0) | 13 , m_nMaxSize(0) |
14 { | 14 { |
15 if (unit_size < 0 || unit_size > (1 << 28)) { | 15 if (unit_size < 0 || unit_size > (1 << 28)) { |
16 m_nUnitSize = 4; | 16 m_nUnitSize = 4; |
17 } else { | 17 } else { |
18 m_nUnitSize = unit_size; | 18 m_nUnitSize = unit_size; |
19 } | 19 } |
20 } | 20 } |
21 CFX_BasicArray::~CFX_BasicArray() | 21 CFX_BasicArray::~CFX_BasicArray() |
22 { | 22 { |
23 FX_Free(m_pData); | 23 FX_Free(m_pData); |
24 } | 24 } |
25 bool CFX_BasicArray::SetSize(int nNewSize) | 25 FX_BOOL CFX_BasicArray::SetSize(int nNewSize) |
26 { | 26 { |
27 if (nNewSize <= 0) { | 27 if (nNewSize <= 0) { |
28 FX_Free(m_pData); | 28 FX_Free(m_pData); |
29 m_pData = NULL; | 29 m_pData = NULL; |
30 m_nSize = m_nMaxSize = 0; | 30 m_nSize = m_nMaxSize = 0; |
31 return 0 == nNewSize; | 31 return 0 == nNewSize; |
32 } | 32 } |
33 | 33 |
34 if (m_pData == NULL) { | 34 if (m_pData == NULL) { |
35 pdfium::base::CheckedNumeric<int> totalSize = nNewSize; | 35 pdfium::base::CheckedNumeric<int> totalSize = nNewSize; |
36 totalSize *= m_nUnitSize; | 36 totalSize *= m_nUnitSize; |
37 if (!totalSize.IsValid()) { | 37 if (!totalSize.IsValid()) { |
38 m_nSize = m_nMaxSize = 0; | 38 m_nSize = m_nMaxSize = 0; |
39 return false; | 39 return FALSE; |
40 } | 40 } |
41 m_pData = FX_Alloc(uint8_t, totalSize.ValueOrDie()); | 41 m_pData = FX_Alloc(uint8_t, totalSize.ValueOrDie()); |
42 m_nSize = m_nMaxSize = nNewSize; | 42 m_nSize = m_nMaxSize = nNewSize; |
43 } else if (nNewSize <= m_nMaxSize) { | 43 } else if (nNewSize <= m_nMaxSize) { |
44 if (nNewSize > m_nSize) { | 44 if (nNewSize > m_nSize) { |
45 FXSYS_memset(m_pData + m_nSize * m_nUnitSize, 0, (nNewSize - m_nSize
) * m_nUnitSize); | 45 FXSYS_memset(m_pData + m_nSize * m_nUnitSize, 0, (nNewSize - m_nSize
) * m_nUnitSize); |
46 } | 46 } |
47 m_nSize = nNewSize; | 47 m_nSize = nNewSize; |
48 } else { | 48 } else { |
49 int nNewMax = nNewSize < m_nMaxSize ? m_nMaxSize : nNewSize; | 49 int nNewMax = nNewSize < m_nMaxSize ? m_nMaxSize : nNewSize; |
50 pdfium::base::CheckedNumeric<int> totalSize = nNewMax; | 50 pdfium::base::CheckedNumeric<int> totalSize = nNewMax; |
51 totalSize *= m_nUnitSize; | 51 totalSize *= m_nUnitSize; |
52 if (!totalSize.IsValid() || nNewMax < m_nSize) { | 52 if (!totalSize.IsValid() || nNewMax < m_nSize) { |
53 return false; | 53 return FALSE; |
54 } | 54 } |
55 uint8_t* pNewData = FX_Realloc(uint8_t, m_pData, totalSize.ValueOrDie())
; | 55 uint8_t* pNewData = FX_Realloc(uint8_t, m_pData, totalSize.ValueOrDie())
; |
56 if (pNewData == NULL) { | 56 if (pNewData == NULL) { |
57 return false; | 57 return FALSE; |
58 } | 58 } |
59 FXSYS_memset(pNewData + m_nSize * m_nUnitSize, 0, (nNewMax - m_nSize) *
m_nUnitSize); | 59 FXSYS_memset(pNewData + m_nSize * m_nUnitSize, 0, (nNewMax - m_nSize) *
m_nUnitSize); |
60 m_pData = pNewData; | 60 m_pData = pNewData; |
61 m_nSize = nNewSize; | 61 m_nSize = nNewSize; |
62 m_nMaxSize = nNewMax; | 62 m_nMaxSize = nNewMax; |
63 } | 63 } |
64 return true; | 64 return TRUE; |
65 } | 65 } |
66 bool CFX_BasicArray::Append(const CFX_BasicArray& src) | 66 FX_BOOL CFX_BasicArray::Append(const CFX_BasicArray& src) |
67 { | 67 { |
68 int nOldSize = m_nSize; | 68 int nOldSize = m_nSize; |
69 pdfium::base::CheckedNumeric<int> newSize = m_nSize; | 69 pdfium::base::CheckedNumeric<int> newSize = m_nSize; |
70 newSize += src.m_nSize; | 70 newSize += src.m_nSize; |
71 if (m_nUnitSize != src.m_nUnitSize || !newSize.IsValid() || !SetSize(newSize
.ValueOrDie())) { | 71 if (m_nUnitSize != src.m_nUnitSize || !newSize.IsValid() || !SetSize(newSize
.ValueOrDie())) { |
72 return false; | 72 return FALSE; |
73 } | 73 } |
74 | 74 |
75 FXSYS_memcpy(m_pData + nOldSize * m_nUnitSize, src.m_pData, src.m_nSize * m_
nUnitSize); | 75 FXSYS_memcpy(m_pData + nOldSize * m_nUnitSize, src.m_pData, src.m_nSize * m_
nUnitSize); |
76 return true; | 76 return TRUE; |
77 } | 77 } |
78 bool CFX_BasicArray::Copy(const CFX_BasicArray& src) | 78 FX_BOOL CFX_BasicArray::Copy(const CFX_BasicArray& src) |
79 { | 79 { |
80 if (!SetSize(src.m_nSize)) { | 80 if (!SetSize(src.m_nSize)) { |
81 return false; | 81 return FALSE; |
82 } | 82 } |
83 FXSYS_memcpy(m_pData, src.m_pData, src.m_nSize * m_nUnitSize); | 83 FXSYS_memcpy(m_pData, src.m_pData, src.m_nSize * m_nUnitSize); |
84 return true; | 84 return TRUE; |
85 } | 85 } |
86 uint8_t* CFX_BasicArray::InsertSpaceAt(int nIndex, int nCount) | 86 uint8_t* CFX_BasicArray::InsertSpaceAt(int nIndex, int nCount) |
87 { | 87 { |
88 if (nIndex < 0 || nCount <= 0) { | 88 if (nIndex < 0 || nCount <= 0) { |
89 return NULL; | 89 return NULL; |
90 } | 90 } |
91 if (nIndex >= m_nSize) { | 91 if (nIndex >= m_nSize) { |
92 if (!SetSize(nIndex + nCount)) { | 92 if (!SetSize(nIndex + nCount)) { |
93 return NULL; | 93 return NULL; |
94 } | 94 } |
95 } else { | 95 } else { |
96 int nOldSize = m_nSize; | 96 int nOldSize = m_nSize; |
97 if (!SetSize(m_nSize + nCount)) { | 97 if (!SetSize(m_nSize + nCount)) { |
98 return NULL; | 98 return NULL; |
99 } | 99 } |
100 FXSYS_memmove(m_pData + (nIndex + nCount)*m_nUnitSize, m_pData + nIndex
* m_nUnitSize, | 100 FXSYS_memmove(m_pData + (nIndex + nCount)*m_nUnitSize, m_pData + nIndex
* m_nUnitSize, |
101 (nOldSize - nIndex) * m_nUnitSize); | 101 (nOldSize - nIndex) * m_nUnitSize); |
102 FXSYS_memset(m_pData + nIndex * m_nUnitSize, 0, nCount * m_nUnitSize); | 102 FXSYS_memset(m_pData + nIndex * m_nUnitSize, 0, nCount * m_nUnitSize); |
103 } | 103 } |
104 return m_pData + nIndex * m_nUnitSize; | 104 return m_pData + nIndex * m_nUnitSize; |
105 } | 105 } |
106 bool CFX_BasicArray::RemoveAt(int nIndex, int nCount) | 106 FX_BOOL CFX_BasicArray::RemoveAt(int nIndex, int nCount) |
107 { | 107 { |
108 if (nIndex < 0 || nCount <= 0 || m_nSize < nIndex + nCount) { | 108 if (nIndex < 0 || nCount <= 0 || m_nSize < nIndex + nCount) { |
109 return false; | 109 return FALSE; |
110 } | 110 } |
111 int nMoveCount = m_nSize - (nIndex + nCount); | 111 int nMoveCount = m_nSize - (nIndex + nCount); |
112 if (nMoveCount) { | 112 if (nMoveCount) { |
113 FXSYS_memmove(m_pData + nIndex * m_nUnitSize, m_pData + (nIndex + nCount
) * m_nUnitSize, nMoveCount * m_nUnitSize); | 113 FXSYS_memmove(m_pData + nIndex * m_nUnitSize, m_pData + (nIndex + nCount
) * m_nUnitSize, nMoveCount * m_nUnitSize); |
114 } | 114 } |
115 m_nSize -= nCount; | 115 m_nSize -= nCount; |
116 return true; | 116 return TRUE; |
117 } | 117 } |
118 bool CFX_BasicArray::InsertAt(int nStartIndex, const CFX_BasicArray* pNewArray) | 118 FX_BOOL CFX_BasicArray::InsertAt(int nStartIndex, const CFX_BasicArray* pNewArra
y) |
119 { | 119 { |
120 if (pNewArray == NULL) { | 120 if (pNewArray == NULL) { |
121 return false; | 121 return FALSE; |
122 } | 122 } |
123 if (pNewArray->m_nSize == 0) { | 123 if (pNewArray->m_nSize == 0) { |
124 return true; | 124 return TRUE; |
125 } | 125 } |
126 if (!InsertSpaceAt(nStartIndex, pNewArray->m_nSize)) { | 126 if (!InsertSpaceAt(nStartIndex, pNewArray->m_nSize)) { |
127 return false; | 127 return FALSE; |
128 } | 128 } |
129 FXSYS_memcpy(m_pData + nStartIndex * m_nUnitSize, pNewArray->m_pData, pNewAr
ray->m_nSize * m_nUnitSize); | 129 FXSYS_memcpy(m_pData + nStartIndex * m_nUnitSize, pNewArray->m_pData, pNewAr
ray->m_nSize * m_nUnitSize); |
130 return true; | 130 return TRUE; |
131 } | 131 } |
132 const void* CFX_BasicArray::GetDataPtr(int index) const | 132 const void* CFX_BasicArray::GetDataPtr(int index) const |
133 { | 133 { |
134 if (index < 0 || index >= m_nSize || m_pData == NULL) { | 134 if (index < 0 || index >= m_nSize || m_pData == NULL) { |
135 return NULL; | 135 return NULL; |
136 } | 136 } |
137 return m_pData + index * m_nUnitSize; | 137 return m_pData + index * m_nUnitSize; |
138 } | 138 } |
139 CFX_BaseSegmentedArray::CFX_BaseSegmentedArray(int unit_size, int segment_units,
int index_size) | 139 CFX_BaseSegmentedArray::CFX_BaseSegmentedArray(int unit_size, int segment_units,
int index_size) |
140 : m_UnitSize(unit_size) | 140 : m_UnitSize(unit_size) |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
253 tree_size *= m_IndexSize; | 253 tree_size *= m_IndexSize; |
254 } | 254 } |
255 void** pSpot = (void**)m_pIndex; | 255 void** pSpot = (void**)m_pIndex; |
256 for (i = 1; i < m_IndexDepth; i ++) { | 256 for (i = 1; i < m_IndexDepth; i ++) { |
257 pSpot = (void**)pSpot[seg_index / tree_size]; | 257 pSpot = (void**)pSpot[seg_index / tree_size]; |
258 seg_index = seg_index % tree_size; | 258 seg_index = seg_index % tree_size; |
259 tree_size /= m_IndexSize; | 259 tree_size /= m_IndexSize; |
260 } | 260 } |
261 return pSpot; | 261 return pSpot; |
262 } | 262 } |
263 void* CFX_BaseSegmentedArray::IterateSegment(const uint8_t* pSegment, int count,
bool (*callback)(void* param, void* pData), void* param) const | 263 void* CFX_BaseSegmentedArray::IterateSegment(const uint8_t* pSegment, int count,
FX_BOOL (*callback)(void* param, void* pData), void* param) const |
264 { | 264 { |
265 for (int i = 0; i < count; i ++) { | 265 for (int i = 0; i < count; i ++) { |
266 if (!callback(param, (void*)(pSegment + i * m_UnitSize))) { | 266 if (!callback(param, (void*)(pSegment + i * m_UnitSize))) { |
267 return (void*)(pSegment + i * m_UnitSize); | 267 return (void*)(pSegment + i * m_UnitSize); |
268 } | 268 } |
269 } | 269 } |
270 return NULL; | 270 return NULL; |
271 } | 271 } |
272 void* CFX_BaseSegmentedArray::IterateIndex(int level, int& start, void** pIndex,
bool (*callback)(void* param, void* pData), void* param) const | 272 void* CFX_BaseSegmentedArray::IterateIndex(int level, int& start, void** pIndex,
FX_BOOL (*callback)(void* param, void* pData), void* param) const |
273 { | 273 { |
274 if (level == 0) { | 274 if (level == 0) { |
275 int count = m_DataSize - start; | 275 int count = m_DataSize - start; |
276 if (count > m_SegmentSize) { | 276 if (count > m_SegmentSize) { |
277 count = m_SegmentSize; | 277 count = m_SegmentSize; |
278 } | 278 } |
279 start += count; | 279 start += count; |
280 return IterateSegment((const uint8_t*)pIndex, count, callback, param); | 280 return IterateSegment((const uint8_t*)pIndex, count, callback, param); |
281 } | 281 } |
282 for (int i = 0; i < m_IndexSize; i ++) { | 282 for (int i = 0; i < m_IndexSize; i ++) { |
283 if (pIndex[i] == NULL) { | 283 if (pIndex[i] == NULL) { |
284 continue; | 284 continue; |
285 } | 285 } |
286 void* p = IterateIndex(level - 1, start, (void**)pIndex[i], callback, pa
ram); | 286 void* p = IterateIndex(level - 1, start, (void**)pIndex[i], callback, pa
ram); |
287 if (p) { | 287 if (p) { |
288 return p; | 288 return p; |
289 } | 289 } |
290 } | 290 } |
291 return NULL; | 291 return NULL; |
292 } | 292 } |
293 void* CFX_BaseSegmentedArray::Iterate(bool (*callback)(void* param, void* pData)
, void* param) const | 293 void* CFX_BaseSegmentedArray::Iterate(FX_BOOL (*callback)(void* param, void* pDa
ta), void* param) const |
294 { | 294 { |
295 if (m_pIndex == NULL) { | 295 if (m_pIndex == NULL) { |
296 return NULL; | 296 return NULL; |
297 } | 297 } |
298 int start = 0; | 298 int start = 0; |
299 return IterateIndex(m_IndexDepth, start, (void**)m_pIndex, callback, param); | 299 return IterateIndex(m_IndexDepth, start, (void**)m_pIndex, callback, param); |
300 } | 300 } |
301 void* CFX_BaseSegmentedArray::GetAt(int index) const | 301 void* CFX_BaseSegmentedArray::GetAt(int index) const |
302 { | 302 { |
303 if (index < 0 || index >= m_DataSize) { | 303 if (index < 0 || index >= m_DataSize) { |
(...skipping 27 matching lines...) Expand all Loading... |
331 FX_Free(pIndex[i % m_IndexSize]); | 331 FX_Free(pIndex[i % m_IndexSize]); |
332 pIndex[i % m_IndexSize] = NULL; | 332 pIndex[i % m_IndexSize] = NULL; |
333 } | 333 } |
334 } else { | 334 } else { |
335 FX_Free(m_pIndex); | 335 FX_Free(m_pIndex); |
336 m_pIndex = NULL; | 336 m_pIndex = NULL; |
337 } | 337 } |
338 } | 338 } |
339 m_DataSize -= count; | 339 m_DataSize -= count; |
340 } | 340 } |
OLD | NEW |