예제 #1
0
파일: main.c 프로젝트: kelcecil/ponyc
int main(int argc, char* argv[])
{
  stringtab_init();

  pass_opt_t opt;
  pass_opt_init(&opt);

  opt.release = true;
  opt.output = ".";

  ast_setwidth(get_width());
  bool print_program_ast = false;
  bool print_package_ast = false;

  opt_state_t s;
  ponyint_opt_init(args, &s, &argc, argv);

  bool ok = true;
  bool print_usage = false;
  int id;

  while((id = ponyint_opt_next(&s)) != -1)
  {
    switch(id)
    {
      case OPT_VERSION:
        printf("%s [%s] (llvm %s)\n", PONY_VERSION, PONY_BUILD_CONFIG,
          LLVM_VERSION);
        return 0;

      case OPT_DEBUG: opt.release = false; break;
      case OPT_BUILDFLAG: define_build_flag(s.arg_val); break;
      case OPT_STRIP: opt.strip_debug = true; break;
      case OPT_PATHS: package_add_paths(s.arg_val, &opt); break;
      case OPT_OUTPUT: opt.output = s.arg_val; break;
      case OPT_LIBRARY: opt.library = true; break;
      case OPT_RUNTIMEBC: opt.runtimebc = true; break;
      case OPT_PIC: opt.pic = true; break;
      case OPT_DOCS: opt.docs = true; break;

      case OPT_SAFE:
        if(!package_add_safe(s.arg_val, &opt))
          ok = false;
        break;

      case OPT_IEEEMATH: opt.ieee_math = true; break;
      case OPT_CPU: opt.cpu = s.arg_val; break;
      case OPT_FEATURES: opt.features = s.arg_val; break;
      case OPT_TRIPLE: opt.triple = s.arg_val; break;
      case OPT_STATS: opt.print_stats = true; break;
      case OPT_LINK_ARCH: opt.link_arch = s.arg_val; break;
      case OPT_LINKER: opt.linker = s.arg_val; break;

      case OPT_AST: print_program_ast = true; break;
      case OPT_ASTPACKAGE: print_package_ast = true; break;
      case OPT_TRACE: parse_trace(true); break;
      case OPT_WIDTH: ast_setwidth(atoi(s.arg_val)); break;
      case OPT_IMMERR: errors_set_immediate(opt.check.errors, true); break;
      case OPT_VERIFY: opt.verify = true; break;
      case OPT_EXTFUN: opt.extfun = true; break;
      case OPT_FILENAMES: opt.print_filenames = true; break;
      case OPT_CHECKTREE: opt.check_tree = true; break;

      case OPT_BNF: print_grammar(false, true); return 0;
      case OPT_ANTLR: print_grammar(true, true); return 0;
      case OPT_ANTLRRAW: print_grammar(true, false); return 0;

      case OPT_VERBOSE:
        {
          int v = atoi(s.arg_val);
          if (v >= 0 && v <= 4) {
            opt.verbosity = (verbosity_level)v;
          } else {
            ok = false;
          }
        }
        break;

      case OPT_PASSES:
        if(!limit_passes(&opt, s.arg_val))
        {
          ok = false;
          print_usage = true;
        }
        break;

      default: usage(); return -1;
    }
  }

  for(int i = 1; i < argc; i++)
  {
    if(argv[i][0] == '-')
    {
      printf("Unrecognised option: %s\n", argv[i]);
      ok = false;
      print_usage = true;
    }
  }

#if defined(PLATFORM_IS_WINDOWS)
  opt.strip_debug = true;
#endif

  if(!ok)
  {
    errors_print(opt.check.errors);

    if(print_usage)
      usage();

    return -1;
  }

  if(ponyc_init(&opt))
  {
    if(argc == 1)
    {
      ok &= compile_package(".", &opt, print_program_ast, print_package_ast);
    } else {
      for(int i = 1; i < argc; i++)
        ok &= compile_package(argv[i], &opt, print_program_ast,
          print_package_ast);
    }
  }

  if(!ok && errors_get_count(opt.check.errors) == 0)
    printf("Error: internal failure not reported\n");

  ponyc_shutdown(&opt);
  pass_opt_done(&opt);

  return ok ? 0 : -1;
}
예제 #2
0
파일: main.c 프로젝트: mgist/ponyc
int main(int argc, char* argv[])
{
  stringtab_init();

  pass_opt_t opt;
  pass_opt_init(&opt);

  opt.release = true;
  opt.output = ".";

  ast_setwidth(get_width());
  bool print_program_ast = false;
  bool print_package_ast = false;

  opt_state_t s;
  opt_init(args, &s, &argc, argv);

  bool ok = true;
  bool print_usage = false;
  int id;

  while((id = opt_next(&s)) != -1)
  {
    switch(id)
    {
      case OPT_VERSION:
        printf("%s\n", PONY_VERSION);
        return 0;

      case OPT_DEBUG: opt.release = false; break;
      case OPT_BUILDFLAG: define_build_flag(s.arg_val); break;
      case OPT_STRIP: opt.strip_debug = true; break;
      case OPT_PATHS: package_add_paths(s.arg_val); break;
      case OPT_OUTPUT: opt.output = s.arg_val; break;
      case OPT_LIBRARY: opt.library = true; break;
      case OPT_DOCS: opt.docs = true; break;

      case OPT_SAFE:
        if(!package_add_safe(s.arg_val))
          ok = false;
        break;

      case OPT_IEEEMATH: opt.ieee_math = true; break;
      case OPT_CPU: opt.cpu = s.arg_val; break;
      case OPT_FEATURES: opt.features = s.arg_val; break;
      case OPT_TRIPLE: opt.triple = s.arg_val; break;
      case OPT_STATS: opt.print_stats = true; break;

      case OPT_AST: print_program_ast = true; break;
      case OPT_ASTPACKAGE: print_package_ast = true; break;
      case OPT_TRACE: parse_trace(true); break;
      case OPT_WIDTH: ast_setwidth(atoi(s.arg_val)); break;
      case OPT_IMMERR: error_set_immediate(true); break;
      case OPT_VERIFY: opt.verify = true; break;
      case OPT_FILENAMES: opt.print_filenames = true; break;
      case OPT_CHECKTREE: enable_check_tree(true); break;

      case OPT_BNF: print_grammar(false, true); return 0;
      case OPT_ANTLR: print_grammar(true, true); return 0;
      case OPT_ANTLRRAW: print_grammar(true, false); return 0;

      case OPT_PASSES:
        if(!limit_passes(&opt, s.arg_val))
        {
          ok = false;
          print_usage = true;
        }
        break;

      default: usage(); return -1;
    }
  }

  for(int i = 1; i < argc; i++)
  {
    if(argv[i][0] == '-')
    {
      printf("Unrecognised option: %s\n", argv[i]);
      ok = false;
      print_usage = true;
    }
  }

#ifdef PLATFORM_IS_WINDOWS
  opt.strip_debug = true;
#endif

  if(!ok)
  {
    print_errors();

    if(print_usage)
      usage();

    return -1;
  }

  if(package_init(&opt))
  {
    if(argc == 1)
    {
      ok &= compile_package(".", &opt, print_program_ast, print_package_ast);
    } else {
      for(int i = 1; i < argc; i++)
        ok &= compile_package(argv[i], &opt, print_program_ast,
          print_package_ast);
    }
  }

  if(!ok && get_error_count() == 0)
    printf("Error: internal failure not reported\n");

  package_done(&opt);
  pass_opt_done(&opt);
  stringtab_done();

  return ok ? 0 : -1;
}