1e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Tencent is pleased to support the open source community by making RapidJSON available. 2e462795ff5d4c7359f9e8637c10544bb2de70107tturney// 3e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. 4e462795ff5d4c7359f9e8637c10544bb2de70107tturney// 5e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Licensed under the MIT License (the "License"); you may not use this file except 6e462795ff5d4c7359f9e8637c10544bb2de70107tturney// in compliance with the License. You may obtain a copy of the License at 7e462795ff5d4c7359f9e8637c10544bb2de70107tturney// 8e462795ff5d4c7359f9e8637c10544bb2de70107tturney// http://opensource.org/licenses/MIT 9e462795ff5d4c7359f9e8637c10544bb2de70107tturney// 10e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Unless required by applicable law or agreed to in writing, software distributed 11e462795ff5d4c7359f9e8637c10544bb2de70107tturney// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 12e462795ff5d4c7359f9e8637c10544bb2de70107tturney// CONDITIONS OF ANY KIND, either express or implied. See the License for the 13e462795ff5d4c7359f9e8637c10544bb2de70107tturney// specific language governing permissions and limitations under the License. 14e462795ff5d4c7359f9e8637c10544bb2de70107tturney 15e462795ff5d4c7359f9e8637c10544bb2de70107tturney#ifndef RAPIDJSON_FILEREADSTREAM_H_ 16e462795ff5d4c7359f9e8637c10544bb2de70107tturney#define RAPIDJSON_FILEREADSTREAM_H_ 17e462795ff5d4c7359f9e8637c10544bb2de70107tturney 18e462795ff5d4c7359f9e8637c10544bb2de70107tturney#include "rapidjson.h" 19e462795ff5d4c7359f9e8637c10544bb2de70107tturney#include <cstdio> 20e462795ff5d4c7359f9e8637c10544bb2de70107tturney 21e462795ff5d4c7359f9e8637c10544bb2de70107tturneyRAPIDJSON_NAMESPACE_BEGIN 22e462795ff5d4c7359f9e8637c10544bb2de70107tturney 23e462795ff5d4c7359f9e8637c10544bb2de70107tturney//! File byte stream for input using fread(). 24e462795ff5d4c7359f9e8637c10544bb2de70107tturney/*! 25e462795ff5d4c7359f9e8637c10544bb2de70107tturney \note implements Stream concept 26e462795ff5d4c7359f9e8637c10544bb2de70107tturney*/ 27e462795ff5d4c7359f9e8637c10544bb2de70107tturneyclass FileReadStream { 28e462795ff5d4c7359f9e8637c10544bb2de70107tturneypublic: 29e462795ff5d4c7359f9e8637c10544bb2de70107tturney typedef char Ch; //!< Character type (byte). 30e462795ff5d4c7359f9e8637c10544bb2de70107tturney 31e462795ff5d4c7359f9e8637c10544bb2de70107tturney //! Constructor. 32e462795ff5d4c7359f9e8637c10544bb2de70107tturney /*! 33e462795ff5d4c7359f9e8637c10544bb2de70107tturney \param fp File pointer opened for read. 34e462795ff5d4c7359f9e8637c10544bb2de70107tturney \param buffer user-supplied buffer. 35e462795ff5d4c7359f9e8637c10544bb2de70107tturney \param bufferSize size of buffer in bytes. Must >=4 bytes. 36e462795ff5d4c7359f9e8637c10544bb2de70107tturney */ 37e462795ff5d4c7359f9e8637c10544bb2de70107tturney FileReadStream(std::FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferSize_(bufferSize), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) { 38e462795ff5d4c7359f9e8637c10544bb2de70107tturney RAPIDJSON_ASSERT(fp_ != 0); 39e462795ff5d4c7359f9e8637c10544bb2de70107tturney RAPIDJSON_ASSERT(bufferSize >= 4); 40e462795ff5d4c7359f9e8637c10544bb2de70107tturney Read(); 41e462795ff5d4c7359f9e8637c10544bb2de70107tturney } 42e462795ff5d4c7359f9e8637c10544bb2de70107tturney 43e462795ff5d4c7359f9e8637c10544bb2de70107tturney Ch Peek() const { return *current_; } 44e462795ff5d4c7359f9e8637c10544bb2de70107tturney Ch Take() { Ch c = *current_; Read(); return c; } 45e462795ff5d4c7359f9e8637c10544bb2de70107tturney size_t Tell() const { return count_ + static_cast<size_t>(current_ - buffer_); } 46e462795ff5d4c7359f9e8637c10544bb2de70107tturney 47e462795ff5d4c7359f9e8637c10544bb2de70107tturney // Not implemented 48e462795ff5d4c7359f9e8637c10544bb2de70107tturney void Put(Ch) { RAPIDJSON_ASSERT(false); } 49e462795ff5d4c7359f9e8637c10544bb2de70107tturney void Flush() { RAPIDJSON_ASSERT(false); } 50e462795ff5d4c7359f9e8637c10544bb2de70107tturney Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } 51e462795ff5d4c7359f9e8637c10544bb2de70107tturney size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } 52e462795ff5d4c7359f9e8637c10544bb2de70107tturney 53e462795ff5d4c7359f9e8637c10544bb2de70107tturney // For encoding detection only. 54e462795ff5d4c7359f9e8637c10544bb2de70107tturney const Ch* Peek4() const { 55e462795ff5d4c7359f9e8637c10544bb2de70107tturney return (current_ + 4 <= bufferLast_) ? current_ : 0; 56e462795ff5d4c7359f9e8637c10544bb2de70107tturney } 57e462795ff5d4c7359f9e8637c10544bb2de70107tturney 58e462795ff5d4c7359f9e8637c10544bb2de70107tturneyprivate: 59e462795ff5d4c7359f9e8637c10544bb2de70107tturney void Read() { 60e462795ff5d4c7359f9e8637c10544bb2de70107tturney if (current_ < bufferLast_) 61e462795ff5d4c7359f9e8637c10544bb2de70107tturney ++current_; 62e462795ff5d4c7359f9e8637c10544bb2de70107tturney else if (!eof_) { 63e462795ff5d4c7359f9e8637c10544bb2de70107tturney count_ += readCount_; 64e462795ff5d4c7359f9e8637c10544bb2de70107tturney readCount_ = fread(buffer_, 1, bufferSize_, fp_); 65e462795ff5d4c7359f9e8637c10544bb2de70107tturney bufferLast_ = buffer_ + readCount_ - 1; 66e462795ff5d4c7359f9e8637c10544bb2de70107tturney current_ = buffer_; 67e462795ff5d4c7359f9e8637c10544bb2de70107tturney 68e462795ff5d4c7359f9e8637c10544bb2de70107tturney if (readCount_ < bufferSize_) { 69e462795ff5d4c7359f9e8637c10544bb2de70107tturney buffer_[readCount_] = '\0'; 70e462795ff5d4c7359f9e8637c10544bb2de70107tturney ++bufferLast_; 71e462795ff5d4c7359f9e8637c10544bb2de70107tturney eof_ = true; 72e462795ff5d4c7359f9e8637c10544bb2de70107tturney } 73e462795ff5d4c7359f9e8637c10544bb2de70107tturney } 74e462795ff5d4c7359f9e8637c10544bb2de70107tturney } 75e462795ff5d4c7359f9e8637c10544bb2de70107tturney 76e462795ff5d4c7359f9e8637c10544bb2de70107tturney std::FILE* fp_; 77e462795ff5d4c7359f9e8637c10544bb2de70107tturney Ch *buffer_; 78e462795ff5d4c7359f9e8637c10544bb2de70107tturney size_t bufferSize_; 79e462795ff5d4c7359f9e8637c10544bb2de70107tturney Ch *bufferLast_; 80e462795ff5d4c7359f9e8637c10544bb2de70107tturney Ch *current_; 81e462795ff5d4c7359f9e8637c10544bb2de70107tturney size_t readCount_; 82e462795ff5d4c7359f9e8637c10544bb2de70107tturney size_t count_; //!< Number of characters read 83e462795ff5d4c7359f9e8637c10544bb2de70107tturney bool eof_; 84e462795ff5d4c7359f9e8637c10544bb2de70107tturney}; 85e462795ff5d4c7359f9e8637c10544bb2de70107tturney 86e462795ff5d4c7359f9e8637c10544bb2de70107tturneyRAPIDJSON_NAMESPACE_END 87e462795ff5d4c7359f9e8637c10544bb2de70107tturney 88e462795ff5d4c7359f9e8637c10544bb2de70107tturney#endif // RAPIDJSON_FILESTREAM_H_ 89