23{
25
26 switch (*c)
27 {
28 case '"':
29 do
30 {
32
33 if (*c == '\\')
34 {
36 if (*c == 'n')
37 {
39 continue;
40 }
41 if (*c == '\\')
42 {
44 continue;
45 }
46 else if (*c == 't')
47 {
49 continue;
50 }
51 else if (*c == 'x')
52 {
53 char ByteString[] = "000";
54 INT Len = (
INT)strlen(ByteString);
55 int i = 0;
56 for (; i < Len; i++)
57 {
60 break;
61
63 ByteString[Len - 1] = *c;
64 }
65
66 if (i == 0 || i == 3)
67 {
70 return Token;
71 }
72 else
73 {
77 }
78 }
79 else if (*c == '"')
80 {
82 continue;
83 }
84 else
85 {
88 return Token;
89 }
90 }
91 else if (*c == '"')
92 {
93 break;
94 }
95 else
96 {
98 }
99 } while (1);
100
104 return Token;
105 case '~':
106 strcpy(Token->
Value,
"~");
109 return Token;
110
111 case '+':
113 if (*c == '+')
114 {
115 strcpy(Token->
Value,
"++");
118 return Token;
119 }
120 else if (*c == '=')
121 {
122 strcpy(Token->
Value,
"+=");
125 return Token;
126 }
127 else
128 {
129 strcpy(Token->
Value,
"+");
131 return Token;
132 }
133 case '-':
135 if (*c == '-')
136 {
137 strcpy(Token->
Value,
"--");
140 return Token;
141 }
142 else if (*c == '=')
143 {
144 strcpy(Token->
Value,
"-=");
147 return Token;
148 }
149 else
150 {
151 strcpy(Token->
Value,
"-");
153 return Token;
154 }
155 case '*':
157 if (*c == '=')
158 {
159 strcpy(Token->
Value,
"*=");
162 return Token;
163 }
164 else
165 {
166 strcpy(Token->
Value,
"*");
168 return Token;
169 }
170 case '>':
172 if (*c == '>')
173 {
175 if (*c == '=')
176 {
177 strcpy(Token->
Value,
">>=");
180 return Token;
181 }
182 else
183 {
184 strcpy(Token->
Value,
">>");
186 return Token;
187 }
188 }
189 else if (*c == '=')
190 {
191 strcpy(Token->
Value,
">=");
194 return Token;
195 }
196 else
197 {
198 strcpy(Token->
Value,
">");
200 return Token;
201 }
202 case '<':
204 if (*c == '<')
205 {
207 if (*c == '=')
208 {
209 strcpy(Token->
Value,
"<<=");
212 return Token;
213 }
214 else
215 {
216 strcpy(Token->
Value,
"<<");
218 return Token;
219 }
220 }
221 else if (*c == '=')
222 {
223 strcpy(Token->
Value,
"<=");
226 return Token;
227 }
228 else
229 {
230 strcpy(Token->
Value,
"<");
232 return Token;
233 }
234 case '/':
236 if (*c == '=')
237 {
238 strcpy(Token->
Value,
"/=");
241
242 return Token;
243 }
244 else if (*c == '/')
245 {
246 do
247 {
249 } while (*c != '\n' && (int)*c != EOF);
250
253 return Token;
254 }
255 else if (*c == '*')
256 {
257 do
258 {
260 if (*c == '*')
261 {
263 if (*c == '/')
264 {
267 return Token;
268 }
269 }
270 if ((int)*c == EOF)
271 break;
272 } while (1);
273
276 return Token;
277 }
278 else
279 {
280 strcpy(Token->
Value,
"/");
282 return Token;
283 }
284
285 case '=':
287 if (*c == '=')
288 {
289 strcpy(Token->
Value,
"==");
292 return Token;
293 }
294 else
295 {
296 strcpy(Token->
Value,
"=");
298 return Token;
299 }
300 case '!':
302 if (*c == '=')
303 {
304 strcpy(Token->
Value,
"!=");
307 return Token;
308 }
309 else
310 {
311 strcpy(Token->
Value,
"!");
313 return Token;
314 }
315 case '%':
317 if (*c == '=')
318 {
319 strcpy(Token->
Value,
"%=");
322 return Token;
323 }
324 else
325 {
326 strcpy(Token->
Value,
"%");
328 }
329 return Token;
330
331 case ',':
332 strcpy(Token->
Value,
",");
335 return Token;
336
337 case ';':
338 strcpy(Token->
Value,
";");
341 return Token;
342
343 case ':':
344 strcpy(Token->
Value,
":");
347 return Token;
348
349 case '(':
350 strcpy(Token->
Value,
"(");
353 return Token;
354 case ')':
355 strcpy(Token->
Value,
")");
358 return Token;
359 case '{':
360 strcpy(Token->
Value,
"{");
363 return Token;
364 case '}':
365 strcpy(Token->
Value,
"}");
368 return Token;
369 case '[':
370 strcpy(Token->
Value,
"[");
373 return Token;
374 case ']':
375 strcpy(Token->
Value,
"]");
378 return Token;
379 case '|':
381 if (*c == '|')
382 {
383 strcpy(Token->
Value,
"||");
386 return Token;
387 }
388 else if (*c == '=')
389 {
390 strcpy(Token->
Value,
"|=");
393 return Token;
394 }
395 else
396 {
397 strcpy(Token->
Value,
"|");
399 return Token;
400 }
401 case '&':
403 if (*c == '&')
404 {
405 strcpy(Token->
Value,
"&&");
408 return Token;
409 }
410 else if (*c == '=')
411 {
412 strcpy(Token->
Value,
"&=");
415 return Token;
416 }
417 else
418 {
419 strcpy(Token->
Value,
"&");
421 return Token;
422 }
423
424 case '^':
426 if (*c == '=')
427 {
428 strcpy(Token->
Value,
"^=");
431 return Token;
432 }
433 else
434 {
435 strcpy(Token->
Value,
"^");
437 }
438 return Token;
439 case '@':
442 {
444 {
447 }
449 {
451 }
452 else
453 {
455 }
456 return Token;
457 }
458
459 case '$':
462 {
463
464
465
467 {
470 }
472 {
474 }
475 else
476 {
478 }
479
480 return Token;
481 }
482
483 case '.':
487 {
488 do
489 {
492 }
while (
IsLetter(*c) ||
IsHex(*c) || (*c ==
'_') || (*c ==
'!'));
493
496 UINT64 Address = 0;
497
498 if (HasBang)
499 {
501 }
502
503 if (WasFound)
504 {
506 char HexStr[20] = {0};
507 sprintf(HexStr, "%llx", Address);
509 }
510 else
511 {
512 if (HasBang)
513 {
515 return Token;
516 }
517 else
518 {
520 {
523 }
524 else
525 {
527 }
528 }
529 }
530 }
531 else
532 {
534 return Token;
535 }
536 return Token;
537
538 case '#':
539 do
540 {
541 if (*c != '`')
544 }
while (
IsLetter(*c) ||
IsHex(*c) || (*c ==
'_') || (*c ==
'!'));
546 {
548 }
549 else
550 {
552 }
553 return Token;
554
555 case ' ':
556 case '\t':
557 strcpy(Token->
Value,
"");
560 return Token;
561 case '\n':
562 strcpy(Token->
Value,
"\n");
565 return Token;
566
567 case '0':
569 if (*c == 'x')
570 {
572 while (
IsHex(*c) || *c ==
'`')
573 {
574 if (*c != '`')
577 }
579 return Token;
580 }
581 else if (*c == 'o')
582 {
584 while (
IsOctal(*c) || *c ==
'`')
585 {
586 if (*c != '`')
589 }
591 return Token;
592 }
593 else if (*c == 'n')
594 {
597 {
598 if (*c != '`')
601 }
603 return Token;
604 }
605 else if (*c == 'y')
606 {
609 {
610 if (*c != '`')
613 }
615 return Token;
616 }
617
619 {
620 do
621 {
622 if (*c != '`')
625 }
while (
IsHex(*c) || *c ==
'`');
627 return Token;
628 }
629 else
630 {
631 strcpy(Token->
Value,
"0");
633 return Token;
634 }
635
636 case 'L':
638 {
640 do
641 {
643
644 if (*c == '\\')
645 {
647 if (*c == 'n')
648 {
650 continue;
651 }
652 if (*c == '\\')
653 {
655 continue;
656 }
657 else if (*c == 't')
658 {
660 continue;
661 }
662 else if (*c == 'x')
663 {
664 char ByteString[] = "00000";
665 INT Len = (
INT)strlen(ByteString);
666 int i = 0;
667 for (; i < Len; i++)
668 {
671 break;
672
674 ByteString[Len - 1] = *c;
675 }
676
677 if (i == 0 || i == 5)
678 {
681 return Token;
682 }
683 else
684 {
686 WCHAR
Num = (WCHAR)strtol(ByteString, NULL, 16);
688 }
689 }
690 else if (*c == '"')
691 {
693 continue;
694 }
695 else
696 {
699 return Token;
700 }
701 }
702 else if (*c == '"')
703 {
704 break;
705 }
706 else
707 {
709 }
710 } while (1);
711
715 return Token;
716 }
717
718 default:
719 if (*c >= '0' && *c <= '9')
720 {
721 do
722 {
723 if (*c != '`')
726 }
while (
IsHex(*c) || *c ==
'`');
728 return Token;
729 }
730 else if ((*c >= 'a' && *c <= 'f') || (*c >= 'A' && *c <= 'F') || (*c == '_') || (*c == '!'))
731 {
733 do
734 {
735 if (*c != '`')
737
739 if (
IsHex(*c) || *c ==
'`' || *c ==
'_')
740 {
741
742 }
743 else if ((*c >= 'G' && *c <= 'Z') || (*c >= 'g' && *c <= 'z'))
744 {
745 NotHex = 1;
746 break;
747 }
748 else
749 {
750 break;
751 }
752 } while (1);
753 if (NotHex)
754 {
755 do
756 {
757 if (*c != '`')
760 }
while (
IsLetter(*c) ||
IsHex(*c) || (*c ==
'_') || (*c ==
'!'));
762 {
764 }
766 {
768 }
770 {
772 }
773 else
774 {
777 UINT64 Address = 0;
778
779 if (HasBang)
780 {
782 }
783
784 if (WasFound)
785 {
787 char str[20] = {0};
788 sprintf(str, "%llx", Address);
790 }
791 else
792 {
793 if (HasBang)
794 {
796 return Token;
797 }
798 else
799 {
801 {
803 }
805 {
807 }
809 {
812 }
813 else
814 {
816 }
817 }
818 }
819 }
820 return Token;
821 }
822 else
823 {
825 {
827 }
829 {
831 }
833 {
835 }
837 {
840 UINT64 Address = 0;
841
842 if (HasBang)
843 {
845 }
846
847 if (WasFound)
848 {
850 char HexStr[20] = {0};
851 sprintf(HexStr, "%llx", Address);
853 }
854 else
855 {
856 if (HasBang)
857 {
859 return Token;
860 }
861 else
862 {
864 {
866 }
868 {
870 }
872 {
875 }
876 else
877 {
879 }
881 }
882 }
883 }
884 else
885 {
887 }
888 return Token;
889 }
890 }
891 else if ((*c >= 'G' && *c <= 'Z') || (*c >= 'g' && *c <= 'z') || (*c == '_') || (*c == '!'))
892 {
893 do
894 {
895 if (*c != '`')
898 }
while (
IsLetter(*c) ||
IsHex(*c) || (*c ==
'_') || (*c ==
'!'));
900 {
902 }
904 {
906 }
908 {
910 }
911 else
912 {
915 UINT64 Address = 0;
916
917 if (HasBang)
918 {
920 }
921
922 if (WasFound)
923 {
925 char HexStr[20] = {0};
926 sprintf(HexStr, "%llx", Address);
928 }
929 else
930 {
931 if (HasBang)
932 {
934 return Token;
935 }
936 else
937 {
939 {
941 }
943 {
945 }
947 {
950 }
951 else
952 {
954 }
955 }
956 }
957 }
958 return Token;
959 }
960
963 return Token;
964 }
965 return Token;
966}
IMPORT_EXPORT_HYPERDBG_SCRIPT_ENGINE UINT64 ScriptEngineConvertNameToAddress(const CHAR *FunctionOrVariableName, PBOOLEAN WasFound)
Converts name to address.
Definition script-engine.c:69
@ Num
Definition commands.h:167
unsigned int InputIdx
number of read characters from input
Definition globals.c:18
char IsVariableType(char *str)
Check if string is variable type or not.
Definition scanner.c:1107
char IsId(char *str)
Check if string is Id or not.
Definition scanner.c:1127
char IsRegister(char *str)
Check if string is register or not.
Definition scanner.c:1093
char IsKeyword(char *str)
Check whether a string is a keyword or not.
Definition scanner.c:1064
char sgetc(char *str)
Returns the next character in the input string.
Definition scanner.c:1042
char IsUnderscore(char c)
Checks whether input char is underscore (_) or not.
Definition common.c:606
char IsLetter(char c)
Checks whether input char belongs to alphabet set or not.
Definition common.c:589
void RotateLeftStringOnce(char *str)
Rotate a character array to the left by one time.
Definition common.c:1536
void RemoveToken(PSCRIPT_ENGINE_TOKEN *Token)
Removes allocated memory of a token.
Definition common.c:116
PSCRIPT_ENGINE_TOKEN NewToken(SCRIPT_ENGINE_TOKEN_TYPE Type, char *Value)
Allocates a new token with given type and value.
Definition common.c:69
char IsOctal(char c)
Checks whether input char belongs to octal digit-set or not.
Definition common.c:640
void AppendByte(PSCRIPT_ENGINE_TOKEN Token, char c)
Appends char to the token value.
Definition common.c:243
void AppendWchar(PSCRIPT_ENGINE_TOKEN Token, wchar_t c)
Appends wchar_t to the token value.
Definition common.c:285
char IsBinary(char c)
Checks whether input char belongs to binary digit-set or not.
Definition common.c:623
PSCRIPT_ENGINE_TOKEN NewUnknownToken()
Allocates a new token.
Definition common.c:20
char IsDecimal(char c)
Checks whether input char belongs to decimal digit-set or not.
Definition common.c:574
char IsHex(char c)
Checks whether input char belongs to hexadecimal digit-set or not.
Definition common.c:559
PUSER_DEFINED_FUNCTION_NODE GetUserDefinedFunctionNode(PSCRIPT_ENGINE_TOKEN Token)
Definition script-engine.c:4549
VARIABLE_TYPE * GetLocalIdentifierVariableType(PSCRIPT_ENGINE_TOKEN Token)
Definition script-engine.c:4493
unsigned long long int RegisterToInt(char *str)
Converts register string to integer.
Definition script-engine.c:4112
int GetGlobalIdentifierVal(PSCRIPT_ENGINE_TOKEN Token)
Returns the integer assigned to global variable.
Definition script-engine.c:4362
int GetLocalIdentifierVal(PSCRIPT_ENGINE_TOKEN Token)
Returns the integer assigned to local variable.
Definition script-engine.c:4383
VARIABLE_TYPE * GetGlobalIdentifierVariableType(PSCRIPT_ENGINE_TOKEN Token)
Definition script-engine.c:4436
unsigned long long int PseudoRegToInt(char *str)
Converts pseudo register string to integer.
Definition script-engine.c:4213
int GetFunctionParameterIdentifier(PSCRIPT_ENGINE_TOKEN Token)
Definition script-engine.c:4528
unsigned int Len
Definition common.h:74
SCRIPT_ENGINE_TOKEN_TYPE Type
Definition common.h:72
char * Value
Definition common.h:73
VARIABLE_TYPE * VariableType
Definition common.h:76