#include "Includes.h"// Inclus les fichiers... #pragma comment(lib,"psapi.lib") /* Fonctions Exp développés par DarkBatcher pour DOS 9. http://dos9.franceserv.fr/ */ int ExpressionLoad(LPEXPSTART lpesStart, char* ptrExpression, char mode) { LPEXPRESSION lpeCurrent=NULL; char *ptrCurrent=ptrExpression, cLastOpp=LASTOPERATION_OPERATOR, cOpperation=0; unsigned int iPriorite=0, iHigherPriorite=0; double dNumber=0.0, dMultiplicateur=1; lpeCurrent=(LPEXPRESSION)malloc(sizeof(EXPRESSION)); if (lpeCurrent==NULL) return 1; lpesStart->lpeStart=lpeCurrent; lpeCurrent->lpeNext=NULL; while (1) { switch (*ptrCurrent) { case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (cLastOpp & (LASTOPERATION_CLOSINGPARENT)) return 1; if (dMultiplicateur>=1) dNumber*=10; dNumber+=(*ptrCurrent & MASQUE_NUMBERS) * dMultiplicateur; if (dMultiplicateur<1) dMultiplicateur/=10; cLastOpp=LASTOPERATION_DIGIT; break; case '0': if (cLastOpp & (LASTOPERATION_CLOSINGPARENT)) return 1; if (dMultiplicateur<1) dMultiplicateur/=10; else dNumber*=10; cLastOpp=LASTOPERATION_DIGIT; break; case '.': if (dMultiplicateur<1) return 1; dMultiplicateur=0.1; break; case '+': case '-': case '*': case '/': case '%': if (cLastOpp & (LASTOPERATION_OPERATOR | LASTOPERATION_OPENINGPARENT)) return 1; cLastOpp=LASTOPERATION_OPERATOR; cOpperation=*ptrCurrent; dMultiplicateur=1.0; break; case '(': if (cLastOpp & (LASTOPERATION_DIGIT | LASTOPERATION_CLOSINGPARENT)) return 1; iPriorite+=2; cLastOpp=LASTOPERATION_OPENINGPARENT; break; case ')': if (cLastOpp & (LASTOPERATION_OPERATOR | LASTOPERATION_OPENINGPARENT)) return 1; iPriorite-=2; cLastOpp=LASTOPERATION_CLOSINGPARENT; break; case '\0': if (cLastOpp & (LASTOPERATION_OPERATOR | LASTOPERATION_OPENINGPARENT)) return 1; cLastOpp=LASTOPERATION_NULL_CHAR; break; } if (cLastOpp==LASTOPERATION_OPERATOR) { if (mode==EXPRESSION_INTEGERS) lpeCurrent->iValue=(int)dNumber; /* choix du mode */ else lpeCurrent->dValue=dNumber; lpeCurrent->cOpperation=cOpperation; if (cOpperation=='/' || cOpperation=='*' || cOpperation=='%') /* s'il s'agit d'une opération prioritaire */ { lpeCurrent->iPriorite=iPriorite+1; if (iHigherPriorite<(iPriorite+1)) iHigherPriorite=iPriorite+1; } else /* sinon */ { lpeCurrent->iPriorite=iPriorite; if (iHigherPrioritelpeNext=(LPEXPRESSION)malloc(sizeof(EXPRESSION)); if (lpeCurrent->lpeNext==NULL) { return 1; /* allocation de l'élément suivant */ } lpeCurrent=lpeCurrent->lpeNext; lpeCurrent->lpeNext=NULL; dNumber=0.0; dMultiplicateur=1; } if (cLastOpp==LASTOPERATION_NULL_CHAR) { if (mode==EXPRESSION_INTEGERS) lpeCurrent->iValue=(int)dNumber; /* choix du mode */ else lpeCurrent->dValue=dNumber; lpeCurrent->cOpperation='\0'; if (cOpperation=='/' || cOpperation=='*' || cOpperation=='%') /* s'il s'agit d'une opération prioritaire */ { lpeCurrent->iPriorite=iPriorite+1; if (iHigherPriorite<(iPriorite+1)) iHigherPriorite=iPriorite+1; } else /* sinon */ { lpeCurrent->iPriorite=iPriorite; if (iHigherPrioriteiHigherPriorite=iHigherPriorite; return 0; } ptrCurrent++; } } int ExpressionCalculate(LPEXPSTART lpesExpression, char mode, double* ptrdResult, int* ptriResult) { LPEXPRESSION lpeElement=NULL; LPEXPRESSION lpeTemp=NULL; lpeElement=lpesExpression->lpeStart; while (1) { lpeElement=lpesExpression->lpeStart; if (lpeElement->cOpperation=='\0') { if (mode==EXPRESSION_INTEGERS) *ptriResult=lpeElement->iValue; else *ptrdResult=lpeElement->dValue; free(lpeElement); return 0; } while (lpeElement!=NULL) { if (lpeElement->iPriorite==lpesExpression->iHigherPriorite) { if (mode==EXPRESSION_INTEGERS) { switch (lpeElement->cOpperation) { case '*': lpeElement->iValue=lpeElement->iValue*lpeElement->lpeNext->iValue; break; case '/': lpeElement->iValue=lpeElement->iValue/lpeElement->lpeNext->iValue; break; case '%': lpeElement->iValue=lpeElement->iValue%lpeElement->lpeNext->iValue; break; case '+': lpeElement->iValue=lpeElement->iValue+lpeElement->lpeNext->iValue; break; case '-': lpeElement->iValue=lpeElement->iValue-lpeElement->lpeNext->iValue; break; case '\0': break; default : return 1; } } else { switch (lpeElement->cOpperation) { case '*': lpeElement->dValue=lpeElement->dValue*lpeElement->lpeNext->dValue; break; case '/': lpeElement->dValue=lpeElement->dValue/lpeElement->lpeNext->dValue; break; case '%': lpeElement->dValue=fmod(lpeElement->dValue,lpeElement->lpeNext->dValue); break; case '+': lpeElement->dValue=lpeElement->dValue+lpeElement->lpeNext->dValue; break; case '-': lpeElement->dValue=lpeElement->dValue-lpeElement->lpeNext->dValue; break; case '\0': break; default : return 1; } } if(lpeElement->cOpperation=='\0') lpeElement=lpeElement->lpeNext; else { lpeTemp=lpeElement->lpeNext; lpeElement->lpeNext=lpeTemp->lpeNext; lpeElement->cOpperation=lpeTemp->cOpperation; lpeElement->iPriorite=lpeTemp->iPriorite; free(lpeTemp); } } else lpeElement=lpeElement->lpeNext; } lpesExpression->iHigherPriorite--; } } int ExpressionDelete(LPEXPSTART lpesExpression) { LPEXPRESSION lpeElement=NULL; LPEXPRESSION lpeTemp=NULL; lpeElement=lpesExpression->lpeStart; while (lpeElement!=NULL) { lpeTemp=lpeElement; lpeElement=lpeElement->lpeNext; free(lpeTemp); } return 0; }