/* * Call specified function */ void ffcall(symbol *sym,const char *label,int numargs) { char symname[2*sNAMEMAX+16]; char aliasname[sNAMEMAX+1]; assert(sym!=NULL); assert(sym->ident==iFUNCTN); if (sc_asmfile) funcdisplayname(symname,sym->name); if ((sym->usage & uNATIVE)!=0) { /* reserve a SYSREQ id if called for the first time */ assert(label==NULL); stgwrite("\tsysreq.n "); if (sc_status==statWRITE && (sym->usage & uREAD)==0 && sym->addr>=0) sym->addr=ntv_funcid++; /* Look for an alias */ if (lookup_alias(aliasname, sym->name)) { symbol *asym = findglb(aliasname, sGLOBAL); if (asym && asym->ident==iFUNCTN && ((sym->usage & uNATIVE) != 0)) { sym = asym; if (sc_status==statWRITE && (sym->usage & uREAD)==0 && sym->addr>=0) { sym->addr=ntv_funcid++; markusage(sym, uREAD); } } } outval(sym->addr,FALSE); stgwrite(" "); outval(numargs,FALSE); if (sc_asmfile) { stgwrite("\t; "); stgwrite(symname); } /* if */ stgwrite("\n"); /* write on a separate line, to mark a sequence point for the peephole optimizer */ code_idx+=opcodes(1)+opargs(2); } else { pushval(numargs); /* normal function */ stgwrite("\tcall "); if (label!=NULL) { stgwrite("l."); stgwrite(label); } else { stgwrite(sym->name); } /* if */ if (sc_asmfile && (label!=NULL || (!isalpha(sym->name[0]) && sym->name[0]!='_' && sym->name[0]!=sc_ctrlchar))) { stgwrite("\t; "); stgwrite(symname); } /* if */ stgwrite("\n"); code_idx+=opcodes(1)+opargs(1); } /* if */ }
int main() { struct node*sv=NULL; struct node2*sop=NULL; int n,n1,n2,result,i; char thisop; //scanf("%d",&n); char a[100]; scanf("%s",a); i=0; for(;a[i]!='\0';i++) { if(isdigit(a[i])) { sv=pushval(sv,a[i]); } else if(a[i]=='+') { if(sop!=NULL) { n1=popval(&sv); n2=popval(&sv); result=n2+n1; //editing required sv=pushval(sv,result); } else { sop=pushop(sop,a[i]); } } } while(sop!=NULL) { thisop=popop(&sop); n1=popval(&sv); n2=popval(&sv); result=n2+n1;//editing required sv=pushval(sv,result); } result=popval(&sv); printf("%d",result); }
void invoke_getter(methodmap_method_t *method) { if (!method->getter) { error(149, method->name); return; } // push.c 1 // sysreq.c N 1 // stack 8 pushreg(sPRI); pushval(1); ffcall(method->getter, NULL, 1); if (sc_status != statSKIP) markusage(method->getter, uREAD); }
void invoke_setter(methodmap_method_t *method, int save) { if (!method->setter) { error(152, method->name); return; } if (save) pushreg(sPRI); pushreg(sPRI); pushreg(sALT); pushval(2); ffcall(method->setter, NULL, 2); if (save) popreg(sPRI); if (sc_status != statSKIP) markusage(method->setter, uREAD); }
int main() { int n; char *p; char *q; /* Initialize symbol table */ nsym = RES+NPRECALL; p = names; q = NAMES; n = NAMESSIZE; do *p++ = *q++; while(n--); curloc = 10; /* some space to avoid low addrs */ thechar = getchar(); parse(); n = curloc; /* Generate code to jump to main */ curloc = 0; lexval = lookup("main"); pushval(); emitop(C_CALL, 0); emit(C_EXIT); putchar(n); putchar(n/256); p = code; while(n--) { putchar(*p++); } return 0; }
/* returns true if lvalue, else false */ int expr(int needval, int prec) { int na; int islval; int jdst; int op; int any; int opprec; islval = 0; /* parse one expr */ if (istoken(T_CONST)) { emitop(C_PUSHC, lexval); } else if (istoken(T_STRING)) { /* If the syntax is ok the string must still be in the symbol buffer. Stuff it into global space. */ emitop(C_PUSHS, strsize); any = 0; while(any < strsize) emit(symbol[any++]); } else if (istoken(T_NAME)) { islval = pushval(); } else if (istoken('(')) { islval = expr(0, P_NONE); expect(')'); } else if (istoken(T_NOT)) { expr(1, P_PRE); emit(C_NOT); } else if (istoken(T_SUB)) { expr(1, P_PRE); emit(C_NEG); } else if (istoken(T_MUL)) { expr(1, P_PRE); islval = 1; } else if (istoken(T_AND)) { if (expr(0, P_PRE) == 0) error("lvalue required"); } else error("syntax error in expr"); /* one expression parsed, try for hi prec ops */ any = 1; while(any) { op = token % OPMOD; if (istoken('(')) { /* function call */ pderef(islval); na = 0; if (!istoken(')')) { do { expr(1, P_NONE); na++; } while(istoken(',')); expect(')'); } emitop(C_CALL, na*2); islval = 0; } else if (istoken('[')) { /* array ref */ pderef(islval); expr(1, P_NONE); emit(C_ADD); expect(']'); islval = 1; } else if (istoken(T_POSTINC) || istoken(T_POSTDEC)) { if (!islval) error("no lval for ++"); emit(op); islval = 0; } else any = 0; } opprec = token / OPMOD; while (prec < opprec) { if ( (op = token % OPMOD) != C_ASSIGN) { pderef(islval); } else { if (!islval) error("no lval for ="); } if (istoken(T_ANDAND) || istoken(T_OROR)) { emit(C_DUP); if (op == C_OROR) emit(C_NOT); jdst = emitj(C_JFALSE, 0); emit(C_POP); expr(1, opprec); emitat(jdst, curloc); } else { /* emit binop code */ token = getlex(); expr(1, opprec); emit(op); } islval = 0; opprec = token / OPMOD; } if (needval) { pderef(islval); islval = 0; } return islval; }
static char * add_fmt(int len, char *s, char *onefmt, int ppos, int wpos, int posarg, value_t **vals) { int size=(vals[posarg]->type.type == V_REF ? sial_defbsize(): vals[posarg]->type.size); int sign=(vals[posarg]->type.type == V_REF ? 0 : sial_issigned(vals[posarg]->type.typattr)); if(vals[posarg]->type.type == V_STRING) { if(wpos>=0 && ppos<0) s+=snprintf(s, len, onefmt , (int)sial_getval(vals[wpos]) , vals[posarg]->v.data); else if(wpos<0 && ppos>=0) s+=snprintf(s, len, onefmt , (int)sial_getval(vals[ppos]) , vals[posarg]->v.data); else if(wpos>=0 && ppos>=0) s+=snprintf(s, len, onefmt , (int)sial_getval(vals[wpos]) , (int)sial_getval(vals[ppos]) , vals[posarg]->v.data); else s+=snprintf(s, len, onefmt , vals[posarg]->v.data); } else { #if defined(__s390x__) || defined(__s390__) if(wpos>=0 && ppos<0) s+=snprintf(s, len, onefmt , (int)sial_getval(vals[wpos]) , (unsigned long)pushval(vals[posarg], size, sign)); else if(wpos<0 && ppos>=0) s+=snprintf(s, len, onefmt , (int)sial_getval(vals[ppos]) , (unsigned long)pushval(vals[posarg], size, sign)); else if(wpos>=0 && ppos>=0) s+=snprintf(s, len, onefmt , (int)sial_getval(vals[wpos]) , (int)sial_getval(vals[ppos]) , (unsigned long) pushval(vals[posarg], size, sign)); else s+=snprintf(s, len, onefmt , (unsigned long) pushval(vals[posarg], size, sign)); #else if(wpos>=0 && ppos<0) s+=snprintf(s, len, onefmt , (int)sial_getval(vals[wpos]) , pushval(vals[posarg], size, sign)); else if(wpos<0 && ppos>=0) s+=snprintf(s, len, onefmt , (int)sial_getval(vals[ppos]) , pushval(vals[posarg], size, sign)); else if(wpos>=0 && ppos>=0) s+=snprintf(s, len, onefmt , (int)sial_getval(vals[wpos]) , (int)sial_getval(vals[ppos]) , pushval(vals[posarg], size, sign)); else s+=snprintf(s, len, onefmt , pushval(vals[posarg], size, sign)); #endif } return s; }