Index: core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp |
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp |
index 588ab5dff620428a542d9e099651c70ef5e6483d..57d19718897e364250631627367961c7e1545587 100644 |
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp |
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp |
@@ -9,6 +9,7 @@ |
#include "core/include/fpdfapi/fpdf_module.h" |
#include "core/include/fpdfapi/fpdf_parser.h" |
#include "core/include/fxcodec/fx_codec.h" |
+#include "core/include/fxcrt/fx_ext.h" |
#define _STREAM_MAX_SIZE_ 20 * 1024 * 1024 |
@@ -129,37 +130,32 @@ FX_DWORD HexDecode(const uint8_t* src_buf, |
} |
dest_buf = FX_Alloc(uint8_t, i / 2 + 1); |
dest_size = 0; |
- FX_BOOL bFirstDigit = TRUE; |
+ bool bFirst = true; |
for (i = 0; i < src_size; i++) { |
uint8_t ch = src_buf[i]; |
if (PDFCharIsLineEnding(ch) || ch == ' ' || ch == '\t') |
continue; |
- int digit; |
- if (ch <= '9' && ch >= '0') { |
- digit = ch - '0'; |
- } else if (ch <= 'f' && ch >= 'a') { |
- digit = ch - 'a' + 10; |
- } else if (ch <= 'F' && ch >= 'A') { |
- digit = ch - 'A' + 10; |
- } else if (ch == '>') { |
- i++; |
+ if (ch == '>') { |
+ ++i; |
break; |
- } else { |
- continue; |
} |
- if (bFirstDigit) { |
+ if (!std::isxdigit(ch)) |
+ continue; |
+ |
+ int digit = FXSYS_toHexDigit(ch); |
+ if (bFirst) |
dest_buf[dest_size] = digit * 16; |
- } else { |
+ else |
dest_buf[dest_size++] += digit; |
- } |
- bFirstDigit = !bFirstDigit; |
+ |
+ bFirst = !bFirst; |
} |
- if (!bFirstDigit) { |
+ if (!bFirst) |
dest_size++; |
- } |
return i; |
} |
+ |
FX_DWORD RunLengthDecode(const uint8_t* src_buf, |
FX_DWORD src_size, |
uint8_t*& dest_buf, |