Exemple #1
0
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;
}
Exemple #2
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;
}