mirror of
https://github.com/HyperDbg/HyperDbg.git
synced 2026-07-26 01:15:16 +00:00
279 lines
4.7 KiB
C
279 lines
4.7 KiB
C
/**
|
|
* @file common.h
|
|
* @author M.H. Gholamrezaei (mh@hyperdbg.org)
|
|
*
|
|
* @details Common routines header
|
|
* @version 0.1
|
|
* @date 2020-10-22
|
|
*
|
|
* @copyright This project is released under the GNU Public License v3.
|
|
*
|
|
*/
|
|
#pragma once
|
|
|
|
#ifndef COMMON_H
|
|
# define COMMON_H
|
|
|
|
/**
|
|
*
|
|
initial size of symbol buffer
|
|
*/
|
|
# define SYMBOL_BUFFER_INIT_SIZE 64
|
|
|
|
/**
|
|
* @brief maximum length of string in the token
|
|
*/
|
|
# define TOKEN_VALUE_MAX_LEN 8
|
|
|
|
/**
|
|
* @brief init size of token list
|
|
*/
|
|
# define TOKEN_LIST_INIT_SIZE 256
|
|
|
|
/**
|
|
* @brief enumerates possible types for token
|
|
*/
|
|
typedef enum TOKEN_TYPE
|
|
{
|
|
LOCAL_ID,
|
|
LOCAL_UNRESOLVED_ID,
|
|
GLOBAL_ID,
|
|
GLOBAL_UNRESOLVED_ID,
|
|
DECIMAL,
|
|
STATE_ID,
|
|
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,
|
|
SCRIPT_VARIABLE_TYPE,
|
|
UNKNOWN
|
|
} TOKEN_TYPE;
|
|
|
|
/**
|
|
* @brief read tokens from input stored in this structure
|
|
*/
|
|
typedef struct _TOKEN
|
|
{
|
|
TOKEN_TYPE Type;
|
|
char * Value;
|
|
unsigned int Len;
|
|
unsigned int MaxLen;
|
|
unsigned long long VariableType;
|
|
} TOKEN, *PTOKEN;
|
|
|
|
/**
|
|
* @brief this structure is a dynamic container of TOKENS
|
|
*/
|
|
typedef struct _TOKEN_LIST
|
|
{
|
|
PTOKEN * Head;
|
|
unsigned int Pointer;
|
|
unsigned int Size;
|
|
} TOKEN_LIST, *PTOKEN_LIST;
|
|
|
|
////////////////////////////////////////////////////
|
|
// PTOKEN related functions //
|
|
////////////////////////////////////////////////////
|
|
PTOKEN
|
|
NewUnknownToken(void);
|
|
|
|
PTOKEN
|
|
NewToken(TOKEN_TYPE Type, char * Value);
|
|
|
|
void
|
|
RemoveToken(PTOKEN * Token);
|
|
|
|
void
|
|
PrintToken(PTOKEN Token);
|
|
|
|
void
|
|
AppendByte(PTOKEN Token, char c);
|
|
|
|
void
|
|
AppendWchar(PTOKEN Token, wchar_t c);
|
|
|
|
PTOKEN
|
|
CopyToken(PTOKEN Token);
|
|
|
|
PTOKEN
|
|
NewTemp(PSCRIPT_ENGINE_ERROR_TYPE);
|
|
|
|
void
|
|
FreeTemp(PSCRIPT_ENGINE_ERROR_TYPE);
|
|
|
|
////////////////////////////////////////////////////
|
|
// TOKEN_LIST related functions //
|
|
////////////////////////////////////////////////////
|
|
|
|
PTOKEN_LIST
|
|
NewTokenList(void);
|
|
|
|
void
|
|
RemoveTokenList(PTOKEN_LIST TokenList);
|
|
|
|
void
|
|
PrintTokenList(PTOKEN_LIST TokenList);
|
|
|
|
PTOKEN_LIST
|
|
Push(PTOKEN_LIST TokenList, PTOKEN Token);
|
|
|
|
PTOKEN
|
|
Pop(PTOKEN_LIST TokenList);
|
|
|
|
PTOKEN
|
|
Top(PTOKEN_LIST TokenList);
|
|
|
|
char
|
|
IsNoneTerminal(PTOKEN Token);
|
|
|
|
char
|
|
IsSemanticRule(PTOKEN Token);
|
|
|
|
char
|
|
IsEqual(const PTOKEN Token1, const PTOKEN Token2);
|
|
|
|
int
|
|
GetNonTerminalId(PTOKEN Token);
|
|
|
|
int
|
|
GetTerminalId(PTOKEN Token);
|
|
|
|
int
|
|
LalrGetNonTerminalId(PTOKEN Token);
|
|
|
|
int
|
|
LalrGetTerminalId(PTOKEN Token);
|
|
|
|
////////////////////////////////////////////////////
|
|
// Util Functions //
|
|
////////////////////////////////////////////////////
|
|
|
|
char
|
|
IsHex(char c);
|
|
|
|
char
|
|
IsDecimal(char c);
|
|
|
|
char
|
|
IsLetter(char c);
|
|
|
|
char
|
|
IsUnderscore(char c);
|
|
|
|
char
|
|
IsBinary(char c);
|
|
|
|
char
|
|
IsOctal(char c);
|
|
|
|
void
|
|
SetType(unsigned long long * Val, unsigned char Type);
|
|
|
|
unsigned long long
|
|
DecimalToInt(char * str);
|
|
|
|
unsigned long long
|
|
DecimalToSignedInt(char * str);
|
|
|
|
unsigned long long
|
|
HexToInt(char * str);
|
|
|
|
unsigned long long
|
|
OctalToInt(char * str);
|
|
|
|
unsigned long long
|
|
BinaryToInt(char * str);
|
|
|
|
void
|
|
RotateLeftStringOnce(char * str);
|
|
|
|
////////////////////////////////////////////////////
|
|
// Semantic Rule Related Functions //
|
|
////////////////////////////////////////////////////
|
|
|
|
char
|
|
IsType1Func(PTOKEN Operator);
|
|
|
|
char
|
|
IsType2Func(PTOKEN Operator);
|
|
|
|
char
|
|
IsType4Func(PTOKEN Operator);
|
|
|
|
char
|
|
IsType5Func(PTOKEN Operator);
|
|
|
|
char
|
|
IsType6Func(PTOKEN Operator);
|
|
|
|
char
|
|
IsType7Func(PTOKEN Operator);
|
|
|
|
char
|
|
IsType8Func(PTOKEN Operator);
|
|
|
|
char
|
|
IsType9Func(PTOKEN Operator);
|
|
|
|
char
|
|
IsType10Func(PTOKEN Operator);
|
|
|
|
char
|
|
IsType11Func(PTOKEN Operator);
|
|
|
|
char
|
|
IsType12Func(PTOKEN Operator);
|
|
|
|
char
|
|
IsType13Func(PTOKEN Operator);
|
|
|
|
char
|
|
IsType14Func(PTOKEN Operator);
|
|
|
|
char
|
|
IsType15Func(PTOKEN Operator);
|
|
|
|
char
|
|
IsType16Func(PTOKEN Operator);
|
|
|
|
char
|
|
IsAssignmentOperator(PTOKEN Operator);
|
|
|
|
char
|
|
IsTwoOperandOperator(PTOKEN Operator);
|
|
|
|
char
|
|
IsOneOperandOperator(PTOKEN Operator);
|
|
|
|
/**
|
|
*
|
|
*/
|
|
typedef struct USER_DEFINED_FUNCTION_NODE
|
|
{
|
|
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;
|
|
} USER_DEFINED_FUNCTION_NODE, *PUSER_DEFINED_FUNCTION_NODE;
|
|
|
|
#endif // !COMMON_H
|