fork download
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4.  
  5. #define TOKENS "><+-.,[]"
  6.  
  7. #define CODE_SEGMENT_SIZE 30000
  8. #define STACK_SEGMENT_SIZE 1000
  9. #define DATA_SEGMENT_SIZE 30000
  10.  
  11. typedef void (*Callback)(void);
  12.  
  13. struct {
  14. char cs[CODE_SEGMENT_SIZE]; /* Code Segment */
  15. long ip; /* Instruction Pointer */
  16.  
  17. char ss[STACK_SEGMENT_SIZE]; /* Stack Segment */
  18. long sp; /* Stack Pointer */
  19.  
  20. char ds[DATA_SEGMENT_SIZE]; /* Data Segment */
  21. long bp; /* Base Pointer */
  22.  
  23. Callback fn[128];
  24. } vm;
  25.  
  26. void vm_forward() {
  27. vm.bp = (vm.bp + 1) % DATA_SEGMENT_SIZE;
  28. }
  29.  
  30. void vm_backward() {
  31. vm.bp = (vm.bp + DATA_SEGMENT_SIZE - 1) % DATA_SEGMENT_SIZE;
  32. }
  33.  
  34. void vm_increment() {
  35. vm.ds[vm.bp]++;
  36. }
  37.  
  38. void vm_decrement() {
  39. vm.ds[vm.bp]--;
  40. }
  41.  
  42. void vm_input() {
  43. vm.ds[vm.bp] = getchar();
  44. }
  45.  
  46. void vm_output() {
  47. putchar(vm.ds[vm.bp]);
  48. }
  49.  
  50. void vm_while_entry() {
  51. if (vm.ds[vm.bp]) {
  52. vm.ss[vm.sp] = vm.ip - 1;
  53. vm.sp++;
  54. } else {
  55. int c = 1;
  56. for (vm.ip++; vm.cs[vm.ip] && c; vm.ip++) {
  57. if (vm.cs[vm.ip] == '[') {
  58. c++;
  59. } else if (vm.cs[vm.ip] == ']') {
  60. c--;
  61. }
  62. }
  63. }
  64. }
  65.  
  66. void vm_while_exit() {
  67. if (vm.ds[vm.bp]) {
  68. vm.sp--;
  69. vm.ip = vm.ss[vm.sp];
  70. }
  71. }
  72.  
  73. void setup() {
  74. int c;
  75. int i;
  76.  
  77. memset(&vm, 0, sizeof(vm));
  78. vm.fn['>'] = vm_forward;
  79. vm.fn['<'] = vm_backward;
  80. vm.fn['+'] = vm_increment;
  81. vm.fn['-'] = vm_decrement;
  82. vm.fn['.'] = vm_output;
  83. vm.fn[','] = vm_input;
  84. vm.fn['['] = vm_while_entry;
  85. vm.fn[']'] = vm_while_exit;
  86.  
  87. for (i = 0; (c = getchar()) != EOF;) {
  88. if (strchr(TOKENS, c)) {
  89. vm.cs[i] = c;
  90. i++;
  91. }
  92. }
  93. }
  94.  
  95. void run() {
  96. while (vm.cs[vm.ip]) {
  97. vm.fn[vm.cs[vm.ip]]();
  98. vm.ip++;
  99. }
  100. }
  101.  
  102. int main(int argc, char* argv[]) {
  103. if (argc > 1) {
  104. freopen(argv[1], "r", stdin);
  105. }
  106.  
  107. setup();
  108. run();
  109.  
  110. return 0;
  111. }
Success #stdin #stdout 0s 2072KB
stdin
++++++++++[>+++++>+++++++++++>+++++++++++>+<<<<-]>++++++>++>-<<<>.>.>.>. 
stdout
8pm