LCOV - code coverage report
Current view: top level - port - cpl_json_streaming_parser.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 16 26 61.5 %
Date: 2024-11-21 22:18:42 Functions: 8 13 61.5 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  *
       3             :  * Project:  CPL - Common Portability Library
       4             :  * Purpose:  JSon streaming parser
       5             :  * Author:   Even Rouault, even.rouault at spatialys.com
       6             :  *
       7             :  ******************************************************************************
       8             :  * Copyright (c) 2017, Even Rouault <even.rouault at spatialys.com>
       9             :  *
      10             :  * SPDX-License-Identifier: MIT
      11             :  ****************************************************************************/
      12             : 
      13             : #ifndef CPL_JSON_STREAMIN_PARSER_H
      14             : #define CPL_JSON_STREAMIN_PARSER_H
      15             : 
      16             : /*! @cond Doxygen_Suppress */
      17             : 
      18             : #if defined(__cplusplus) && !defined(CPL_SUPRESS_CPLUSPLUS)
      19             : 
      20             : #include <vector>
      21             : #include <string>
      22             : #include "cpl_port.h"
      23             : 
      24             : class CPL_DLL CPLJSonStreamingParser
      25             : {
      26             :     CPL_DISALLOW_COPY_ASSIGN(CPLJSonStreamingParser)
      27             : 
      28             :     enum State
      29             :     {
      30             :         INIT,
      31             :         OBJECT,
      32             :         ARRAY,
      33             :         STRING,
      34             :         NUMBER,
      35             :         STATE_TRUE,
      36             :         STATE_FALSE,
      37             :         STATE_NULL
      38             :     };
      39             : 
      40             :     bool m_bExceptionOccurred = false;
      41             :     bool m_bElementFound = false;
      42             :     bool m_bStopParsing = false;
      43             :     int m_nLastChar = 0;
      44             :     int m_nLineCounter = 1;
      45             :     int m_nCharCounter = 1;
      46             :     std::vector<State> m_aState{};
      47             :     std::string m_osToken{};
      48             :     enum class ArrayState
      49             :     {
      50             :         INIT,
      51             :         AFTER_COMMA,
      52             :         AFTER_VALUE
      53             :     };
      54             :     std::vector<ArrayState> m_abArrayState{};
      55             :     bool m_bInStringEscape = false;
      56             :     bool m_bInUnicode = false;
      57             :     std::string m_osUnicodeHex{};
      58             :     size_t m_nMaxDepth = 1024;
      59             :     size_t m_nMaxStringSize = 10000000;
      60             : 
      61             :     enum MemberState
      62             :     {
      63             :         WAITING_KEY,
      64             :         IN_KEY,
      65             :         KEY_FINISHED,
      66             :         IN_VALUE
      67             :     };
      68             : 
      69             :     std::vector<MemberState> m_aeObjectState{};
      70             : 
      71     2063160 :     enum State currentState()
      72             :     {
      73     2063160 :         return m_aState.back();
      74             :     }
      75             : 
      76             :     void SkipSpace(const char *&pStr, size_t &nLength);
      77             :     void AdvanceChar(const char *&pStr, size_t &nLength);
      78             :     bool EmitUnexpectedChar(char ch, const char *pszExpecting = nullptr);
      79             :     bool StartNewToken(const char *&pStr, size_t &nLength);
      80             :     bool CheckAndEmitTrueFalseOrNull(char ch);
      81             :     bool CheckStackEmpty();
      82             :     void DecodeUnicode();
      83             : 
      84             :   protected:
      85             :     bool EmitException(const char *pszMessage);
      86             :     void StopParsing();
      87             : 
      88             :   public:
      89             :     CPLJSonStreamingParser();
      90             :     virtual ~CPLJSonStreamingParser();
      91             : 
      92             :     void SetMaxDepth(size_t nVal);
      93             :     void SetMaxStringSize(size_t nVal);
      94             : 
      95        2838 :     bool ExceptionOccurred() const
      96             :     {
      97        2838 :         return m_bExceptionOccurred;
      98             :     }
      99             : 
     100             :     static std::string GetSerializedString(const char *pszStr);
     101             : 
     102             :     virtual void Reset();
     103             :     virtual bool Parse(const char *pStr, size_t nLength, bool bFinished);
     104             : 
     105          44 :     virtual void String(const char * /*pszValue*/, size_t /*nLength*/)
     106             :     {
     107          44 :     }
     108             : 
     109         201 :     virtual void Number(const char * /*pszValue*/, size_t /*nLength*/)
     110             :     {
     111         201 :     }
     112             : 
     113           8 :     virtual void Boolean(bool /*b*/)
     114             :     {
     115           8 :     }
     116             : 
     117           3 :     virtual void Null()
     118             :     {
     119           3 :     }
     120             : 
     121           0 :     virtual void StartObject()
     122             :     {
     123           0 :     }
     124             : 
     125           0 :     virtual void EndObject()
     126             :     {
     127           0 :     }
     128             : 
     129           0 :     virtual void StartObjectMember(const char * /*pszKey*/, size_t /*nLength*/)
     130             :     {
     131           0 :     }
     132             : 
     133           0 :     virtual void StartArray()
     134             :     {
     135           0 :     }
     136             : 
     137           0 :     virtual void EndArray()
     138             :     {
     139           0 :     }
     140             : 
     141         220 :     virtual void StartArrayMember()
     142             :     {
     143         220 :     }
     144             : 
     145           7 :     virtual void Exception(const char * /*pszMessage*/)
     146             :     {
     147           7 :     }
     148             : };
     149             : 
     150             : #endif  // __cplusplus
     151             : 
     152             : /*! @endcond */
     153             : 
     154             : #endif  // CPL_JSON_STREAMIN_PARSER_H

Generated by: LCOV version 1.14