/** @copyright 2020 Sean Kasun */ #pragma once #include #include #include "handle.h" struct Fingerprint { std::map> map; uint8_t numDB; std::string name; }; class Fingerprints { public: Fingerprints(); void add(const std::vector &keys, std::string name, uint8_t numDB = 0); std::shared_ptr root; }; namespace symbol { enum Kind { isIntrinsic = 0, isEnum, isAlias, isStruct, isUnion, isRef, isFunction, }; struct Symbol { std::string name; uint32_t size; Kind kind; }; struct Ref : public Symbol { std::shared_ptr symbol; uint32_t pointer; int32_t array; std::string reg; }; struct Argument { std::string key; std::shared_ptr ref; }; struct Function : public Symbol { std::vector arguments; std::shared_ptr returnType; std::vector signature; }; struct Field { std::string key; std::shared_ptr value; }; struct Struct : public Symbol { std::vector fields; }; struct Intrinsic : public Symbol { enum uint8_t { U8, U16, U32, S8, S16, S32 } type; }; struct Enum : public Symbol { std::shared_ptr type; std::map entries; }; } class API { public: API(unsigned char *dat, unsigned int len); std::map> symbols; void search(std::string keyword, uint32_t org); void dumpSymbol(std::shared_ptr symbol, uint32_t org); void dumpRef(std::shared_ptr ref); private: std::shared_ptr lookup(uint32_t id); void setIntrinsic(Handle h, std::shared_ptr s); void setEnum(Handle h, std::shared_ptr s); void setRef(Handle h, std::shared_ptr s); void setStruct(Handle h, std::shared_ptr s); void setFunction(Handle h, std::shared_ptr s); std::map ids; };