{"body":"//vm.c john morris beck the license to use this code is gpl2 found at gnu.org\n//compile with:gcc -std=c99 -O3 -march=native -flto vm.c -o vm\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#define declare_type(a,b) (a b)\n//#define define(a,b,c,d) declare_type(a,b c {d})\n#define assign(a,b) ((a)=(b))\n//#define declare(a,b) declare_type(a,assign(b,0))\n#define access(a,b) (a[b])\n#define typecast(a,b) ((a)b)\n#define reference(a) (&(a))\n#define loop(a,b) while(a){b}\n#define binary_operation(a,b,c) ((b)a(c))\n#define not(a) (!(a))\n#define add(a,b) binary_operation(+,a,b)\n#define subtract(a,b) binary_operation(-,a,b)\n#define less_than(a,b) binary_operation(<,a,b)\n#define is_equal(a,b) binary_operation(==,a,b)\n#define post_increment(a) ((a)++)\n#define jump_to_this_value(a,b) switch(a){b}\n#define if_value_equals(a,b) case a:b;break;\n\n#define literal_newline_character '\\n'\n\n#define false 0\n#define true not(false)\n\n#define max_char_size 256\n\n#define starter_integer_for_user 1\n#define reference_to_pointer_registers typecast(void*,pointer_registers)\n#define reference_to_integer_registers typecast(void*,integer_registers)\n#define reference_to_thread_of_execution reference(thread_of_execution)\n\n\n#define left_pointer_operand access(pointer_registers,left_operand)\n#define right_pointer_operand access(pointer_registers,right_operand)\n#define left_integer_operand access(integer_registers,left_operand)\n#define right_integer_operand access(integer_registers,right_operand)\n\n#define halt return 0\n#define instruction_width 3\n\n\n#define subtract_operation 0\n#define less_than_operation 1\n#define add_to_pointer_operation 2\n#define deeply_copy_pointer_operation 3\n#define deeply_copy_integer_operation 4\n#define allocate_memory_operation 5\n#define free_memory_operation 6\n#define read_operation 7\n#define write_operation 8\n#define halt_virtual_machine 9\n\nint main(){\n  int fetch_instruction_counter=0;\n  int left_operand;\n  int right_operand;\n  int operator;\n\n       \n  int* integer_registers=max_char_size;\n  int* initial_instruction_buffer=max_char_size;\n  int* thread_of_exeuction=1;\n\n  assign(access(thread_of_operation,0),initial_instruction_buffer);\n  assign(access(integer_registers,0),starter_integer_for_user);\n       \n  void* pointer_registers=max_char_size;\n       \n  assign(access(pointer_registers,0),reference_to_pointer_registers);\n  assign(access(pointer_registers,1),reference_to_integer_registers);\n  assign(access(pointer_registers,2),reference_to_thread_of_execution);\n\n  loop( not(is_equal(\n\n\t\t     literal_newline_character,\n\t\t\t  \n\t\t     assign(access(thread_of_execution,post_increment(fetch_instruction_counter)),getchar())\n\n\n\t\t     )\n\n\t    ),\n\n\tvoid;\n\n\t)\n\n    loop(true,\n\n\n\t assign(left_operand,access(thread_of_execution,0));\n\t assign(right_operand,(access(thread_of_execution,1)));\n\t assign(operator,access(thread_of_execution,2));\n\n\t jump_to_this_value(operator,\n\n\t\t\t    if_value_equals(subtract_operation,\n\n\t\t\t\t\t    assign(left_integer_operand,(subtract(left_integer_operand,right_integer_operand)));\n\n\t\t\t\t\t    );\n\n\t\t\t    if_value_equals(less_than_operation,\n\n\t\t\t\t\t    assign(left_integer_operand,less_than(left_integer,right_integer_operand));\n\n\t\t\t\t\t    );\n\n\t\t\t    if_value_equals(add_to_pointer_operation,\n\n\t\t\t\t\t    assign(left_pointer_operand, typecast(void*,typecast(char*,add(left_pointer_operand,typecast(int,left_integer_operand)))));\n\t\t\t       \n\t\t\t\t\t    );\n\n\n\n\t\t\t    if_value_equals(deeply_copy_pointer_operation,\n\n\t\t\t\t\t    assign(access(0,typecast(int*,right_pointer_operand)),typecast(int,assign(access(0,typecast(int*,right_pointer_operand)))))\n\t\t\t\t\t       \n\t\t\t\t\t    );\n\n\t\t\t    if_value_equals(deeply_copy_integer_operation,\n\t\t\t\t\t       \n\t\t\t\t\t    assign(access(0,typecast(void*,right_pointer_operand)),access(0,typecast(void*,right_integer_operand)));\n\t\t\t\t\t       \n\t\t\t\t\t    );\n\n\t\t\t    if_value_equals(allocate_memory_operation,\n\t\t\t\t\t       \n\n\t\t\t\t\t    assign(right_pointer_operand, malloc(left_integer_operand));\n\t\t\t\t\t    assign(left_integer_operand, is_equal(right_pointer_operand,NULL));\n\t    \n\t    \n\t\t\t\t\t    );\n\n\t\t\t    if_value_equals(free_memory_operation,\n\t\t\t\t\t       \n\t\t\t\t\t    free(left_pointer_operand);\n\t\t\t\t\t       \n\t\t\t\t\t    );\n\n\t\t\t    if_value_equals(read_operation,\n\n\t\t\t\t\t    fread(right_pointer_operand,1,left_integer_operand,stdin);\n       \n\t\t\t\t\t    );\n\n\t\t\t    if_value_equals(write_operation,\n\n\t\t\t\t\t    fwrite(right_pointer_operand,1,left_integer_operand,stdout);\n\t\t       \n\t\t\t\t\t    fflush(stdout);\n\n\t\t\t\t\t    );\n\n\t\t\t    if_value_equals(halt_virtual_machine,\n\t\t\t\t\t       \n\t\t\t\t\t    halt;\n\t\t\t\t\t       \n\t\t\t\t\t    );\n\n\t\t\t    );\n\t    \n\t assign(thread_of_execution,add(thread_of_execution,instruction_width));\n\n\t )\n    }\n       \n       \n       \n       \n","name":"","extension":"txt","url":"https://www.irccloud.com/pastebin/caTlyHcT","modified":1760072116,"id":"caTlyHcT","size":4706,"lines":177,"own_paste":false,"theme":"","date":1760072116}