//
//  StringSerialiser.cpp
//  Clock Signal
//
//  Created by Thomas Harte on 13/05/2018.
//  Copyright 2018 Thomas Harte. All rights reserved.
//

#include "StringSerialiser.hpp"

using namespace Utility;

StringSerialiser::StringSerialiser(const std::string &source, bool use_linefeed_only) {
	if(!use_linefeed_only) {
		input_string_ = source;
	} else {
		input_string_.reserve(source.size());

		// Commute any \ns that are not immediately after \rs to \rs; remove the rest.
		bool saw_carriage_return = false;
		for(auto character: source) {
			if(character != '\n') {
				input_string_.push_back(character);
			} else {
				if(!saw_carriage_return) {
					input_string_.push_back('\r');
				}
			}
			saw_carriage_return = character == '\r';
		}
	}
}

uint8_t StringSerialiser::head() {
	if(input_string_pointer_ == input_string_.size())
		return '\0';
	return static_cast<uint8_t>(input_string_[input_string_pointer_]);
}

bool StringSerialiser::advance() {
	if(input_string_pointer_ != input_string_.size()) {
		++input_string_pointer_;
		return input_string_pointer_ != input_string_.size();
	}
	return false;
}
