int TSolver::checkexpr() {int i,j; int SL=strlen(S); if (SL==1) if (!(isconst(S[0])||isnumc(S[0])) ) {seterr(E_EXPR); return 0; } else return 1; if (!(isnumc(S[SL-1])||S[SL-1]==')'||S[SL-1]==']'||isconst(S[SL-1]))) {seterr(E_EXPR); return 0; } #define ib(x) (i>0?(x):1) for (i=0;i<SL-1;i++) {if (isfn(S[i])||isconst(S[i])||issymbevul(S[i])||S[i]=='('||S[i]=='[') if(!( ( isfn(S[i]) && (S[i+1]=='(') )|| ( i>0?S[i]=='(' && isfn(S[i-1]):1 )|| ( isconst(S[i]) && (issymbevul(S[i+1])||S[i+1]==')'||S[i+1]==']') )|| ( ((issymbevul(S[i])||S[i]=='('||S[i]=='[')&&(isnumc(S[i+1])||S[i+1]=='-'||S[i+1]=='_'||isstrevul(S[i+1])||S[i+1]=='('||S[i+1]=='[')) ) ) ) {seterr(E_EXPR); return 0; } } return 1; }
void MoveSelectionUp(char *pText, long *nCharIndex, int isfn(int)) { while (((*nCharIndex) < SB_NUM_COLS) && (isfn(pText[(*nCharIndex)]))) { (*nCharIndex)++; } }
void MoveSelectionDown(char *pText, long *nCharIndex, int isfn(int)) { while (((*nCharIndex) > 0) && (isfn(pText[(*nCharIndex) - 1]))) { (*nCharIndex)--; } }
int prior(const char f) //gives priority of function {if (isfn(f)) return 0; switch (f) {case '(': case '[': return 0; case ']': case ')': return 1; case f_op_root: case f_op_pow: case '^': return 2; case '*': case '/': return 3; case '+': case '-': return 4; case '_': return 5; case ',': return 6; default: return -1; } }
int argcnt(const char c) //count of arguments {if (isconst(c)) return 0; if (isfn(c) && c!=fpow && c!=f_op_pow && c!=f_op_root && c!=froot && c!=flogn || c=='!' || c=='_') return 1; return 2; }
char* TSolver::convtopol() //converts symbol-function string to polish record {if (S==NULL || !strlen(S)) seterr(E_VOID); char* r; if (Err!=E_NO) {ERROR: if (r!=NULL) free(r); free(S); return S=NULL; } int i,j=0; int p; int SL=strlen(S); r=(char*)calloc(SL*2+2,sizeof(char)); r[0]='\0'; cst_clear; for (i=0;S[i]!='\0';i++) {if (isnumc(S[i]) || isconst(S[i]) || (S[i]=='-' && (minusE || minusN))) {r[j++]=S[i]; continue; } if (S[i]=='!') {addspc(); r[j++]=S[i]; addspc(); continue; } p=prior(S[i]); {if (S[i]==')') {addspc(); while ((!cst_free) && cst_end!='(') {r[j++]=cpop(); r[j++]=' '; } cpop(); if ((!cst_free) && isfn(cst_end)) {r[j++]=cpop(); r[j++]=' '; } continue; } if (S[i]==']') {addspc(); while ((!cst_free) && cst_end!='[') {r[j++]=cpop(); r[j++]=' '; } cpop(); r[j++]=f_abs; r[j++]=' '; continue; } if ((((!cst_free) && (p>=prior(cst_end)) && (prior(cst_end)>0)&&cst_end!='_'&&S[i]!='_') || S[i]==',')) {addspc(); while ((!cst_free) && p>=prior(cst_end) && prior(cst_end)>0) {r[j++]=cpop(); r[j++]=' '; } if (S[i]==',') continue; } cpush(S[i]); if (j>0) addspc(); } } if (Err!=E_NO) goto ERROR; if (r[j-1]!=' ') r[j++]=' '; while (!cst_free) {r[j++]=cpop(); r[j++]=' '; } if (r[j-1]!=' ') r[j++]=' '; r[j]='\0'; free(S); S=strdbl(r); free(r); #ifdef debug printf("%s\n",S); #endif poled=1; return S; }