Cleanup some numeric code.
[pdfium.git] / core / src / fpdfapi / fpdf_parser / fpdf_parser_decode.cpp
index 402a19e..eaff29d 100644 (file)
@@ -8,6 +8,7 @@
 #include "../../../include/fpdfapi/fpdf_parser.h"
 #include "../../../include/fpdfapi/fpdf_module.h"
 #include "../../../include/fxcodec/fx_codec.h"
+#include "../../../include/fxcrt/fx_ext.h"
 
 #define _STREAM_MAX_SIZE_ 20 * 1024 * 1024
 
@@ -80,9 +81,9 @@ FX_DWORD _A85Decode(const uint8_t* src_buf,
   pos = dest_size = 0;
   while (pos < src_size) {
     uint8_t ch = src_buf[pos++];
-    if (ch == '\n' || ch == '\r' || ch == ' ' || ch == '\t') {
+    if (PDFCharIsLineEnding(ch) || ch == ' ' || ch == '\t')
       continue;
-    }
+
     if (ch == 'z') {
       FXSYS_memset(dest_buf + dest_size, 0, 4);
       state = 0;
@@ -131,27 +132,24 @@ FX_DWORD _HexDecode(const uint8_t* src_buf,
   FX_BOOL bFirstDigit = TRUE;
   for (i = 0; i < src_size; i++) {
     uint8_t ch = src_buf[i];
-    if (ch == ' ' || ch == '\n' || ch == '\t' || ch == '\r') {
+    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;
+    if (std::isxdigit(ch)) {
+      digit = HexCharToDigit(ch);
     } else if (ch == '>') {
       i++;
       break;
     } else {
       continue;
     }
-    if (bFirstDigit) {
+
+    if (bFirstDigit)
       dest_buf[dest_size] = digit * 16;
-    } else {
+    else
       dest_buf[dest_size++] += digit;
-    }
+
     bFirstDigit = !bFirstDigit;
   }
   if (!bFirstDigit) {
@@ -283,7 +281,7 @@ ICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder(
   int predictor = 0;
   int Colors = 0, BitsPerComponent = 0, Columns = 0;
   if (pParams) {
-    predictor = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("Predictor"));
+    predictor = pParams->GetInteger(FX_BSTRC("Predictor"));
     Colors = pParams->GetInteger(FX_BSTRC("Colors"), 1);
     BitsPerComponent = pParams->GetInteger(FX_BSTRC("BitsPerComponent"), 8);
     Columns = pParams->GetInteger(FX_BSTRC("Columns"), 1);
@@ -306,9 +304,8 @@ FX_DWORD FPDFAPI_FlateOrLZWDecode(FX_BOOL bLZW,
   FX_BOOL bEarlyChange = TRUE;
   int Colors = 0, BitsPerComponent = 0, Columns = 0;
   if (pParams) {
-    predictor = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("Predictor"));
-    bEarlyChange =
-        ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("EarlyChange"), 1);
+    predictor = pParams->GetInteger(FX_BSTRC("Predictor"));
+    bEarlyChange = pParams->GetInteger(FX_BSTRC("EarlyChange"), 1);
     Colors = pParams->GetInteger(FX_BSTRC("Colors"), 1);
     BitsPerComponent = pParams->GetInteger(FX_BSTRC("BitsPerComponent"), 8);
     Columns = pParams->GetInteger(FX_BSTRC("Columns"), 1);
@@ -332,32 +329,27 @@ FX_BOOL PDF_DataDecode(const uint8_t* src_buf,
 
 {
   CPDF_Object* pDecoder =
-      pDict ? pDict->GetElementValue(FX_BSTRC("Filter")) : NULL;
-  if (pDecoder == NULL || (pDecoder->GetType() != PDFOBJ_ARRAY &&
-                           pDecoder->GetType() != PDFOBJ_NAME)) {
+      pDict ? pDict->GetElementValue(FX_BSTRC("Filter")) : nullptr;
+  if (!pDecoder || (!pDecoder->IsArray() && !pDecoder->IsName()))
     return FALSE;
-  }
+
   CPDF_Object* pParams =
-      pDict ? pDict->GetElementValue(FX_BSTRC("DecodeParms")) : NULL;
+      pDict ? pDict->GetElementValue(FX_BSTRC("DecodeParms")) : nullptr;
   CFX_ByteStringArray DecoderList;
   CFX_PtrArray ParamList;
-  if (pDecoder->GetType() == PDFOBJ_ARRAY) {
-    if (pParams && pParams->GetType() != PDFOBJ_ARRAY) {
-      pParams = NULL;
-    }
-    CPDF_Array* pDecoders = (CPDF_Array*)pDecoder;
+  if (CPDF_Array* pDecoders = pDecoder->AsArray()) {
+    CPDF_Array* pParamsArray = ToArray(pParams);
+    if (!pParamsArray)
+      pParams = nullptr;
+
     for (FX_DWORD i = 0; i < pDecoders->GetCount(); i++) {
       CFX_ByteStringC str = pDecoders->GetConstString(i);
       DecoderList.Add(str);
-      if (pParams) {
-        ParamList.Add(((CPDF_Array*)pParams)->GetDict(i));
-      } else {
-        ParamList.Add(NULL);
-      }
+      ParamList.Add(pParams ? pParamsArray->GetDict(i) : nullptr);
     }
   } else {
     DecoderList.Add(pDecoder->GetConstString());
-    ParamList.Add(pParams ? pParams->GetDict() : NULL);
+    ParamList.Add(pParams ? pParams->GetDict() : nullptr);
   }
   uint8_t* last_buf = (uint8_t*)src_buf;
   FX_DWORD last_size = src_size;
@@ -365,7 +357,9 @@ FX_BOOL PDF_DataDecode(const uint8_t* src_buf,
     int estimated_size =
         i == DecoderList.GetSize() - 1 ? last_estimated_size : 0;
     CFX_ByteString decoder = DecoderList[i];
-    CPDF_Dictionary* pParam = (CPDF_Dictionary*)ParamList[i];
+    // Use ToDictionary here because we can push NULL into the ParamList.
+    CPDF_Dictionary* pParam =
+        ToDictionary(static_cast<CPDF_Object*>(ParamList[i]));
     uint8_t* new_buf = NULL;
     FX_DWORD new_size = (FX_DWORD)-1;
     int offset = -1;
@@ -416,6 +410,7 @@ FX_BOOL PDF_DataDecode(const uint8_t* src_buf,
       FX_Free(last_buf);
     }
     if (offset == -1) {
+      FX_Free(new_buf);
       return FALSE;
     }
     last_buf = new_buf;