fxos/tools/mkdefs_insn.cc

68 lines
1.6 KiB
C++

#include <fmt/core.h>
#include <iostream>
#include <fstream>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <cctype>
#include <cassert>
#include <map>
static void usage(int rc)
{
fprintf(stderr, "usage: ./mkdefs_insn <insn listing...>\n");
exit(rc);
}
std::string encodeMnemonic(std::string mnemonic)
{
for(size_t i = 0; i < mnemonic.size(); i++) {
if(!isalnum(mnemonic[i]))
mnemonic[i] = '_';
}
return mnemonic;
}
static void parseTable(
char const *file, std::map<std::string, std::string> &allMnemonics)
{
std::ifstream fin {file};
std::string line, pattern, mnemonic;
while(std::getline(fin, line)) {
if(line.size() == 0 || !strchr("01nmdi", line[0]))
continue;
std::istringstream stream {line};
stream >> pattern >> mnemonic;
if(mnemonic.ends_with(".b") || mnemonic.ends_with(".w") ||
mnemonic.ends_with(".l"))
mnemonic = mnemonic.substr(0, mnemonic.size() - 2);
std::string enc = encodeMnemonic(mnemonic);
assert(!allMnemonics.count(enc) || allMnemonics.at(enc) == mnemonic);
allMnemonics.insert({ enc, mnemonic });
}
}
int main(int argc, char **argv)
{
for(int i = 1; i < argc; i++) {
if(!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help"))
usage(0);
}
if(argc <= 1)
usage(1);
std::map<std::string, std::string> allMnemonics;
for(int i = 1; i < argc; i++)
parseTable(argv[i], allMnemonics);
for(auto const &[e,m]: allMnemonics)
fmt::print("GENDEFS_INSN({}, \"{}\")\n", e, m);
return 0;
}