From ae01f53d15516113447101852c9da7d665444180 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Wed, 18 Mar 2026 18:48:01 +0300 Subject: [PATCH] Improve interpreter input handling --- apps/interpreter/source/main.cpp | 83 +++++++++++++++++++++++++------- 1 file changed, 66 insertions(+), 17 deletions(-) diff --git a/apps/interpreter/source/main.cpp b/apps/interpreter/source/main.cpp index 9aa285d..2eada0c 100644 --- a/apps/interpreter/source/main.cpp +++ b/apps/interpreter/source/main.cpp @@ -97,36 +97,85 @@ int main(int argc, char ** argv) std::vector filenames; std::vector parsed; + bool no_more_options = false; + for (int arg = 1; arg < argc; ++arg) { - if (std::strcmp(argv[arg], "-d") == 0 || std::strcmp(argv[arg], "--dump") == 0) + if (argv[arg][0] == 0) + continue; + + if (std::strcmp(argv[arg], "--") == 0) { - dump = true; + no_more_options = true; continue; } - if (std::strcmp(argv[arg], "-t") == 0 || std::strcmp(argv[arg], "--trace") == 0) + if (!no_more_options) { - context.trace = true; - continue; + if (argv[arg][0] == '-' && argv[arg][1] != 0 && argv[arg][1] != '-') + { + for (char * p = argv[arg] + 1; *p != 0; ++p) + { + if (*p == 'd') + dump = true; + else if (*p == 't') + context.trace = true; + else if (*p == 'p') + dump_ast = true; + else if (*p == 'i') + dump_ir = true; + else if (*p == 'j') + jit = true; + else + { + std::cerr << "Unknown option '" << *p << "'\n"; + return EXIT_FAILURE; + } + } + continue; + } + + if (std::strcmp(argv[arg], "--dump") == 0) + { + dump = true; + continue; + } + + if (std::strcmp(argv[arg], "--trace") == 0) + { + context.trace = true; + continue; + } + + if (std::strcmp(argv[arg], "--print") == 0) + { + dump_ast = true; + continue; + } + + if (std::strcmp(argv[arg], "--ir") == 0) + { + dump_ir = true; + continue; + } + + if (std::strcmp(argv[arg], "--jit") == 0) + { + jit = true; + continue; + } } - if (std::strcmp(argv[arg], "-p") == 0 || std::strcmp(argv[arg], "--print") == 0) + if (!std::filesystem::exists(argv[arg])) { - dump_ast = true; - continue; + std::cerr << "Error: input file \"" << argv[arg] << "\" does not exist\n"; + return EXIT_FAILURE; } - if (std::strcmp(argv[arg], "-i") == 0 || std::strcmp(argv[arg], "--ir") == 0) + if (std::filesystem::is_directory(argv[arg])) { - dump_ir = true; - continue; - } - - if (std::strcmp(argv[arg], "-j") == 0 || std::strcmp(argv[arg], "--jit") == 0) - { - jit = true; - continue; + std::cerr << "Error: input file \"" << argv[arg] << "\" is a directory\n"; + return EXIT_FAILURE; } try