From 5623b1dd225c15fe71f6a45aeb4a0479f4aa7bb8 Mon Sep 17 00:00:00 2001 From: eidheim Date: Thu, 13 Aug 2026 13:09:46 +0200 Subject: [PATCH] Improved shebang detection code --- src/source_base.cpp | 48 +++++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/src/source_base.cpp b/src/source_base.cpp index 2f141fe..682c09d 100644 --- a/src/source_base.cpp +++ b/src/source_base.cpp @@ -38,24 +38,6 @@ Glib::RefPtr Source::StyleSchemeManager::get_default() return instance; } -static Glib::RefPtr guess_shebang(const boost::filesystem::path &file_path, Glib::RefPtr &language_manager) { - std::ifstream input(file_path.string(), std::ios::binary); - std::string line; - if(!std::getline(input, line) || line.empty() || line == "#!") - return {}; - - if(line.find("perl") < line.size()) - return language_manager->get_language("perl"); - else if(line.find("python3") < line.size()) - return language_manager->get_language("python3"); - else if(line.find("python") < line.size()) - return language_manager->get_language("python"); - else if(line.find("sh") < line.size()) - return language_manager->get_language("sh"); - - return {}; -} - Glib::RefPtr Source::guess_language(const boost::filesystem::path &file_path) { auto language_manager = LanguageManager::get_default(); bool result_uncertain = false; @@ -96,11 +78,31 @@ Glib::RefPtr Source::guess_language(const boost::filesystem::path language = language_manager->get_language("cpphdr"); else { std::ifstream input(file_path.string(), std::ios::binary); - std::string tag(5, '\0'); - if(input && input.read(&tag[0], static_cast(tag.size())) && tag == "get_language("xml"); - else if(input && starts_with(tag, "#!")) - language = guess_shebang(file_path, language_manager); + std::string first_chars(2, '\0'); + if(input && input.read(&first_chars[0], static_cast(first_chars.size()))) { + if(first_chars == "(next_chars.size())) && next_chars == "xml") + language = language_manager->get_language("xml"); + } + else if(first_chars == "#!") { + boost::filesystem::path interpreter; + input >> interpreter; + auto interpreter_filename = interpreter.filename().string(); + if(interpreter_filename == "env") + input >> interpreter_filename; + if(interpreter_filename == "perl") + return language_manager->get_language("perl"); + else if(interpreter_filename == "python3") + return language_manager->get_language("python3"); + else if(interpreter_filename == "python") + return language_manager->get_language("python"); + else if(interpreter_filename == "sh" || interpreter_filename == "bash") + return language_manager->get_language("sh"); + else if(interpreter_filename == "node") + return language_manager->get_language("js"); + } + } } } else if(language->get_id() == "cuda") {