HyperDbg Debugger
Loading...
Searching...
No Matches
type.c File Reference

Routines for handling variable types. More...

#include "pch.h"

Functions

VARIABLE_TYPEHandleType (PSCRIPT_ENGINE_TOKEN_LIST PtokenStack)
 Return a variable type based on the token stack.
VARIABLE_TYPEGetCommonVariableType (VARIABLE_TYPE *Ty1, VARIABLE_TYPE *Ty2)
 Returns the common variable type between two types.

Variables

VARIABLE_TYPEVARIABLE_TYPE_UNKNOWN = &(VARIABLE_TYPE) {TY_UNKNOWN}
VARIABLE_TYPEVARIABLE_TYPE_VOID = &(VARIABLE_TYPE) {TY_VOID, 1, 1}
VARIABLE_TYPEVARIABLE_TYPE_BOOL = &(VARIABLE_TYPE) {TY_BOOL, 1, 1}
VARIABLE_TYPEVARIABLE_TYPE_CHAR = &(VARIABLE_TYPE) {TY_CHAR, 1, 1}
VARIABLE_TYPEVARIABLE_TYPE_SHORT = &(VARIABLE_TYPE) {TY_SHORT, 2, 2}
VARIABLE_TYPEVARIABLE_TYPE_INT = &(VARIABLE_TYPE) {TY_INT, 4, 4}
VARIABLE_TYPEVARIABLE_TYPE_LONG = &(VARIABLE_TYPE) {TY_LONG, 8, 8}
VARIABLE_TYPEVARIABLE_TYPE_UCHAR = &(VARIABLE_TYPE) {TY_CHAR, 1, 1, TRUE}
VARIABLE_TYPEVARIABLE_TYPE_USHORT = &(VARIABLE_TYPE) {TY_SHORT, 2, 2, TRUE}
VARIABLE_TYPEVARIABLE_TYPE_UINT = &(VARIABLE_TYPE) {TY_INT, 4, 4, TRUE}
VARIABLE_TYPEVARIABLE_TYPE_ULONG = &(VARIABLE_TYPE) {TY_LONG, 8, 8, TRUE}
VARIABLE_TYPEVARIABLE_TYPE_FLOAT = &(VARIABLE_TYPE) {TY_FLOAT, 4, 4}
VARIABLE_TYPEVARIABLE_TYPE_DOUBLE = &(VARIABLE_TYPE) {TY_DOUBLE, 8, 8}
VARIABLE_TYPEVARIABLE_TYPE_LDOUBLE = &(VARIABLE_TYPE) {TY_LDOUBLE, 16, 16}

Detailed Description

Routines for handling variable types.

Author
M.H. Gholamrezaei (mh@hy.nosp@m.perd.nosp@m.bg.or.nosp@m.g)
Version
0.1
Date
2020-10-22

Function Documentation

◆ GetCommonVariableType()

VARIABLE_TYPE * GetCommonVariableType ( VARIABLE_TYPE * Ty1,
VARIABLE_TYPE * Ty2 )

Returns the common variable type between two types.

Parameters
Ty1the first variable type
Ty2the second variable type
Returns
VARIABLE_TYPE * pointer to the common variable type
189{
190 // if (Ty1->Kind == TY_ARRAY)
191 //{
192 // return Ty1;
193 // }
194
195 // if (Ty2->Kind == TY_ARRAY)
196 //{
197 // return Ty2;
198 // }
199
200 return VARIABLE_TYPE_LONG;
201}
VARIABLE_TYPE * VARIABLE_TYPE_LONG
Definition type.c:23

◆ HandleType()

VARIABLE_TYPE * HandleType ( PSCRIPT_ENGINE_TOKEN_LIST PtokenStack)

Return a variable type based on the token stack.

Parameters
PtokenStackthe token stack containing type tokens
Returns
VARIABLE_TYPE * pointer to the resolved variable type
42{
43 enum
44 {
45 ENUM_VOID = 1 << 0,
46 ENUM_BOOL = 1 << 2,
47 ENUM_CHAR = 1 << 4,
48 ENUM_SHORT = 1 << 6,
49 ENUM_INT = 1 << 8,
50 ENUM_LONG = 1 << 10,
51 ENUM_FLOAT = 1 << 12,
52 ENUM_DOUBLE = 1 << 14,
53 ENUM_OTHER = 1 << 16,
54 ENUM_SIGNED = 1 << 17,
55 ENUM_UNSIGNED = 1 << 18,
56 };
57
59 int Counter = 0;
60 PSCRIPT_ENGINE_TOKEN TopToken = NULL;
61
62 while (PtokenStack->Pointer > 0)
63 {
64 TopToken = Pop(PtokenStack);
65 if (TopToken->Type != SCRIPT_VARIABLE_TYPE)
66 {
67 Push(PtokenStack, TopToken);
68 break;
69 }
70 if (!strcmp(TopToken->Value, "void"))
71 {
72 Counter += ENUM_VOID;
73 }
74 else if (!strcmp(TopToken->Value, "bool"))
75 {
76 Counter += ENUM_BOOL;
77 }
78 else if (!strcmp(TopToken->Value, "char"))
79 {
80 Counter += ENUM_CHAR;
81 }
82 else if (!strcmp(TopToken->Value, "short"))
83 {
84 Counter += ENUM_SHORT;
85 }
86 else if (!strcmp(TopToken->Value, "int"))
87 {
88 Counter += ENUM_INT;
89 }
90 else if (!strcmp(TopToken->Value, "long"))
91 {
92 Counter += ENUM_LONG;
93 }
94 else if (!strcmp(TopToken->Value, "float"))
95 {
96 Counter += ENUM_FLOAT;
97 }
98 else if (!strcmp(TopToken->Value, "double"))
99 {
100 Counter += ENUM_DOUBLE;
101 }
102 else if (!strcmp(TopToken->Value, "signed"))
103 {
104 Counter |= ENUM_SIGNED;
105 }
106 else if (!strcmp(TopToken->Value, "unsigned"))
107 {
108 Counter |= ENUM_UNSIGNED;
109 }
110 else
111 {
113 }
114 RemoveToken(&TopToken);
115
116 switch (Counter)
117 {
118 case ENUM_VOID:
119 Result = VARIABLE_TYPE_VOID;
120 break;
121 case ENUM_BOOL:
122 Result = VARIABLE_TYPE_BOOL;
123 break;
124 case ENUM_CHAR:
125 case ENUM_SIGNED + ENUM_CHAR:
126 Result = VARIABLE_TYPE_CHAR;
127 break;
128 case ENUM_UNSIGNED + ENUM_CHAR:
129 Result = VARIABLE_TYPE_UCHAR;
130 break;
131 case ENUM_SHORT:
132 case ENUM_SHORT + ENUM_INT:
133 case ENUM_SIGNED + ENUM_SHORT:
134 case ENUM_SIGNED + ENUM_SHORT + ENUM_INT:
135 Result = VARIABLE_TYPE_INT;
136 break;
137 case ENUM_UNSIGNED + ENUM_SHORT:
138 case ENUM_UNSIGNED + ENUM_SHORT + ENUM_INT:
139 Result = VARIABLE_TYPE_USHORT;
140 break;
141 case ENUM_INT:
142 case ENUM_SIGNED:
143 case ENUM_SIGNED + ENUM_INT:
144 Result = VARIABLE_TYPE_INT;
145 break;
146 case ENUM_UNSIGNED:
147 case ENUM_UNSIGNED + ENUM_INT:
148 Result = VARIABLE_TYPE_UINT;
149 break;
150 case ENUM_LONG:
151 case ENUM_LONG + ENUM_INT:
152 case ENUM_LONG + ENUM_LONG:
153 case ENUM_LONG + ENUM_LONG + ENUM_INT:
154 case ENUM_SIGNED + ENUM_LONG:
155 case ENUM_SIGNED + ENUM_LONG + ENUM_INT:
156 case ENUM_SIGNED + ENUM_LONG + ENUM_LONG:
157 case ENUM_SIGNED + ENUM_LONG + ENUM_LONG + ENUM_INT:
158 Result = VARIABLE_TYPE_LONG;
159 break;
160 case ENUM_UNSIGNED + ENUM_LONG:
161 case ENUM_UNSIGNED + ENUM_LONG + ENUM_INT:
162 case ENUM_UNSIGNED + ENUM_LONG + ENUM_LONG:
163 case ENUM_UNSIGNED + ENUM_LONG + ENUM_LONG + ENUM_INT:
164 Result = VARIABLE_TYPE_ULONG;
165 break;
166 case ENUM_FLOAT:
167 Result = VARIABLE_TYPE_FLOAT;
168 break;
169 case ENUM_DOUBLE:
170 Result = VARIABLE_TYPE_DOUBLE;
171 break;
172 case ENUM_LONG + ENUM_DOUBLE:
173 Result = VARIABLE_TYPE_LDOUBLE;
174 break;
175 }
176 }
177 return Result;
178}
NULL()
Definition test-case-generator.py:530
PSCRIPT_ENGINE_TOKEN_LIST Push(PSCRIPT_ENGINE_TOKEN_LIST TokenList, PSCRIPT_ENGINE_TOKEN Token)
Adds Token to the last empty position of TokenList.
Definition common.c:441
void RemoveToken(PSCRIPT_ENGINE_TOKEN *Token)
Removes allocated memory of a token.
Definition common.c:116
PSCRIPT_ENGINE_TOKEN Pop(PSCRIPT_ENGINE_TOKEN_LIST TokenList)
Removes last Token of a TokenList and returns it.
Definition common.c:502
struct _SCRIPT_ENGINE_TOKEN * PSCRIPT_ENGINE_TOKEN
@ SCRIPT_VARIABLE_TYPE
Definition common.h:62
unsigned int Pointer
Definition common.h:86
SCRIPT_ENGINE_TOKEN_TYPE Type
Definition common.h:72
char * Value
Definition common.h:73
VARIABLE_TYPE * VARIABLE_TYPE_FLOAT
Definition type.c:30
VARIABLE_TYPE * VARIABLE_TYPE_UCHAR
Definition type.c:25
VARIABLE_TYPE * VARIABLE_TYPE_UNKNOWN
Definition type.c:15
VARIABLE_TYPE * VARIABLE_TYPE_DOUBLE
Definition type.c:31
VARIABLE_TYPE * VARIABLE_TYPE_ULONG
Definition type.c:28
VARIABLE_TYPE * VARIABLE_TYPE_VOID
Definition type.c:17
VARIABLE_TYPE * VARIABLE_TYPE_BOOL
Definition type.c:18
VARIABLE_TYPE * VARIABLE_TYPE_INT
Definition type.c:22
VARIABLE_TYPE * VARIABLE_TYPE_CHAR
Definition type.c:20
VARIABLE_TYPE * VARIABLE_TYPE_UINT
Definition type.c:27
VARIABLE_TYPE * VARIABLE_TYPE_USHORT
Definition type.c:26
VARIABLE_TYPE * VARIABLE_TYPE_LDOUBLE
Definition type.c:32
struct _VARIABLE_TYPE VARIABLE_TYPE

Variable Documentation

◆ VARIABLE_TYPE_BOOL

VARIABLE_TYPE* VARIABLE_TYPE_BOOL = &(VARIABLE_TYPE) {TY_BOOL, 1, 1}
18{TY_BOOL, 1, 1};
@ TY_BOOL
Definition type.h:22

◆ VARIABLE_TYPE_CHAR

VARIABLE_TYPE* VARIABLE_TYPE_CHAR = &(VARIABLE_TYPE) {TY_CHAR, 1, 1}
20{TY_CHAR, 1, 1};
@ TY_CHAR
Definition type.h:23

◆ VARIABLE_TYPE_DOUBLE

VARIABLE_TYPE* VARIABLE_TYPE_DOUBLE = &(VARIABLE_TYPE) {TY_DOUBLE, 8, 8}
31{TY_DOUBLE, 8, 8};
@ TY_DOUBLE
Definition type.h:28

◆ VARIABLE_TYPE_FLOAT

VARIABLE_TYPE* VARIABLE_TYPE_FLOAT = &(VARIABLE_TYPE) {TY_FLOAT, 4, 4}
30{TY_FLOAT, 4, 4};
@ TY_FLOAT
Definition type.h:27

◆ VARIABLE_TYPE_INT

VARIABLE_TYPE* VARIABLE_TYPE_INT = &(VARIABLE_TYPE) {TY_INT, 4, 4}
22{TY_INT, 4, 4};
@ TY_INT
Definition type.h:25

◆ VARIABLE_TYPE_LDOUBLE

VARIABLE_TYPE* VARIABLE_TYPE_LDOUBLE = &(VARIABLE_TYPE) {TY_LDOUBLE, 16, 16}
32{TY_LDOUBLE, 16, 16};
@ TY_LDOUBLE
Definition type.h:29

◆ VARIABLE_TYPE_LONG

VARIABLE_TYPE* VARIABLE_TYPE_LONG = &(VARIABLE_TYPE) {TY_LONG, 8, 8}
23{TY_LONG, 8, 8};
@ TY_LONG
Definition type.h:26

◆ VARIABLE_TYPE_SHORT

VARIABLE_TYPE* VARIABLE_TYPE_SHORT = &(VARIABLE_TYPE) {TY_SHORT, 2, 2}
21{TY_SHORT, 2, 2};
@ TY_SHORT
Definition type.h:24

◆ VARIABLE_TYPE_UCHAR

VARIABLE_TYPE* VARIABLE_TYPE_UCHAR = &(VARIABLE_TYPE) {TY_CHAR, 1, 1, TRUE}
25{TY_CHAR, 1, 1, TRUE};
#define TRUE
Definition BasicTypes.h:114

◆ VARIABLE_TYPE_UINT

VARIABLE_TYPE* VARIABLE_TYPE_UINT = &(VARIABLE_TYPE) {TY_INT, 4, 4, TRUE}
27{TY_INT, 4, 4, TRUE};

◆ VARIABLE_TYPE_ULONG

VARIABLE_TYPE* VARIABLE_TYPE_ULONG = &(VARIABLE_TYPE) {TY_LONG, 8, 8, TRUE}
28{TY_LONG, 8, 8, TRUE};

◆ VARIABLE_TYPE_UNKNOWN

VARIABLE_TYPE* VARIABLE_TYPE_UNKNOWN = &(VARIABLE_TYPE) {TY_UNKNOWN}
@ TY_UNKNOWN
Definition type.h:20

◆ VARIABLE_TYPE_USHORT

VARIABLE_TYPE* VARIABLE_TYPE_USHORT = &(VARIABLE_TYPE) {TY_SHORT, 2, 2, TRUE}
26{TY_SHORT, 2, 2, TRUE};

◆ VARIABLE_TYPE_VOID

VARIABLE_TYPE* VARIABLE_TYPE_VOID = &(VARIABLE_TYPE) {TY_VOID, 1, 1}
17{TY_VOID, 1, 1};
@ TY_VOID
Definition type.h:21