/*
  liblightgrep: not the worst forensics regexp engine
  Copyright (C) 2013, Lightbox Technologies, Inc

  This program 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 3 of the License, or
  (at your option) any later version.

  This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "byteset.h"

#include <iomanip>

std::ostream& operator<<(std::ostream& out, const ByteSet& bs) {
  out << '[' << std::hex;

  int low = -1;
  bool first = true;
  for (int i = 0; i < 256; ++i) {
    if (bs.test(i)) {
      if (low < 0) {
        if (!first) {
          out << ',';
        }
        out << std::setfill('0') << std::setw(2) << i;
        low = i;
        first = false;
      }
    }
    else if (low >= 0) {
      if ((i-1) > low) {
        out << '-' << std::setfill('0') << std::setw(2) << (i-1);
      }
      low = -1;
    }
  }

  if (0 <= low && low < 255) {
    out << '-' << std::setfill('0') << std::setw(2) << 255;
  }

  out << ']' << std::dec;
  return out;
}
