예제 #1
0
파일: n5.c 프로젝트: aksr/heirloom
void
casereturn(void)
{
	flushi();
	nflush++;
	while (frame->loopf) {
		frame->loopf = LOOP_FREE;
		popi();
	}
	popi();
}
예제 #2
0
/* assign input vector */
void assign_input_affix ()
{   int nr = popi ();
    affix_node affx = popa ();
    value new_val = my_ivals[nr];

    if (affx -> val != value_nil)
    {   if (equal_value (new_val, affx -> val)) callq ();
    }
    else
    {   affx -> val = rdup_value (new_val);
        if (affx -> mfunc != NULL)
        {   /* check metadefinition */
            pushv (new_val);
            pushq (affx -> mfunc);
            callq ();
            pop (2);
        }
        else callq ();
        rfre_value (new_val);
        affx -> val = value_nil;
    };
    pusha (affx);
    pushi (nr);
    pushq (assign_input_affix);
};
예제 #3
0
파일: n5.c 프로젝트: aksr/heirloom
int 
rdtty(void)
{
	char	onechar;
#if defined (EUC)
	int	i, n;

loop:
#endif /* EUC */

	onechar = 0;
	if (read(0, &onechar, 1) == 1) {
		if (onechar == '\n')
			tty++;
		else 
			tty = 1;
#if !defined (EUC)
		if (tty != 3)
			return(onechar);
#else	/* EUC */
		if (tty != 3) {
			if (!multi_locale)
				return(onechar);
			i = onechar & 0377;
			*mbbuf1p++ = i;
			*mbbuf1p = 0;
			if ((*mbbuf1&~(wchar_t)0177) == 0) {
				twc = 0;
				mbbuf1p = mbbuf1;
			}
			else if ((n = mbtowc(&twc, mbbuf1, mb_cur_max)) <= 0) {
				if (mbbuf1p >= mbbuf1 + mb_cur_max) {
					illseq(-1, mbbuf1, mbbuf1p-mbbuf1);
					twc = 0;
					mbbuf1p = mbbuf1;
					*mbbuf1p = 0;
					i &= 0177;
				} else {
					goto loop;
				}
			} else {
				i = twc | COPYBIT;
				twc = 0;
				mbbuf1p = mbbuf1;
			}
			return(i);
		}
#endif /* EUC */
	}
	popi();
	tty = 0;
#ifdef	NROFF
	if (quiet)
		echo_on();
#endif	/* NROFF */
	return(0);
}
예제 #4
0
/*
   Reserve space to collect output affixes
*/
void reserve_collection_space ()
{   my_nrps = popi ();
    my_cvals = (value **) ckcalloc (1, sizeof (value *));
    room = 1;
    allocated = 0;
    callq ();
    pushi (my_nrps);
    pushq (reserve_collection_space);
};
예제 #5
0
파일: n5.c 프로젝트: aksr/heirloom
void
casecontinue(int _break)
{
	int	i, j;
	struct s	*s;

	noscale++;
	if (skip(0) || (i = atoi()) <= 0 || nonumb)
		i = 1;
	noscale--;
	j = 0;
	for (s = frame; s != stk; s = s->pframe)
		if (s->loopf && ++j >= i)
			break;
	if (j != i) {
		if (i == 1) {
			if (warn & WARN_RANGE)
				errprint("%s outside loop", macname(lastrq));
			return;
		}
		if (warn & WARN_RANGE)
			errprint("%s: breaking out of %d current loop "
					"levels but %d requested",
				macname(lastrq), j, i);
		_break = 1;
		i = j;
	}
	flushi();
	nflush++;
	while (i > 1 || _break && i > 0) {
		if (frame->loopf) {
			frame->loopf = LOOP_FREE;
			i--;
		}
		popi();
	}
	if (i == 1) {
		while (frame->loopf == 0)
			popi();
		popi();
	}
}
예제 #6
0
void collect_output_affix ()
{   int nr = popi ();
    affix_node affx = popa ();
    value new_val = affx -> val;
    check_for_space ();
    my_cvals[nrofparses][nr] = rdup_value (new_val);
    callq ();
    pusha (affx);
    pushi (nr);
    pushq (collect_output_affix);
};
예제 #7
0
파일: n3.c 프로젝트: AustenConrad/plan-9
Tchar rbf(void)	/* return next char from blist[] block */
{
	Tchar i, j;

	if (ip == RD_OFFSET) {		/* for rdtty */
		if (j = rdtty())
			return(j);
		else
			return(popi());
	}
	
	i = rbf0(ip);
	if (i == 0) {
		if (!app)
			i = popi();
		return(i);
	}
	ip = incoff(ip);
	return(i);
}
예제 #8
0
파일: task2.c 프로젝트: xujingao13/Complier
int toResult(){
    int val = 0;
    int i = 0;
    int len = getlength(poly_exp);
    int result = 0;
    for(i = 0; i < len; i++){
        char c = poly_exp[i];
        if(isint(c)){
            val = val*10+(c-'0');
        }
        if(c == '~'){
            pushi(val);
            val = 0;
        }
        if(isint(c) && (1-isint(poly_exp[i+1])) && poly_exp[i+1] != '~'){
            pushi(val);
            val = 0;
        }
        if(c == '+'){
            int x = popi();
            int y = popi();
            pushi(x+y);
        }
        if(c == '-'){
            int x = popi();
            int y = popi();
            pushi(y-x);
        }
        if(c == '*'){
            int x = popi();
            int y = popi();
            pushi(y*x);
        }
        if(c == '/'){
            int x = popi();
            int y = popi();
            pushi(y/x);
        }
    }
    result = popi();
    return result;
}
예제 #9
0
	void ExecFrame::execute_ops(int num)
	{
		int opcode, param;
		floatval fa,fb;
		int ia, ib, ifor, iparam, ijmp;
		//char opfor,pfor;
		Vec2 *v1,*v2;
		Vec2 v;
		VMInterface* obj;
		ExecFrame* frame;
		CodeObj* cobj;
		
		while(num-- != 0)
		{
			opcode = (int)code->code[iptr++];
			param = (int)code->code[iptr++];
			
			//std::cout << opcode << ':' << param << std::endl;
			
			switch(opcode) {
				case OPC_EXIT:
					iptr-=2;
					return;
				case OPC_VMCALL:
					cobj = (CodeObj*)popp();
					ia = popi();
					frame = new ExecFrame(cobj);
					frame->restart();
					if (param > 0) move(param, frame);
					frame->execute();
					if (ia > 0) frame->move(ia, this);
					delete frame;
					break;
			    case OPC_CONSTF:
			    	pushf(code->conarray_f[param]);
			        break;
			    case OPC_CONSTI:
			        pushi(code->conarray_i[param]);
			        break;
			    case OPC_CONSTV:
			    	pushv(code->conarray_v[param]);
			        break;
			    case OPC_CONSTP:
			    	pushp(code->conarray_p[param]);
			    	break;
			    case OPC_PUSHVARF:
			        pushf(vararray_f[param]);
			        break;
			    case OPC_PUSHVARI:
			        pushi(vararray_i[param]);
			        break;
			    case OPC_PUSHVARV:
			        pushv(vararray_v[param]);
			        break;
			    case OPC_PUSHVARP:
			        pushp(vararray_p[param]);
			        break;
				case OPC_POP:
					top -= param;
					break;
			    case OPC_SETVARF:
			        vararray_f[param] = popf();
			        break;
			    case OPC_SETVARI:
			        vararray_i[param] = popi();
			        break;
			    case OPC_SETVARV:
			    	fb = popf();
			    	fa = popf();
			        vararray_v[param].set(fa,fb);
			        break;
			    case OPC_SETVARP:
			        vararray_p[param] = popp();
			        break;
			    case OPC_GETPROP:
			        obj = (VMInterface*)popp();
			        obj->VM_GetProp(this, param);
			        break;
			    case OPC_SETPROP:
			        obj = (VMInterface*)popp();
			        obj->VM_SetProp(this, param);
			        break;
			    case OPC_METCALL:
			        obj = (VMInterface*)popp();
			        obj->VM_MetCall(this, param);
			        break;
			    case OPC_GETPROPV:
			        v1 = (Vec2*)popp();
			        v1->VM_GetProp(this, param);
			        break;
			    case OPC_SETPROPV:		    
			        v1 = (Vec2*)popp();
			        v1->VM_SetProp(this, param);
			        break;
			    case OPC_METCALLV:
			        v1 = (Vec2*)popp();
			        v1->VM_MetCall(this, param);
			        break;
			    case OPC_JUMP:
			        iptr += param*2;
			        break;
			    case OPC_IFJUMP:
			        ia = popi();
			        if (ia == 0) iptr += param*2;
			        break;
			    case OPC_INITFOR:
			        ib = popi();
			        ia = popi();
			        ++iptr;
			        iparam = code->code[iptr++];
			        ijmp = iptr;
			        for(ifor=ia;ifor<ib;++ifor)
			        {
			        	iptr = ijmp;
			        	vararray_i[param] = ifor;
			        	execute_ops(iparam);
			        	/*for(iptr=ijmp;iptr<ijmp+iparam*2;++iptr)
			        	{
					        opfor = code->code[iptr];
					        pfor = code->code[++iptr];
					        if (opfor == OPC_EXIT)
					        {
					        	--iptr;
					        	return;
					        }
			        		execute_op(opfor, pfor);
			        	}*/
			        	 
			        }
			        break;
			    case OPC_LOOP:
			        ; // TODO
			        break;
			    case OPC_I2F:
			    //  this will break is floatval uses doubles !!
			    /*    ia = *((int*)top);
			        *((floatval*)top) = (float)ia;*/
			        ia = popi();
			        pushf((floatval)ia);		        
			        break;
			    case OPC_F2I:
			        /*fa = *((floatval*)top);
			        *((int*)top) = (int)fa;*/
			        fa = popf();
			        pushi((int)fa);		        
			        break;
			    case OPC_VEC2P:
			    	fb = popf();
			    	fa = popf();
			    	v1 = vectemp + (vecidx % 5);
			    	++vecidx;
			    	v1->set(fa,fb);
			    	pushp(v1);
			    	break;
			    case OPC_P2VEC:
			    	v1 = popv();
			    	pushv(*v1);
			    	break;
			    case OPC_LASTVEC:
			    	v1 = vectemp + ((vecidx-1)%5);
			    	pushv(*v1);
			    	break;
			        
		// --------------------------------------------------
		// -------------------- OPERATORS -------------------
		// --------------------------------------------------		        
			        
			    case OPC_OP_ADDFF:
			    	fa = popf();
			        *(((floatval*)top)-1) += fa;
			        break;
			    case OPC_OP_ADDII:
			    	ia = popi();
			        *(((int*)top)-1) += ia;
			        break;
			    case OPC_OP_ADDVV:
			        v2 = popv();
			        v1 = popv();
			        v.set(*v1);
			        v.add(*v2);
			        pushv(v);
			        break;
			    case OPC_OP_ANDBB:
			        ib = popi();
			        ia = popi();
			        pushi(ia & ib);
			        break;
			    case OPC_OP_DIVFF:
			    	fa = popf();
			        *(((floatval*)top)-1) /= fa;
			        break;
			    case OPC_OP_DIVII:
			    	ia = popi();
			        *(((int*)top)-1) /= ia;
			        break;
			    case OPC_OP_DIVVF:
			        fa = popf();
			        v1 = (Vec2*)popp();
			        v.set(*v1);
			        v.div(fa);
			        pushv(v);
			        break;
			    case OPC_OP_EQFF:
			        fb = popf();
			        fa = popf();
			        pushi((int)(fa == fb));
			        break;
			    case OPC_OP_EQII:
			        ib = popi();
			        ia = popi();
			        pushi((int)(ia == ib));
			        break;
			    case OPC_OP_EQVV:
			        v2 = popv();
			        v1 = popv();
			        pushi((int)(ia == ib));
			        break;
			    case OPC_OP_GEFF:
			        fb = popf();
			        fa = popf();
			        pushi((int)(fa >= fb));
			        break;
			    case OPC_OP_GEII:
			        ib = popi();
			        ia = popi();
			        pushi((int)(ia >= ib));
			        break;
			    case OPC_OP_GTFF:
			        fb = popf();
			        fa = popf();
			        pushi((int)(fa > fb));
			        break;
			    case OPC_OP_GTII:
			        ib = popi();
			        ia = popi();
			        pushi((int)(ia > ib));
			        break;
			    case OPC_OP_LEFF:
			        fb = popf();
			        fa = popf();
			        pushi((int)(fa <= fb));
			        break;
			    case OPC_OP_LEII:
			        ib = popi();
			        ia = popi();
			        pushi((int)(ia <= ib));
			        break;
			    case OPC_OP_LTFF:
			        fb = popf();
			        fa = popf();
			        pushi((int)(fa < fb));
			        break;
			    case OPC_OP_LTII:
			        ib = popi();
			        ia = popi();
			        pushi((int)(ia < ib));
			        break;
			    case OPC_OP_MULFF:
			    	fa = popf();
			        *(((floatval*)top)-1) *= fa;
			        break;
			    case OPC_OP_MULII:
			    	ia = popi();
			        *(((int*)top)-1) *= ia;
			        break;
			    case OPC_OP_MULVF:
			        fa = popf();
			        v1 = popv();
			        v.set(*v1);
			        v.mul(fa);
			        pushv(v);
			        break;
			    case OPC_OP_NEFF:
			        fb = popf();
			        fa = popf();
			        pushi((int)(fa != fb));
			        break;
			    case OPC_OP_NEGF:
			        *(((floatval*)top)-1) = -(*((floatval*)top));
			        break;
			    case OPC_OP_NEGI:
			        *(((int*)top)-1) = -(*((int*)top));
			        break;
			    case OPC_OP_NEGV:
			        v1 = popv();
			        v.set(-v1->x, -v1->y);
			        pushv(v);
			        break;
			    case OPC_OP_NEII:
			        ib = popi();
			        ia = popi();
			        pushi((int)(ia != ib));
			        break;
			    case OPC_OP_NEVV:
			        v2 = popv();
			        v1 = popv();
			        pushi((int)(ia != ib));
			        break;
			    case OPC_OP_NOTBB:
			        ; // TODO
			        break;
			    case OPC_OP_ORBB:
			        ; // TODO
			        break;
			    case OPC_OP_SUBFF:
			    	fa = popf();
			        *(((floatval*)top)-1) -= fa;
			        break;
			    case OPC_OP_SUBII:
			    	ia = popi();
			        *(((int*)top)-1) -= ia;
			        break;
			    case OPC_OP_SUBVV:
			        v2 = (Vec2*)popp();
			        v1 = (Vec2*)popp();
			        v.set(*v1);
			        v.sub(*v2);
			        pushv(v);
			        break;
			    case OPC_OP_XORBB:
			        ; // TODO
			        break;
			}
		}
	}
예제 #10
0
static void _startOrStopModule(MstpId id, bool start)
{
    static const struct {
        int id:9;
        uint8_t reg:2;
        uint8_t bit:5;
    } t[] = {
        {MstpIdEXDMAC,  0, 29},
        {MstpIdEXDMAC0, 0, 29},
        {MstpIdEXDMAC1, 0, 29},
        {MstpIdDMAC,    0, 28},
        {MstpIdDMAC0,   0, 28},
        {MstpIdDMAC1,   0, 28},
        {MstpIdDMAC2,   0, 28},
        {MstpIdDMAC3,   0, 28},
        {MstpIdDTC,     0, 28},
        {MstpIdA27,     0, 27},
        {MstpIdA24,     0, 24},
        {MstpIdAD,      0, 23},
        {MstpIdDA,      0, 19},
        {MstpIdS12AD,   0, 17},
        {MstpIdCMT0,    0, 15},
        {MstpIdCMT1,    0, 15},
        {MstpIdCMT2,    0, 14},
        {MstpIdCMT3,    0, 14},
        {MstpIdTPU0,    0, 13},
        {MstpIdTPU1,    0, 13},
        {MstpIdTPU2,    0, 13},
        {MstpIdTPU3,    0, 13},
        {MstpIdTPU4,    0, 13},
        {MstpIdTPU5,    0, 13},
        {MstpIdTPU6,    0, 12},
        {MstpIdTPU7,    0, 12},
        {MstpIdTPU8,    0, 12},
        {MstpIdTPU9,    0, 12},
        {MstpIdTPU10,   0, 12},
        {MstpIdTPU11,   0, 12},
        {MstpIdPPG0,    0, 11},
        {MstpIdPPG1,    0, 10},
        {MstpIdMTU,     0,  9},
        {MstpIdMTU0,    0,  9},
        {MstpIdMTU1,    0,  9},
        {MstpIdMTU2,    0,  9},
        {MstpIdMTU3,    0,  9},
        {MstpIdMTU4,    0,  9},
        {MstpIdMTU5,    0,  9},
        {MstpIdTMR0,    0,  5},
        {MstpIdTMR1,    0,  5},
        {MstpIdTMR01,   0,  5},
        {MstpIdTMR2,    0,  4},
        {MstpIdTMR3,    0,  4},
        {MstpIdTMR23,   0,  4},
        {MstpIdSCI0,    1, 31},
        {MstpIdSMCI0,   1, 31},
        {MstpIdSCI1,    1, 30},
        {MstpIdSMCI1,   1, 30},
        {MstpIdSCI2,    1, 29},
        {MstpIdSMCI2,   1, 29},
        {MstpIdSCI3,    1, 28},
        {MstpIdSMCI3,   1, 28},
        {MstpIdSCI4,    1, 27},
        {MstpIdSMCI4,   1, 27},
        {MstpIdSCI5,    1, 26},
        {MstpIdSMCI5,   1, 26},
        {MstpIdSCI6,    1, 25},
        {MstpIdSMCI6,   1, 25},
        {MstpIdSCI7,    1, 24},
        {MstpIdSMCI7,   1, 24},
        {MstpIdCRC,     1, 23},
        {MstpIdPDC,     1, 22},
        {MstpIdRIIC0,   1, 21},
        {MstpIdRIIC1,   1, 20},
        {MstpIdUSB0,    1, 19},
        {MstpIdUSB1,    1, 18},
        {MstpIdRSPI0,   1, 17},
        {MstpIdRSPI1,   1, 16},
        {MstpIdEDMAC,   1, 15},
        {MstpIdTEMPS,   1,  8},
        {MstpIdSCI12,   1,  4},
        {MstpIdSMCI12,  1,  4},
        {MstpIdCAN2,    1,  2},
        {MstpIdCAN1,    1,  1},
        {MstpIdCAN0,    1,  0},
        {MstpIdSCI8,    2, 27},
        {MstpIdSMCI8,   2, 27},
        {MstpIdSCI9,    2, 26},
        {MstpIdSMCI9,   2, 26},
        {MstpIdSCI10,   2, 25},
        {MstpIdSMCI10,  2, 25},
        {MstpIdSCI11,   2, 24},
        {MstpIdSMCI11,  2, 24},
        {MstpIdRSPI2,   2, 22},
        {MstpIdMCK,     2, 19},
        {MstpIdIEB,     2, 18},
        {MstpIdRIIC2,   2, 17},
        {MstpIdRIIC3,   2, 16},
        {MstpIdRAM1,    2,  1},
        {MstpIdRAM0,    2,  0},
        {MstpIdDEU,     3, 31},
    };
    static uint8_t f[(NumOfMstpId + __CHAR_BIT__ - 1) / __CHAR_BIT__] = {0};

    if (id >= 0 && id < NumOfMstpId) {
        int reg;
        volatile uint32_t* mstpcr = NULL;
        int bit;
        int i;
        for (i = 0; i < (int)(sizeof(t) / sizeof(*t)); i++) {
            if (t[i].id == id) {
                reg = t[i].reg;
                mstpcr = (volatile uint32_t*)((uint32_t*)&SYSTEM.MSTPCRA.LONG + reg);
                bit = t[i].bit;
                break;
            }
        }
        if (mstpcr != NULL) {
            int c = 0;
            int j;
            for (j = 0; j < (int)(sizeof(t) / sizeof(*t)); j++) {
                if (t[j].id != id && (t[j].reg == reg && t[j].bit == bit)) {
                    if ((f[t[j].id / __CHAR_BIT__] & (1 << (t[j].id % __CHAR_BIT__))) != 0) {
                        c++;
                    }
                }
            }
            if (start) {
                if ((f[id / __CHAR_BIT__] & (1 << (id % __CHAR_BIT__))) == 0) {
                    f[id / __CHAR_BIT__] |= (1 << (id % __CHAR_BIT__));
                    if (c == 0) {
                        pushi();
                        cli();
                        *mstpcr &= ~(1U << bit);
                        popi();
                    }
                }
            } else {
                if ((f[id / __CHAR_BIT__] & (1 << (id % __CHAR_BIT__))) != 0) {
                    f[id / __CHAR_BIT__] &= ~(1 << (id % __CHAR_BIT__));
                    if (c == 0) {
                        pushi();
                        cli();
                        *mstpcr |= (1U << bit);
                        popi();
                    }
                }
            }
        }
    }
}