HyperDbg/hyperdbg/script-engine/header/common.h

304 lines
6.2 KiB
C
Raw Permalink Normal View History

2022-05-18 23:44:03 +04:30
/**
* @file common.h
* @author M.H. Gholamrezaei (mh@hyperdbg.org)
2023-01-18 20:23:40 +09:00
*
2022-05-18 23:44:03 +04:30
* @details Common routines header
* @version 0.1
* @date 2020-10-22
*
* @copyright This project is released under the GNU Public License v3.
*
*/
2020-11-04 15:50:14 +03:30
#pragma once
2020-12-01 22:26:46 +03:30
#ifndef COMMON_H
2021-03-22 18:19:39 +04:30
# define COMMON_H
2020-11-04 15:50:14 +03:30
/**
2023-01-18 20:23:40 +09:00
*
2022-05-18 16:00:16 +09:00
initial size of symbol buffer
*/
2021-03-22 18:19:39 +04:30
# define SYMBOL_BUFFER_INIT_SIZE 64
2020-10-20 19:35:15 +03:30
2020-10-28 08:31:51 +03:30
/**
2023-01-18 20:23:40 +09:00
* @brief maximum length of string in the token
*/
2022-05-07 22:51:55 +09:00
# define TOKEN_VALUE_MAX_LEN 8
2020-10-28 08:31:51 +03:30
/**
2023-01-18 20:23:40 +09:00
* @brief init size of token list
*/
2021-06-27 19:48:25 +04:30
# define TOKEN_LIST_INIT_SIZE 256
2020-12-01 22:26:46 +03:30
2020-10-28 08:31:51 +03:30
/**
2023-01-18 20:23:40 +09:00
* @brief enumerates possible types for token
*/
typedef enum _SCRIPT_ENGINE_TOKEN_TYPE
2020-10-20 19:35:15 +03:30
{
LOCAL_ID,
LOCAL_UNRESOLVED_ID,
GLOBAL_ID,
GLOBAL_UNRESOLVED_ID,
2021-03-22 18:19:39 +04:30
DECIMAL,
2021-06-27 19:48:25 +04:30
STATE_ID,
2021-03-22 18:19:39 +04:30
HEX,
OCTAL,
BINARY,
SPECIAL_TOKEN,
KEYWORD,
WHITE_SPACE,
COMMENT,
REGISTER,
PSEUDO_REGISTER,
NON_TERMINAL,
SEMANTIC_RULE,
END_OF_STACK,
EPSILON,
TEMP,
STRING,
WSTRING,
FUNCTION_ID,
FUNCTION_PARAMETER_ID,
2024-07-25 01:52:58 +08:00
SCRIPT_VARIABLE_TYPE,
2025-10-21 16:46:49 +08:00
DEFERENCE_TEMP,
2026-07-20 15:03:45 +08:00
UNKNOWN,
FLOAT_LITERAL
} SCRIPT_ENGINE_TOKEN_TYPE;
2020-10-20 19:35:15 +03:30
2020-10-28 08:31:51 +03:30
/**
2023-01-18 20:23:40 +09:00
* @brief read tokens from input stored in this structure
*/
typedef struct _SCRIPT_ENGINE_TOKEN
2020-10-20 19:35:15 +03:30
{
SCRIPT_ENGINE_TOKEN_TYPE Type;
char * Value;
unsigned int Len;
unsigned int MaxLen;
2025-10-21 12:56:21 +02:00
VARIABLE_TYPE * VariableType;
2025-10-21 16:46:49 +08:00
unsigned long long VariableMemoryIdx;
2026-07-18 22:28:45 +08:00
unsigned int AddressSpace;
BOOLEAN IsAddress;
BOOLEAN IsImplicitType;
} SCRIPT_ENGINE_TOKEN, *PSCRIPT_ENGINE_TOKEN;
2020-10-20 19:35:15 +03:30
2020-10-28 08:31:51 +03:30
/**
2024-03-17 18:49:51 +09:00
* @brief this structure is a dynamic container of TOKENS
2023-01-18 20:23:40 +09:00
*/
typedef struct _SCRIPT_ENGINE_TOKEN_LIST
2020-10-20 19:35:15 +03:30
{
PSCRIPT_ENGINE_TOKEN * Head;
unsigned int Pointer;
unsigned int Size;
} SCRIPT_ENGINE_TOKEN_LIST, *PSCRIPT_ENGINE_TOKEN_LIST;
2020-10-20 19:35:15 +03:30
2020-10-28 08:31:51 +03:30
////////////////////////////////////////////////////
2022-05-07 22:51:55 +09:00
// PTOKEN related functions //
2020-10-28 08:31:51 +03:30
////////////////////////////////////////////////////
PSCRIPT_ENGINE_TOKEN
2022-05-07 22:51:55 +09:00
NewUnknownToken(void);
PSCRIPT_ENGINE_TOKEN
NewToken(SCRIPT_ENGINE_TOKEN_TYPE Type, char * Value);
2020-10-24 12:19:10 +03:30
VOID
RemoveToken(PSCRIPT_ENGINE_TOKEN * Token);
2020-10-28 08:31:51 +03:30
VOID
PrintToken(PSCRIPT_ENGINE_TOKEN Token);
2020-10-28 08:31:51 +03:30
VOID
AppendByte(PSCRIPT_ENGINE_TOKEN Token, CHAR c);
2022-05-07 22:51:55 +09:00
VOID
AppendWchar(PSCRIPT_ENGINE_TOKEN Token, wchar_t c);
PSCRIPT_ENGINE_TOKEN
CopyToken(PSCRIPT_ENGINE_TOKEN Token);
2020-12-02 02:32:49 +03:30
PSCRIPT_ENGINE_TOKEN
NewTemp(PSCRIPT_ENGINE_ERROR_TYPE);
VOID
FreeTemp(PSCRIPT_ENGINE_TOKEN Temp);
2025-10-21 12:56:21 +02:00
VARIABLE_TYPE *
HandleType(PSCRIPT_ENGINE_TOKEN_LIST PtokenStack);
VARIABLE_TYPE *
GetCommonVariableType(VARIABLE_TYPE * Ty1, VARIABLE_TYPE * Ty2);
2020-10-28 08:31:51 +03:30
////////////////////////////////////////////////////
// SCRIPT_ENGINE_TOKEN_LIST related functions //
2020-10-28 08:31:51 +03:30
////////////////////////////////////////////////////
2022-05-18 23:44:03 +04:30
PSCRIPT_ENGINE_TOKEN_LIST
2021-03-22 18:19:39 +04:30
NewTokenList(void);
2020-10-28 08:31:51 +03:30
VOID
RemoveTokenList(PSCRIPT_ENGINE_TOKEN_LIST TokenList);
2020-10-28 08:31:51 +03:30
VOID
PrintTokenList(PSCRIPT_ENGINE_TOKEN_LIST TokenList);
2020-10-28 08:31:51 +03:30
PSCRIPT_ENGINE_TOKEN_LIST
Push(PSCRIPT_ENGINE_TOKEN_LIST TokenList, PSCRIPT_ENGINE_TOKEN Token);
2020-10-28 08:31:51 +03:30
PSCRIPT_ENGINE_TOKEN
Pop(PSCRIPT_ENGINE_TOKEN_LIST TokenList);
2020-10-28 08:31:51 +03:30
PSCRIPT_ENGINE_TOKEN
Top(PSCRIPT_ENGINE_TOKEN_LIST TokenList);
2020-10-28 08:31:51 +03:30
PSCRIPT_ENGINE_TOKEN
TopIndexed(PSCRIPT_ENGINE_TOKEN_LIST TokenList, int Index);
2021-03-22 18:19:39 +04:30
char
IsNoneTerminal(PSCRIPT_ENGINE_TOKEN Token);
2020-12-02 02:32:49 +03:30
2021-03-22 18:19:39 +04:30
char
IsSemanticRule(PSCRIPT_ENGINE_TOKEN Token);
2020-12-02 02:32:49 +03:30
2021-03-22 18:19:39 +04:30
char
IsEqual(const PSCRIPT_ENGINE_TOKEN Token1, const PSCRIPT_ENGINE_TOKEN Token2);
2020-12-02 02:32:49 +03:30
2021-03-22 18:19:39 +04:30
int
GetNonTerminalId(PSCRIPT_ENGINE_TOKEN Token);
2020-12-02 02:32:49 +03:30
2024-03-17 20:33:02 +09:00
int
GetTerminalId(PSCRIPT_ENGINE_TOKEN Token);
2024-03-17 20:33:02 +09:00
int
LalrGetNonTerminalId(PSCRIPT_ENGINE_TOKEN Token);
2020-12-02 02:32:49 +03:30
int
LalrGetTerminalId(PSCRIPT_ENGINE_TOKEN Token);
2020-10-28 08:31:51 +03:30
////////////////////////////////////////////////////
2020-12-02 02:44:37 +03:30
// Util Functions //
2020-10-28 08:31:51 +03:30
////////////////////////////////////////////////////
2022-05-18 23:44:03 +04:30
2021-03-22 18:19:39 +04:30
char
IsHex(char c);
2020-10-28 08:31:51 +03:30
2021-03-22 18:19:39 +04:30
char
IsDecimal(char c);
2020-10-28 08:31:51 +03:30
2021-03-22 18:19:39 +04:30
char
IsLetter(char c);
2020-10-28 08:31:51 +03:30
char
IsUnderscore(char c);
2021-03-22 18:19:39 +04:30
char
IsBinary(char c);
2020-10-28 08:31:51 +03:30
2021-03-22 18:19:39 +04:30
char
IsOctal(char c);
2020-10-20 19:35:15 +03:30
VOID
2021-03-22 18:19:39 +04:30
SetType(unsigned long long * Val, unsigned char Type);
2020-12-02 02:32:49 +03:30
unsigned long long
2021-03-22 18:19:39 +04:30
DecimalToInt(char * str);
2020-12-02 02:32:49 +03:30
unsigned long long
2021-04-11 18:27:23 +04:30
DecimalToSignedInt(char * str);
unsigned long long
2021-03-22 18:19:39 +04:30
HexToInt(char * str);
2020-12-02 02:32:49 +03:30
unsigned long long
2021-03-22 18:19:39 +04:30
OctalToInt(char * str);
2020-12-02 02:32:49 +03:30
unsigned long long
2021-03-22 18:19:39 +04:30
BinaryToInt(char * str);
2020-12-02 15:52:49 +03:30
VOID
RotateLeftStringOnce(char * str);
////////////////////////////////////////////////////
2020-12-02 02:44:37 +03:30
// Semantic Rule Related Functions //
2021-03-22 18:19:39 +04:30
////////////////////////////////////////////////////
2022-05-18 23:44:03 +04:30
2021-03-22 18:19:39 +04:30
char
IsType1Func(PSCRIPT_ENGINE_TOKEN Operator);
2020-12-02 03:20:34 +03:30
2021-03-22 18:19:39 +04:30
char
IsType2Func(PSCRIPT_ENGINE_TOKEN Operator);
2020-10-28 08:31:51 +03:30
2021-03-22 18:19:39 +04:30
char
IsType4Func(PSCRIPT_ENGINE_TOKEN Operator);
2021-05-13 15:24:03 +04:30
char
IsType5Func(PSCRIPT_ENGINE_TOKEN Operator);
2020-12-03 20:54:33 +03:30
2021-05-19 15:17:14 +04:30
char
IsType6Func(PSCRIPT_ENGINE_TOKEN Operator);
2021-05-19 15:17:14 +04:30
2021-09-08 18:28:58 +09:00
char
IsType7Func(PSCRIPT_ENGINE_TOKEN Operator);
2021-09-08 18:28:58 +09:00
char
IsType8Func(PSCRIPT_ENGINE_TOKEN Operator);
2021-09-08 18:28:58 +09:00
char
IsType9Func(PSCRIPT_ENGINE_TOKEN Operator);
char
IsType10Func(PSCRIPT_ENGINE_TOKEN Operator);
char
IsType11Func(PSCRIPT_ENGINE_TOKEN Operator);
char
IsType12Func(PSCRIPT_ENGINE_TOKEN Operator);
char
IsType13Func(PSCRIPT_ENGINE_TOKEN Operator);
char
IsType14Func(PSCRIPT_ENGINE_TOKEN Operator);
2024-06-13 14:42:43 +09:00
char
IsType15Func(PSCRIPT_ENGINE_TOKEN Operator);
2024-06-13 14:42:43 +09:00
2025-06-03 10:00:08 +02:00
char
IsType16Func(PSCRIPT_ENGINE_TOKEN Operator);
2025-06-03 10:00:08 +02:00
char
IsAssignmentOperator(PSCRIPT_ENGINE_TOKEN Operator);
2021-03-22 18:19:39 +04:30
char
IsTwoOperandOperator(PSCRIPT_ENGINE_TOKEN Operator);
2021-04-13 22:53:02 +04:30
char
IsOneOperandOperator(PSCRIPT_ENGINE_TOKEN Operator);
2020-12-02 03:20:34 +03:30
2024-07-25 01:52:58 +08:00
/**
* @brief User-defined function linked list node
2024-07-25 01:52:58 +08:00
*/
2026-01-06 16:38:22 +08:00
typedef struct _USER_DEFINED_FUNCTION_NODE
2024-07-25 01:52:58 +08:00
{
2026-01-06 16:38:22 +08:00
char * Name;
long long unsigned Address;
long long unsigned VariableType;
long long unsigned ParameterNumber;
long long unsigned MaxTempNumber;
long long unsigned LocalVariableNumber;
long long unsigned IdTable;
long long unsigned FunctionParameterIdTable;
char * TempMap;
struct _USER_DEFINED_FUNCTION_NODE * NextNode;
2024-07-25 01:52:58 +08:00
} USER_DEFINED_FUNCTION_NODE, *PUSER_DEFINED_FUNCTION_NODE;
2026-01-06 16:38:22 +08:00
/**
* @brief Include file linked list node
2026-01-06 16:38:22 +08:00
*/
typedef struct _INCLUDE_NODE
{
char * FilePath;
struct _INCLUDE_NODE * NextNode;
} INCLUDE_NODE, *PINCLUDE_NODE;
2020-12-01 22:26:46 +03:30
#endif // !COMMON_H