// Copyright 2015 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "file_reader.h"

#include <string.h>

#include <memory>

namespace quipper {

FileReader::FileReader(const string& filename) {
  infile_ = fopen(filename.c_str(), "rb");
  if (!IsOpen()) {
    size_ = 0;
    return;
  }
  // Determine the size of the file.
  fseek(infile_, 0, SEEK_END);
  size_ = ftell(infile_);

  // Reset to the beginning of the file.
  fseek(infile_, 0, SEEK_SET);
}

FileReader::~FileReader() {
  if (IsOpen()) {
    fclose(infile_);
  }
}

bool FileReader::ReadData(const size_t size, void* dest) {
  if (Tell() + size > size_ || fread(dest, 1, size, infile_) < size)
    return false;
  return true;
}

bool FileReader::ReadString(const size_t size, string* str) {
  if (!ReadDataString(size, str)) return false;

  // Truncate anything after a terminating null.
  size_t actual_length = strnlen(str->data(), size);
  str->resize(actual_length);
  return true;
}

}  // namespace quipper