Skip to content
Snippets Groups Projects
PacketStructureTxt.cpp 2.1 KiB
Newer Older
Valerio Pastore's avatar
Valerio Pastore committed
/*
 * PacketStructure.cpp
 *
 *  Created on: Dec 7, 2022
 *      Author: valerio
 */

#include <PacketStructureTxt.h>

using namespace inaf::oasbo::Packets;
Valerio Pastore's avatar
Valerio Pastore committed
std::vector<std::tuple<uint, std::string, uint>> PacketStructureTxt::readStructureFromSource(
		std::string source) {
Valerio Pastore's avatar
Valerio Pastore committed
	std::ifstream file;
	file.open(source, std::ios::in);
Valerio Pastore's avatar
Valerio Pastore committed
	stringArrayFile = this->toStringArray(file);
Valerio Pastore's avatar
Valerio Pastore committed
	uint start = 0;
	uint count = 0;
Valerio Pastore's avatar
Valerio Pastore committed
	this->structure = convertToTupleVector(start, count);
	file.close();
	return structure;
Valerio Pastore's avatar
Valerio Pastore committed
}

std::vector<std::string> PacketStructureTxt::toStringArray(
		std::ifstream &file) {
Valerio Pastore's avatar
Valerio Pastore committed
	std::vector<std::string> out;
	std::string line;
	while (std::getline(file, line)) {
		out.push_back(line);
	}
	return out;
}

Valerio Pastore's avatar
Valerio Pastore committed
std::vector<std::tuple<uint, std::string, uint>> PacketStructureTxt::convertToTupleVector(
		uint &start, uint &count) {
	std::vector<std::tuple<uint, std::string, uint>> out;
Valerio Pastore's avatar
Valerio Pastore committed
	for (;
			start < stringArrayFile.size()
					&& stringArrayFile.at(start).find("}") == std::string::npos;
			start++) {
		std::string line = stringArrayFile.at(start);
		if (line.find("#") != std::string::npos) {
			continue;
		}
		if (line.find("array") != std::string::npos) {
Valerio Pastore's avatar
Valerio Pastore committed
			uint arraySize = std::stoi(
Valerio Pastore's avatar
Valerio Pastore committed
					line.substr(line.find(":") + 1, line.find("{")));
Valerio Pastore's avatar
Valerio Pastore committed
			std::vector<std::tuple<uint, std::string, uint>> array;
			uint newStart = start + 1;
			for (uint i = 0; i < arraySize; i++) {
Valerio Pastore's avatar
Valerio Pastore committed
				newStart = start + 1;
				array = convertToTupleVector(newStart, count);
				std::for_each(array.begin(), array.end(),
Valerio Pastore's avatar
Valerio Pastore committed
						[i](std::tuple<uint, std::string, uint> &line) {
Valerio Pastore's avatar
Valerio Pastore committed
							std::get<1>(line).append("_#").append(
									std::to_string(i));
						});
				out.insert(out.end(), array.begin(), array.end());
			}
			start = newStart;
		} else {
			std::string fieldName = line.substr(0, line.find(" "));
			fieldName.erase(
					std::remove_if(fieldName.begin(), fieldName.end(),
							::isspace), fieldName.end());
			std::transform(fieldName.begin(), fieldName.end(),
					fieldName.begin(), ::tolower);
Valerio Pastore's avatar
Valerio Pastore committed
			out.push_back(
					std::make_tuple(count, fieldName,
							std::stoi(line.substr(line.find(" ")))));
			count += 1;
		}
	}
	return out;
}