int main(int argc, char *argv[]) { char out_filename[256]; if (argc >= 2) { make_out_filename(out_filename, argv[1]); freopen(argv[1], "r", stdin); freopen(out_filename, "w", stdout); } puts("#include <stdio.h>"); puts("#include <stdlib.h>"); puts("#include <string.h>\n"); puts("typedef unsigned char byte;"); puts("static byte *ptr_start, *ptr_end, *ptr;\n"); puts("#define MEM_SIZE ( 32768 )"); puts("#ifdef NOCHECK"); puts("#define CHK(p) ( p )"); puts("#else"); puts("#define CHK(p) ( chk(p) )"); puts("static void chk(byte *p){"); puts(" if(p<ptr_start||ptr_end<=p){"); puts(" fprintf(stderr,\"Error: Memory Out Of Bounds.\\n\");"); puts(" exit(1);"); puts(" }"); puts("}"); puts("#endif\n"); puts("int main(int argc, char *argv[]){"); puts(" int i=1,mem_size=MEM_SIZE;"); puts(" for (; i < argc;){"); puts(" if (strcmp(argv[i], \"-m\") == 0){"); puts(" i++;"); puts(" if (i < argc) mem_size=atoi(argv[i++]);"); puts(" } else i++;"); puts(" }"); puts(" if (mem_size<1) mem_size=1;"); puts(" ptr_start=(byte *)calloc(mem_size, 1);"); puts(" ptr_end=ptr_start+mem_size;"); puts(" ptr=ptr_start;"); puts("/* -- translated code -- */"); emit_code(); while (g_indent_level > 0) { print_code("break;"); --g_indent_level; print_code("}"); fprintf(stderr, "Warning: Incorrect Nesting.\n"); } puts("/* -- end -- */"); puts(" putchar('\\n');"); puts(" free(ptr_start);"); puts(" return 0;"); puts("}\n"); return 0; }
int main(int argc, char *argv[]) { Options opts = parse_args(argc, argv); FILE *in_file; if (!(in_file = fopen(opts.in_filename, "r"))) { file_error("could not open file for reading", opts.in_filename); } if (opts.out_filename == NULL) { // write to stdout by default opts.out_filename = make_out_filename(opts.in_filename, "hack"); } FILE *out_file; if (!(out_file = fopen(opts.out_filename, "w"))) { file_error("could not open file for writing", opts.out_filename); } assemble_file(in_file, out_file); return 0; }