Created
March 23, 2018 05:05
-
-
Save H4niz/5b19f09d3ec6107394481c8b82063241 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
int parse_arg( int *refArrayofElement, int Pool) { | |
char *ArrayofElement, PrevElement; | |
int CountElement, sizeOfElement, Element; | |
*ArrayofElement = &refArrayofElement; | |
NextElement = *ArrayofElement; | |
_bzero( ListofSign, 0x64 ); //Fill ListofSign by Zero | |
while( ArrayofElement[CountElement] != NULL ) { | |
CountElement = 0; | |
if( (ArrayofElement[CountElement] - 0x30) < 9 ) { // is it number? | |
sizeOfElement = (*ArrayofElement + CountElement) - *NextElement; //sizeof(ArrayofElement[CountElement]); | |
Element = malloc(sizeOfElement); | |
memcpy( Element, NextElement, sizeOfElement ); | |
if( !strcmp( Element, 0x30 ) ) { | |
isNumber = atoi( Element ); | |
if( isNumber <= 0 && ArrayofElement[CountElement+1] - 0x30 > 0x9) { | |
puts( "expression error!\n" ); | |
fflush( stdout ); | |
} | |
else { | |
NextElement = ArrayofElement[CountElement+1]; | |
Pool.value[Pool.number+1] = isNumber; | |
/* | |
.text:0804914A mov eax, [eax] | |
.text:0804914C lea ecx, [eax+1] ->Pool.number+1 | |
.text:0804914F mov edx, [ebp+Pool] | |
.text:08049155 mov [edx], ecx ->Pool.number = Pool.number+1 | |
.text:08049157 mov edx, [ebp+Pool] | |
.text:0804915D mov ecx, [ebp+isNumber] | |
.text:08049160 mov [edx+eax*4+4], ecx ->Pool.value[Pool.number] = isNumber | |
*/ | |
NextElement = ArrayofElement[CountElement+1]; | |
if ( ListofSign[NumberSign] != 0 ) { | |
if ( (ArrayofElement[CountElement]-0x25) <= 0x0A ) { | |
/* 045 37 25 % -> dd offset isMultiple | |
046 38 26 & -> dd offset Default | |
047 39 27 ' -> dd offset Default | |
050 40 28 ( -> dd offset Default | |
051 41 29 ) -> dd offset Default | |
052 42 2A * -> dd offset isMultiple | |
053 43 2B + -> dd offset isPlus/Sub | |
054 44 2C , -> dd offset Default | |
055 45 2D - -> dd offset isPlus/Sub | |
056 46 2E . -> dd offset Default | |
057 47 2F / -> dd offset isMultiple | |
*/ | |
switch( SignJumpTable[(ArrayofElement[CountElement]-0x25)] ) { | |
/* SignJumpTable { | |
isDigit, | |
isSign, | |
Default | |
} | |
*/ | |
case 'isMultiple': if( ListofSign[NumberSign] == '+' || ListofSign[NumberSign] == '-' ) { | |
NumberSign+=1; | |
ListofSign[NumberSign] = ArrayofElement[CountElement]; | |
/* | |
* If last operation in ListofSign array is "+"" || "-"" and current operation is "*" || "/" || "%" | |
* then add it into ListofSign *Remember that this program calculate with reverse Sign array* | |
*/ | |
} | |
else { | |
eval( ListofSign[NumberSign], Pool ); | |
ListofSign[NumberSign] = ArrayofElement[CountElement]; | |
} | |
case 'isPlus/Sub': eval( Pool[NumberSign], Pool ); | |
ListofSign[NumberSign] = ArrayofElement[CountElement]; | |
default: eval(ListofSign[NumberSign], Pool); | |
NumberSign--; | |
} | |
} | |
else { | |
ListofSign[NumberSign] = ArrayofElement[CountElement]; | |
} | |
while(ArrayofElement[CountElement] != 0 && NumberSign >= 0) { | |
eval(ListofSign[NumberSign], Pool); | |
NumberSign--; | |
} | |
} | |
ListofSign[NumberSign] = ArrayofElement[CountElement]; | |
} | |
} | |
else { | |
puts( "prevent division by zero\n"); | |
fflush( stdout ); | |
} | |
} | |
CountElement++; | |
} | |
while( NumberSign > 0 ) { | |
eval( ListofSign[NumberSign], Pool ); | |
NumberSign--; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment