| 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/fpdfapi/fpdf_parser.h" | 7 #include "../../../include/fpdfapi/fpdf_parser.h" |
| 8 extern const FX_LPCSTR _PDF_CharType = | 8 const char PDF_CharType[256] = { |
| 9 "WRRRRRRRRWWRWWRRRRRRRRRRRRRRRRRR" | 9 //NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO S
I |
| 10 "WRRRRDRRDDRNRNNDNNNNNNNNNNRRDRDR" | 10 'W', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'W', 'W', 'R', 'W', 'W', 'R', '
R', |
| 11 "RRRRRRRRRRRRRRRRRRRRRRRRRRRDRDRR" | 11 |
| 12 "RRRRRRRRRRRRRRRRRRRRRRRRRRRDRDRR" | 12 //DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS U
S |
| 13 "WRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR" | 13 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', '
R', |
| 14 "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR" | 14 |
| 15 "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR" | 15 //SP ! " # $ % & ยด ( ) * + , - .
/ |
| 16 "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRW"; | 16 'W', 'R', 'R', 'R', 'R', 'D', 'R', 'R', 'D', 'D', 'R', 'N', 'R', 'N', 'N', '
D', |
| 17 |
| 18 // 0 1 2 3 4 5 6 7 8 9 : ; < = >
? |
| 19 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'R', 'R', 'D', 'R', 'D', '
R', |
| 20 |
| 21 // @ A B C D E F G H I J K L M N
O |
| 22 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', '
R', |
| 23 |
| 24 // P Q R S T U V W X Y Z [ \ ] ^
_ |
| 25 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'D', 'R', 'D', 'R', '
R', |
| 26 |
| 27 // ` a b c d e f g h i j k l m n
o |
| 28 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', '
R', |
| 29 |
| 30 // p q r s t u v w x y z { | } ~ D
EL |
| 31 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'D', 'R', 'D', 'R', '
R', |
| 32 |
| 33 'W', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', '
R', |
| 34 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', '
R', |
| 35 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', '
R', |
| 36 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', '
R', |
| 37 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', '
R', |
| 38 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', '
R', |
| 39 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', '
R', |
| 40 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', '
W' |
| 41 }; |
| 42 |
| 17 #ifndef MAX_PATH | 43 #ifndef MAX_PATH |
| 18 #define MAX_PATH 4096 | 44 #define MAX_PATH 4096 |
| 19 #endif | 45 #endif |
| 20 CPDF_SimpleParser::CPDF_SimpleParser(FX_LPCBYTE pData, FX_DWORD dwSize) | 46 CPDF_SimpleParser::CPDF_SimpleParser(FX_LPCBYTE pData, FX_DWORD dwSize) |
| 21 { | 47 { |
| 22 m_pData = pData; | 48 m_pData = pData; |
| 23 m_dwSize = dwSize; | 49 m_dwSize = dwSize; |
| 24 m_dwCurPos = 0; | 50 m_dwCurPos = 0; |
| 25 } | 51 } |
| 26 CPDF_SimpleParser::CPDF_SimpleParser(FX_BSTR str) | 52 CPDF_SimpleParser::CPDF_SimpleParser(FX_BSTR str) |
| 27 { | 53 { |
| 28 m_pData = str; | 54 m_pData = str; |
| 29 m_dwSize = str.GetLength(); | 55 m_dwSize = str.GetLength(); |
| 30 m_dwCurPos = 0; | 56 m_dwCurPos = 0; |
| 31 } | 57 } |
| 32 void CPDF_SimpleParser::ParseWord(FX_LPCBYTE& pStart, FX_DWORD& dwSize, int& typ
e) | 58 void CPDF_SimpleParser::ParseWord(FX_LPCBYTE& pStart, FX_DWORD& dwSize, int& typ
e) |
| 33 { | 59 { |
| 34 pStart = NULL; | 60 pStart = NULL; |
| 35 dwSize = 0; | 61 dwSize = 0; |
| 36 type = PDFWORD_EOF; | 62 type = PDFWORD_EOF; |
| 37 FX_BYTE ch; | 63 FX_BYTE ch; |
| 38 char chartype; | 64 char chartype; |
| 39 while (1) { | 65 while (1) { |
| 40 if (m_dwSize <= m_dwCurPos) { | 66 if (m_dwSize <= m_dwCurPos) { |
| 41 return; | 67 return; |
| 42 } | 68 } |
| 43 ch = m_pData[m_dwCurPos++]; | 69 ch = m_pData[m_dwCurPos++]; |
| 44 chartype = _PDF_CharType[ch]; | 70 chartype = PDF_CharType[ch]; |
| 45 while (chartype == 'W') { | 71 while (chartype == 'W') { |
| 46 if (m_dwSize <= m_dwCurPos) { | 72 if (m_dwSize <= m_dwCurPos) { |
| 47 return; | 73 return; |
| 48 } | 74 } |
| 49 ch = m_pData[m_dwCurPos++]; | 75 ch = m_pData[m_dwCurPos++]; |
| 50 chartype = _PDF_CharType[ch]; | 76 chartype = PDF_CharType[ch]; |
| 51 } | 77 } |
| 52 if (ch != '%') { | 78 if (ch != '%') { |
| 53 break; | 79 break; |
| 54 } | 80 } |
| 55 while (1) { | 81 while (1) { |
| 56 if (m_dwSize <= m_dwCurPos) { | 82 if (m_dwSize <= m_dwCurPos) { |
| 57 return; | 83 return; |
| 58 } | 84 } |
| 59 ch = m_pData[m_dwCurPos++]; | 85 ch = m_pData[m_dwCurPos++]; |
| 60 if (ch == '\r' || ch == '\n') { | 86 if (ch == '\r' || ch == '\n') { |
| 61 break; | 87 break; |
| 62 } | 88 } |
| 63 } | 89 } |
| 64 chartype = _PDF_CharType[ch]; | 90 chartype = PDF_CharType[ch]; |
| 65 } | 91 } |
| 66 FX_DWORD start_pos = m_dwCurPos - 1; | 92 FX_DWORD start_pos = m_dwCurPos - 1; |
| 67 pStart = m_pData + start_pos; | 93 pStart = m_pData + start_pos; |
| 68 if (chartype == 'D') { | 94 if (chartype == 'D') { |
| 69 if (ch == '/') { | 95 if (ch == '/') { |
| 70 while (1) { | 96 while (1) { |
| 71 if (m_dwSize <= m_dwCurPos) { | 97 if (m_dwSize <= m_dwCurPos) { |
| 72 return; | 98 return; |
| 73 } | 99 } |
| 74 ch = m_pData[m_dwCurPos++]; | 100 ch = m_pData[m_dwCurPos++]; |
| 75 chartype = _PDF_CharType[ch]; | 101 chartype = PDF_CharType[ch]; |
| 76 if (chartype != 'R' && chartype != 'N') { | 102 if (chartype != 'R' && chartype != 'N') { |
| 77 m_dwCurPos --; | 103 m_dwCurPos --; |
| 78 dwSize = m_dwCurPos - start_pos; | 104 dwSize = m_dwCurPos - start_pos; |
| 79 type = PDFWORD_NAME; | 105 type = PDFWORD_NAME; |
| 80 return; | 106 return; |
| 81 } | 107 } |
| 82 } | 108 } |
| 83 } else { | 109 } else { |
| 84 type = PDFWORD_DELIMITER; | 110 type = PDFWORD_DELIMITER; |
| 85 dwSize = 1; | 111 dwSize = 1; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 110 type = PDFWORD_NUMBER; | 136 type = PDFWORD_NUMBER; |
| 111 dwSize = 1; | 137 dwSize = 1; |
| 112 while (1) { | 138 while (1) { |
| 113 if (chartype != 'N') { | 139 if (chartype != 'N') { |
| 114 type = PDFWORD_TEXT; | 140 type = PDFWORD_TEXT; |
| 115 } | 141 } |
| 116 if (m_dwSize <= m_dwCurPos) { | 142 if (m_dwSize <= m_dwCurPos) { |
| 117 return; | 143 return; |
| 118 } | 144 } |
| 119 ch = m_pData[m_dwCurPos++]; | 145 ch = m_pData[m_dwCurPos++]; |
| 120 chartype = _PDF_CharType[ch]; | 146 chartype = PDF_CharType[ch]; |
| 121 if (chartype == 'D' || chartype == 'W') { | 147 if (chartype == 'D' || chartype == 'W') { |
| 122 m_dwCurPos --; | 148 m_dwCurPos --; |
| 123 break; | 149 break; |
| 124 } | 150 } |
| 125 dwSize ++; | 151 dwSize ++; |
| 126 } | 152 } |
| 127 } | 153 } |
| 128 CFX_ByteStringC CPDF_SimpleParser::GetWord() | 154 CFX_ByteStringC CPDF_SimpleParser::GetWord() |
| 129 { | 155 { |
| 130 FX_LPCBYTE pStart; | 156 FX_LPCBYTE pStart; |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 return PDF_NameDecode(CFX_ByteStringC(orig)); | 316 return PDF_NameDecode(CFX_ByteStringC(orig)); |
| 291 } | 317 } |
| 292 CFX_ByteString PDF_NameEncode(const CFX_ByteString& orig) | 318 CFX_ByteString PDF_NameEncode(const CFX_ByteString& orig) |
| 293 { | 319 { |
| 294 FX_LPBYTE src_buf = (FX_LPBYTE)orig.c_str(); | 320 FX_LPBYTE src_buf = (FX_LPBYTE)orig.c_str(); |
| 295 int src_len = orig.GetLength(); | 321 int src_len = orig.GetLength(); |
| 296 int dest_len = 0; | 322 int dest_len = 0; |
| 297 int i; | 323 int i; |
| 298 for (i = 0; i < src_len; i ++) { | 324 for (i = 0; i < src_len; i ++) { |
| 299 FX_BYTE ch = src_buf[i]; | 325 FX_BYTE ch = src_buf[i]; |
| 300 if (ch >= 0x80 || _PDF_CharType[ch] == 'W' || ch == '#' || | 326 if (ch >= 0x80 || PDF_CharType[ch] == 'W' || ch == '#' || |
| 301 _PDF_CharType[ch] == 'D') { | 327 PDF_CharType[ch] == 'D') { |
| 302 dest_len += 3; | 328 dest_len += 3; |
| 303 } else { | 329 } else { |
| 304 dest_len ++; | 330 dest_len ++; |
| 305 } | 331 } |
| 306 } | 332 } |
| 307 if (dest_len == src_len) { | 333 if (dest_len == src_len) { |
| 308 return orig; | 334 return orig; |
| 309 } | 335 } |
| 310 CFX_ByteString res; | 336 CFX_ByteString res; |
| 311 FX_LPSTR dest_buf = res.GetBuffer(dest_len); | 337 FX_LPSTR dest_buf = res.GetBuffer(dest_len); |
| 312 dest_len = 0; | 338 dest_len = 0; |
| 313 for (i = 0; i < src_len; i ++) { | 339 for (i = 0; i < src_len; i ++) { |
| 314 FX_BYTE ch = src_buf[i]; | 340 FX_BYTE ch = src_buf[i]; |
| 315 if (ch >= 0x80 || _PDF_CharType[ch] == 'W' || ch == '#' || | 341 if (ch >= 0x80 || PDF_CharType[ch] == 'W' || ch == '#' || |
| 316 _PDF_CharType[ch] == 'D') { | 342 PDF_CharType[ch] == 'D') { |
| 317 dest_buf[dest_len++] = '#'; | 343 dest_buf[dest_len++] = '#'; |
| 318 dest_buf[dest_len++] = "0123456789ABCDEF"[ch / 16]; | 344 dest_buf[dest_len++] = "0123456789ABCDEF"[ch / 16]; |
| 319 dest_buf[dest_len++] = "0123456789ABCDEF"[ch % 16]; | 345 dest_buf[dest_len++] = "0123456789ABCDEF"[ch % 16]; |
| 320 } else { | 346 } else { |
| 321 dest_buf[dest_len++] = ch; | 347 dest_buf[dest_len++] = ch; |
| 322 } | 348 } |
| 323 } | 349 } |
| 324 dest_buf[dest_len] = 0; | 350 dest_buf[dest_len] = 0; |
| 325 res.ReleaseBuffer(); | 351 res.ReleaseBuffer(); |
| 326 return res; | 352 return res; |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 444 if (pFound) { | 470 if (pFound) { |
| 445 return pFound; | 471 return pFound; |
| 446 } | 472 } |
| 447 } | 473 } |
| 448 return NULL; | 474 return NULL; |
| 449 } | 475 } |
| 450 CPDF_Object* CPDF_NumberTree::LookupValue(int num) | 476 CPDF_Object* CPDF_NumberTree::LookupValue(int num) |
| 451 { | 477 { |
| 452 return SearchNumberNode(m_pRoot, num); | 478 return SearchNumberNode(m_pRoot, num); |
| 453 } | 479 } |
| OLD | NEW |