diff options
author | Timothy Flynn <trflynn89@pm.me> | 2021-08-02 10:47:41 -0400 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-08-04 11:18:24 +0200 |
commit | 1bb6404a19eab97586fb76445bf62f8451cc81ff (patch) | |
tree | 3e73dac1f8953d4c68a44b3d9b4ed1f13e782605 /Userland/Libraries/LibUnicode/CodeGenerators | |
parent | 9413c3a0d12d8f137fc1024d099eff429fba8ab9 (diff) | |
download | serenity-1bb6404a19eab97586fb76445bf62f8451cc81ff.zip |
LibUnicode: Invoke Unicode data generator a single time
It takes a non-neglible amount of time to parse all of the UCD files and
generate the Unicode data files. To help compile times, only invoke the
generator once.
Diffstat (limited to 'Userland/Libraries/LibUnicode/CodeGenerators')
-rw-r--r-- | Userland/Libraries/LibUnicode/CodeGenerators/GenerateUnicodeData.cpp | 52 |
1 files changed, 30 insertions, 22 deletions
diff --git a/Userland/Libraries/LibUnicode/CodeGenerators/GenerateUnicodeData.cpp b/Userland/Libraries/LibUnicode/CodeGenerators/GenerateUnicodeData.cpp index a29aff8867..6b113a0c2f 100644 --- a/Userland/Libraries/LibUnicode/CodeGenerators/GenerateUnicodeData.cpp +++ b/Userland/Libraries/LibUnicode/CodeGenerators/GenerateUnicodeData.cpp @@ -121,6 +121,18 @@ static constexpr auto s_desired_fields = Array { "simple_lowercase_mapping"sv, }; +static void write_to_file_if_different(Core::File& file, StringView contents) +{ + auto const current_contents = file.read_all(); + + if (StringView { current_contents.bytes() } == contents) + return; + + VERIFY(file.seek(0)); + VERIFY(file.truncate(0)); + VERIFY(file.write(contents)); +} + static void parse_special_casing(Core::File& file, UnicodeData& unicode_data) { auto parse_code_point_list = [&](auto const& line) { @@ -372,7 +384,7 @@ static void parse_unicode_data(Core::File& file, UnicodeData& unicode_data) } } -static void generate_unicode_data_header(UnicodeData& unicode_data) +static void generate_unicode_data_header(Core::File& file, UnicodeData& unicode_data) { StringBuilder builder; SourceGenerator generator { builder }; @@ -529,12 +541,13 @@ Optional<GeneralCategory> general_category_from_string(StringView const& general } -})~~~"); +} +)~~~"); - outln("{}", generator.as_string_view()); + write_to_file_if_different(file, generator.as_string_view()); } -static void generate_unicode_data_implementation(UnicodeData unicode_data) +static void generate_unicode_data_implementation(Core::File& file, UnicodeData const& unicode_data) { StringBuilder builder; SourceGenerator generator { builder }; @@ -735,15 +748,16 @@ Optional<GeneralCategory> general_category_from_string(StringView const& general } -})~~~"); +} +)~~~"); - outln("{}", generator.as_string_view()); + write_to_file_if_different(file, generator.as_string_view()); } int main(int argc, char** argv) { - bool generate_header = false; - bool generate_implementation = false; + char const* generated_header_path = nullptr; + char const* generated_implementation_path = nullptr; char const* unicode_data_path = nullptr; char const* special_casing_path = nullptr; char const* prop_list_path = nullptr; @@ -753,8 +767,8 @@ int main(int argc, char** argv) char const* word_break_path = nullptr; Core::ArgsParser args_parser; - args_parser.add_option(generate_header, "Generate the Unicode Data header file", "generate-header", 'h'); - args_parser.add_option(generate_implementation, "Generate the Unicode Data implementation file", "generate-implementation", 'c'); + args_parser.add_option(generated_header_path, "Path to the Unicode Data header file to generate", "generated-header-path", 'h', "generated-header-path"); + args_parser.add_option(generated_implementation_path, "Path to the Unicode Data implementation file to generate", "generated-implementation-path", 'c', "generated-implementation-path"); args_parser.add_option(unicode_data_path, "Path to UnicodeData.txt file", "unicode-data-path", 'u', "unicode-data-path"); args_parser.add_option(special_casing_path, "Path to SpecialCasing.txt file", "special-casing-path", 's', "special-casing-path"); args_parser.add_option(prop_list_path, "Path to PropList.txt file", "prop-list-path", 'p', "prop-list-path"); @@ -764,20 +778,14 @@ int main(int argc, char** argv) args_parser.add_option(word_break_path, "Path to WordBreakProperty.txt file", "word-break-path", 'w', "word-break-path"); args_parser.parse(argc, argv); - if (!generate_header && !generate_implementation) { - warnln("At least one of -h/--generate-header or -c/--generate-implementation is required"); - args_parser.print_usage(stderr, argv[0]); - return 1; - } - - auto open_file = [&](StringView path, StringView flags) { + auto open_file = [&](StringView path, StringView flags, Core::OpenMode mode = Core::OpenMode::ReadOnly) { if (path.is_empty()) { warnln("{} is required", flags); args_parser.print_usage(stderr, argv[0]); exit(1); } - auto file_or_error = Core::File::open(path, Core::OpenMode::ReadOnly); + auto file_or_error = Core::File::open(path, mode); if (file_or_error.is_error()) { warnln("Failed to open {}: {}", path, file_or_error.release_error()); exit(1); @@ -786,6 +794,8 @@ int main(int argc, char** argv) return file_or_error.release_value(); }; + auto generated_header_file = open_file(generated_header_path, "-h/--generated-header-path", Core::OpenMode::ReadWrite); + auto generated_implementation_file = open_file(generated_implementation_path, "-c/--generated-implementation-path", Core::OpenMode::ReadWrite); auto unicode_data_file = open_file(unicode_data_path, "-u/--unicode-data-path"); auto special_casing_file = open_file(special_casing_path, "-s/--special-casing-path"); auto prop_list_file = open_file(prop_list_path, "-p/--prop-list-path"); @@ -803,10 +813,8 @@ int main(int argc, char** argv) parse_unicode_data(unicode_data_file, unicode_data); parse_value_alias_list(prop_value_alias_file, "gc"sv, unicode_data.general_categories, unicode_data.general_category_unions, unicode_data.general_category_aliases); - if (generate_header) - generate_unicode_data_header(unicode_data); - if (generate_implementation) - generate_unicode_data_implementation(move(unicode_data)); + generate_unicode_data_header(generated_header_file, unicode_data); + generate_unicode_data_implementation(generated_implementation_file, unicode_data); return 0; } |