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 <set> | 7 #include <set> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "../../../../third_party/base/nonstd_unique_ptr.h" | 11 #include "../../../../third_party/base/nonstd_unique_ptr.h" |
12 #include "../../../../third_party/base/stl_util.h" | 12 #include "../../../../third_party/base/stl_util.h" |
13 #include "../../../include/fpdfapi/fpdf_module.h" | 13 #include "../../../include/fpdfapi/fpdf_module.h" |
14 #include "../../../include/fpdfapi/fpdf_page.h" | 14 #include "../../../include/fpdfapi/fpdf_page.h" |
15 #include "../../../include/fpdfapi/fpdf_parser.h" | 15 #include "../../../include/fpdfapi/fpdf_parser.h" |
| 16 #include "../../../include/fxcrt/fx_ext.h" |
16 #include "../../../include/fxcrt/fx_safe_types.h" | 17 #include "../../../include/fxcrt/fx_safe_types.h" |
17 #include "../fpdf_page/pageint.h" | 18 #include "../fpdf_page/pageint.h" |
18 #include "parser_int.h" | 19 #include "parser_int.h" |
19 | 20 |
20 namespace { | 21 namespace { |
21 | 22 |
22 struct SearchTagRecord { | 23 struct SearchTagRecord { |
23 const uint8_t* m_pTag; | 24 const uint8_t* m_pTag; |
24 FX_DWORD m_Len; | 25 FX_DWORD m_Len; |
25 FX_DWORD m_Offset; | 26 FX_DWORD m_Offset; |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 } | 157 } |
157 CPDF_SecurityHandler* FPDF_CreateStandardSecurityHandler(); | 158 CPDF_SecurityHandler* FPDF_CreateStandardSecurityHandler(); |
158 CPDF_SecurityHandler* FPDF_CreatePubKeyHandler(void*); | 159 CPDF_SecurityHandler* FPDF_CreatePubKeyHandler(void*); |
159 FX_DWORD CPDF_Parser::StartParse(IFX_FileRead* pFileAccess, | 160 FX_DWORD CPDF_Parser::StartParse(IFX_FileRead* pFileAccess, |
160 FX_BOOL bReParse, | 161 FX_BOOL bReParse, |
161 FX_BOOL bOwnFileRead) { | 162 FX_BOOL bOwnFileRead) { |
162 CloseParser(bReParse); | 163 CloseParser(bReParse); |
163 m_bXRefStream = FALSE; | 164 m_bXRefStream = FALSE; |
164 m_LastXRefOffset = 0; | 165 m_LastXRefOffset = 0; |
165 m_bOwnFileRead = bOwnFileRead; | 166 m_bOwnFileRead = bOwnFileRead; |
| 167 |
166 int32_t offset = GetHeaderOffset(pFileAccess); | 168 int32_t offset = GetHeaderOffset(pFileAccess); |
167 if (offset == -1) { | 169 if (offset == -1) { |
168 if (bOwnFileRead && pFileAccess) { | 170 if (bOwnFileRead && pFileAccess) |
169 pFileAccess->Release(); | 171 pFileAccess->Release(); |
170 } | |
171 return PDFPARSE_ERROR_FORMAT; | 172 return PDFPARSE_ERROR_FORMAT; |
172 } | 173 } |
173 m_Syntax.InitParser(pFileAccess, offset); | 174 m_Syntax.InitParser(pFileAccess, offset); |
| 175 |
174 uint8_t ch; | 176 uint8_t ch; |
175 if (!m_Syntax.GetCharAt(5, ch)) { | 177 if (!m_Syntax.GetCharAt(5, ch)) |
176 return PDFPARSE_ERROR_FORMAT; | 178 return PDFPARSE_ERROR_FORMAT; |
177 } | 179 if (std::isdigit(ch)) |
178 if (ch >= '0' && ch <= '9') { | 180 m_FileVersion = FXSYS_toDecimalDigit(ch) * 10; |
179 m_FileVersion = (ch - '0') * 10; | 181 |
180 } | 182 if (!m_Syntax.GetCharAt(7, ch)) |
181 if (!m_Syntax.GetCharAt(7, ch)) { | |
182 return PDFPARSE_ERROR_FORMAT; | 183 return PDFPARSE_ERROR_FORMAT; |
183 } | 184 if (std::isdigit(ch)) |
184 if (ch >= '0' && ch <= '9') { | 185 m_FileVersion += FXSYS_toDecimalDigit(ch); |
185 m_FileVersion += ch - '0'; | 186 |
186 } | 187 if (m_Syntax.m_FileLen < m_Syntax.m_HeaderOffset + 9) |
187 if (m_Syntax.m_FileLen < m_Syntax.m_HeaderOffset + 9) { | |
188 return PDFPARSE_ERROR_FORMAT; | 188 return PDFPARSE_ERROR_FORMAT; |
189 } | 189 |
190 m_Syntax.RestorePos(m_Syntax.m_FileLen - m_Syntax.m_HeaderOffset - 9); | 190 m_Syntax.RestorePos(m_Syntax.m_FileLen - m_Syntax.m_HeaderOffset - 9); |
191 if (!bReParse) { | 191 if (!bReParse) |
192 m_pDocument = new CPDF_Document(this); | 192 m_pDocument = new CPDF_Document(this); |
193 } | 193 |
194 FX_BOOL bXRefRebuilt = FALSE; | 194 FX_BOOL bXRefRebuilt = FALSE; |
195 if (m_Syntax.SearchWord(FX_BSTRC("startxref"), TRUE, FALSE, 4096)) { | 195 if (m_Syntax.SearchWord(FX_BSTRC("startxref"), TRUE, FALSE, 4096)) { |
196 FX_FILESIZE startxref_offset = m_Syntax.SavePos(); | 196 FX_FILESIZE startxref_offset = m_Syntax.SavePos(); |
197 void* pResult = FXSYS_bsearch(&startxref_offset, m_SortedOffset.GetData(), | 197 void* pResult = FXSYS_bsearch(&startxref_offset, m_SortedOffset.GetData(), |
198 m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), | 198 m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), |
199 CompareFileSize); | 199 CompareFileSize); |
200 if (pResult == NULL) { | 200 if (!pResult) |
201 m_SortedOffset.Add(startxref_offset); | 201 m_SortedOffset.Add(startxref_offset); |
202 } | 202 |
203 m_Syntax.GetKeyword(); | 203 m_Syntax.GetKeyword(); |
204 FX_BOOL bNumber; | 204 FX_BOOL bNumber; |
205 CFX_ByteString xrefpos_str = m_Syntax.GetNextWord(bNumber); | 205 CFX_ByteString xrefpos_str = m_Syntax.GetNextWord(bNumber); |
206 if (!bNumber) { | 206 if (!bNumber) |
207 return PDFPARSE_ERROR_FORMAT; | 207 return PDFPARSE_ERROR_FORMAT; |
208 } | 208 |
209 m_LastXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str); | 209 m_LastXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str); |
210 if (!LoadAllCrossRefV4(m_LastXRefOffset) && | 210 if (!LoadAllCrossRefV4(m_LastXRefOffset) && |
211 !LoadAllCrossRefV5(m_LastXRefOffset)) { | 211 !LoadAllCrossRefV5(m_LastXRefOffset)) { |
212 if (!RebuildCrossRef()) { | 212 if (!RebuildCrossRef()) |
213 return PDFPARSE_ERROR_FORMAT; | 213 return PDFPARSE_ERROR_FORMAT; |
214 } | 214 |
215 bXRefRebuilt = TRUE; | 215 bXRefRebuilt = TRUE; |
216 m_LastXRefOffset = 0; | 216 m_LastXRefOffset = 0; |
217 } | 217 } |
218 } else { | 218 } else { |
219 if (!RebuildCrossRef()) { | 219 if (!RebuildCrossRef()) |
220 return PDFPARSE_ERROR_FORMAT; | 220 return PDFPARSE_ERROR_FORMAT; |
221 } | 221 |
222 bXRefRebuilt = TRUE; | 222 bXRefRebuilt = TRUE; |
223 } | 223 } |
224 FX_DWORD dwRet = SetEncryptHandler(); | 224 FX_DWORD dwRet = SetEncryptHandler(); |
225 if (dwRet != PDFPARSE_ERROR_SUCCESS) { | 225 if (dwRet != PDFPARSE_ERROR_SUCCESS) |
226 return dwRet; | 226 return dwRet; |
227 } | 227 |
228 m_pDocument->LoadDoc(); | 228 m_pDocument->LoadDoc(); |
229 if (m_pDocument->GetRoot() == NULL || m_pDocument->GetPageCount() == 0) { | 229 if (!m_pDocument->GetRoot() || m_pDocument->GetPageCount() == 0) { |
230 if (bXRefRebuilt) { | 230 if (bXRefRebuilt) |
231 return PDFPARSE_ERROR_FORMAT; | 231 return PDFPARSE_ERROR_FORMAT; |
232 } | 232 |
233 ReleaseEncryptHandler(); | 233 ReleaseEncryptHandler(); |
234 if (!RebuildCrossRef()) { | 234 if (!RebuildCrossRef()) |
235 return PDFPARSE_ERROR_FORMAT; | 235 return PDFPARSE_ERROR_FORMAT; |
236 } | 236 |
237 dwRet = SetEncryptHandler(); | 237 dwRet = SetEncryptHandler(); |
238 if (dwRet != PDFPARSE_ERROR_SUCCESS) { | 238 if (dwRet != PDFPARSE_ERROR_SUCCESS) |
239 return dwRet; | 239 return dwRet; |
240 } | 240 |
241 m_pDocument->LoadDoc(); | 241 m_pDocument->LoadDoc(); |
242 if (m_pDocument->GetRoot() == NULL) { | 242 if (!m_pDocument->GetRoot()) |
243 return PDFPARSE_ERROR_FORMAT; | 243 return PDFPARSE_ERROR_FORMAT; |
244 } | |
245 } | 244 } |
246 FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), | 245 FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), |
247 sizeof(FX_FILESIZE), CompareFileSize); | 246 sizeof(FX_FILESIZE), CompareFileSize); |
248 FX_DWORD RootObjNum = GetRootObjNum(); | 247 FX_DWORD RootObjNum = GetRootObjNum(); |
249 if (RootObjNum == 0) { | 248 if (RootObjNum == 0) { |
250 ReleaseEncryptHandler(); | 249 ReleaseEncryptHandler(); |
251 RebuildCrossRef(); | 250 RebuildCrossRef(); |
252 RootObjNum = GetRootObjNum(); | 251 RootObjNum = GetRootObjNum(); |
253 if (RootObjNum == 0) { | 252 if (RootObjNum == 0) |
254 return PDFPARSE_ERROR_FORMAT; | 253 return PDFPARSE_ERROR_FORMAT; |
255 } | 254 |
256 dwRet = SetEncryptHandler(); | 255 dwRet = SetEncryptHandler(); |
257 if (dwRet != PDFPARSE_ERROR_SUCCESS) { | 256 if (dwRet != PDFPARSE_ERROR_SUCCESS) |
258 return dwRet; | 257 return dwRet; |
259 } | |
260 } | 258 } |
261 if (m_pSecurityHandler && !m_pSecurityHandler->IsMetadataEncrypted()) { | 259 if (m_pSecurityHandler && !m_pSecurityHandler->IsMetadataEncrypted()) { |
262 CPDF_Reference* pMetadata = | 260 CPDF_Reference* pMetadata = |
263 ToReference(m_pDocument->GetRoot()->GetElement(FX_BSTRC("Metadata"))); | 261 ToReference(m_pDocument->GetRoot()->GetElement(FX_BSTRC("Metadata"))); |
264 if (pMetadata) | 262 if (pMetadata) |
265 m_Syntax.m_MetadataObjnum = pMetadata->GetRefObjNum(); | 263 m_Syntax.m_MetadataObjnum = pMetadata->GetRefObjNum(); |
266 } | 264 } |
267 return PDFPARSE_ERROR_SUCCESS; | 265 return PDFPARSE_ERROR_SUCCESS; |
268 } | 266 } |
269 FX_DWORD CPDF_Parser::SetEncryptHandler() { | 267 FX_DWORD CPDF_Parser::SetEncryptHandler() { |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
453 for (int32_t i = 0; i < block_size; i++) { | 451 for (int32_t i = 0; i < block_size; i++) { |
454 FX_DWORD objnum = start_objnum + block * 1024 + i; | 452 FX_DWORD objnum = start_objnum + block * 1024 + i; |
455 char* pEntry = pBuf + i * recordsize; | 453 char* pEntry = pBuf + i * recordsize; |
456 if (pEntry[17] == 'f') { | 454 if (pEntry[17] == 'f') { |
457 m_CrossRef.SetAtGrow(objnum, 0); | 455 m_CrossRef.SetAtGrow(objnum, 0); |
458 m_V5Type.SetAtGrow(objnum, 0); | 456 m_V5Type.SetAtGrow(objnum, 0); |
459 } else { | 457 } else { |
460 int32_t offset = FXSYS_atoi(pEntry); | 458 int32_t offset = FXSYS_atoi(pEntry); |
461 if (offset == 0) { | 459 if (offset == 0) { |
462 for (int32_t c = 0; c < 10; c++) { | 460 for (int32_t c = 0; c < 10; c++) { |
463 if (pEntry[c] < '0' || pEntry[c] > '9') { | 461 if (!std::isdigit(pEntry[c])) |
464 return FALSE; | 462 return FALSE; |
465 } | |
466 } | 463 } |
467 } | 464 } |
468 m_CrossRef.SetAtGrow(objnum, offset); | 465 m_CrossRef.SetAtGrow(objnum, offset); |
469 int32_t version = FXSYS_atoi(pEntry + 11); | 466 int32_t version = FXSYS_atoi(pEntry + 11); |
470 if (version >= 1) { | 467 if (version >= 1) { |
471 m_bVersionUpdated = TRUE; | 468 m_bVersionUpdated = TRUE; |
472 } | 469 } |
473 m_ObjVersion.SetAtGrow(objnum, version); | 470 m_ObjVersion.SetAtGrow(objnum, version); |
474 if (m_CrossRef[objnum] < m_Syntax.m_FileLen) { | 471 if (m_CrossRef[objnum] < m_Syntax.m_FileLen) { |
475 void* pResult = FXSYS_bsearch( | 472 void* pResult = FXSYS_bsearch( |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
554 start_objnum--; | 551 start_objnum--; |
555 objnum = 0; | 552 objnum = 0; |
556 } | 553 } |
557 } | 554 } |
558 m_CrossRef.SetAtGrow(objnum, 0); | 555 m_CrossRef.SetAtGrow(objnum, 0); |
559 m_V5Type.SetAtGrow(objnum, 0); | 556 m_V5Type.SetAtGrow(objnum, 0); |
560 } else { | 557 } else { |
561 FX_FILESIZE offset = (FX_FILESIZE)FXSYS_atoi64(pEntry); | 558 FX_FILESIZE offset = (FX_FILESIZE)FXSYS_atoi64(pEntry); |
562 if (offset == 0) { | 559 if (offset == 0) { |
563 for (int32_t c = 0; c < 10; c++) { | 560 for (int32_t c = 0; c < 10; c++) { |
564 if (pEntry[c] < '0' || pEntry[c] > '9') { | 561 if (!std::isdigit(pEntry[c])) |
565 return false; | 562 return false; |
566 } | |
567 } | 563 } |
568 } | 564 } |
569 m_CrossRef.SetAtGrow(objnum, offset); | 565 m_CrossRef.SetAtGrow(objnum, offset); |
570 int32_t version = FXSYS_atoi(pEntry + 11); | 566 int32_t version = FXSYS_atoi(pEntry + 11); |
571 if (version >= 1) { | 567 if (version >= 1) { |
572 m_bVersionUpdated = TRUE; | 568 m_bVersionUpdated = TRUE; |
573 } | 569 } |
574 m_ObjVersion.SetAtGrow(objnum, version); | 570 m_ObjVersion.SetAtGrow(objnum, version); |
575 if (m_CrossRef[objnum] < m_Syntax.m_FileLen && | 571 if (m_CrossRef[objnum] < m_Syntax.m_FileLen && |
576 !FindPosInOffsets(m_CrossRef[objnum])) { | 572 !FindPosInOffsets(m_CrossRef[objnum])) { |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
624 if (size > 4096) { | 620 if (size > 4096) { |
625 size = 4096; | 621 size = 4096; |
626 } | 622 } |
627 if (!m_Syntax.m_pFileAccess->ReadBlock(buffer, pos, size)) { | 623 if (!m_Syntax.m_pFileAccess->ReadBlock(buffer, pos, size)) { |
628 break; | 624 break; |
629 } | 625 } |
630 for (FX_DWORD i = 0; i < size; i++) { | 626 for (FX_DWORD i = 0; i < size; i++) { |
631 uint8_t byte = buffer[i]; | 627 uint8_t byte = buffer[i]; |
632 switch (status) { | 628 switch (status) { |
633 case 0: | 629 case 0: |
634 if (PDFCharIsWhitespace(byte)) { | 630 if (PDFCharIsWhitespace(byte)) |
635 status = 1; | 631 status = 1; |
636 } | 632 |
637 if (byte <= '9' && byte >= '0') { | 633 if (std::isdigit(byte)) { |
638 --i; | 634 --i; |
639 status = 1; | 635 status = 1; |
640 } | 636 } |
| 637 |
641 if (byte == '%') { | 638 if (byte == '%') { |
642 inside_index = 0; | 639 inside_index = 0; |
643 status = 9; | 640 status = 9; |
644 } | 641 } |
| 642 |
645 if (byte == '(') { | 643 if (byte == '(') { |
646 status = 10; | 644 status = 10; |
647 depth = 1; | 645 depth = 1; |
648 } | 646 } |
| 647 |
649 if (byte == '<') { | 648 if (byte == '<') { |
650 inside_index = 1; | 649 inside_index = 1; |
651 status = 11; | 650 status = 11; |
652 } | 651 } |
653 if (byte == '\\') { | 652 |
| 653 if (byte == '\\') |
654 status = 13; | 654 status = 13; |
655 } | 655 |
656 if (byte == 't') { | 656 if (byte == 't') { |
657 status = 7; | 657 status = 7; |
658 inside_index = 1; | 658 inside_index = 1; |
659 } | 659 } |
660 break; | 660 break; |
661 case 1: | 661 case 1: |
662 if (PDFCharIsWhitespace(byte)) { | 662 if (PDFCharIsWhitespace(byte)) { |
663 break; | 663 break; |
664 } else if (byte <= '9' && byte >= '0') { | 664 } else if (std::isdigit(byte)) { |
665 start_pos = pos + i; | 665 start_pos = pos + i; |
666 status = 2; | 666 status = 2; |
667 objnum = byte - '0'; | 667 objnum = FXSYS_toDecimalDigit(byte); |
668 } else if (byte == 't') { | 668 } else if (byte == 't') { |
669 status = 7; | 669 status = 7; |
670 inside_index = 1; | 670 inside_index = 1; |
671 } else if (byte == 'x') { | 671 } else if (byte == 'x') { |
672 status = 8; | 672 status = 8; |
673 inside_index = 1; | 673 inside_index = 1; |
674 } else { | 674 } else { |
675 --i; | 675 --i; |
676 status = 0; | 676 status = 0; |
677 } | 677 } |
678 break; | 678 break; |
679 case 2: | 679 case 2: |
680 if (byte <= '9' && byte >= '0') { | 680 if (std::isdigit(byte)) { |
681 objnum = objnum * 10 + byte - '0'; | 681 objnum = objnum * 10 + FXSYS_toDecimalDigit(byte); |
682 break; | 682 break; |
683 } else if (PDFCharIsWhitespace(byte)) { | 683 } else if (PDFCharIsWhitespace(byte)) { |
684 status = 3; | 684 status = 3; |
685 } else { | 685 } else { |
686 --i; | 686 --i; |
687 status = 14; | 687 status = 14; |
688 inside_index = 0; | 688 inside_index = 0; |
689 } | 689 } |
690 break; | 690 break; |
691 case 3: | 691 case 3: |
692 if (byte <= '9' && byte >= '0') { | 692 if (std::isdigit(byte)) { |
693 start_pos1 = pos + i; | 693 start_pos1 = pos + i; |
694 status = 4; | 694 status = 4; |
695 gennum = byte - '0'; | 695 gennum = FXSYS_toDecimalDigit(byte); |
696 } else if (PDFCharIsWhitespace(byte)) { | 696 } else if (PDFCharIsWhitespace(byte)) { |
697 break; | 697 break; |
698 } else if (byte == 't') { | 698 } else if (byte == 't') { |
699 status = 7; | 699 status = 7; |
700 inside_index = 1; | 700 inside_index = 1; |
701 } else { | 701 } else { |
702 --i; | 702 --i; |
703 status = 0; | 703 status = 0; |
704 } | 704 } |
705 break; | 705 break; |
706 case 4: | 706 case 4: |
707 if (byte <= '9' && byte >= '0') { | 707 if (std::isdigit(byte)) { |
708 gennum = gennum * 10 + byte - '0'; | 708 gennum = gennum * 10 + FXSYS_toDecimalDigit(byte); |
709 break; | 709 break; |
710 } else if (PDFCharIsWhitespace(byte)) { | 710 } else if (PDFCharIsWhitespace(byte)) { |
711 status = 5; | 711 status = 5; |
712 } else { | 712 } else { |
713 --i; | 713 --i; |
714 status = 0; | 714 status = 0; |
715 } | 715 } |
716 break; | 716 break; |
717 case 5: | 717 case 5: |
718 if (byte == 'o') { | 718 if (byte == 'o') { |
719 status = 6; | 719 status = 6; |
720 inside_index = 1; | 720 inside_index = 1; |
721 } else if (PDFCharIsWhitespace(byte)) { | 721 } else if (PDFCharIsWhitespace(byte)) { |
722 break; | 722 break; |
723 } else if (byte <= '9' && byte >= '0') { | 723 } else if (std::isdigit(byte)) { |
724 objnum = gennum; | 724 objnum = gennum; |
725 gennum = byte - '0'; | 725 gennum = FXSYS_toDecimalDigit(byte); |
726 start_pos = start_pos1; | 726 start_pos = start_pos1; |
727 start_pos1 = pos + i; | 727 start_pos1 = pos + i; |
728 status = 4; | 728 status = 4; |
729 } else if (byte == 't') { | 729 } else if (byte == 't') { |
730 status = 7; | 730 status = 7; |
731 inside_index = 1; | 731 inside_index = 1; |
732 } else { | 732 } else { |
733 --i; | 733 --i; |
734 status = 0; | 734 status = 0; |
735 } | 735 } |
(...skipping 1120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1856 parlevel++; | 1856 parlevel++; |
1857 buf.AppendChar('('); | 1857 buf.AppendChar('('); |
1858 } else if (ch == '\\') { | 1858 } else if (ch == '\\') { |
1859 status = 1; | 1859 status = 1; |
1860 } else { | 1860 } else { |
1861 buf.AppendChar(ch); | 1861 buf.AppendChar(ch); |
1862 } | 1862 } |
1863 break; | 1863 break; |
1864 case 1: | 1864 case 1: |
1865 if (ch >= '0' && ch <= '7') { | 1865 if (ch >= '0' && ch <= '7') { |
1866 iEscCode = ch - '0'; | 1866 iEscCode = FXSYS_toDecimalDigit(ch); |
1867 status = 2; | 1867 status = 2; |
1868 break; | 1868 break; |
1869 } | 1869 } |
1870 if (ch == 'n') { | 1870 if (ch == 'n') { |
1871 buf.AppendChar('\n'); | 1871 buf.AppendChar('\n'); |
1872 } else if (ch == 'r') { | 1872 } else if (ch == 'r') { |
1873 buf.AppendChar('\r'); | 1873 buf.AppendChar('\r'); |
1874 } else if (ch == 't') { | 1874 } else if (ch == 't') { |
1875 buf.AppendChar('\t'); | 1875 buf.AppendChar('\t'); |
1876 } else if (ch == 'b') { | 1876 } else if (ch == 'b') { |
1877 buf.AppendChar('\b'); | 1877 buf.AppendChar('\b'); |
1878 } else if (ch == 'f') { | 1878 } else if (ch == 'f') { |
1879 buf.AppendChar('\f'); | 1879 buf.AppendChar('\f'); |
1880 } else if (ch == '\r') { | 1880 } else if (ch == '\r') { |
1881 status = 4; | 1881 status = 4; |
1882 break; | 1882 break; |
1883 } else if (ch == '\n') { | 1883 } else if (ch == '\n') { |
1884 } else { | 1884 } else { |
1885 buf.AppendChar(ch); | 1885 buf.AppendChar(ch); |
1886 } | 1886 } |
1887 status = 0; | 1887 status = 0; |
1888 break; | 1888 break; |
1889 case 2: | 1889 case 2: |
1890 if (ch >= '0' && ch <= '7') { | 1890 if (ch >= '0' && ch <= '7') { |
1891 iEscCode = iEscCode * 8 + ch - '0'; | 1891 iEscCode = iEscCode * 8 + FXSYS_toDecimalDigit(ch); |
1892 status = 3; | 1892 status = 3; |
1893 } else { | 1893 } else { |
1894 buf.AppendChar(iEscCode); | 1894 buf.AppendChar(iEscCode); |
1895 status = 0; | 1895 status = 0; |
1896 continue; | 1896 continue; |
1897 } | 1897 } |
1898 break; | 1898 break; |
1899 case 3: | 1899 case 3: |
1900 if (ch >= '0' && ch <= '7') { | 1900 if (ch >= '0' && ch <= '7') { |
1901 iEscCode = iEscCode * 8 + ch - '0'; | 1901 iEscCode = iEscCode * 8 + FXSYS_toDecimalDigit(ch); |
1902 buf.AppendChar(iEscCode); | 1902 buf.AppendChar(iEscCode); |
1903 status = 0; | 1903 status = 0; |
1904 } else { | 1904 } else { |
1905 buf.AppendChar(iEscCode); | 1905 buf.AppendChar(iEscCode); |
1906 status = 0; | 1906 status = 0; |
1907 continue; | 1907 continue; |
1908 } | 1908 } |
1909 break; | 1909 break; |
1910 case 4: | 1910 case 4: |
1911 status = 0; | 1911 status = 0; |
1912 if (ch != '\n') { | 1912 if (ch != '\n') { |
1913 continue; | 1913 continue; |
1914 } | 1914 } |
1915 break; | 1915 break; |
1916 } | 1916 } |
1917 if (!GetNextChar(ch)) { | 1917 if (!GetNextChar(ch)) { |
1918 break; | 1918 break; |
1919 } | 1919 } |
1920 } | 1920 } |
1921 GetNextChar(ch); | 1921 GetNextChar(ch); |
1922 return buf.GetByteString(); | 1922 return buf.GetByteString(); |
1923 } | 1923 } |
1924 CFX_ByteString CPDF_SyntaxParser::ReadHexString() { | 1924 CFX_ByteString CPDF_SyntaxParser::ReadHexString() { |
1925 uint8_t ch; | 1925 uint8_t ch; |
1926 if (!GetNextChar(ch)) { | 1926 if (!GetNextChar(ch)) |
1927 return CFX_ByteString(); | 1927 return CFX_ByteString(); |
1928 } | 1928 |
1929 CFX_BinaryBuf buf; | 1929 CFX_BinaryBuf buf; |
1930 FX_BOOL bFirst = TRUE; | 1930 bool bFirst = true; |
1931 uint8_t code = 0; | 1931 uint8_t code = 0; |
1932 while (1) { | 1932 while (1) { |
1933 if (ch == '>') { | 1933 if (ch == '>') |
1934 break; | 1934 break; |
1935 } | 1935 |
1936 if (ch >= '0' && ch <= '9') { | 1936 if (std::isxdigit(ch)) { |
| 1937 int val = FXSYS_toHexDigit(ch); |
1937 if (bFirst) { | 1938 if (bFirst) { |
1938 code = (ch - '0') * 16; | 1939 code = val * 16; |
1939 } else { | 1940 } else { |
1940 code += ch - '0'; | 1941 code += val; |
1941 buf.AppendByte((uint8_t)code); | |
1942 } | |
1943 bFirst = !bFirst; | |
1944 } else if (ch >= 'A' && ch <= 'F') { | |
1945 if (bFirst) { | |
1946 code = (ch - 'A' + 10) * 16; | |
1947 } else { | |
1948 code += ch - 'A' + 10; | |
1949 buf.AppendByte((uint8_t)code); | |
1950 } | |
1951 bFirst = !bFirst; | |
1952 } else if (ch >= 'a' && ch <= 'f') { | |
1953 if (bFirst) { | |
1954 code = (ch - 'a' + 10) * 16; | |
1955 } else { | |
1956 code += ch - 'a' + 10; | |
1957 buf.AppendByte((uint8_t)code); | 1942 buf.AppendByte((uint8_t)code); |
1958 } | 1943 } |
1959 bFirst = !bFirst; | 1944 bFirst = !bFirst; |
1960 } | 1945 } |
1961 if (!GetNextChar(ch)) { | 1946 |
| 1947 if (!GetNextChar(ch)) |
1962 break; | 1948 break; |
1963 } | |
1964 } | 1949 } |
1965 if (!bFirst) { | 1950 if (!bFirst) |
1966 buf.AppendByte((uint8_t)code); | 1951 buf.AppendByte((uint8_t)code); |
1967 } | 1952 |
1968 return buf.GetByteString(); | 1953 return buf.GetByteString(); |
1969 } | 1954 } |
1970 void CPDF_SyntaxParser::ToNextLine() { | 1955 void CPDF_SyntaxParser::ToNextLine() { |
1971 uint8_t ch; | 1956 uint8_t ch; |
1972 while (GetNextChar(ch)) { | 1957 while (GetNextChar(ch)) { |
1973 if (ch == '\n') { | 1958 if (ch == '\n') { |
1974 break; | 1959 break; |
1975 } | 1960 } |
1976 if (ch == '\r') { | 1961 if (ch == '\r') { |
1977 GetNextChar(ch); | 1962 GetNextChar(ch); |
(...skipping 2975 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4953 if (!m_pLinearizedDict) | 4938 if (!m_pLinearizedDict) |
4954 return -1; | 4939 return -1; |
4955 CPDF_Array* pRange = m_pLinearizedDict->GetArray(FX_BSTRC("H")); | 4940 CPDF_Array* pRange = m_pLinearizedDict->GetArray(FX_BSTRC("H")); |
4956 if (!pRange) | 4941 if (!pRange) |
4957 return -1; | 4942 return -1; |
4958 CPDF_Object* pStreamLen = pRange->GetElementValue(1); | 4943 CPDF_Object* pStreamLen = pRange->GetElementValue(1); |
4959 if (!pStreamLen) | 4944 if (!pStreamLen) |
4960 return -1; | 4945 return -1; |
4961 return pStreamLen->GetInteger(); | 4946 return pStreamLen->GetInteger(); |
4962 } | 4947 } |
OLD | NEW |