// This file is part of the brlaser printer driver.
//
// Copyright 2013 Peter De Wachter
//
// brlaser is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 2 of the License, or
// (at your option) any later version.
//
// brlaser is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with brlaser.  If not, see <http://www.gnu.org/licenses/>.

#ifndef BLOCK_H
#define BLOCK_H

#include <assert.h>
#include <stdio.h>
#include <vector>

class block {
 public:
  block(): line_bytes_(0) {
    lines_.reserve(max_lines_per_block_);
  }

  bool empty() const {
    return line_bytes_ == 0;
  }

  void add_line(std::vector<uint8_t> &&line) {
    assert(!line.empty());
    assert(line_fits(line.size()));
    line_bytes_ += line.size();
    lines_.emplace_back(line);
  }

  bool line_fits(unsigned size) {
    return lines_.size() != max_lines_per_block_
      && line_bytes_ + size < max_block_size_;
  }

  void flush(FILE *f) {
    if (!empty()) {
      fprintf(f, "%dw%c%c",
              line_bytes_ + 2, 0,
              static_cast<int>(lines_.size()));
      for (auto &line : lines_) {
        fwrite(line.data(), 1, line.size(), f);
      }
      line_bytes_ = 0;
      lines_.clear();
    }
  }

 private:
  static const unsigned max_block_size_ = 16350;
  static const unsigned max_lines_per_block_ = 64;

  std::vector<std::vector<uint8_t>> lines_;
  int line_bytes_;
};

#endif  // BLOCK_H