pennmush/dbtools/bits.cpp

231 lines
4.6 KiB
C++
Raw Permalink Normal View History

#include <string>
#include <cstdint>
#include <algorithm>
#ifndef _MSC_VER
#include "config.h"
#else
#define HAVE_STDINT_H
#define HAVE_INTTYPES_H
#define SSE_OFFSET 0
#define WIN32_CDECL __cdecl
#define __attribute__(x)
#define RESTRICT
#endif
#include "hdrs/privtab.h"
#include "hdrs/atr_tab.h"
#include "hdrs/lock.h"
#include "hdrs/lock_tab.h"
#include "hdrs/oldflags.h"
#include "hdrs/flags.h"
#include "hdrs/flag_tab.h"
#include "hdrs/warn_tab.h"
#include "database.h"
#include "io_primitives.h"
#include "bits.h"
using namespace std::literals::string_literals;
stringset
privs_to_set(const PRIV *privs, std::uint32_t bits)
{
stringset flags;
for (int i = 0; privs[i].name; i += 1) {
if (bits & privs[i].bits_to_show) {
flags.insert(privs[i].name);
}
}
return flags;
}
stringvec
privs_to_vec(const PRIV *privs, std::uint32_t bits)
{
stringvec flags;
for (int i = 0; privs[i].name; i += 1) {
if (bits & privs[i].bits_to_show) {
flags.push_back(privs[i].name);
}
}
std::sort(flags.begin(), flags.end());
return flags;
}
stringset
flagprivs_to_set(std::uint32_t bits)
{
return privs_to_set(flag_privs, bits);
}
stringset
typebits_to_set(std::uint32_t bits)
{
stringset types;
for (int i = 0; type_table[i].name; i += 1) {
if (bits & type_table[i].perms) {
types.insert(type_table[i].name);
}
}
return types;
}
stringvec
attrflags_to_vec(std::uint32_t bits)
{
auto flags = privs_to_vec(attr_privs_db, bits);
return flags;
}
attrmap
standard_attribs()
{
attrmap attribs;
for (int i = 0; attr[i].name; i += 1) {
attrib a{};
a.name = attr[i].name;
a.creator = attr[i].creator;
a.flags = attrflags_to_vec(attr[i].flags);
attribs.emplace(attr[i].name, std::move(a));
}
for (int i = 0; attralias[i].realname; i += 1) {
auto a = attribs.find(attralias[i].realname);
if (a != attribs.end()) {
attribs.emplace(attralias[i].alias, a->second);
}
}
return attribs;
}
flagmap
build_standard_flags(const FLAG *flag_tab, const FLAG_ALIAS *alias_tab)
{
flagmap flags;
for (int i = 0; flag_tab[i].name; i += 1) {
flag f;
f.name = flag_tab[i].name;
f.letter = flag_tab[i].letter;
f.types = typebits_to_set(flag_tab[i].type);
f.perms = flagprivs_to_set(flag_tab[i].perms);
f.negate_perms = flagprivs_to_set(flag_tab[i].negate_perms);
flags.emplace(flag_tab[i].name, std::move(f));
}
for (int i = 0; alias_tab[i].realname; i += 1) {
auto f = flags.find(alias_tab[i].realname);
if (f != flags.end()) {
flags.emplace(alias_tab[i].alias, f->second);
}
}
return flags;
}
flagmap
standard_flags()
{
return build_standard_flags(flag_table, flag_alias_tab);
}
stringset
flagbits_to_set(dbtype type, std::uint32_t bits, std::uint32_t toggles)
{
stringset flags;
std::uint32_t typebit = dbtype_to_num(type);
for (int i = 0; flag_table[i].name; i += 1) {
if (flag_table[i].type == NOTYPE && flag_table[i].bitpos & bits) {
flags.insert(flag_table[i].name);
} else if (flag_table[i].type & typebit && flag_table[i].bitpos & toggles) {
flags.insert(flag_table[i].name);
}
}
for (int i = 0; hack_table[i].name; i += 1) {
if (hack_table[i].type & typebit && hack_table[i].bitpos & toggles) {
flags.insert(hack_table[i].name);
}
}
return flags;
}
flagmap
standard_powers()
{
return build_standard_flags(power_table, power_alias_tab);
}
stringset
powerbits_to_set(std::uint32_t bits)
{
stringset powers;
for (int i = 0; power_table[i].name; i += 1) {
if (power_table[i].bitpos & bits) {
powers.insert(power_table[i].name);
}
}
return powers;
}
stringvec
warnbits_to_vec(std::uint32_t bits)
{
stringvec warnings;
for (int i = 0; checklist[i].name; i += 1) {
if (checklist[i].flag & bits) {
warnings.push_back(checklist[i].name);
}
}
std::sort(warnings.begin(), warnings.end());
return warnings;
}
stringvec
lockbits_to_vec(std::uint32_t bits)
{
return privs_to_vec(lock_privs, bits);
}
stringvec
default_lock_flags(string_view name)
{
for (int i = 0; lock_types[i].type; i += 1) {
if (name == lock_types[i].type) {
return privs_to_vec(lock_privs, lock_types[i].flags);
}
}
return {};
}
dbtype
dbtype_from_oldflags(std::uint32_t bits)
{
switch (bits & OLD_TYPE_MASK) {
case OLD_TYPE_PLAYER:
return dbtype::PLAYER;
case OLD_TYPE_ROOM:
return dbtype::ROOM;
case OLD_TYPE_THING:
return dbtype::THING;
case OLD_TYPE_EXIT:
return dbtype::EXIT;
case OLD_TYPE_GARBAGE:
return dbtype::GARBAGE;
default:
throw db_format_exception{"Unknown type "s +
std::to_string(bits & OLD_TYPE_MASK)};
}
}