2
0

filereadstream.h 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #ifndef RAPIDJSON_FILEREADSTREAM_H_
  2. #define RAPIDJSON_FILEREADSTREAM_H_
  3. #include "rapidjson.h"
  4. #include <cstdio>
  5. namespace rapidjson {
  6. //! File byte stream for input using fread().
  7. /*!
  8. \implements Stream
  9. */
  10. class FileReadStream {
  11. public:
  12. typedef char Ch; //!< Character type (byte).
  13. //! Constructor.
  14. /*!
  15. \param fp File pointer opened for read.
  16. \param buffer user-supplied buffer.
  17. \param bufferSize size of buffer in bytes. Must >=4 bytes.
  18. */
  19. FileReadStream(FILE* fp, char* buffer, size_t bufferSize) : fp_(fp), buffer_(buffer), bufferSize_(bufferSize), bufferLast_(0), current_(buffer_), readCount_(0), count_(0), eof_(false) {
  20. RAPIDJSON_ASSERT(fp_ != 0);
  21. RAPIDJSON_ASSERT(bufferSize >= 4);
  22. Read();
  23. }
  24. Ch Peek() const { return *current_; }
  25. Ch Take() { Ch c = *current_; Read(); return c; }
  26. size_t Tell() const { return count_ + (current_ - buffer_); }
  27. // Not implemented
  28. void Put(Ch) { RAPIDJSON_ASSERT(false); }
  29. void Flush() { RAPIDJSON_ASSERT(false); }
  30. Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; }
  31. size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; }
  32. // For encoding detection only.
  33. const Ch* Peek4() const {
  34. return (current_ + 4 <= bufferLast_) ? current_ : 0;
  35. }
  36. private:
  37. void Read() {
  38. if (current_ < bufferLast_)
  39. ++current_;
  40. else if (!eof_) {
  41. count_ += readCount_;
  42. readCount_ = fread(buffer_, 1, bufferSize_, fp_);
  43. bufferLast_ = buffer_ + readCount_ - 1;
  44. current_ = buffer_;
  45. if (readCount_ < bufferSize_) {
  46. buffer_[readCount_] = '\0';
  47. ++bufferLast_;
  48. eof_ = true;
  49. }
  50. }
  51. }
  52. FILE* fp_;
  53. Ch *buffer_;
  54. size_t bufferSize_;
  55. Ch *bufferLast_;
  56. Ch *current_;
  57. size_t readCount_;
  58. size_t count_; //!< Number of characters read
  59. bool eof_;
  60. };
  61. } // namespace rapidjson
  62. #endif // RAPIDJSON_FILESTREAM_H_