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
|
|
|
|
2022-02-03 20:30:16 +03:30
|
|
|
/**
|
2023-01-18 20:23:40 +09:00
|
|
|
*
|
2022-05-18 16:00:16 +09:00
|
|
|
initial size of symbol buffer
|
2022-02-03 20:30:16 +03:30
|
|
|
*/
|
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
|
|
|
|
|
*/
|
2025-07-07 11:46:10 -07:00
|
|
|
typedef enum _SCRIPT_ENGINE_TOKEN_TYPE
|
2020-10-20 19:35:15 +03:30
|
|
|
{
|
2021-09-26 21:42:36 +09:00
|
|
|
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,
|
2023-11-08 23:48:59 +08:00
|
|
|
WSTRING,
|
2024-08-21 03:42:03 +08:00
|
|
|
FUNCTION_ID,
|
2024-03-02 01:59:33 +08:00
|
|
|
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
|
2025-07-07 11:46:10 -07:00
|
|
|
} 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
|
|
|
|
|
*/
|
2025-07-07 11:46:10 -07:00
|
|
|
typedef struct _SCRIPT_ENGINE_TOKEN
|
2020-10-20 19:35:15 +03:30
|
|
|
{
|
2025-07-07 11:46:10 -07:00
|
|
|
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;
|
2026-07-20 23:21:34 +08:00
|
|
|
BOOLEAN IsImplicitType;
|
2025-07-07 11:46:10 -07:00
|
|
|
} 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
|
|
|
*/
|
2025-07-07 11:46:10 -07:00
|
|
|
typedef struct _SCRIPT_ENGINE_TOKEN_LIST
|
2020-10-20 19:35:15 +03:30
|
|
|
{
|
2025-07-07 11:46:10 -07:00
|
|
|
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
|
|
|
////////////////////////////////////////////////////
|
2025-07-07 11:46:10 -07:00
|
|
|
PSCRIPT_ENGINE_TOKEN
|
2022-05-07 22:51:55 +09:00
|
|
|
NewUnknownToken(void);
|
|
|
|
|
|
2025-07-07 11:46:10 -07:00
|
|
|
PSCRIPT_ENGINE_TOKEN
|
|
|
|
|
NewToken(SCRIPT_ENGINE_TOKEN_TYPE Type, char * Value);
|
2020-10-24 12:19:10 +03:30
|
|
|
|
2026-05-31 02:21:47 +02:00
|
|
|
VOID
|
2025-07-07 11:46:10 -07:00
|
|
|
RemoveToken(PSCRIPT_ENGINE_TOKEN * Token);
|
2020-10-28 08:31:51 +03:30
|
|
|
|
2026-05-31 02:21:47 +02:00
|
|
|
VOID
|
2025-07-07 11:46:10 -07:00
|
|
|
PrintToken(PSCRIPT_ENGINE_TOKEN Token);
|
2020-10-28 08:31:51 +03:30
|
|
|
|
2026-05-31 02:21:47 +02:00
|
|
|
VOID
|
|
|
|
|
AppendByte(PSCRIPT_ENGINE_TOKEN Token, CHAR c);
|
2022-05-07 22:51:55 +09:00
|
|
|
|
2026-05-31 02:21:47 +02:00
|
|
|
VOID
|
2025-07-07 11:46:10 -07:00
|
|
|
AppendWchar(PSCRIPT_ENGINE_TOKEN Token, wchar_t c);
|
2023-11-08 23:48:59 +08:00
|
|
|
|
2025-07-07 11:46:10 -07:00
|
|
|
PSCRIPT_ENGINE_TOKEN
|
|
|
|
|
CopyToken(PSCRIPT_ENGINE_TOKEN Token);
|
2020-12-02 02:32:49 +03:30
|
|
|
|
2025-07-07 11:46:10 -07:00
|
|
|
PSCRIPT_ENGINE_TOKEN
|
2024-08-21 03:42:03 +08:00
|
|
|
NewTemp(PSCRIPT_ENGINE_ERROR_TYPE);
|
2022-01-28 02:11:15 +09:00
|
|
|
|
2026-05-31 02:21:47 +02:00
|
|
|
VOID
|
2026-05-31 03:17:53 +02:00
|
|
|
FreeTemp(PSCRIPT_ENGINE_TOKEN Temp);
|
2024-07-20 11:58:17 +08:00
|
|
|
|
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
|
|
|
////////////////////////////////////////////////////
|
2025-07-07 11:46:10 -07:00
|
|
|
// SCRIPT_ENGINE_TOKEN_LIST related functions //
|
2020-10-28 08:31:51 +03:30
|
|
|
////////////////////////////////////////////////////
|
2022-05-18 23:44:03 +04:30
|
|
|
|
2025-07-07 11:46:10 -07:00
|
|
|
PSCRIPT_ENGINE_TOKEN_LIST
|
2021-03-22 18:19:39 +04:30
|
|
|
NewTokenList(void);
|
2020-10-28 08:31:51 +03:30
|
|
|
|
2026-05-31 02:21:47 +02:00
|
|
|
VOID
|
2025-07-07 11:46:10 -07:00
|
|
|
RemoveTokenList(PSCRIPT_ENGINE_TOKEN_LIST TokenList);
|
2020-10-28 08:31:51 +03:30
|
|
|
|
2026-05-31 02:21:47 +02:00
|
|
|
VOID
|
2025-07-07 11:46:10 -07:00
|
|
|
PrintTokenList(PSCRIPT_ENGINE_TOKEN_LIST TokenList);
|
2020-10-28 08:31:51 +03:30
|
|
|
|
2025-07-07 11:46:10 -07:00
|
|
|
PSCRIPT_ENGINE_TOKEN_LIST
|
|
|
|
|
Push(PSCRIPT_ENGINE_TOKEN_LIST TokenList, PSCRIPT_ENGINE_TOKEN Token);
|
2020-10-28 08:31:51 +03:30
|
|
|
|
2025-07-07 11:46:10 -07:00
|
|
|
PSCRIPT_ENGINE_TOKEN
|
|
|
|
|
Pop(PSCRIPT_ENGINE_TOKEN_LIST TokenList);
|
2020-10-28 08:31:51 +03:30
|
|
|
|
2025-07-07 11:46:10 -07:00
|
|
|
PSCRIPT_ENGINE_TOKEN
|
|
|
|
|
Top(PSCRIPT_ENGINE_TOKEN_LIST TokenList);
|
2020-10-28 08:31:51 +03:30
|
|
|
|
2025-10-15 08:01:17 +08:00
|
|
|
PSCRIPT_ENGINE_TOKEN
|
|
|
|
|
TopIndexed(PSCRIPT_ENGINE_TOKEN_LIST TokenList, int Index);
|
|
|
|
|
|
2021-03-22 18:19:39 +04:30
|
|
|
char
|
2025-07-07 11:46:10 -07:00
|
|
|
IsNoneTerminal(PSCRIPT_ENGINE_TOKEN Token);
|
2020-12-02 02:32:49 +03:30
|
|
|
|
2021-03-22 18:19:39 +04:30
|
|
|
char
|
2025-07-07 11:46:10 -07:00
|
|
|
IsSemanticRule(PSCRIPT_ENGINE_TOKEN Token);
|
2020-12-02 02:32:49 +03:30
|
|
|
|
2021-03-22 18:19:39 +04:30
|
|
|
char
|
2025-07-07 11:46:10 -07:00
|
|
|
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
|
2025-07-07 11:46:10 -07:00
|
|
|
GetNonTerminalId(PSCRIPT_ENGINE_TOKEN Token);
|
2020-12-02 02:32:49 +03:30
|
|
|
|
2024-03-17 20:33:02 +09:00
|
|
|
int
|
2025-07-07 11:46:10 -07:00
|
|
|
GetTerminalId(PSCRIPT_ENGINE_TOKEN Token);
|
2024-03-17 20:33:02 +09:00
|
|
|
|
2022-02-03 20:30:16 +03:30
|
|
|
int
|
2025-07-07 11:46:10 -07:00
|
|
|
LalrGetNonTerminalId(PSCRIPT_ENGINE_TOKEN Token);
|
2020-12-02 02:32:49 +03:30
|
|
|
|
2022-02-03 20:30:16 +03:30
|
|
|
int
|
2025-07-07 11:46:10 -07:00
|
|
|
LalrGetTerminalId(PSCRIPT_ENGINE_TOKEN Token);
|
2021-04-10 19:02:23 +04:30
|
|
|
|
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
|
|
|
|
2024-06-21 17:09:41 +09:00
|
|
|
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
|
|
|
|
2026-05-31 02:21:47 +02:00
|
|
|
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
|
|
|
|
2024-03-18 12:31:11 +09:00
|
|
|
unsigned long long
|
2021-03-22 18:19:39 +04:30
|
|
|
DecimalToInt(char * str);
|
2020-12-02 02:32:49 +03:30
|
|
|
|
2024-03-18 12:31:11 +09:00
|
|
|
unsigned long long
|
2021-04-11 18:27:23 +04:30
|
|
|
DecimalToSignedInt(char * str);
|
|
|
|
|
|
2024-03-18 12:31:11 +09:00
|
|
|
unsigned long long
|
2021-03-22 18:19:39 +04:30
|
|
|
HexToInt(char * str);
|
2020-12-02 02:32:49 +03:30
|
|
|
|
2024-03-18 12:31:11 +09:00
|
|
|
unsigned long long
|
2021-03-22 18:19:39 +04:30
|
|
|
OctalToInt(char * str);
|
2020-12-02 02:32:49 +03:30
|
|
|
|
2024-03-18 12:31:11 +09:00
|
|
|
unsigned long long
|
2021-03-22 18:19:39 +04:30
|
|
|
BinaryToInt(char * str);
|
2020-12-02 15:52:49 +03:30
|
|
|
|
2026-05-31 02:21:47 +02:00
|
|
|
VOID
|
2023-11-24 04:51:56 +08:00
|
|
|
RotateLeftStringOnce(char * str);
|
|
|
|
|
|
2024-03-02 01:59:33 +08:00
|
|
|
////////////////////////////////////////////////////
|
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
|
2025-07-07 11:46:10 -07:00
|
|
|
IsType1Func(PSCRIPT_ENGINE_TOKEN Operator);
|
2020-12-02 03:20:34 +03:30
|
|
|
|
2021-03-22 18:19:39 +04:30
|
|
|
char
|
2025-07-07 11:46:10 -07:00
|
|
|
IsType2Func(PSCRIPT_ENGINE_TOKEN Operator);
|
2020-10-28 08:31:51 +03:30
|
|
|
|
2021-03-22 18:19:39 +04:30
|
|
|
char
|
2025-07-07 11:46:10 -07:00
|
|
|
IsType4Func(PSCRIPT_ENGINE_TOKEN Operator);
|
2021-05-13 15:24:03 +04:30
|
|
|
|
|
|
|
|
char
|
2025-07-07 11:46:10 -07:00
|
|
|
IsType5Func(PSCRIPT_ENGINE_TOKEN Operator);
|
2020-12-03 20:54:33 +03:30
|
|
|
|
2021-05-19 15:17:14 +04:30
|
|
|
char
|
2025-07-07 11:46:10 -07:00
|
|
|
IsType6Func(PSCRIPT_ENGINE_TOKEN Operator);
|
2021-05-19 15:17:14 +04:30
|
|
|
|
2021-09-08 18:28:58 +09:00
|
|
|
char
|
2025-07-07 11:46:10 -07:00
|
|
|
IsType7Func(PSCRIPT_ENGINE_TOKEN Operator);
|
2021-09-08 18:28:58 +09:00
|
|
|
|
|
|
|
|
char
|
2025-07-07 11:46:10 -07:00
|
|
|
IsType8Func(PSCRIPT_ENGINE_TOKEN Operator);
|
2021-09-08 18:28:58 +09:00
|
|
|
|
2023-11-02 23:25:46 +08:00
|
|
|
char
|
2025-07-07 11:46:10 -07:00
|
|
|
IsType9Func(PSCRIPT_ENGINE_TOKEN Operator);
|
2023-11-02 23:25:46 +08:00
|
|
|
|
|
|
|
|
char
|
2025-07-07 11:46:10 -07:00
|
|
|
IsType10Func(PSCRIPT_ENGINE_TOKEN Operator);
|
2023-11-02 23:25:46 +08:00
|
|
|
|
|
|
|
|
char
|
2025-07-07 11:46:10 -07:00
|
|
|
IsType11Func(PSCRIPT_ENGINE_TOKEN Operator);
|
2023-11-02 23:25:46 +08:00
|
|
|
|
2023-11-08 23:48:59 +08:00
|
|
|
char
|
2025-07-07 11:46:10 -07:00
|
|
|
IsType12Func(PSCRIPT_ENGINE_TOKEN Operator);
|
2023-11-08 23:48:59 +08:00
|
|
|
|
|
|
|
|
char
|
2025-07-07 11:46:10 -07:00
|
|
|
IsType13Func(PSCRIPT_ENGINE_TOKEN Operator);
|
2023-11-08 23:48:59 +08:00
|
|
|
|
2023-11-10 00:22:31 +08:00
|
|
|
char
|
2025-07-07 11:46:10 -07:00
|
|
|
IsType14Func(PSCRIPT_ENGINE_TOKEN Operator);
|
2023-11-10 00:22:31 +08:00
|
|
|
|
2024-06-13 14:42:43 +09:00
|
|
|
char
|
2025-07-07 11:46:10 -07:00
|
|
|
IsType15Func(PSCRIPT_ENGINE_TOKEN Operator);
|
2024-06-13 14:42:43 +09:00
|
|
|
|
2025-06-03 10:00:08 +02:00
|
|
|
char
|
2025-07-07 11:46:10 -07:00
|
|
|
IsType16Func(PSCRIPT_ENGINE_TOKEN Operator);
|
2025-06-03 10:00:08 +02:00
|
|
|
|
2024-08-22 00:30:23 +08:00
|
|
|
char
|
2025-07-07 11:46:10 -07:00
|
|
|
IsAssignmentOperator(PSCRIPT_ENGINE_TOKEN Operator);
|
2024-08-22 00:30:23 +08:00
|
|
|
|
2021-03-22 18:19:39 +04:30
|
|
|
char
|
2025-07-07 11:46:10 -07:00
|
|
|
IsTwoOperandOperator(PSCRIPT_ENGINE_TOKEN Operator);
|
2021-04-13 22:53:02 +04:30
|
|
|
|
|
|
|
|
char
|
2025-07-07 11:46:10 -07:00
|
|
|
IsOneOperandOperator(PSCRIPT_ENGINE_TOKEN Operator);
|
2020-12-02 03:20:34 +03:30
|
|
|
|
2024-07-25 01:52:58 +08:00
|
|
|
/**
|
2026-05-31 02:21:47 +02: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;
|
2024-03-02 01:59:33 +08:00
|
|
|
|
2026-01-06 16:38:22 +08:00
|
|
|
/**
|
2026-05-31 02:21:47 +02: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
|