示例#1
0
/*
 *  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 */
}
示例#2
0
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);
	
}
示例#3
0
文件: sc4.cpp 项目: War3Evo/sourcemod
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);
}
示例#4
0
文件: sc4.cpp 项目: War3Evo/sourcemod
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);
}
示例#5
0
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;
}
示例#6
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;
}