diff --git a/obfuscator.hpp b/obfuscator.hpp index e004671..67bbfb0 100644 --- a/obfuscator.hpp +++ b/obfuscator.hpp @@ -4,6 +4,9 @@ #include #include +#define OBFS_FINITE_STATE_MACHINE +#define STATE(Name) struct Name {}; +#define EVENT(Name) struct Name {}; #define COMPILE_TIME_RANDOM #define MAKE_RAND_VAL(MOD) RAND_VAL<__LINE__, MOD> #define COMPILE_TIME_SEQUENCE @@ -11,6 +14,70 @@ #define MAKE_STRING(Var, String, ...) constexpr auto Var = obfs::make_string<__VA_ARGS__>(String); +namespace obfs { + template + struct Next { + using event = Event; + using state = State; + }; + + struct FalseType {}; + + template + struct First { + using type = std::conditional_t< + std::is_same_v, + typename First::type, + T>; + }; + + template + struct First { + using type = std::conditional_t< + std::is_same_v, + IfFalse, + T>; + }; + + template + struct Stage { + + template + using act = std::conditional_t< + std::is_same_v, + typename Cond::state, + FalseType>; + + template + using next = typename First...>::type; + }; + + template + struct StateMachine { + + }; + + + STATE(Final); + + EVENT(none); + EVENT(Trigger); + + STATE(state1); STATE(state2); STATE(state3); STATE(state4); STATE(state5); + EVENT(event1); EVENT(event2); EVENT(event3); EVENT(event4); EVENT(event5); + + using machine = StateMachine< + Stage, + Next>, + Stage>, + Stage>, + Stage, + Next>, + Stage>>; + +} + + namespace obfs { constexpr char TIME[] = __TIME__; constexpr int digit(char c) { diff --git a/obfuscator/obfs/fsm.hpp b/obfuscator/obfs/fsm.hpp new file mode 100644 index 0000000..2990a02 --- /dev/null +++ b/obfuscator/obfs/fsm.hpp @@ -0,0 +1,71 @@ +#ifndef OBFS_FINITE_STATE_MACHINE +#define OBFS_FINITE_STATE_MACHINE + +#include + +namespace obfs { + template + struct Next { + using event = Event; + using state = State; + }; + + struct FalseType {}; + + template + struct First { + using type = std::conditional_t< + std::is_same_v, + typename First::type, + T>; + }; + + template + struct First { + using type = std::conditional_t< + std::is_same_v, + IfFalse, + T>; + }; + + template + struct Stage { + + template + using act = std::conditional_t< + std::is_same_v, + typename Cond::state, + FalseType>; + + template + using next = typename First...>::type; + }; + + template + struct StateMachine { + + }; + +#define STATE(Name) struct Name {}; +#define EVENT(Name) struct Name {}; + + STATE(Final); + + EVENT(none); + EVENT(Trigger); + + STATE(state1); STATE(state2); STATE(state3); STATE(state4); STATE(state5); + EVENT(event1); EVENT(event2); EVENT(event3); EVENT(event4); EVENT(event5); + + using machine = StateMachine< + Stage, + Next>, + Stage>, + Stage>, + Stage, + Next>, + Stage>>; + +} + +#endif \ No newline at end of file diff --git a/obfuscator/obfuscator.hpp b/obfuscator/obfuscator.hpp index a51090e..2c74c15 100644 --- a/obfuscator/obfuscator.hpp +++ b/obfuscator/obfuscator.hpp @@ -1,6 +1,7 @@ #ifndef OBFUSCATOR #define OBFUSCATOR +#include "obfs/fsm.hpp" #include "obfs/random.hpp" #include "obfs/sequence.hpp" #include "obfs/string.hpp"