Skip to content

Instantly share code, notes, and snippets.

@H4niz
Created March 23, 2018 05:05
Show Gist options
  • Save H4niz/5b19f09d3ec6107394481c8b82063241 to your computer and use it in GitHub Desktop.
Save H4niz/5b19f09d3ec6107394481c8b82063241 to your computer and use it in GitHub Desktop.
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