void main() { stack s; char p; int op1,op2,value; initial(&s); printf("Enter an expression"); while(p=getchar()!='\n') { if(checkdigit(p)) { push(&s,p-48); } else { op2=pop(&s); op1=pop(&s); value=operation(p,op1,op2); push(&s,value); } } value=pop(&s); printf("Answer is %d",value); }
U1 getvarstr_comp (U1 *argstr, S2 pos_start) { S2 pos, pos_end, endvn, dimstart, dimend; S4 varind, dims; U1 pstr[MAXLINELEN + 1], comm[2], dimensstr[MAXLINELEN + 1], private_var = NORMAL_VAR; U1 ok = FALSE; U1 varname[MAXLINELEN + 1]; U1 buf[MAXLINELEN + 1]; comm[0] = AROPEN_SB; comm[1] = BINUL; /* bugfix */ pos_start = 0; pos_end = strlen (argstr) - 1; endvn = searchstr (argstr, comm, pos_start, pos_end, TRUE); if (endvn != -1) { if (argstr[0] != '_') { partstr (argstr, varname, pos_start, endvn - 1); strcat (varname, AT_SB); strcat (varname, function[function_ind].name); partstr (argstr, buf, endvn, pos_end); strcat (varname, buf); } else { partstr (argstr, varname, pos_start, pos_end); } } else { if (argstr[0] != '_') { strcpy (varname, argstr); strcat (varname, AT_SB); strcat (varname, function[function_ind].name); } else { /* global variable starting with "_": exp: _foobar */ strcpy (varname, argstr); } } t_var.dims = NODIMS; pos_end = strlen (varname) - 1; if (varname[0] == PRIVATE_VAR_SB) { /* use pvarlist for dimens */ private_var = PRIVATE_VAR; #if DEBUG printf ("getvarstr: PRIVATE_VAR SET\n"); #endif } partstr (varname, pstr, pos_start, pos_end); #if DEBUG printf ("getvarstr: argstr: '%s'\n", varname); #endif /* bugfix */ pos_start = 0; pos_end = strlen (pstr) - 1; endvn = searchstr (pstr, comm, pos_start, pos_end, TRUE); if (endvn != -1) { /* area variable, exp. a[5][x] */ dimstart = endvn; endvn--; dims = NODIMS; while (! ok) { comm[0] = ARCLOSE_SB; comm[1] = BINUL; dimend = searchstr (pstr, comm, dimstart + 1, pos_end, TRUE); if (dimend != -1) { if (dims < MAXDIMENS - 1) { dims++; } else { printerr (OVERFLOW_IND, plist_ind, ST_PRE, t_var.varname); return (FALSE); } /* getstr (U1 *str, U1 *retstr, S2 maxlen, S2 start, S2 end) */ if (private_var == NORMAL_VAR) { getstr (pstr, dimensstr, MAXLINELEN, dimstart + 1, dimend - 1); if (checkdigit (dimensstr) == TRUE) { if (! make_val (INT_VAR, varlist, NORMAL_VAR)) { printerr (MEMORY, plist_ind, ST_PRE, t_var.varname); return (FALSE); } t_var.dimens[dims] = t_var.varlist_ind; } else { /* variable, */ /* check if already defined */ varind = getvarind_comp (dimensstr); if (varind != -1) { if (varlist[varind].type != STRING_VAR && varlist[varind].type != BYTE_VAR) { t_var.dimens[dims] = varind; } else { /* error: its a string or byte var */ printerr (WRONG_VARTYPE, plist_ind, ST_PRE, dimensstr); return (FALSE); } } else { printerr (NOTDEF_VAR, plist_ind, ST_PRE, dimensstr); return (FALSE); } } } else { /* private variable */ #if DEBUG printf ("getvarstr: PRIVATE VAR!"); #endif getstr (pstr, dimensstr, MAXLINELEN, dimstart + 1, dimend - 1); if (checkdigit (dimensstr) == TRUE) { if (! make_val (INT_VAR, pvarlist_obj, PRIVATE_VAR)) { printerr (MEMORY, plist_ind, ST_PRE, t_var.varname); return (FALSE); } t_var.dimens[dims] = t_var.varlist_ind; #if DEBUG printf ("getvarstr: PRIVATE VAR: %li", t_var.varlist_ind); #endif } else { /* variable, */ /* check if already defined */ varind = getvarind_comp (dimensstr); if (varind != -1) { if (pvarlist_obj[varind].type != STRING_VAR && pvarlist_obj[varind].type != BYTE_VAR) { t_var.dimens[dims] = varind; } else { /* error: its a string or byte var */ printerr (WRONG_VARTYPE, plist_ind, ST_PRE, dimensstr); return (FALSE); } } else { printerr (NOTDEF_VAR, plist_ind, ST_PRE, dimensstr); return (FALSE); } } } } else { /* no ] */ printerr (BRNOT_OK, plist_ind, ST_PRE, ""); return (FALSE); } comm[0] = AROPEN_SB; comm[1] = BINUL; if (dimend < pos_end) { pos = searchstr (pstr, comm, dimend + 1, pos_end, TRUE); if (pos != -1) { dimstart = pos; } else { ok = TRUE; } } else { ok = TRUE; } } getstr (pstr, t_var.varname, MAXVARNAME, pos_start, endvn); t_var.dims = dims; #if DEBUG printf ("getvarstr: dims = %li\n", dims); #endif } else { getstr (pstr, t_var.varname, MAXVARNAME, pos_start, pos_end); } return (TRUE); }