chore: format code
This commit is contained in:
parent
8d2041e946
commit
10adb7a9b2
14
.astylerc
Normal file
14
.astylerc
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
--style=attach
|
||||||
|
--indent-switches
|
||||||
|
--indent-namespaces
|
||||||
|
--indent-after-parens
|
||||||
|
--indent-col1-comments
|
||||||
|
--break-blocks
|
||||||
|
--pad-oper
|
||||||
|
--pad-header
|
||||||
|
--unpad-paren
|
||||||
|
--break-one-line-headers
|
||||||
|
--convert-tabs
|
||||||
|
--max-code-length=90
|
||||||
|
--break-after-logical
|
||||||
|
--lineend=linux
|
|
@ -1,9 +1,9 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
namespace ansi {
|
namespace ansi {
|
||||||
const char *reset = "\033[0m";
|
const char *reset = "\033[0m";
|
||||||
|
|
||||||
const char *cyan = "\033[0;36m";
|
const char *cyan = "\033[0;36m";
|
||||||
const char *green = "\033[0;32m";
|
const char *green = "\033[0;32m";
|
||||||
const char *yellow = "\033[0;33m";
|
const char *yellow = "\033[0;33m";
|
||||||
} // namespace ansi
|
} // namespace ansi
|
||||||
|
|
|
@ -9,45 +9,46 @@
|
||||||
#include <sys/msg.h>
|
#include <sys/msg.h>
|
||||||
|
|
||||||
namespace client {
|
namespace client {
|
||||||
void sendMsg(int msqid, data::RequestMapMsg *msg) {
|
void sendMsg(int msqid, data::RequestMapMsg *msg) {
|
||||||
if (msgsnd(msqid, msg, sizeof(data::RequestMapMsg) - sizeof(long), 0) < 0) {
|
if (msgsnd(msqid, msg, sizeof(data::RequestMapMsg) - sizeof(long), 0) < 0) {
|
||||||
throw std::runtime_error(std::string("send error ") + strerror(errno));
|
throw std::runtime_error(std::string("send error ") + strerror(errno));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string recvMsg(int msqid) {
|
std::string recvMsg(int msqid) {
|
||||||
data::ResponseMapMsg msg;
|
data::ResponseMapMsg msg;
|
||||||
if (msgrcv(msqid, &msg, sizeof(data::ResponseMapMsg) - sizeof(long),
|
|
||||||
data::clientbound_msg, 0) < 0) {
|
|
||||||
throw std::runtime_error(std::string("receive error ") + strerror(errno));
|
|
||||||
}
|
|
||||||
|
|
||||||
return std::string(&msg.data[0], msg.datalen);
|
if (msgrcv(msqid, &msg, sizeof(data::ResponseMapMsg) - sizeof(long),
|
||||||
}
|
data::clientbound_msg, 0) < 0) {
|
||||||
|
throw std::runtime_error(std::string("receive error ") + strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
void map(key_t key) {
|
return std::string(&msg.data[0], msg.datalen);
|
||||||
std::string inp;
|
}
|
||||||
std::cin >> inp;
|
|
||||||
|
|
||||||
auto msqid = msgget(key, 0664);
|
void map(key_t key) {
|
||||||
|
std::string inp;
|
||||||
|
std::cin >> inp;
|
||||||
|
|
||||||
if (msqid < 0) {
|
auto msqid = msgget(key, 0664);
|
||||||
throw std::runtime_error("msgget fail. is the server running?");
|
|
||||||
}
|
|
||||||
|
|
||||||
data::RequestMapMsg req;
|
if (msqid < 0) {
|
||||||
req.msgtype = data::serverbound_msg;
|
throw std::runtime_error("msgget fail. is the server running?");
|
||||||
req.datalen = inp.size();
|
}
|
||||||
std::copy(inp.begin(), inp.end(), req.data);
|
|
||||||
|
|
||||||
sendMsg(msqid, &req);
|
data::RequestMapMsg req;
|
||||||
std::cout << recvMsg(msqid) << std::endl;
|
req.msgtype = data::serverbound_msg;
|
||||||
}
|
req.datalen = inp.size();
|
||||||
|
std::copy(inp.begin(), inp.end(), req.data);
|
||||||
|
|
||||||
void resolveResourceLoc(key_t key) {
|
sendMsg(msqid, &req);
|
||||||
std::string inp;
|
std::cout << recvMsg(msqid) << std::endl;
|
||||||
std::cin >> inp;
|
}
|
||||||
|
|
||||||
std::cout << resourceloc::resolve(inp) << std::endl;
|
void resolveResourceLoc(key_t key) {
|
||||||
}
|
std::string inp;
|
||||||
|
std::cin >> inp;
|
||||||
|
|
||||||
|
std::cout << resourceloc::resolve(inp) << std::endl;
|
||||||
|
}
|
||||||
} // namespace client
|
} // namespace client
|
||||||
|
|
|
@ -3,6 +3,6 @@
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
namespace client {
|
namespace client {
|
||||||
void map(key_t key);
|
void map(key_t key);
|
||||||
void resolveResourceLoc(key_t key);
|
void resolveResourceLoc(key_t key);
|
||||||
} // namespace client
|
} // namespace client
|
||||||
|
|
132
src/csv.cpp
132
src/csv.cpp
|
@ -4,70 +4,82 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace csv {
|
namespace csv {
|
||||||
enum class CSVState { UnquotedField, QuotedField, QuotedQuote };
|
enum class CSVState { UnquotedField, QuotedField, QuotedQuote };
|
||||||
|
|
||||||
// this function has been made in collaboration with
|
// this function has been made in collaboration with
|
||||||
// StackOverflow https://stackoverflow.com/a/30338543
|
// StackOverflow https://stackoverflow.com/a/30338543
|
||||||
void readCSVRow(const std::string &row, std::vector<std::string> &fields) {
|
void readCSVRow(const std::string &row, std::vector<std::string> &fields) {
|
||||||
fields.push_back("");
|
|
||||||
CSVState state = CSVState::UnquotedField;
|
|
||||||
size_t i = 0; // index of the current field
|
|
||||||
for (char c : row) {
|
|
||||||
switch (state) {
|
|
||||||
case CSVState::UnquotedField:
|
|
||||||
switch (c) {
|
|
||||||
case ',': // end of field
|
|
||||||
fields.push_back("");
|
fields.push_back("");
|
||||||
i++;
|
CSVState state = CSVState::UnquotedField;
|
||||||
break;
|
size_t i = 0; // index of the current field
|
||||||
case '"':
|
|
||||||
state = CSVState::QuotedField;
|
for (char c : row) {
|
||||||
break;
|
switch (state) {
|
||||||
default:
|
case CSVState::UnquotedField:
|
||||||
fields[i].push_back(c);
|
switch (c) {
|
||||||
break;
|
case ',': // end of field
|
||||||
}
|
fields.push_back("");
|
||||||
break;
|
i++;
|
||||||
case CSVState::QuotedField:
|
break;
|
||||||
switch (c) {
|
|
||||||
case '"':
|
case '"':
|
||||||
state = CSVState::QuotedQuote;
|
state = CSVState::QuotedField;
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
fields[i].push_back(c);
|
default:
|
||||||
break;
|
fields[i].push_back(c);
|
||||||
}
|
break;
|
||||||
break;
|
}
|
||||||
case CSVState::QuotedQuote:
|
|
||||||
switch (c) {
|
break;
|
||||||
case ',': // , after closing quote
|
|
||||||
fields.push_back("");
|
case CSVState::QuotedField:
|
||||||
i++;
|
switch (c) {
|
||||||
state = CSVState::UnquotedField;
|
case '"':
|
||||||
break;
|
state = CSVState::QuotedQuote;
|
||||||
case '"': // "" -> "
|
break;
|
||||||
fields[i].push_back('"');
|
|
||||||
state = CSVState::QuotedField;
|
default:
|
||||||
break;
|
fields[i].push_back(c);
|
||||||
default: // end of quote
|
break;
|
||||||
state = CSVState::UnquotedField;
|
}
|
||||||
break;
|
|
||||||
}
|
break;
|
||||||
break;
|
|
||||||
|
case CSVState::QuotedQuote:
|
||||||
|
switch (c) {
|
||||||
|
case ',': // , after closing quote
|
||||||
|
fields.push_back("");
|
||||||
|
i++;
|
||||||
|
state = CSVState::UnquotedField;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '"': // "" -> "
|
||||||
|
fields[i].push_back('"');
|
||||||
|
state = CSVState::QuotedField;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: // end of quote
|
||||||
|
state = CSVState::UnquotedField;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
bool CsvReader::operator>>(std::vector<std::string> &line) {
|
||||||
}
|
line.clear();
|
||||||
bool CsvReader::operator>>(std::vector<std::string> &line) {
|
|
||||||
line.clear();
|
|
||||||
if (!m_stream) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string row;
|
if (!m_stream) {
|
||||||
std::getline(m_stream, row);
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
readCSVRow(row, line);
|
std::string row;
|
||||||
|
std::getline(m_stream, row);
|
||||||
|
|
||||||
return !!m_stream;
|
readCSVRow(row, line);
|
||||||
}
|
|
||||||
|
return !!m_stream;
|
||||||
|
}
|
||||||
} // namespace csv
|
} // namespace csv
|
||||||
|
|
16
src/csv.hpp
16
src/csv.hpp
|
@ -3,14 +3,14 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
namespace csv {
|
namespace csv {
|
||||||
class CsvReader {
|
class CsvReader {
|
||||||
private:
|
private:
|
||||||
std::ifstream m_stream;
|
std::ifstream m_stream;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CsvReader(auto stream) : m_stream(stream){};
|
CsvReader(auto stream) : m_stream(stream) {};
|
||||||
~CsvReader() = default;
|
~CsvReader() = default;
|
||||||
|
|
||||||
bool operator>>(std::vector<std::string> &line);
|
bool operator>>(std::vector<std::string> &line);
|
||||||
};
|
};
|
||||||
} // namespace csv
|
} // namespace csv
|
||||||
|
|
14
src/data.cpp
14
src/data.cpp
|
@ -5,13 +5,13 @@
|
||||||
#include <sys/ipc.h>
|
#include <sys/ipc.h>
|
||||||
|
|
||||||
namespace data {
|
namespace data {
|
||||||
key_t getIpcKeyFromExeName(char *argv0) {
|
key_t getIpcKeyFromExeName(char *argv0) {
|
||||||
auto k = ftok(argv0, 'X');
|
auto k = ftok(argv0, 'X');
|
||||||
|
|
||||||
if (k < 0) {
|
if (k < 0) {
|
||||||
throw std::runtime_error("failed to get IPC key");
|
throw std::runtime_error("failed to get IPC key");
|
||||||
}
|
}
|
||||||
|
|
||||||
return k;
|
return k;
|
||||||
}
|
}
|
||||||
} // namespace data
|
} // namespace data
|
||||||
|
|
26
src/data.hpp
26
src/data.hpp
|
@ -3,22 +3,22 @@
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
namespace data {
|
namespace data {
|
||||||
const int serverbound_msg = 1;
|
const int serverbound_msg = 1;
|
||||||
const int clientbound_msg = 2;
|
const int clientbound_msg = 2;
|
||||||
|
|
||||||
key_t getIpcKeyFromExeName(char *argv0);
|
key_t getIpcKeyFromExeName(char *argv0);
|
||||||
|
|
||||||
struct RequestMapMsg {
|
struct RequestMapMsg {
|
||||||
long msgtype;
|
long msgtype;
|
||||||
|
|
||||||
unsigned int datalen;
|
unsigned int datalen;
|
||||||
char data[128];
|
char data[128];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ResponseMapMsg {
|
struct ResponseMapMsg {
|
||||||
long msgtype;
|
long msgtype;
|
||||||
|
|
||||||
unsigned int datalen;
|
unsigned int datalen;
|
||||||
char data[128];
|
char data[128];
|
||||||
};
|
};
|
||||||
} // namespace data
|
} // namespace data
|
||||||
|
|
38
src/main.cpp
38
src/main.cpp
|
@ -6,27 +6,27 @@
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
void main2(int argc, char *argv[]) {
|
void main2(int argc, char *argv[]) {
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
throw std::runtime_error("not enough arguments!");
|
throw std::runtime_error("not enough arguments!");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(argv[1], "serve") == 0) {
|
if (strcmp(argv[1], "serve") == 0) {
|
||||||
server::run(data::getIpcKeyFromExeName(argv[0]));
|
server::run(data::getIpcKeyFromExeName(argv[0]));
|
||||||
} else if (strcmp(argv[1], "map") == 0) {
|
} else if (strcmp(argv[1], "map") == 0) {
|
||||||
client::map(data::getIpcKeyFromExeName(argv[0]));
|
client::map(data::getIpcKeyFromExeName(argv[0]));
|
||||||
} else if (strcmp(argv[1], "resourceloc") == 0) {
|
} else if (strcmp(argv[1], "resourceloc") == 0) {
|
||||||
client::resolveResourceLoc(data::getIpcKeyFromExeName(argv[0]));
|
client::resolveResourceLoc(data::getIpcKeyFromExeName(argv[0]));
|
||||||
} else {
|
} else {
|
||||||
throw std::runtime_error("unknown command!");
|
throw std::runtime_error("unknown command!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
try {
|
try {
|
||||||
main2(argc, argv);
|
main2(argc, argv);
|
||||||
return 0;
|
return 0;
|
||||||
} catch (const std::exception &e) {
|
} catch (const std::exception &e) {
|
||||||
BOOST_LOG_TRIVIAL(fatal) << "Exception: " << e.what();
|
BOOST_LOG_TRIVIAL(fatal) << "Exception: " << e.what();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
169
src/mappings.cpp
169
src/mappings.cpp
|
@ -18,95 +18,102 @@
|
||||||
namespace fs = boost::filesystem;
|
namespace fs = boost::filesystem;
|
||||||
|
|
||||||
namespace mappings {
|
namespace mappings {
|
||||||
Mappings Mappings::load() {
|
Mappings Mappings::load() {
|
||||||
std::map<std::string, Mapping> mappings;
|
std::map<std::string, Mapping> mappings;
|
||||||
std::map<std::string, std::string> renames;
|
std::map<std::string, std::string> renames;
|
||||||
|
|
||||||
// load mappings
|
// load mappings
|
||||||
fs::directory_iterator end_itr;
|
fs::directory_iterator end_itr;
|
||||||
try {
|
|
||||||
for (fs::directory_iterator itr("mappings"); itr != end_itr; ++itr) {
|
|
||||||
if (fs::is_directory(itr->status()) ||
|
|
||||||
!boost::algorithm::ends_with(itr->path().string(), ".csv"))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
csv::CsvReader csv(itr->path().string());
|
try {
|
||||||
|
for (fs::directory_iterator itr("mappings"); itr != end_itr; ++itr) {
|
||||||
|
if (fs::is_directory(itr->status()) ||
|
||||||
|
!boost::algorithm::ends_with(itr->path().string(), ".csv"))
|
||||||
|
continue;
|
||||||
|
|
||||||
std::vector<std::string> l;
|
csv::CsvReader csv(itr->path().string());
|
||||||
while (csv >> l) {
|
|
||||||
if (l.size() < 2) {
|
std::vector<std::string> l;
|
||||||
BOOST_LOG_TRIVIAL(warning) << "found invalid mapping";
|
|
||||||
continue;
|
while (csv >> l) {
|
||||||
|
if (l.size() < 2) {
|
||||||
|
BOOST_LOG_TRIVIAL(warning) << "found invalid mapping";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
mappings[l[0]] = {l[0], l[1],
|
||||||
|
l.size() >= 4 ? std::optional(l[3]) : std::nullopt
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (boost::filesystem::filesystem_error &e) {
|
||||||
|
if (e.code() == boost::system::errc::no_such_file_or_directory) {
|
||||||
|
throw std::runtime_error(
|
||||||
|
std::string("The mappings directory is missing!\n") + e.what());
|
||||||
|
}
|
||||||
|
|
||||||
|
throw;
|
||||||
}
|
}
|
||||||
mappings[l[0]] = {l[0], l[1],
|
|
||||||
l.size() >= 4 ? std::optional(l[3]) : std::nullopt};
|
if (fs::is_regular_file("renames.csv")) {
|
||||||
}
|
csv::CsvReader csv("renames.csv");
|
||||||
|
|
||||||
|
std::vector<std::string> l;
|
||||||
|
|
||||||
|
while (csv >> l) {
|
||||||
|
if (l.size() < 2) {
|
||||||
|
BOOST_LOG_TRIVIAL(warning) << "found invalid rename";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
renames[l[0]] = l[1];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
BOOST_LOG_TRIVIAL(warning) << "no renames found, skipping";
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_LOG_TRIVIAL(info) << "loaded " << mappings.size() << " mappings and "
|
||||||
|
<< renames.size() << " renames";
|
||||||
|
return {mappings, renames};
|
||||||
}
|
}
|
||||||
} catch (boost::filesystem::filesystem_error &e) {
|
|
||||||
if (e.code() == boost::system::errc::no_such_file_or_directory) {
|
void showMapInfo(Mapping mapping, std::optional<std::string> rename) {
|
||||||
throw std::runtime_error(
|
auto doc = mapping.doc.has_value()
|
||||||
std::string("The mappings directory is missing!\n") + e.what());
|
? std::string(ansi::yellow) + "\n\n\t" + *mapping.doc + "\n"
|
||||||
|
: "";
|
||||||
|
|
||||||
|
if (rename.has_value()) {
|
||||||
|
BOOST_LOG_TRIVIAL(info)
|
||||||
|
<< "\nFound mapping:\n"
|
||||||
|
<< ansi::cyan << "\n\tOriginal\t" << ansi::green << mapping.orig
|
||||||
|
<< ansi::cyan << "\n\tRemapped\t" << ansi::green << mapping.name
|
||||||
|
<< ansi::cyan << "\n\tRenamed \t" << ansi::green << *rename << doc
|
||||||
|
<< ansi::reset;
|
||||||
|
} else {
|
||||||
|
BOOST_LOG_TRIVIAL(info)
|
||||||
|
<< "\nFound mapping:\n"
|
||||||
|
<< ansi::cyan << "\n\tOriginal\t" << ansi::green << mapping.orig
|
||||||
|
<< ansi::cyan << "\n\tRemapped\t" << ansi::green << mapping.name << doc
|
||||||
|
<< ansi::reset;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
throw;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fs::is_regular_file("renames.csv")) {
|
std::string Mappings::map(std::string inp) {
|
||||||
csv::CsvReader csv("renames.csv");
|
if (!this->m_mappings.count(inp)) {
|
||||||
|
BOOST_LOG_TRIVIAL(warning) << "unknown mapping '" << inp << "'";
|
||||||
|
return "<unknown>";
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<std::string> l;
|
auto mapped = this->m_mappings[inp];
|
||||||
while (csv >> l) {
|
|
||||||
if (l.size() < 2) {
|
|
||||||
BOOST_LOG_TRIVIAL(warning) << "found invalid rename";
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
renames[l[0]] = l[1];
|
if (this->m_renames.count(mapped.name)) {
|
||||||
|
BOOST_LOG_TRIVIAL(info)
|
||||||
|
<< "found rename " << mapped.name << " -> " << m_renames[mapped.name];
|
||||||
|
showMapInfo(mapped, m_renames[mapped.name]);
|
||||||
|
return m_renames[mapped.name];
|
||||||
|
}
|
||||||
|
|
||||||
|
showMapInfo(mapped, std::nullopt);
|
||||||
|
return mapped.name;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
BOOST_LOG_TRIVIAL(warning) << "no renames found, skipping";
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOST_LOG_TRIVIAL(info) << "loaded " << mappings.size() << " mappings and "
|
|
||||||
<< renames.size() << " renames";
|
|
||||||
return {mappings, renames};
|
|
||||||
}
|
|
||||||
|
|
||||||
void showMapInfo(Mapping mapping, std::optional<std::string> rename) {
|
|
||||||
auto doc = mapping.doc.has_value()
|
|
||||||
? std::string(ansi::yellow) + "\n\n\t" + *mapping.doc + "\n"
|
|
||||||
: "";
|
|
||||||
if (rename.has_value()) {
|
|
||||||
BOOST_LOG_TRIVIAL(info)
|
|
||||||
<< "\nFound mapping:\n"
|
|
||||||
<< ansi::cyan << "\n\tOriginal\t" << ansi::green << mapping.orig
|
|
||||||
<< ansi::cyan << "\n\tRemapped\t" << ansi::green << mapping.name
|
|
||||||
<< ansi::cyan << "\n\tRenamed \t" << ansi::green << *rename << doc
|
|
||||||
<< ansi::reset;
|
|
||||||
} else {
|
|
||||||
BOOST_LOG_TRIVIAL(info)
|
|
||||||
<< "\nFound mapping:\n"
|
|
||||||
<< ansi::cyan << "\n\tOriginal\t" << ansi::green << mapping.orig
|
|
||||||
<< ansi::cyan << "\n\tRemapped\t" << ansi::green << mapping.name << doc
|
|
||||||
<< ansi::reset;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string Mappings::map(std::string inp) {
|
|
||||||
if (!this->m_mappings.count(inp)) {
|
|
||||||
BOOST_LOG_TRIVIAL(warning) << "unknown mapping '" << inp << "'";
|
|
||||||
return "<unknown>";
|
|
||||||
}
|
|
||||||
|
|
||||||
auto mapped = this->m_mappings[inp];
|
|
||||||
|
|
||||||
if (this->m_renames.count(mapped.name)) {
|
|
||||||
BOOST_LOG_TRIVIAL(info)
|
|
||||||
<< "found rename " << mapped.name << " -> " << m_renames[mapped.name];
|
|
||||||
showMapInfo(mapped, m_renames[mapped.name]);
|
|
||||||
return m_renames[mapped.name];
|
|
||||||
}
|
|
||||||
|
|
||||||
showMapInfo(mapped, std::nullopt);
|
|
||||||
return mapped.name;
|
|
||||||
}
|
|
||||||
} // namespace mappings
|
} // namespace mappings
|
||||||
|
|
|
@ -4,24 +4,24 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace mappings {
|
namespace mappings {
|
||||||
struct Mapping {
|
struct Mapping {
|
||||||
std::string orig;
|
std::string orig;
|
||||||
std::string name;
|
std::string name;
|
||||||
std::optional<std::string> doc;
|
std::optional<std::string> doc;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Mappings {
|
class Mappings {
|
||||||
std::map<std::string, Mapping> m_mappings;
|
std::map<std::string, Mapping> m_mappings;
|
||||||
std::map<std::string, std::string> m_renames;
|
std::map<std::string, std::string> m_renames;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Mappings(std::map<std::string, Mapping> mappings,
|
Mappings(std::map<std::string, Mapping> mappings,
|
||||||
std::map<std::string, std::string> renames) {
|
std::map<std::string, std::string> renames) {
|
||||||
this->m_mappings = mappings;
|
this->m_mappings = mappings;
|
||||||
this->m_renames = renames;
|
this->m_renames = renames;
|
||||||
}
|
}
|
||||||
~Mappings() = default;
|
~Mappings() = default;
|
||||||
static Mappings load();
|
static Mappings load();
|
||||||
std::string map(std::string inp);
|
std::string map(std::string inp);
|
||||||
};
|
};
|
||||||
} // namespace mappings
|
} // namespace mappings
|
||||||
|
|
|
@ -9,26 +9,28 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace resourceloc {
|
namespace resourceloc {
|
||||||
std::string resolve(std::string inp) {
|
std::string resolve(std::string inp) {
|
||||||
boost::algorithm::trim_if(inp, boost::is_any_of(" \n\r\""));
|
boost::algorithm::trim_if(inp, boost::is_any_of(" \n\r\""));
|
||||||
|
|
||||||
std::vector<std::string> components;
|
std::vector<std::string> components;
|
||||||
boost::algorithm::split(components, inp, boost::is_any_of("/"));
|
boost::algorithm::split(components, inp, boost::is_any_of("/"));
|
||||||
|
|
||||||
if (components.size() < 3 || components[0] != "" || components[1] != "mods") {
|
if (components.size() < 3 || components[0] != "" || components[1] != "mods") {
|
||||||
BOOST_LOG_TRIVIAL(warning) << "invalid resourceloc";
|
BOOST_LOG_TRIVIAL(warning) << "invalid resourceloc";
|
||||||
return "<invalid>";
|
return "<invalid>";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string path_component;
|
std::string path_component;
|
||||||
for (unsigned int i = 3; i < components.size(); i++) {
|
|
||||||
path_component += components[i];
|
for (unsigned int i = 3; i < components.size(); i++) {
|
||||||
if (i != components.size() - 1) {
|
path_component += components[i];
|
||||||
path_component += "/";
|
|
||||||
|
if (i != components.size() - 1) {
|
||||||
|
path_component += "/";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return boost::str(boost::format("new ResourceLocation(\"%1%\", \"%2%\")") %
|
||||||
|
components[2] % path_component);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return boost::str(boost::format("new ResourceLocation(\"%1%\", \"%2%\")") %
|
|
||||||
components[2] % path_component);
|
|
||||||
}
|
|
||||||
} // namespace resourceloc
|
} // namespace resourceloc
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <string>
|
#include <string>
|
||||||
namespace resourceloc {
|
namespace resourceloc {
|
||||||
std::string resolve(std::string inp);
|
std::string resolve(std::string inp);
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,41 +11,42 @@
|
||||||
#include <sys/msg.h>
|
#include <sys/msg.h>
|
||||||
|
|
||||||
namespace server {
|
namespace server {
|
||||||
void sendToClient(int msqid, std::string msg) {
|
void sendToClient(int msqid, std::string msg) {
|
||||||
data::ResponseMapMsg pkt;
|
data::ResponseMapMsg pkt;
|
||||||
pkt.msgtype = data::clientbound_msg;
|
pkt.msgtype = data::clientbound_msg;
|
||||||
pkt.datalen = msg.size();
|
pkt.datalen = msg.size();
|
||||||
std::copy(msg.begin(), msg.end(), pkt.data);
|
std::copy(msg.begin(), msg.end(), pkt.data);
|
||||||
|
|
||||||
if (msgsnd(msqid, &pkt, sizeof(data::ResponseMapMsg) - sizeof(long), 0) < 0) {
|
if (msgsnd(msqid, &pkt, sizeof(data::ResponseMapMsg) - sizeof(long), 0) < 0) {
|
||||||
BOOST_LOG_TRIVIAL(error) << "failed to send response " << strerror(errno);
|
BOOST_LOG_TRIVIAL(error) << "failed to send response " << strerror(errno);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void run(key_t key) {
|
|
||||||
BOOST_LOG_TRIVIAL(info) << "starting server";
|
|
||||||
|
|
||||||
auto msqid = msgget(key, 0664 | IPC_CREAT);
|
|
||||||
|
|
||||||
if (msqid < 0) {
|
|
||||||
throw std::runtime_error("msgget fail");
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOST_LOG_TRIVIAL(info) << "msqid " << msqid;
|
|
||||||
|
|
||||||
auto mappings = mappings::Mappings::load();
|
|
||||||
|
|
||||||
data::RequestMapMsg msg;
|
|
||||||
for (;;) {
|
|
||||||
if (msgrcv(msqid, &msg, sizeof(data::RequestMapMsg) - sizeof(long),
|
|
||||||
data::serverbound_msg, 0) < 0) {
|
|
||||||
BOOST_LOG_TRIVIAL(error) << "receive error " << strerror(errno);
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string s(msg.data, msg.datalen);
|
void run(key_t key) {
|
||||||
BOOST_LOG_TRIVIAL(info) << "got request to map '" << s << "'";
|
BOOST_LOG_TRIVIAL(info) << "starting server";
|
||||||
sendToClient(msqid, mappings.map(s));
|
|
||||||
}
|
auto msqid = msgget(key, 0664 | IPC_CREAT);
|
||||||
}
|
|
||||||
|
if (msqid < 0) {
|
||||||
|
throw std::runtime_error("msgget fail");
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_LOG_TRIVIAL(info) << "msqid " << msqid;
|
||||||
|
|
||||||
|
auto mappings = mappings::Mappings::load();
|
||||||
|
|
||||||
|
data::RequestMapMsg msg;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
if (msgrcv(msqid, &msg, sizeof(data::RequestMapMsg) - sizeof(long),
|
||||||
|
data::serverbound_msg, 0) < 0) {
|
||||||
|
BOOST_LOG_TRIVIAL(error) << "receive error " << strerror(errno);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string s(msg.data, msg.datalen);
|
||||||
|
BOOST_LOG_TRIVIAL(info) << "got request to map '" << s << "'";
|
||||||
|
sendToClient(msqid, mappings.map(s));
|
||||||
|
}
|
||||||
|
}
|
||||||
} // namespace server
|
} // namespace server
|
||||||
|
|
|
@ -3,5 +3,5 @@
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
namespace server {
|
namespace server {
|
||||||
void run(key_t key);
|
void run(key_t key);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue