function error(msg) { printf("%s\n", msg) exit(1) } function bytes_to_int(bstr, i, sum) { sum = 0 for (i=word_size-1; i>=0; i--) { sum *= 256 sum += code[bstr+i] } return sum } function emit_byte(x) { code[next_free_code_index++] = x } function emit_word(x, i) { for (i=0; i stack[sp-1]; sp-- } else if (op == LE ) { stack[sp-2] = stack[sp-2] <= stack[sp-1]; sp-- } else if (op == GE ) { stack[sp-2] = stack[sp-2] >= stack[sp-1]; sp-- } else if (op == EQ ) { stack[sp-2] = stack[sp-2] == stack[sp-1]; sp-- } else if (op == NE ) { stack[sp-2] = stack[sp-2] != stack[sp-1]; sp-- } else if (op == AND ) { stack[sp-2] = stack[sp-2] && stack[sp-1]; sp-- } else if (op == OR ) { stack[sp-2] = stack[sp-2] || stack[sp-1]; sp-- } else if (op == NEG ) { stack[sp-1] = - stack[sp-1] } else if (op == NOT ) { stack[sp-1] = ! stack[sp-1] } else if (op == JMP ) { pc += bytes_to_int(pc) } else if (op == JZ ) { if (stack[--sp]) { pc += word_size } else { pc += bytes_to_int(pc) } } else if (op == PRTC) { printf("%c", stack[--sp]) } else if (op == PRTS) { printf("%s", string_pool[stack[--sp]]) } else if (op == PRTI) { printf("%d", stack[--sp]) } else if (op == HALT) { break } } # while } function str_trans(srce, dest, i) { dest = "" for (i=1; i <= length(srce); ) { if (substr(srce, i, 1) == "\\" && i < length(srce)) { if (substr(srce, i+1, 1) == "n") { dest = dest "\n" i += 2 } else if (substr(srce, i+1, 1) == "\\") { dest = dest "\\" i += 2 } } else { dest = dest substr(srce, i, 1) i += 1 } } return dest } function load_code( n, i) { getline line if (line == "") error("empty line") n=split(line, line_list) data_size = line_list[2] n_strings = line_list[4] for (i=0; i 1) input_file = ARGV[1] data_size = load_code() run_vm(data_size) }