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 |