Exemplo n.º 1
0
void
process_line(longint_t vars[], char *line) {
	int varnum, optype, status;
	longint_t second_value;

	/* determine the LHS variable, it
	 * must be first character in line
	 */
	varnum = to_varnum(line[0]);
	if (varnum==ERROR) {
		printf("Invalid LHS variable\n");
		return;
	}

	/* more testing for validity 
	 */
	if (strlen(line)<2) {
		printf("No operator supplied\n");
		return;
	}

	/* determine the operation to be performed, it
	 * must be second character in line
	 */
	optype = line[1];
	if (strchr(ALLOPS, optype) == NULL) {
		printf("Unknown operator\n");
		return;
	}

	/* determine the RHS argument (if one is required),
	 * it must start in third character of line
	 */
	if (optype != PRINT) {
		if (strlen(line)<3) {
			printf("No RHS supplied\n");
			return;
		}
		status = get_second_value(vars, line+2, &second_value);
		if (status==ERROR) {
			printf("RHS argument is invalid\n");
			return;
		}
	}

	/* finally, do the actual operation
	 */
	if (optype == PRINT) {
		do_print(vars+varnum);
	} else if (optype == ASSIGN) {
		do_assign(vars+varnum, &second_value);
	} else if (optype == PLUS) {
		do_plus(vars+varnum, &second_value);
	} else if (optype == MULT) {
		do_mult(vars+varnum, &second_value);
	} else if (optype == POWER) {
		do_power(vars+varnum, &second_value);
	}
	return;
}
Exemplo n.º 2
0
void
do_mult(longint_t *var1, longint_t *var2) {
	longint_t product = LONG_ZERO;
	longint_t oneterm;
	int i;
	for (i=var2->ndig-1; i>=0; i--) {
		/* process one digit from var2 */
		oneterm = *var1;
		mult_one_digit(&oneterm, to_int(var2->digs[i]));
		mult_ten(&product);
		do_plus(&product, &oneterm);
	}
	/* now sort out the sign */
	product.nega = var1->nega != var2->nega;
	*var1 = product;
	return;
}
Exemplo n.º 3
0
int main(int argc, char *argv[])
{
	int 	type;
	int		op;
	char 	s[1024];

	push('=');
	while ((type = getop(s)) != EOF) {
		switch (type) {
		case '(':
			do_left_bracket(type);
			break;
		case ')':
			do_right_bracket(type);
			break;
		case NUMBER:
			fprintf(stdout, " %s ", s);
			break;
		case '-':
			do_sub(type);
			break;
		case '+':
			do_plus(type);
			break;
		case '*':
			do_mul(type);
			break;
		case '/':
			do_div(type);
			break;
		case '\n':
			while ((op = pop()) != '=')
				fprintf(stdout, " %c ", op);
			push(op);
			fprintf(stdout, "\n");
			break;
		default:
			fprintf(stderr, "unknow type: %d\n", type);
			break;
		}
	}

	exit(0);
}
Exemplo n.º 4
0
void run_scu_operation(machinecode *program, int *pc, int *convert, union bit *reg) {
    switch(program[*pc].opcode) {
    case 0: /* set reg */
        reg_set(reg, program[*pc].dr, reg_ref(reg,program[*pc].sr2,convert), convert);
        (*pc)++;
        break;
    case (0 + IMD_SIZE): /* set imd */
        reg_set(reg, program[*pc].dr, program[*pc].imd, convert);
        (*pc)++;
        break;
     case 1: /* + reg */
        reg_set(reg, program[*pc].dr, do_plus(reg_ref(reg,program[*pc].sr1,convert),reg_ref(reg,program[*pc].sr2,convert)), convert);
        (*pc)++;
        break;
     case (1 + IMD_SIZE): /* + imd */
        reg_set(reg, program[*pc].dr, do_plus(reg_ref(reg,program[*pc].sr1,convert),program[*pc].imd), convert);
        (*pc)++;
        break;
     case 2: /* - reg */
        reg_set(reg, program[*pc].dr, do_minus(reg_ref(reg,program[*pc].sr1,convert),reg_ref(reg,program[*pc].sr2,convert)), convert);
        (*pc)++;
        break;
     case (2 + IMD_SIZE): /* - imd */
        reg_set(reg, program[*pc].dr, do_minus(reg_ref(reg,program[*pc].sr1,convert),program[*pc].imd), convert);
        (*pc)++;
        break;
     case 3: /* xor reg */
        reg_set(reg, program[*pc].dr, do_xor(reg_ref(reg,program[*pc].sr1,convert),reg_ref(reg,program[*pc].sr2,convert)), convert);
        (*pc)++;
        break;
     case (3 + IMD_SIZE): /* xor imd */
        reg_set(reg, program[*pc].dr, do_xor(reg_ref(reg,program[*pc].sr1,convert),program[*pc].imd), convert);
        (*pc)++;
        break;
     case 4: /* or reg */
        reg_set(reg, program[*pc].dr, do_or(reg_ref(reg,program[*pc].sr1,convert),reg_ref(reg,program[*pc].sr2,convert)), convert);
        (*pc)++;
        break;
     case (4 + IMD_SIZE): /* or imd */
        reg_set(reg, program[*pc].dr, do_or(reg_ref(reg,program[*pc].sr1,convert),program[*pc].imd), convert);
        (*pc)++;
        break;
     case 5: /* and reg */
        reg_set(reg, program[*pc].dr, do_and(reg_ref(reg,program[*pc].sr1,convert),reg_ref(reg,program[*pc].sr2,convert)), convert);
        (*pc)++;
        break;
     case (5 + IMD_SIZE): /* adn imd */
        reg_set(reg, program[*pc].dr, do_and(reg_ref(reg,program[*pc].sr1,convert),program[*pc].imd), convert);
        (*pc)++;
        break;
     case 6: /* not reg */
        reg_set(reg, program[*pc].dr, do_not(reg_ref(reg,program[*pc].sr2,convert)), convert);
        (*pc)++;
        break;
     case (6 + IMD_SIZE): /* not imd */
        reg_set(reg, program[*pc].dr, do_not(program[*pc].imd), convert);
        (*pc)++;
        break;
     default:
        fprintf(stderr, "%2x : unknown instruction\n", (program[*pc].info)+(program[*pc].opcode));
        exit(EXIT_FAILURE);
    }
}