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 "core/include/fxcrt/fx_basic.h" | 7 #include "core/include/fxcrt/fx_basic.h" |
8 #include "plex.h" | 8 #include "plex.h" |
9 | 9 |
| 10 namespace { |
| 11 |
| 12 const uint8_t kFreeLength = 0xfe; |
| 13 const uint8_t kHasAllocatedBufferLength = 0xff; |
| 14 |
| 15 } // namespace |
| 16 |
10 CFX_MapPtrToPtr::CFX_MapPtrToPtr(int nBlockSize) | 17 CFX_MapPtrToPtr::CFX_MapPtrToPtr(int nBlockSize) |
11 : m_pHashTable(NULL), | 18 : m_pHashTable(NULL), |
12 m_nHashTableSize(17), | 19 m_nHashTableSize(17), |
13 m_nCount(0), | 20 m_nCount(0), |
14 m_pFreeList(NULL), | 21 m_pFreeList(NULL), |
15 m_pBlocks(NULL), | 22 m_pBlocks(NULL), |
16 m_nBlockSize(nBlockSize) { | 23 m_nBlockSize(nBlockSize) { |
17 ASSERT(m_nBlockSize > 0); | 24 ASSERT(m_nBlockSize > 0); |
18 } | 25 } |
19 void CFX_MapPtrToPtr::RemoveAll() { | 26 void CFX_MapPtrToPtr::RemoveAll() { |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 } | 165 } |
159 } | 166 } |
160 struct _CompactString { | 167 struct _CompactString { |
161 uint8_t m_CompactLen; | 168 uint8_t m_CompactLen; |
162 uint8_t m_LenHigh; | 169 uint8_t m_LenHigh; |
163 uint8_t m_LenLow; | 170 uint8_t m_LenLow; |
164 uint8_t m_Unused; | 171 uint8_t m_Unused; |
165 uint8_t* m_pBuffer; | 172 uint8_t* m_pBuffer; |
166 }; | 173 }; |
167 static void _CompactStringRelease(_CompactString* pCompact) { | 174 static void _CompactStringRelease(_CompactString* pCompact) { |
168 if (pCompact->m_CompactLen == 0xff) { | 175 if (pCompact->m_CompactLen == kHasAllocatedBufferLength) { |
169 FX_Free(pCompact->m_pBuffer); | 176 FX_Free(pCompact->m_pBuffer); |
170 } | 177 } |
171 } | 178 } |
172 static FX_BOOL _CompactStringSame(_CompactString* pCompact, | 179 static FX_BOOL _CompactStringSame(_CompactString* pCompact, |
173 const uint8_t* pStr, | 180 const uint8_t* pStr, |
174 int len) { | 181 int len) { |
175 if (len < sizeof(_CompactString)) { | 182 if (len < sizeof(_CompactString)) { |
176 if (pCompact->m_CompactLen != len) { | 183 if (pCompact->m_CompactLen != len) { |
177 return FALSE; | 184 return FALSE; |
178 } | 185 } |
179 return FXSYS_memcmp(&pCompact->m_LenHigh, pStr, len) == 0; | 186 return FXSYS_memcmp(&pCompact->m_LenHigh, pStr, len) == 0; |
180 } | 187 } |
181 if (pCompact->m_CompactLen != 0xff || | 188 if (pCompact->m_CompactLen != kHasAllocatedBufferLength || |
182 pCompact->m_LenHigh * 256 + pCompact->m_LenLow != len) { | 189 pCompact->m_LenHigh * 256 + pCompact->m_LenLow != len) { |
183 return FALSE; | 190 return FALSE; |
184 } | 191 } |
185 return FXSYS_memcmp(pCompact->m_pBuffer, pStr, len) == 0; | 192 return FXSYS_memcmp(pCompact->m_pBuffer, pStr, len) == 0; |
186 } | 193 } |
187 static void _CompactStringStore(_CompactString* pCompact, | 194 static void _CompactStringStore(_CompactString* pCompact, |
188 const uint8_t* pStr, | 195 const uint8_t* pStr, |
189 int len) { | 196 int len) { |
190 if (len < (int)sizeof(_CompactString)) { | 197 if (len < (int)sizeof(_CompactString)) { |
191 pCompact->m_CompactLen = (uint8_t)len; | 198 pCompact->m_CompactLen = (uint8_t)len; |
192 FXSYS_memcpy(&pCompact->m_LenHigh, pStr, len); | 199 FXSYS_memcpy(&pCompact->m_LenHigh, pStr, len); |
193 return; | 200 return; |
194 } | 201 } |
195 pCompact->m_CompactLen = 0xff; | 202 pCompact->m_CompactLen = kHasAllocatedBufferLength; |
196 pCompact->m_LenHigh = len / 256; | 203 pCompact->m_LenHigh = len / 256; |
197 pCompact->m_LenLow = len % 256; | 204 pCompact->m_LenLow = len % 256; |
198 pCompact->m_pBuffer = FX_Alloc(uint8_t, len); | 205 pCompact->m_pBuffer = FX_Alloc(uint8_t, len); |
199 FXSYS_memcpy(pCompact->m_pBuffer, pStr, len); | 206 FXSYS_memcpy(pCompact->m_pBuffer, pStr, len); |
200 } | 207 } |
201 static CFX_ByteStringC _CompactStringGet(_CompactString* pCompact) { | 208 static CFX_ByteStringC _CompactStringGet(_CompactString* pCompact) { |
202 if (pCompact->m_CompactLen == 0xff) { | 209 if (pCompact->m_CompactLen == kHasAllocatedBufferLength) { |
203 return CFX_ByteStringC(pCompact->m_pBuffer, | 210 return CFX_ByteStringC(pCompact->m_pBuffer, |
204 pCompact->m_LenHigh * 256 + pCompact->m_LenLow); | 211 pCompact->m_LenHigh * 256 + pCompact->m_LenLow); |
205 } | 212 } |
206 if (pCompact->m_CompactLen == 0xfe) { | 213 if (pCompact->m_CompactLen == kFreeLength) { |
207 return CFX_ByteStringC(); | 214 return CFX_ByteStringC(); |
208 } | 215 } |
209 return CFX_ByteStringC(&pCompact->m_LenHigh, pCompact->m_CompactLen); | 216 return CFX_ByteStringC(&pCompact->m_LenHigh, pCompact->m_CompactLen); |
210 } | 217 } |
211 #define CMAP_ALLOC_STEP 8 | 218 #define CMAP_ALLOC_STEP 8 |
212 #define CMAP_INDEX_SIZE 8 | 219 #define CMAP_INDEX_SIZE 8 |
213 CFX_CMapByteStringToPtr::CFX_CMapByteStringToPtr() | 220 CFX_CMapByteStringToPtr::CFX_CMapByteStringToPtr() |
214 : m_Buffer(sizeof(_CompactString) + sizeof(void*), | 221 : m_Buffer(sizeof(_CompactString) + sizeof(void*), |
215 CMAP_ALLOC_STEP, | 222 CMAP_ALLOC_STEP, |
216 CMAP_INDEX_SIZE) {} | 223 CMAP_INDEX_SIZE) {} |
217 CFX_CMapByteStringToPtr::~CFX_CMapByteStringToPtr() { | 224 CFX_CMapByteStringToPtr::~CFX_CMapByteStringToPtr() { |
218 RemoveAll(); | 225 RemoveAll(); |
219 } | 226 } |
220 void CFX_CMapByteStringToPtr::RemoveAll() { | 227 void CFX_CMapByteStringToPtr::RemoveAll() { |
221 int size = m_Buffer.GetSize(); | 228 int size = m_Buffer.GetSize(); |
222 for (int i = 0; i < size; i++) { | 229 for (int i = 0; i < size; i++) { |
223 _CompactStringRelease((_CompactString*)m_Buffer.GetAt(i)); | 230 _CompactStringRelease((_CompactString*)m_Buffer.GetAt(i)); |
224 } | 231 } |
225 m_Buffer.RemoveAll(); | 232 m_Buffer.RemoveAll(); |
226 } | 233 } |
227 FX_POSITION CFX_CMapByteStringToPtr::GetStartPosition() const { | 234 FX_POSITION CFX_CMapByteStringToPtr::GetStartPosition() const { |
228 int size = m_Buffer.GetSize(); | 235 int size = m_Buffer.GetSize(); |
229 for (int i = 0; i < size; i++) { | 236 for (int i = 0; i < size; i++) { |
230 _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(i); | 237 _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(i); |
231 if (pKey->m_CompactLen != 0xfe) { | 238 if (pKey->m_CompactLen != kFreeLength) { |
232 return (FX_POSITION)(uintptr_t)(i + 1); | 239 return (FX_POSITION)(uintptr_t)(i + 1); |
233 } | 240 } |
234 } | 241 } |
235 return NULL; | 242 return NULL; |
236 } | 243 } |
237 void CFX_CMapByteStringToPtr::GetNextAssoc(FX_POSITION& rNextPosition, | 244 void CFX_CMapByteStringToPtr::GetNextAssoc(FX_POSITION& rNextPosition, |
238 CFX_ByteString& rKey, | 245 CFX_ByteString& rKey, |
239 void*& rValue) const { | 246 void*& rValue) const { |
240 if (!rNextPosition) { | 247 if (!rNextPosition) { |
241 return; | 248 return; |
242 } | 249 } |
243 int index = (int)(uintptr_t)rNextPosition - 1; | 250 int index = (int)(uintptr_t)rNextPosition - 1; |
244 _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index); | 251 _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index); |
245 rKey = _CompactStringGet(pKey); | 252 rKey = _CompactStringGet(pKey); |
246 rValue = *(void**)(pKey + 1); | 253 rValue = *(void**)(pKey + 1); |
247 index++; | 254 index++; |
248 int size = m_Buffer.GetSize(); | 255 int size = m_Buffer.GetSize(); |
249 while (index < size) { | 256 while (index < size) { |
250 pKey = (_CompactString*)m_Buffer.GetAt(index); | 257 pKey = (_CompactString*)m_Buffer.GetAt(index); |
251 if (pKey->m_CompactLen != 0xfe) { | 258 if (pKey->m_CompactLen != kFreeLength) { |
252 rNextPosition = (FX_POSITION)(uintptr_t)(index + 1); | 259 rNextPosition = (FX_POSITION)(uintptr_t)(index + 1); |
253 return; | 260 return; |
254 } | 261 } |
255 index++; | 262 index++; |
256 } | 263 } |
257 rNextPosition = NULL; | 264 rNextPosition = NULL; |
258 } | 265 } |
259 void* CFX_CMapByteStringToPtr::GetNextValue(FX_POSITION& rNextPosition) const { | 266 void* CFX_CMapByteStringToPtr::GetNextValue(FX_POSITION& rNextPosition) const { |
260 if (!rNextPosition) { | 267 if (!rNextPosition) { |
261 return NULL; | 268 return NULL; |
262 } | 269 } |
263 int index = (int)(uintptr_t)rNextPosition - 1; | 270 int index = (int)(uintptr_t)rNextPosition - 1; |
264 _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index); | 271 _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index); |
265 void* rValue = *(void**)(pKey + 1); | 272 void* rValue = *(void**)(pKey + 1); |
266 index++; | 273 index++; |
267 int size = m_Buffer.GetSize(); | 274 int size = m_Buffer.GetSize(); |
268 while (index < size) { | 275 while (index < size) { |
269 pKey = (_CompactString*)m_Buffer.GetAt(index); | 276 pKey = (_CompactString*)m_Buffer.GetAt(index); |
270 if (pKey->m_CompactLen != 0xfe) { | 277 if (pKey->m_CompactLen != kFreeLength) { |
271 rNextPosition = (FX_POSITION)(uintptr_t)(index + 1); | 278 rNextPosition = (FX_POSITION)(uintptr_t)(index + 1); |
272 return rValue; | 279 return rValue; |
273 } | 280 } |
274 index++; | 281 index++; |
275 } | 282 } |
276 rNextPosition = NULL; | 283 rNextPosition = NULL; |
277 return rValue; | 284 return rValue; |
278 } | 285 } |
279 FX_BOOL _CMapLookupCallback(void* param, void* pData) { | 286 FX_BOOL _CMapLookupCallback(void* param, void* pData) { |
280 return !_CompactStringSame((_CompactString*)pData, | 287 return !_CompactStringSame((_CompactString*)pData, |
(...skipping 16 matching lines...) Expand all Loading... |
297 for (int index = 0; index < size; index++) { | 304 for (int index = 0; index < size; index++) { |
298 _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index); | 305 _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index); |
299 if (!_CompactStringSame(pKey, key.GetPtr(), key_len)) { | 306 if (!_CompactStringSame(pKey, key.GetPtr(), key_len)) { |
300 continue; | 307 continue; |
301 } | 308 } |
302 *(void**)(pKey + 1) = value; | 309 *(void**)(pKey + 1) = value; |
303 return; | 310 return; |
304 } | 311 } |
305 for (int index = 0; index < size; index++) { | 312 for (int index = 0; index < size; index++) { |
306 _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index); | 313 _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index); |
307 if (pKey->m_CompactLen) { | 314 if (pKey->m_CompactLen != kFreeLength) { |
308 continue; | 315 continue; |
309 } | 316 } |
310 _CompactStringStore(pKey, key.GetPtr(), key_len); | 317 _CompactStringStore(pKey, key.GetPtr(), key_len); |
311 *(void**)(pKey + 1) = value; | 318 *(void**)(pKey + 1) = value; |
312 return; | 319 return; |
313 } | 320 } |
314 _CompactString* pKey = (_CompactString*)m_Buffer.Add(); | 321 _CompactString* pKey = (_CompactString*)m_Buffer.Add(); |
315 _CompactStringStore(pKey, key.GetPtr(), key_len); | 322 _CompactStringStore(pKey, key.GetPtr(), key_len); |
316 *(void**)(pKey + 1) = value; | 323 *(void**)(pKey + 1) = value; |
317 } | 324 } |
318 void CFX_CMapByteStringToPtr::AddValue(const CFX_ByteStringC& key, | 325 void CFX_CMapByteStringToPtr::AddValue(const CFX_ByteStringC& key, |
319 void* value) { | 326 void* value) { |
320 ASSERT(value); | 327 ASSERT(value); |
321 _CompactString* pKey = (_CompactString*)m_Buffer.Add(); | 328 _CompactString* pKey = (_CompactString*)m_Buffer.Add(); |
322 _CompactStringStore(pKey, key.GetPtr(), key.GetLength()); | 329 _CompactStringStore(pKey, key.GetPtr(), key.GetLength()); |
323 *(void**)(pKey + 1) = value; | 330 *(void**)(pKey + 1) = value; |
324 } | 331 } |
325 void CFX_CMapByteStringToPtr::RemoveKey(const CFX_ByteStringC& key) { | 332 void CFX_CMapByteStringToPtr::RemoveKey(const CFX_ByteStringC& key) { |
326 int key_len = key.GetLength(); | 333 int key_len = key.GetLength(); |
327 int size = m_Buffer.GetSize(); | 334 int size = m_Buffer.GetSize(); |
328 for (int index = 0; index < size; index++) { | 335 for (int index = 0; index < size; index++) { |
329 _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index); | 336 _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index); |
330 if (!_CompactStringSame(pKey, key.GetPtr(), key_len)) { | 337 if (!_CompactStringSame(pKey, key.GetPtr(), key_len)) { |
331 continue; | 338 continue; |
332 } | 339 } |
333 _CompactStringRelease(pKey); | 340 _CompactStringRelease(pKey); |
334 pKey->m_CompactLen = 0xfe; | 341 pKey->m_CompactLen = kFreeLength; |
335 return; | 342 return; |
336 } | 343 } |
337 } | 344 } |
338 int CFX_CMapByteStringToPtr::GetCount() const { | 345 int CFX_CMapByteStringToPtr::GetCount() const { |
339 int count = 0; | 346 int count = 0; |
340 int size = m_Buffer.GetSize(); | 347 int size = m_Buffer.GetSize(); |
341 for (int i = 0; i < size; i++) { | 348 for (int i = 0; i < size; i++) { |
342 _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(i); | 349 _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(i); |
343 if (pKey->m_CompactLen != 0xfe) { | 350 if (pKey->m_CompactLen != kFreeLength) { |
344 count++; | 351 count++; |
345 } | 352 } |
346 } | 353 } |
347 return count; | 354 return count; |
348 } | 355 } |
OLD | NEW |