All pastes #470831 Raw Edit

Bytecode intepreter

public c v1 · immutable
·published 2007-05-04 14:58 UTC
rendered paste body
#include <stdlib.h>#include <stdio.h>#include <string.h>void error(const char *reason) {  printf("\nError: %s\n", reason);  exit(1);}void print(char nr) {  static int count = 0;  printf("%X", nr);  count++;  if (count > 0 && count % 2 == 0) printf(" ");}int main() {  char program[256];  char stack[256];  int top = -1;  int i;  fgets(program, 256, stdin);  int length = strlen(program);  for (i = 0 ; i < length ; i++) {    if (program[i] >= '0' && program[i] <= '9') {      top++;      stack[top] = program[i] - '0';      print(stack[top]);    } else if (program[i] >= 'A' && program[i] <= 'F') {      top++;      stack[top] = program[i] - 'A' + 10;      print(stack[top]);    } else if(program[i] >= 'a' && program[i] <= 'o') {      if(top < 0) error("stack underrun");      int tmp = stack[top] + program[i] - 'a' + 1;      if(tmp >= 16) tmp -= 16;      print(tmp);    } else {      if(top < 0) error("stack underrun");      switch(program[i]) {      case '!':	print(stack[top]);	break;      case '>':	print(stack[top]);	top--;	break;      case '#':	top++;	stack[top] = stack[top - 1];	break;      case 'z':	print(stack[top]);      case 'x':	if(top < 0) error("stack underrun");	char tmp = stack[top];	stack[top] = stack[top - 1];	stack[top - 1] = tmp;	break;      case '*':	stack[top] += 3;      case '+':	++stack[top];	if(stack[top] >= 16) stack[top] -= 16;	break;      case '=':	--stack[top];      case '-':	--stack[top];	if(stack[top] < 0) stack[top] += 16;	break;      default:	printf("%c", program[i]);      }    }  }  if(top >= 0) {    for (i = top ; i >= 0 ; i--) {      print(stack[i]);    }  }  printf("\n");  return 0;}