Exemplo n.º 1
0
static int
interpret()
{
fetch:
    Cyclecount++;
    W = M[C++];
    if ((W & DBIT) == 0)
        D = W & ABITS;
    else
        D = M[C++];

    if ((W & PBIT) != 0) D += P;
    if ((W & GBIT) != 0) D += G;
    if ((W & IBIT) != 0) D = M[D];

    switch (W >> FSHIFT) {
    error: default: printf("\nINTCODE ERROR AT C = %d\n", C - 1);
        return -1;
    case 0: B = A; A = D; goto fetch;
    case 1: M[D] = A; goto fetch;
    case 2: A = A + D; goto fetch;
    case 3: C = D; goto fetch;
    case 4: A = !A;
    case 5: if (!A) C = D; goto fetch;
    case 6: D += P;
        M[D] = P; M[D + 1] = C;
        P = D; C = A;
        goto fetch;
    case 7: switch (D) {
        default: goto error;
        case 1: A = M[A]; goto fetch;
        case 2: A = -A; goto fetch;
        case 3: A = ~A; goto fetch;
        case 4: C = M[P + 1];
            P = M[P];
            goto fetch;
        case 5: A = B * A; goto fetch;
        case 6: A = B / A; goto fetch;
        case 7: A = B % A; goto fetch;
        case 8: A = B + A; goto fetch;
        case 9: A = B - A; goto fetch;
        case 10: A = B == A ? ~0 : 0; goto fetch;
        case 11: A = B != A ? ~0 : 0; goto fetch;
        case 12: A = B < A  ? ~0 : 0; goto fetch;
        case 13: A = B >= A ? ~0 : 0; goto fetch;
        case 14: A = B > A ? ~0 : 0; goto fetch;
        case 15: A = B <= A ? ~0 : 0; goto fetch;
        case 16: A = B << A; goto fetch;
        case 17: A = B >> A; goto fetch;
        case 18: A = B & A; goto fetch;
        case 19: A = B | A; goto fetch;
        case 20: A = B ^ A; goto fetch;
        case 21: A = B ^ ~A; goto fetch;
        case 22: return 0;
        case 23: B = M[C]; D = M[C + 1];
            while (B != 0) {
                B--; C += 2;
                if (A == M[C]) { D = M[C + 1]; break; }
            }
            C = D;
            goto fetch;

        case 24: selectinput(A); goto fetch;
        case 25: selectoutput(A); goto fetch;
        case 26: A = rdch(); goto fetch;
        case 27: wrch(A); goto fetch;
        case 28: A = findinput(A); goto fetch;
        case 29: A = findoutput(A); goto fetch;
        case 30: return A;
        case 31: A = M[P]; goto fetch;
        case 32: P = A; C = B; goto fetch;
        case 33: endread(); goto fetch;
        case 34: endwrite(); goto fetch;
        case 35: D = P + B + 1;
                 M[D] = M[P];
                 M[D + 1] = M[P + 1];
                 M[D + 2] = P;
                 M[D + 3] = B;
                 P = D;
                 C = A;
                 goto fetch;
        case 36: A = getbyte(A, B); goto fetch;
        case 37: putbyte(A, B, M[P + 4]); goto fetch;
        case 38: A = input(); goto fetch;
        case 39: A = output(); goto fetch;
        }
    }
}
Exemplo n.º 2
0
PUBLIC WORD parse(INT old_nesting)
{
        int nesting = (int) old_nesting;
        int quoted;
	
        nextsym();

        if( symb==s_eof ) return nesting;

	parse_depth++;

	if( ( quoted = (symb==s_quote) ) != 0 ) nextsym();

/*	trace("Parse %squoted depth %d",quoted?"":"un",parse_depth); */
		
        for(;;)
        {
                switch ( (int)symb )
                {
                case s_builtin: if(!quoted) { builtin(); break; }

                case s_macro:   if(!quoted) { eval(); break; }

		case s_hexvar:
                case s_var:     if(!quoted) { evalvar(); break; }

                default:
                case s_token:  
				if( toksize == 1 ) wrch(token[0]);
				else wrstr(token);
				break;

                case s_lbra:
                        if( nesting++ > 0) wrch(c_lbra);
                        break;

                case s_rbra:
                        if( --nesting > 0 ) wrch(c_rbra);
                        break;

                case s_eof: return nesting;

                case s_quote:
                        if( quoted ) wrch(c_quote);
                        pbchar(c_quote);
                        nesting = (int) parse((WORD)nesting);
                        break;
                       
                case s_concat:
                        if( quoted ) wrch(c_concat);
                        break;
                }

                if ( nesting <= old_nesting ) break;

                nextsym();
        }

	parse_depth--;

	return nesting;
}