| Index: core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp
|
| diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp
|
| index 4903312645b7230083d959cd7519d148ef9113c9..9e1434139c99cfe4a59f8e2d9a89798ee3d4e4f4 100644
|
| --- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp
|
| +++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp
|
| @@ -6,475 +6,479 @@
|
|
|
| #include "../../../include/fpdfapi/fpdf_parser.h"
|
| const char PDF_CharType[256] = {
|
| - //NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI
|
| - 'W', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'W', 'W', 'R', 'W', 'W', 'R', 'R',
|
| + // NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO
|
| + // SI
|
| + 'W', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'W', 'W', 'R', 'W', 'W', 'R',
|
| + 'R',
|
|
|
| - //DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
|
| - 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
|
| + // DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS
|
| + // US
|
| + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
|
| + 'R',
|
|
|
| - //SP ! " # $ % & ´ ( ) * + , - . /
|
| - 'W', 'R', 'R', 'R', 'R', 'D', 'R', 'R', 'D', 'D', 'R', 'N', 'R', 'N', 'N', 'D',
|
| + // SP ! " # $ % & ´ ( ) * + , - .
|
| + // /
|
| + 'W', 'R', 'R', 'R', 'R', 'D', 'R', 'R', 'D', 'D', 'R', 'N', 'R', 'N', 'N',
|
| + 'D',
|
|
|
| - // 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
|
| - 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'R', 'R', 'D', 'R', 'D', 'R',
|
| + // 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
|
| + 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'R', 'R', 'D', 'R', 'D',
|
| + 'R',
|
|
|
| - // @ A B C D E F G H I J K L M N O
|
| - 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
|
| + // @ A B C D E F G H I J K L M N O
|
| + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
|
| + 'R',
|
|
|
| - // P Q R S T U V W X Y Z [ \ ] ^ _
|
| - 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'D', 'R', 'D', 'R', 'R',
|
| + // P Q R S T U V W X Y Z [ \ ] ^ _
|
| + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'D', 'R', 'D', 'R',
|
| + 'R',
|
|
|
| - // ` a b c d e f g h i j k l m n o
|
| - 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
|
| + // ` a b c d e f g h i j k l m n o
|
| + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
|
| + 'R',
|
|
|
| - // p q r s t u v w x y z { | } ~ DEL
|
| - 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'D', 'R', 'D', 'R', 'R',
|
| + // p q r s t u v w x y z { | } ~
|
| + // DEL
|
| + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'D', 'R', 'D', 'R',
|
| + 'R',
|
|
|
| - 'W', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
|
| - 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
|
| - 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
|
| - 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
|
| - 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
|
| - 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
|
| - 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
|
| - 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'W'
|
| -};
|
| + 'W', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
|
| + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
|
| + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
|
| + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
|
| + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
|
| + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
|
| + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
|
| + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
|
| + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'W'};
|
|
|
| #ifndef MAX_PATH
|
| #define MAX_PATH 4096
|
| #endif
|
| -CPDF_SimpleParser::CPDF_SimpleParser(const uint8_t* pData, FX_DWORD dwSize)
|
| -{
|
| - m_pData = pData;
|
| - m_dwSize = dwSize;
|
| - m_dwCurPos = 0;
|
| +CPDF_SimpleParser::CPDF_SimpleParser(const uint8_t* pData, FX_DWORD dwSize) {
|
| + m_pData = pData;
|
| + m_dwSize = dwSize;
|
| + m_dwCurPos = 0;
|
| }
|
| -CPDF_SimpleParser::CPDF_SimpleParser(const CFX_ByteStringC& str)
|
| -{
|
| - m_pData = str.GetPtr();
|
| - m_dwSize = str.GetLength();
|
| - m_dwCurPos = 0;
|
| +CPDF_SimpleParser::CPDF_SimpleParser(const CFX_ByteStringC& str) {
|
| + m_pData = str.GetPtr();
|
| + m_dwSize = str.GetLength();
|
| + m_dwCurPos = 0;
|
| }
|
| -void CPDF_SimpleParser::ParseWord(const uint8_t*& pStart, FX_DWORD& dwSize, int& type)
|
| -{
|
| - pStart = NULL;
|
| - dwSize = 0;
|
| - type = PDFWORD_EOF;
|
| - uint8_t ch;
|
| - char chartype;
|
| +void CPDF_SimpleParser::ParseWord(const uint8_t*& pStart,
|
| + FX_DWORD& dwSize,
|
| + int& type) {
|
| + pStart = NULL;
|
| + dwSize = 0;
|
| + type = PDFWORD_EOF;
|
| + uint8_t ch;
|
| + char chartype;
|
| + while (1) {
|
| + if (m_dwSize <= m_dwCurPos) {
|
| + return;
|
| + }
|
| + ch = m_pData[m_dwCurPos++];
|
| + chartype = PDF_CharType[ch];
|
| + while (chartype == 'W') {
|
| + if (m_dwSize <= m_dwCurPos) {
|
| + return;
|
| + }
|
| + ch = m_pData[m_dwCurPos++];
|
| + chartype = PDF_CharType[ch];
|
| + }
|
| + if (ch != '%') {
|
| + break;
|
| + }
|
| while (1) {
|
| + if (m_dwSize <= m_dwCurPos) {
|
| + return;
|
| + }
|
| + ch = m_pData[m_dwCurPos++];
|
| + if (ch == '\r' || ch == '\n') {
|
| + break;
|
| + }
|
| + }
|
| + chartype = PDF_CharType[ch];
|
| + }
|
| + FX_DWORD start_pos = m_dwCurPos - 1;
|
| + pStart = m_pData + start_pos;
|
| + if (chartype == 'D') {
|
| + if (ch == '/') {
|
| + while (1) {
|
| if (m_dwSize <= m_dwCurPos) {
|
| - return;
|
| + return;
|
| }
|
| ch = m_pData[m_dwCurPos++];
|
| chartype = PDF_CharType[ch];
|
| - while (chartype == 'W') {
|
| - if (m_dwSize <= m_dwCurPos) {
|
| - return;
|
| - }
|
| - ch = m_pData[m_dwCurPos++];
|
| - chartype = PDF_CharType[ch];
|
| - }
|
| - if (ch != '%') {
|
| - break;
|
| + if (chartype != 'R' && chartype != 'N') {
|
| + m_dwCurPos--;
|
| + dwSize = m_dwCurPos - start_pos;
|
| + type = PDFWORD_NAME;
|
| + return;
|
| }
|
| - while (1) {
|
| - if (m_dwSize <= m_dwCurPos) {
|
| - return;
|
| - }
|
| - ch = m_pData[m_dwCurPos++];
|
| - if (ch == '\r' || ch == '\n') {
|
| - break;
|
| - }
|
| + }
|
| + } else {
|
| + type = PDFWORD_DELIMITER;
|
| + dwSize = 1;
|
| + if (ch == '<') {
|
| + if (m_dwSize <= m_dwCurPos) {
|
| + return;
|
| }
|
| - chartype = PDF_CharType[ch];
|
| - }
|
| - FX_DWORD start_pos = m_dwCurPos - 1;
|
| - pStart = m_pData + start_pos;
|
| - if (chartype == 'D') {
|
| - if (ch == '/') {
|
| - while (1) {
|
| - if (m_dwSize <= m_dwCurPos) {
|
| - return;
|
| - }
|
| - ch = m_pData[m_dwCurPos++];
|
| - chartype = PDF_CharType[ch];
|
| - if (chartype != 'R' && chartype != 'N') {
|
| - m_dwCurPos --;
|
| - dwSize = m_dwCurPos - start_pos;
|
| - type = PDFWORD_NAME;
|
| - return;
|
| - }
|
| - }
|
| + ch = m_pData[m_dwCurPos++];
|
| + if (ch == '<') {
|
| + dwSize = 2;
|
| } else {
|
| - type = PDFWORD_DELIMITER;
|
| - dwSize = 1;
|
| - if (ch == '<') {
|
| - if (m_dwSize <= m_dwCurPos) {
|
| - return;
|
| - }
|
| - ch = m_pData[m_dwCurPos++];
|
| - if (ch == '<') {
|
| - dwSize = 2;
|
| - } else {
|
| - m_dwCurPos --;
|
| - }
|
| - } else if (ch == '>') {
|
| - if (m_dwSize <= m_dwCurPos) {
|
| - return;
|
| - }
|
| - ch = m_pData[m_dwCurPos++];
|
| - if (ch == '>') {
|
| - dwSize = 2;
|
| - } else {
|
| - m_dwCurPos --;
|
| - }
|
| - }
|
| - }
|
| - return;
|
| - }
|
| - type = PDFWORD_NUMBER;
|
| - dwSize = 1;
|
| - while (1) {
|
| - if (chartype != 'N') {
|
| - type = PDFWORD_TEXT;
|
| + m_dwCurPos--;
|
| }
|
| + } else if (ch == '>') {
|
| if (m_dwSize <= m_dwCurPos) {
|
| - return;
|
| + return;
|
| }
|
| ch = m_pData[m_dwCurPos++];
|
| - chartype = PDF_CharType[ch];
|
| - if (chartype == 'D' || chartype == 'W') {
|
| - m_dwCurPos --;
|
| - break;
|
| + if (ch == '>') {
|
| + dwSize = 2;
|
| + } else {
|
| + m_dwCurPos--;
|
| }
|
| - dwSize ++;
|
| + }
|
| }
|
| -}
|
| -CFX_ByteStringC CPDF_SimpleParser::GetWord()
|
| -{
|
| - const uint8_t* pStart;
|
| - FX_DWORD dwSize;
|
| - int type;
|
| - ParseWord(pStart, dwSize, type);
|
| - if (dwSize == 1 && pStart[0] == '<') {
|
| - while (m_dwCurPos < m_dwSize && m_pData[m_dwCurPos] != '>') {
|
| - m_dwCurPos ++;
|
| - }
|
| - if (m_dwCurPos < m_dwSize) {
|
| - m_dwCurPos ++;
|
| - }
|
| - return CFX_ByteStringC(pStart, (FX_STRSIZE)(m_dwCurPos - (pStart - m_pData)));
|
| - }
|
| - if (dwSize == 1 && pStart[0] == '(') {
|
| - int level = 1;
|
| - while (m_dwCurPos < m_dwSize) {
|
| - if (m_pData[m_dwCurPos] == ')') {
|
| - level --;
|
| - if (level == 0) {
|
| - break;
|
| - }
|
| - }
|
| - if (m_pData[m_dwCurPos] == '\\') {
|
| - if (m_dwSize <= m_dwCurPos) {
|
| - break;
|
| - }
|
| - m_dwCurPos ++;
|
| - } else if (m_pData[m_dwCurPos] == '(') {
|
| - level ++;
|
| - }
|
| - if (m_dwSize <= m_dwCurPos) {
|
| - break;
|
| - }
|
| - m_dwCurPos ++;
|
| - }
|
| - if (m_dwCurPos < m_dwSize) {
|
| - m_dwCurPos ++;
|
| - }
|
| - return CFX_ByteStringC(pStart, (FX_STRSIZE)(m_dwCurPos - (pStart - m_pData)));
|
| + return;
|
| + }
|
| + type = PDFWORD_NUMBER;
|
| + dwSize = 1;
|
| + while (1) {
|
| + if (chartype != 'N') {
|
| + type = PDFWORD_TEXT;
|
| }
|
| - return CFX_ByteStringC(pStart, dwSize);
|
| -}
|
| -FX_BOOL CPDF_SimpleParser::SearchToken(const CFX_ByteStringC& token)
|
| -{
|
| - int token_len = token.GetLength();
|
| - while (m_dwCurPos < m_dwSize - token_len) {
|
| - if (FXSYS_memcmp(m_pData + m_dwCurPos, token.GetPtr(), token_len) == 0) {
|
| - break;
|
| - }
|
| - m_dwCurPos ++;
|
| + if (m_dwSize <= m_dwCurPos) {
|
| + return;
|
| }
|
| - if (m_dwCurPos == m_dwSize - token_len) {
|
| - return FALSE;
|
| + ch = m_pData[m_dwCurPos++];
|
| + chartype = PDF_CharType[ch];
|
| + if (chartype == 'D' || chartype == 'W') {
|
| + m_dwCurPos--;
|
| + break;
|
| }
|
| - m_dwCurPos += token_len;
|
| - return TRUE;
|
| + dwSize++;
|
| + }
|
| }
|
| -FX_BOOL CPDF_SimpleParser::SkipWord(const CFX_ByteStringC& token)
|
| -{
|
| - while (1) {
|
| - CFX_ByteStringC word = GetWord();
|
| - if (word.IsEmpty()) {
|
| - return FALSE;
|
| +CFX_ByteStringC CPDF_SimpleParser::GetWord() {
|
| + const uint8_t* pStart;
|
| + FX_DWORD dwSize;
|
| + int type;
|
| + ParseWord(pStart, dwSize, type);
|
| + if (dwSize == 1 && pStart[0] == '<') {
|
| + while (m_dwCurPos < m_dwSize && m_pData[m_dwCurPos] != '>') {
|
| + m_dwCurPos++;
|
| + }
|
| + if (m_dwCurPos < m_dwSize) {
|
| + m_dwCurPos++;
|
| + }
|
| + return CFX_ByteStringC(pStart,
|
| + (FX_STRSIZE)(m_dwCurPos - (pStart - m_pData)));
|
| + }
|
| + if (dwSize == 1 && pStart[0] == '(') {
|
| + int level = 1;
|
| + while (m_dwCurPos < m_dwSize) {
|
| + if (m_pData[m_dwCurPos] == ')') {
|
| + level--;
|
| + if (level == 0) {
|
| + break;
|
| }
|
| - if (word == token) {
|
| - return TRUE;
|
| + }
|
| + if (m_pData[m_dwCurPos] == '\\') {
|
| + if (m_dwSize <= m_dwCurPos) {
|
| + break;
|
| }
|
| + m_dwCurPos++;
|
| + } else if (m_pData[m_dwCurPos] == '(') {
|
| + level++;
|
| + }
|
| + if (m_dwSize <= m_dwCurPos) {
|
| + break;
|
| + }
|
| + m_dwCurPos++;
|
| + }
|
| + if (m_dwCurPos < m_dwSize) {
|
| + m_dwCurPos++;
|
| + }
|
| + return CFX_ByteStringC(pStart,
|
| + (FX_STRSIZE)(m_dwCurPos - (pStart - m_pData)));
|
| + }
|
| + return CFX_ByteStringC(pStart, dwSize);
|
| +}
|
| +FX_BOOL CPDF_SimpleParser::SearchToken(const CFX_ByteStringC& token) {
|
| + int token_len = token.GetLength();
|
| + while (m_dwCurPos < m_dwSize - token_len) {
|
| + if (FXSYS_memcmp(m_pData + m_dwCurPos, token.GetPtr(), token_len) == 0) {
|
| + break;
|
| }
|
| + m_dwCurPos++;
|
| + }
|
| + if (m_dwCurPos == m_dwSize - token_len) {
|
| return FALSE;
|
| + }
|
| + m_dwCurPos += token_len;
|
| + return TRUE;
|
| }
|
| -FX_BOOL CPDF_SimpleParser::FindTagPair(const CFX_ByteStringC& start_token, const CFX_ByteStringC& end_token,
|
| - FX_DWORD& start_pos, FX_DWORD& end_pos)
|
| -{
|
| - if (!start_token.IsEmpty()) {
|
| - if (!SkipWord(start_token)) {
|
| - return FALSE;
|
| - }
|
| - start_pos = m_dwCurPos;
|
| +FX_BOOL CPDF_SimpleParser::SkipWord(const CFX_ByteStringC& token) {
|
| + while (1) {
|
| + CFX_ByteStringC word = GetWord();
|
| + if (word.IsEmpty()) {
|
| + return FALSE;
|
| }
|
| - while (1) {
|
| - end_pos = m_dwCurPos;
|
| - CFX_ByteStringC word = GetWord();
|
| - if (word.IsEmpty()) {
|
| - return FALSE;
|
| - }
|
| - if (word == end_token) {
|
| - return TRUE;
|
| - }
|
| + if (word == token) {
|
| + return TRUE;
|
| }
|
| - return FALSE;
|
| + }
|
| + return FALSE;
|
| }
|
| -FX_BOOL CPDF_SimpleParser::FindTagParam(const CFX_ByteStringC& token, int nParams)
|
| -{
|
| - nParams ++;
|
| - FX_DWORD* pBuf = FX_Alloc(FX_DWORD, nParams);
|
| - int buf_index = 0;
|
| - int buf_count = 0;
|
| - while (1) {
|
| - pBuf[buf_index++] = m_dwCurPos;
|
| - if (buf_index == nParams) {
|
| - buf_index = 0;
|
| - }
|
| - buf_count ++;
|
| - if (buf_count > nParams) {
|
| - buf_count = nParams;
|
| - }
|
| - CFX_ByteStringC word = GetWord();
|
| - if (word.IsEmpty()) {
|
| - FX_Free(pBuf);
|
| - return FALSE;
|
| - }
|
| - if (word == token) {
|
| - if (buf_count < nParams) {
|
| - continue;
|
| - }
|
| - m_dwCurPos = pBuf[buf_index];
|
| - FX_Free(pBuf);
|
| - return TRUE;
|
| - }
|
| +FX_BOOL CPDF_SimpleParser::FindTagPair(const CFX_ByteStringC& start_token,
|
| + const CFX_ByteStringC& end_token,
|
| + FX_DWORD& start_pos,
|
| + FX_DWORD& end_pos) {
|
| + if (!start_token.IsEmpty()) {
|
| + if (!SkipWord(start_token)) {
|
| + return FALSE;
|
| }
|
| - return FALSE;
|
| + start_pos = m_dwCurPos;
|
| + }
|
| + while (1) {
|
| + end_pos = m_dwCurPos;
|
| + CFX_ByteStringC word = GetWord();
|
| + if (word.IsEmpty()) {
|
| + return FALSE;
|
| + }
|
| + if (word == end_token) {
|
| + return TRUE;
|
| + }
|
| + }
|
| + return FALSE;
|
| }
|
| -static int _hex2dec(char ch)
|
| -{
|
| - if (ch >= '0' && ch <= '9') {
|
| - return ch - '0';
|
| +FX_BOOL CPDF_SimpleParser::FindTagParam(const CFX_ByteStringC& token,
|
| + int nParams) {
|
| + nParams++;
|
| + FX_DWORD* pBuf = FX_Alloc(FX_DWORD, nParams);
|
| + int buf_index = 0;
|
| + int buf_count = 0;
|
| + while (1) {
|
| + pBuf[buf_index++] = m_dwCurPos;
|
| + if (buf_index == nParams) {
|
| + buf_index = 0;
|
| }
|
| - if (ch >= 'a' && ch <= 'f') {
|
| - return ch - 'a' + 10;
|
| + buf_count++;
|
| + if (buf_count > nParams) {
|
| + buf_count = nParams;
|
| }
|
| - if (ch >= 'A' && ch <= 'F') {
|
| - return ch - 'A' + 10;
|
| + CFX_ByteStringC word = GetWord();
|
| + if (word.IsEmpty()) {
|
| + FX_Free(pBuf);
|
| + return FALSE;
|
| }
|
| - return 0;
|
| + if (word == token) {
|
| + if (buf_count < nParams) {
|
| + continue;
|
| + }
|
| + m_dwCurPos = pBuf[buf_index];
|
| + FX_Free(pBuf);
|
| + return TRUE;
|
| + }
|
| + }
|
| + return FALSE;
|
| }
|
| -CFX_ByteString PDF_NameDecode(const CFX_ByteStringC& bstr)
|
| -{
|
| - int size = bstr.GetLength();
|
| - const FX_CHAR* pSrc = bstr.GetCStr();
|
| - if (FXSYS_memchr(pSrc, '#', size) == NULL) {
|
| - return bstr;
|
| - }
|
| - CFX_ByteString result;
|
| - FX_CHAR* pDestStart = result.GetBuffer(size);
|
| - FX_CHAR* pDest = pDestStart;
|
| - for (int i = 0; i < size; i ++) {
|
| - if (pSrc[i] == '#' && i < size - 2) {
|
| - *pDest ++ = _hex2dec(pSrc[i + 1]) * 16 + _hex2dec(pSrc[i + 2]);
|
| - i += 2;
|
| - } else {
|
| - *pDest ++ = pSrc[i];
|
| - }
|
| +static int _hex2dec(char ch) {
|
| + if (ch >= '0' && ch <= '9') {
|
| + return ch - '0';
|
| + }
|
| + if (ch >= 'a' && ch <= 'f') {
|
| + return ch - 'a' + 10;
|
| + }
|
| + if (ch >= 'A' && ch <= 'F') {
|
| + return ch - 'A' + 10;
|
| + }
|
| + return 0;
|
| +}
|
| +CFX_ByteString PDF_NameDecode(const CFX_ByteStringC& bstr) {
|
| + int size = bstr.GetLength();
|
| + const FX_CHAR* pSrc = bstr.GetCStr();
|
| + if (FXSYS_memchr(pSrc, '#', size) == NULL) {
|
| + return bstr;
|
| + }
|
| + CFX_ByteString result;
|
| + FX_CHAR* pDestStart = result.GetBuffer(size);
|
| + FX_CHAR* pDest = pDestStart;
|
| + for (int i = 0; i < size; i++) {
|
| + if (pSrc[i] == '#' && i < size - 2) {
|
| + *pDest++ = _hex2dec(pSrc[i + 1]) * 16 + _hex2dec(pSrc[i + 2]);
|
| + i += 2;
|
| + } else {
|
| + *pDest++ = pSrc[i];
|
| }
|
| - result.ReleaseBuffer((FX_STRSIZE)(pDest - pDestStart));
|
| - return result;
|
| + }
|
| + result.ReleaseBuffer((FX_STRSIZE)(pDest - pDestStart));
|
| + return result;
|
| }
|
| -CFX_ByteString PDF_NameDecode(const CFX_ByteString& orig)
|
| -{
|
| - if (FXSYS_memchr(orig.c_str(), '#', orig.GetLength()) == NULL) {
|
| - return orig;
|
| +CFX_ByteString PDF_NameDecode(const CFX_ByteString& orig) {
|
| + if (FXSYS_memchr(orig.c_str(), '#', orig.GetLength()) == NULL) {
|
| + return orig;
|
| + }
|
| + return PDF_NameDecode(CFX_ByteStringC(orig));
|
| +}
|
| +CFX_ByteString PDF_NameEncode(const CFX_ByteString& orig) {
|
| + uint8_t* src_buf = (uint8_t*)orig.c_str();
|
| + int src_len = orig.GetLength();
|
| + int dest_len = 0;
|
| + int i;
|
| + for (i = 0; i < src_len; i++) {
|
| + uint8_t ch = src_buf[i];
|
| + if (ch >= 0x80 || PDF_CharType[ch] == 'W' || ch == '#' ||
|
| + PDF_CharType[ch] == 'D') {
|
| + dest_len += 3;
|
| + } else {
|
| + dest_len++;
|
| + }
|
| + }
|
| + if (dest_len == src_len) {
|
| + return orig;
|
| + }
|
| + CFX_ByteString res;
|
| + FX_CHAR* dest_buf = res.GetBuffer(dest_len);
|
| + dest_len = 0;
|
| + for (i = 0; i < src_len; i++) {
|
| + uint8_t ch = src_buf[i];
|
| + if (ch >= 0x80 || PDF_CharType[ch] == 'W' || ch == '#' ||
|
| + PDF_CharType[ch] == 'D') {
|
| + dest_buf[dest_len++] = '#';
|
| + dest_buf[dest_len++] = "0123456789ABCDEF"[ch / 16];
|
| + dest_buf[dest_len++] = "0123456789ABCDEF"[ch % 16];
|
| + } else {
|
| + dest_buf[dest_len++] = ch;
|
| }
|
| - return PDF_NameDecode(CFX_ByteStringC(orig));
|
| + }
|
| + dest_buf[dest_len] = 0;
|
| + res.ReleaseBuffer();
|
| + return res;
|
| }
|
| -CFX_ByteString PDF_NameEncode(const CFX_ByteString& orig)
|
| -{
|
| - uint8_t* src_buf = (uint8_t*)orig.c_str();
|
| - int src_len = orig.GetLength();
|
| - int dest_len = 0;
|
| - int i;
|
| - for (i = 0; i < src_len; i ++) {
|
| - uint8_t ch = src_buf[i];
|
| - if (ch >= 0x80 || PDF_CharType[ch] == 'W' || ch == '#' ||
|
| - PDF_CharType[ch] == 'D') {
|
| - dest_len += 3;
|
| +CFX_ByteTextBuf& operator<<(CFX_ByteTextBuf& buf, const CPDF_Object* pObj) {
|
| + if (pObj == NULL) {
|
| + buf << FX_BSTRC(" null");
|
| + return buf;
|
| + }
|
| + switch (pObj->GetType()) {
|
| + case PDFOBJ_NULL:
|
| + buf << FX_BSTRC(" null");
|
| + break;
|
| + case PDFOBJ_BOOLEAN:
|
| + case PDFOBJ_NUMBER:
|
| + buf << " " << pObj->GetString();
|
| + break;
|
| + case PDFOBJ_STRING: {
|
| + CFX_ByteString str = pObj->GetString();
|
| + FX_BOOL bHex = ((CPDF_String*)pObj)->IsHex();
|
| + buf << PDF_EncodeString(str, bHex);
|
| + break;
|
| + }
|
| + case PDFOBJ_NAME: {
|
| + CFX_ByteString str = pObj->GetString();
|
| + buf << FX_BSTRC("/") << PDF_NameEncode(str);
|
| + break;
|
| + }
|
| + case PDFOBJ_REFERENCE: {
|
| + CPDF_Reference* p = (CPDF_Reference*)pObj;
|
| + buf << " " << p->GetRefObjNum() << FX_BSTRC(" 0 R ");
|
| + break;
|
| + }
|
| + case PDFOBJ_ARRAY: {
|
| + CPDF_Array* p = (CPDF_Array*)pObj;
|
| + buf << FX_BSTRC("[");
|
| + for (FX_DWORD i = 0; i < p->GetCount(); i++) {
|
| + CPDF_Object* pElement = p->GetElement(i);
|
| + if (pElement->GetObjNum()) {
|
| + buf << " " << pElement->GetObjNum() << FX_BSTRC(" 0 R");
|
| } else {
|
| - dest_len ++;
|
| + buf << pElement;
|
| }
|
| + }
|
| + buf << FX_BSTRC("]");
|
| + break;
|
| }
|
| - if (dest_len == src_len) {
|
| - return orig;
|
| - }
|
| - CFX_ByteString res;
|
| - FX_CHAR* dest_buf = res.GetBuffer(dest_len);
|
| - dest_len = 0;
|
| - for (i = 0; i < src_len; i ++) {
|
| - uint8_t ch = src_buf[i];
|
| - if (ch >= 0x80 || PDF_CharType[ch] == 'W' || ch == '#' ||
|
| - PDF_CharType[ch] == 'D') {
|
| - dest_buf[dest_len++] = '#';
|
| - dest_buf[dest_len++] = "0123456789ABCDEF"[ch / 16];
|
| - dest_buf[dest_len++] = "0123456789ABCDEF"[ch % 16];
|
| + case PDFOBJ_DICTIONARY: {
|
| + CPDF_Dictionary* p = (CPDF_Dictionary*)pObj;
|
| + buf << FX_BSTRC("<<");
|
| + FX_POSITION pos = p->GetStartPos();
|
| + while (pos) {
|
| + CFX_ByteString key;
|
| + CPDF_Object* pValue = p->GetNextElement(pos, key);
|
| + buf << FX_BSTRC("/") << PDF_NameEncode(key);
|
| + if (pValue->GetObjNum()) {
|
| + buf << " " << pValue->GetObjNum() << FX_BSTRC(" 0 R ");
|
| } else {
|
| - dest_buf[dest_len++] = ch;
|
| + buf << pValue;
|
| }
|
| + }
|
| + buf << FX_BSTRC(">>");
|
| + break;
|
| }
|
| - dest_buf[dest_len] = 0;
|
| - res.ReleaseBuffer();
|
| - return res;
|
| -}
|
| -CFX_ByteTextBuf& operator << (CFX_ByteTextBuf& buf, const CPDF_Object* pObj)
|
| -{
|
| - if (pObj == NULL) {
|
| - buf << FX_BSTRC(" null");
|
| - return buf;
|
| - }
|
| - switch (pObj->GetType()) {
|
| - case PDFOBJ_NULL:
|
| - buf << FX_BSTRC(" null");
|
| - break;
|
| - case PDFOBJ_BOOLEAN:
|
| - case PDFOBJ_NUMBER:
|
| - buf << " " << pObj->GetString();
|
| - break;
|
| - case PDFOBJ_STRING: {
|
| - CFX_ByteString str = pObj->GetString();
|
| - FX_BOOL bHex = ((CPDF_String*)pObj)->IsHex();
|
| - buf << PDF_EncodeString(str, bHex);
|
| - break;
|
| - }
|
| - case PDFOBJ_NAME: {
|
| - CFX_ByteString str = pObj->GetString();
|
| - buf << FX_BSTRC("/") << PDF_NameEncode(str);
|
| - break;
|
| - }
|
| - case PDFOBJ_REFERENCE: {
|
| - CPDF_Reference* p = (CPDF_Reference*)pObj;
|
| - buf << " " << p->GetRefObjNum() << FX_BSTRC(" 0 R ");
|
| - break;
|
| - }
|
| - case PDFOBJ_ARRAY: {
|
| - CPDF_Array* p = (CPDF_Array*)pObj;
|
| - buf << FX_BSTRC("[");
|
| - for (FX_DWORD i = 0; i < p->GetCount(); i ++) {
|
| - CPDF_Object* pElement = p->GetElement(i);
|
| - if (pElement->GetObjNum()) {
|
| - buf << " " << pElement->GetObjNum() << FX_BSTRC(" 0 R");
|
| - } else {
|
| - buf << pElement;
|
| - }
|
| - }
|
| - buf << FX_BSTRC("]");
|
| - break;
|
| - }
|
| - case PDFOBJ_DICTIONARY: {
|
| - CPDF_Dictionary* p = (CPDF_Dictionary*)pObj;
|
| - buf << FX_BSTRC("<<");
|
| - FX_POSITION pos = p->GetStartPos();
|
| - while (pos) {
|
| - CFX_ByteString key;
|
| - CPDF_Object* pValue = p->GetNextElement(pos, key);
|
| - buf << FX_BSTRC("/") << PDF_NameEncode(key);
|
| - if (pValue->GetObjNum()) {
|
| - buf << " " << pValue->GetObjNum() << FX_BSTRC(" 0 R ");
|
| - } else {
|
| - buf << pValue;
|
| - }
|
| - }
|
| - buf << FX_BSTRC(">>");
|
| - break;
|
| - }
|
| - case PDFOBJ_STREAM: {
|
| - CPDF_Stream* p = (CPDF_Stream*)pObj;
|
| - buf << p->GetDict() << FX_BSTRC("stream\r\n");
|
| - CPDF_StreamAcc acc;
|
| - acc.LoadAllData(p, TRUE);
|
| - buf.AppendBlock(acc.GetData(), acc.GetSize());
|
| - buf << FX_BSTRC("\r\nendstream");
|
| - break;
|
| - }
|
| - default:
|
| - ASSERT(FALSE);
|
| - break;
|
| + case PDFOBJ_STREAM: {
|
| + CPDF_Stream* p = (CPDF_Stream*)pObj;
|
| + buf << p->GetDict() << FX_BSTRC("stream\r\n");
|
| + CPDF_StreamAcc acc;
|
| + acc.LoadAllData(p, TRUE);
|
| + buf.AppendBlock(acc.GetData(), acc.GetSize());
|
| + buf << FX_BSTRC("\r\nendstream");
|
| + break;
|
| }
|
| - return buf;
|
| + default:
|
| + ASSERT(FALSE);
|
| + break;
|
| + }
|
| + return buf;
|
| }
|
| -FX_FLOAT PDF_ClipFloat(FX_FLOAT f)
|
| -{
|
| - if (f < 0) {
|
| - return 0;
|
| - }
|
| - if (f > 1.0f) {
|
| - return 1.0f;
|
| - }
|
| - return f;
|
| +FX_FLOAT PDF_ClipFloat(FX_FLOAT f) {
|
| + if (f < 0) {
|
| + return 0;
|
| + }
|
| + if (f > 1.0f) {
|
| + return 1.0f;
|
| + }
|
| + return f;
|
| }
|
| -static CPDF_Object* SearchNumberNode(CPDF_Dictionary* pNode, int num)
|
| -{
|
| - CPDF_Array* pLimits = pNode->GetArray("Limits");
|
| - if (pLimits && (num < pLimits->GetInteger(0) || num > pLimits->GetInteger(1))) {
|
| - return NULL;
|
| - }
|
| - CPDF_Array* pNumbers = pNode->GetArray("Nums");
|
| - if (pNumbers) {
|
| - FX_DWORD dwCount = pNumbers->GetCount() / 2;
|
| - for (FX_DWORD i = 0; i < dwCount; i ++) {
|
| - int index = pNumbers->GetInteger(i * 2);
|
| - if (num == index) {
|
| - return pNumbers->GetElementValue(i * 2 + 1);
|
| - }
|
| - if (index > num) {
|
| - break;
|
| - }
|
| - }
|
| - return NULL;
|
| +static CPDF_Object* SearchNumberNode(CPDF_Dictionary* pNode, int num) {
|
| + CPDF_Array* pLimits = pNode->GetArray("Limits");
|
| + if (pLimits &&
|
| + (num < pLimits->GetInteger(0) || num > pLimits->GetInteger(1))) {
|
| + return NULL;
|
| + }
|
| + CPDF_Array* pNumbers = pNode->GetArray("Nums");
|
| + if (pNumbers) {
|
| + FX_DWORD dwCount = pNumbers->GetCount() / 2;
|
| + for (FX_DWORD i = 0; i < dwCount; i++) {
|
| + int index = pNumbers->GetInteger(i * 2);
|
| + if (num == index) {
|
| + return pNumbers->GetElementValue(i * 2 + 1);
|
| + }
|
| + if (index > num) {
|
| + break;
|
| + }
|
| }
|
| - CPDF_Array* pKids = pNode->GetArray("Kids");
|
| - if (pKids == NULL) {
|
| - return NULL;
|
| + return NULL;
|
| + }
|
| + CPDF_Array* pKids = pNode->GetArray("Kids");
|
| + if (pKids == NULL) {
|
| + return NULL;
|
| + }
|
| + for (FX_DWORD i = 0; i < pKids->GetCount(); i++) {
|
| + CPDF_Dictionary* pKid = pKids->GetDict(i);
|
| + if (pKid == NULL) {
|
| + continue;
|
| }
|
| - for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
|
| - CPDF_Dictionary* pKid = pKids->GetDict(i);
|
| - if (pKid == NULL) {
|
| - continue;
|
| - }
|
| - CPDF_Object* pFound = SearchNumberNode(pKid, num);
|
| - if (pFound) {
|
| - return pFound;
|
| - }
|
| + CPDF_Object* pFound = SearchNumberNode(pKid, num);
|
| + if (pFound) {
|
| + return pFound;
|
| }
|
| - return NULL;
|
| + }
|
| + return NULL;
|
| }
|
| -CPDF_Object* CPDF_NumberTree::LookupValue(int num)
|
| -{
|
| - return SearchNumberNode(m_pRoot, num);
|
| +CPDF_Object* CPDF_NumberTree::LookupValue(int num) {
|
| + return SearchNumberNode(m_pRoot, num);
|
| }
|
|
|