diff options
Diffstat (limited to 'protocols/Telegram/tdlib/td/tdtl')
19 files changed, 239 insertions, 129 deletions
diff --git a/protocols/Telegram/tdlib/td/tdtl/CMakeLists.txt b/protocols/Telegram/tdlib/td/tdtl/CMakeLists.txt index b0f83cd98d..8b139ddc68 100644 --- a/protocols/Telegram/tdlib/td/tdtl/CMakeLists.txt +++ b/protocols/Telegram/tdlib/td/tdtl/CMakeLists.txt @@ -1,4 +1,6 @@ -cmake_minimum_required(VERSION 3.0.2 FATAL_ERROR) +if ((CMAKE_MAJOR_VERSION LESS 3) OR (CMAKE_VERSION VERSION_LESS "3.0.2")) + message(FATAL_ERROR "CMake >= 3.0.2 is required") +endif() #SOURCE SETS set(TDTL_SOURCE diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_config.cpp b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_config.cpp index e796596760..871b7e22b3 100644 --- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_config.cpp +++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_config.cpp @@ -1,10 +1,10 @@ // -// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // -#include "tl_config.h" +#include "td/tl/tl_config.h" #include <cassert> #include <cstdio> @@ -40,7 +40,7 @@ void tl_config::add_type(tl_type *type) { } tl_type *tl_config::get_type(std::int32_t type_id) const { - auto it = id_to_type.find(type_id); + std::map<std::int32_t, tl_type *>::const_iterator it = id_to_type.find(type_id); assert(it != id_to_type.end()); return it->second; } @@ -327,7 +327,7 @@ tl_type *tl_config_parser::read_type() { tl_config tl_config_parser::parse_config() { schema_version = get_schema_version(try_parse_int()); if (schema_version < 2) { - std::fprintf(stderr, "Unsupported tl-schema verdion %d\n", static_cast<int>(schema_version)); + std::fprintf(stderr, "Unsupported tl-schema version %d\n", static_cast<int>(schema_version)); std::abort(); } @@ -344,6 +344,7 @@ tl_config tl_config_parser::parse_config() { std::int32_t constructors_n = try_parse_int(); assert(static_cast<std::size_t>(constructors_n) == constructors_total); + (void)constructors_total; for (std::int32_t i = 0; i < constructors_n; i++) { tl_combinator *constructor = read_combinator(); config.get_type(constructor->type_id)->add_constructor(constructor); diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_config.h b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_config.h index 6a25a9cd09..9735a83626 100644 --- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_config.h +++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_config.h @@ -1,13 +1,13 @@ // -// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #pragma once -#include "tl_core.h" -#include "tl_simple_parser.h" +#include "td/tl/tl_core.h" +#include "td/tl/tl_simple_parser.h" #include <cstddef> #include <cstdint> @@ -77,7 +77,7 @@ class tl_config_parser { std::string try_parse_string(); public: - tl_config_parser(const char *s, std::size_t len) : p(s, len) { + tl_config_parser(const char *s, std::size_t len) : p(s, len), schema_version(-1) { } tl_config parse_config(); diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_core.cpp b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_core.cpp index f8aa6eb10d..a77e7092f3 100644 --- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_core.cpp +++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_core.cpp @@ -1,10 +1,10 @@ // -// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // -#include "tl_core.h" +#include "td/tl/tl_core.h" #include <cassert> diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_core.h b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_core.h index 04fabe1168..edf7580a80 100644 --- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_core.h +++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_core.h @@ -1,5 +1,5 @@ // -// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_outputer.cpp b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_outputer.cpp index 046a1ce84e..6d52a27079 100644 --- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_outputer.cpp +++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_outputer.cpp @@ -1,10 +1,10 @@ // -// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // -#include "tl_file_outputer.h" +#include "td/tl/tl_file_outputer.h" #include <cassert> diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_outputer.h b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_outputer.h index 3b9c66caaf..7be40d5635 100644 --- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_outputer.h +++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_outputer.h @@ -1,12 +1,12 @@ // -// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #pragma once -#include "tl_outputer.h" +#include "td/tl/tl_outputer.h" #include <cstdio> #include <string> diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_utils.cpp b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_utils.cpp index bc79d7254e..5aa5d31942 100644 --- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_utils.cpp +++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_utils.cpp @@ -1,14 +1,13 @@ // -// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // -#include "tl_file_utils.h" +#include "td/tl/tl_file_utils.h" #include <cstdio> #include <cstdlib> -#include <cstring> namespace td { namespace tl { @@ -32,11 +31,13 @@ std::string get_file_contents(const std::string &file_name, const std::string &m std::size_t size = static_cast<std::size_t>(size_long); std::string result(size, ' '); - std::rewind(f); - std::size_t fread_res = std::fread(&result[0], size, 1, f); - if (size != 0 && fread_res != 1) { - std::fprintf(stderr, "Can't read file \"%s\"", file_name.c_str()); - std::abort(); + if (size != 0) { + std::rewind(f); + std::size_t fread_res = std::fread(&result[0], size, 1, f); + if (fread_res != 1) { + std::fprintf(stderr, "Can't read file \"%s\"", file_name.c_str()); + std::abort(); + } } std::fclose(f); diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_utils.h b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_utils.h index 50e40b4418..2854cdc9ea 100644 --- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_utils.h +++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_file_utils.h @@ -1,5 +1,5 @@ // -// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_generate.cpp b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_generate.cpp index 401d451cd6..d2d7528ea3 100644 --- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_generate.cpp +++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_generate.cpp @@ -1,17 +1,17 @@ // -// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // -#include "tl_generate.h" +#include "td/tl/tl_generate.h" -#include "tl_config.h" -#include "tl_core.h" -#include "tl_file_utils.h" -#include "tl_outputer.h" -#include "tl_string_outputer.h" -#include "tl_writer.h" +#include "td/tl/tl_config.h" +#include "td/tl/tl_core.h" +#include "td/tl/tl_file_utils.h" +#include "td/tl/tl_outputer.h" +#include "td/tl/tl_string_outputer.h" +#include "td/tl/tl_writer.h" #include <cassert> #include <cstdint> @@ -53,26 +53,26 @@ static bool is_reachable_for_storer(int storer_type, const std::string &name, static void write_class_constructor(tl_outputer &out, const tl_combinator *t, const std::string &class_name, bool is_default, const TL_writer &w) { // std::fprintf(stderr, "Gen constructor %s\n", class_name.c_str()); - int fields_num = 0; + int field_count = 0; for (std::size_t i = 0; i < t->args.size(); i++) { - fields_num += !w.gen_constructor_parameter(0, class_name, t->args[i], is_default).empty(); + field_count += !w.gen_constructor_parameter(field_count, class_name, t->args[i], is_default).empty(); } - out.append(w.gen_constructor_begin(fields_num, class_name, is_default)); + out.append(w.gen_constructor_begin(field_count, class_name, is_default)); int field_num = 0; for (std::size_t i = 0; i < t->args.size(); i++) { std::string parameter_init = w.gen_constructor_parameter(field_num, class_name, t->args[i], is_default); - if (parameter_init.size()) { + if (!parameter_init.empty()) { out.append(parameter_init); field_num++; } } - assert(field_num == fields_num); + assert(field_num == field_count); field_num = 0; for (std::size_t i = 0; i < t->args.size(); i++) { std::string field_init = w.gen_constructor_field_init(field_num, class_name, t->args[i], is_default); - if (field_init.size()) { + if (!field_init.empty()) { out.append(field_init); field_num++; } @@ -85,38 +85,37 @@ static void write_function_fetch(tl_outputer &out, const std::string &parser_nam const std::string &class_name, const std::set<std::string> &request_types, const std::set<std::string> &result_types, const TL_writer &w) { // std::fprintf(stderr, "Write function fetch %s\n", class_name.c_str()); - std::vector<var_description> vars(t->var_count); int parser_type = w.get_parser_type(t, parser_name); if (!is_reachable_for_parser(parser_type, t->name, request_types, result_types, w)) { return; } - out.append(w.gen_fetch_function_begin(parser_name, class_name, 0, vars, parser_type)); + std::vector<var_description> vars(t->var_count); + out.append(w.gen_fetch_function_begin(parser_name, class_name, class_name, 0, static_cast<int>(t->args.size()), vars, + parser_type)); out.append(w.gen_vars(t, NULL, vars)); int field_num = 0; for (std::size_t i = 0; i < t->args.size(); i++) { std::string field_fetch = w.gen_field_fetch(field_num, t->args[i], vars, false, parser_type); - if (field_fetch.size()) { + if (!field_fetch.empty()) { out.append(field_fetch); field_num++; } } - out.append(w.gen_fetch_function_end(field_num, vars, parser_type)); + out.append(w.gen_fetch_function_end(false, field_num, vars, parser_type)); } -static std::vector<var_description> write_function_store(tl_outputer &out, const std::string &storer_name, - const tl_combinator *t, const std::string &class_name, - std::vector<var_description> &vars, - const std::set<std::string> &request_types, - const std::set<std::string> &result_types, - const TL_writer &w) { +static void write_function_store(tl_outputer &out, const std::string &storer_name, const tl_combinator *t, + const std::string &class_name, std::vector<var_description> &vars, + const std::set<std::string> &request_types, const std::set<std::string> &result_types, + const TL_writer &w) { // std::fprintf(stderr, "Write function store %s\n", class_name.c_str()); int storer_type = w.get_storer_type(t, storer_name); if (!is_reachable_for_storer(storer_type, t->name, request_types, result_types, w)) { - return vars; + return; } out.append(w.gen_store_function_begin(storer_name, class_name, 0, vars, storer_type)); @@ -126,8 +125,6 @@ static std::vector<var_description> write_function_store(tl_outputer &out, const } out.append(w.gen_store_function_end(vars, storer_type)); - - return vars; } static void write_function_result_fetch(tl_outputer &out, const std::string &parser_name, const tl_combinator *t, @@ -167,31 +164,32 @@ static void write_function_result_fetch(tl_outputer &out, const std::string &par } static void write_constructor_fetch(tl_outputer &out, const std::string &parser_name, const tl_combinator *t, - const std::string &class_name, const tl_tree_type *result_type, bool is_flat, + const std::string &class_name, const std::string &parent_class_name, + const tl_tree_type *result_type, bool is_flat, const std::set<std::string> &request_types, const std::set<std::string> &result_types, const TL_writer &w) { - std::vector<var_description> vars(t->var_count); - int parser_type = w.get_parser_type(t, parser_name); if (!is_reachable_for_parser(parser_type, t->name, request_types, result_types, w)) { return; } - out.append(w.gen_fetch_function_begin(parser_name, class_name, static_cast<int>(result_type->children.size()), vars, - parser_type)); + std::vector<var_description> vars(t->var_count); + out.append(w.gen_fetch_function_begin(parser_name, class_name, parent_class_name, + static_cast<int>(result_type->children.size()), + static_cast<int>(t->args.size()), vars, parser_type)); out.append(w.gen_vars(t, result_type, vars)); out.append(w.gen_uni(result_type, vars, true)); int field_num = 0; for (std::size_t i = 0; i < t->args.size(); i++) { std::string field_fetch = w.gen_field_fetch(field_num, t->args[i], vars, is_flat, parser_type); - if (field_fetch.size()) { + if (!field_fetch.empty()) { out.append(field_fetch); field_num++; } } - out.append(w.gen_fetch_function_end(field_num, vars, parser_type)); + out.append(w.gen_fetch_function_end(class_name != parent_class_name, field_num, vars, parser_type)); } static void write_constructor_store(tl_outputer &out, const std::string &storer_name, const tl_combinator *t, @@ -233,7 +231,7 @@ static int gen_field_definitions(tl_outputer &out, const tl_combinator *t, const } std::string type_name = w.gen_field_type(a); - if (type_name.size()) { + if (!type_name.empty()) { out.append(w.gen_field_definition(class_name, type_name, w.gen_field_name(a.name))); } } @@ -247,16 +245,18 @@ static void write_function(tl_outputer &out, const tl_combinator *t, const std:: std::string class_name = w.gen_class_name(t->name); - out.append(w.gen_class_begin(class_name, w.gen_base_function_class_name(), false)); + out.append(w.gen_class_begin(class_name, w.gen_base_function_class_name(), false, t->result)); int required_args = gen_field_definitions(out, t, class_name, w); - out.append(w.gen_flags_definitions(t)); + out.append(w.gen_flags_definitions(t, true)); std::vector<var_description> vars(t->var_count); out.append(w.gen_function_vars(t, vars)); - write_class_constructor(out, t, class_name, true, w); - if (required_args) { + if (w.is_default_constructor_generated(t, false, true)) { + write_class_constructor(out, t, class_name, true, w); + } + if (required_args && w.is_full_constructor_generated(t, false, true)) { write_class_constructor(out, t, class_name, false, w); } @@ -294,19 +294,50 @@ static void write_function(tl_outputer &out, const tl_combinator *t, const std:: out.append(w.gen_class_end()); } -static void write_constructor(tl_outputer &out, const tl_combinator *t, const std::string &base_class, bool is_proxy, +static void write_constructor(tl_outputer &out, const tl_combinator *t, const std::string &base_class, + const std::string &parent_class, bool is_proxy, const std::set<std::string> &request_types, const std::set<std::string> &result_types, const TL_writer &w) { assert(w.is_combinator_supported(t)); std::string class_name = w.gen_class_name(t->name); - out.append(w.gen_class_begin(class_name, base_class, is_proxy)); + out.append(w.gen_class_begin(class_name, base_class, is_proxy, t->result)); int required_args = gen_field_definitions(out, t, class_name, w); - out.append(w.gen_flags_definitions(t)); - write_class_constructor(out, t, class_name, true, w); - if (required_args) { + bool can_be_parsed = false; + bool is_can_be_parsed_inited = false; + std::vector<std::string> parsers = w.get_parsers(); + for (std::size_t i = 0; i < parsers.size(); i++) { + int parser_type = w.get_parser_type(t, parsers[i]); + if (w.get_parser_mode(parser_type) != TL_writer::All) { + can_be_parsed |= is_reachable_for_parser(parser_type, t->name, request_types, result_types, w); + is_can_be_parsed_inited = true; + } + } + if (!is_can_be_parsed_inited) { + can_be_parsed = true; + } + + bool can_be_stored = false; + bool is_can_be_stored_inited = false; + std::vector<std::string> storers = w.get_storers(); + for (std::size_t i = 0; i < storers.size(); i++) { + int storer_type = w.get_storer_type(t, storers[i]); + if (w.get_storer_mode(storer_type) != TL_writer::All) { + can_be_stored |= is_reachable_for_storer(storer_type, t->name, request_types, result_types, w); + is_can_be_stored_inited = true; + } + } + if (!is_can_be_stored_inited) { + can_be_stored = true; + } + + out.append(w.gen_flags_definitions(t, can_be_stored)); + if (w.is_default_constructor_generated(t, can_be_parsed, can_be_stored)) { + write_class_constructor(out, t, class_name, true, w); + } + if (required_args && w.is_full_constructor_generated(t, can_be_parsed, can_be_stored)) { write_class_constructor(out, t, class_name, false, w); } @@ -316,15 +347,13 @@ static void write_constructor(tl_outputer &out, const tl_combinator *t, const st assert(t->result->get_type() == NODE_TYPE_TYPE); const tl_tree_type *result_type = static_cast<const tl_tree_type *>(t->result); - std::vector<std::string> parsers = w.get_parsers(); for (std::size_t i = 0; i < parsers.size(); i++) { - write_constructor_fetch(out, parsers[i], t, class_name, result_type, + write_constructor_fetch(out, parsers[i], t, class_name, parent_class, result_type, required_args == 1 && result_type->type->simple_constructors == 1, request_types, result_types, w); } // STORER - std::vector<std::string> storers = w.get_storers(); for (std::size_t i = 0; i < storers.size(); i++) { write_constructor_store(out, storers[i], t, class_name, result_type, required_args == 1 && result_type->type->simple_constructors == 1, request_types, @@ -357,7 +386,7 @@ void write_class(tl_outputer &out, const tl_type *t, const std::set<std::string> std::vector<var_description> empty_vars; bool optimize_one_constructor = (t->simple_constructors == 1); if (!optimize_one_constructor) { - out.append(w.gen_class_begin(class_name, base_class, true)); + out.append(w.gen_class_begin(class_name, base_class, true, nullptr)); out.append(w.gen_get_id(class_name, 0, true)); @@ -367,7 +396,7 @@ void write_class(tl_outputer &out, const tl_type *t, const std::set<std::string> continue; } - out.append(w.gen_fetch_function_begin(parsers[i], class_name, t->arity, empty_vars, -1)); + out.append(w.gen_fetch_function_begin(parsers[i], class_name, class_name, t->arity, -1, empty_vars, -1)); out.append(w.gen_fetch_switch_begin()); for (std::size_t j = 0; j < t->constructors_num; j++) { if (w.is_combinator_supported(t->constructors[j])) { @@ -376,7 +405,7 @@ void write_class(tl_outputer &out, const tl_type *t, const std::set<std::string> } out.append(w.gen_fetch_switch_end()); - out.append(w.gen_fetch_function_end(-1, empty_vars, -1)); + out.append(w.gen_fetch_function_end(false, -1, empty_vars, -1)); } std::vector<std::string> storers = w.get_storers(); @@ -409,10 +438,11 @@ void write_class(tl_outputer &out, const tl_type *t, const std::set<std::string> for (std::size_t i = 0; i < t->constructors_num; i++) { if (w.is_combinator_supported(t->constructors[i])) { if (optimize_one_constructor) { - write_constructor(out, t->constructors[i], base_class, false, request_types, result_types, w); + write_constructor(out, t->constructors[i], base_class, w.gen_class_name(t->constructors[i]->name), false, + request_types, result_types, w); out.append(w.gen_class_alias(w.gen_class_name(t->constructors[i]->name), class_name)); } else { - write_constructor(out, t->constructors[i], class_name, false, request_types, result_types, w); + write_constructor(out, t->constructors[i], class_name, class_name, false, request_types, result_types, w); } written_constructors++; } else { @@ -479,7 +509,6 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) { std::size_t types_n = config.get_type_count(); std::size_t functions_n = config.get_function_count(); - bool found_complex = false; for (std::size_t type = 0; type < types_n; type++) { tl_type *t = config.get_type_by_num(type); assert(t->constructors_num == t->constructors.size()); @@ -487,7 +516,6 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) { if (t->name == "Type") { assert(t->id == ID_VAR_TYPE); t->flags |= FLAG_COMPLEX; - found_complex = true; } continue; } @@ -525,7 +553,6 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) { b.exist_var_num != -1) { if (!w.is_built_in_complex_type(t->name)) { t->flags |= FLAG_COMPLEX; - found_complex = true; } } else { assert(b_arg_type == NODE_TYPE_TYPE); @@ -545,14 +572,13 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) { if (main_type == NODE_TYPE_VAR_TYPE) { if (!w.is_built_in_complex_type(t->name)) { t->flags |= FLAG_COMPLEX; - found_complex = true; } } } } - while (found_complex) { - found_complex = false; + while (true) { + bool found_complex = false; for (std::size_t type = 0; type < types_n; type++) { tl_type *t = config.get_type_by_num(type); if (t->constructors_num == 0 || w.is_built_in_complex_type(t->name)) { // built-in dummy or complex types @@ -572,6 +598,9 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) { // std::fprintf(stderr, "Found complex %s\n", t->name.c_str()); } } + if (!found_complex) { + break; + } } std::set<std::string> request_types; @@ -619,7 +648,7 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) { // write base classes std::vector<var_description> empty_vars; for (int i = 0; i <= w.get_max_arity(); i++) { - out.append(w.gen_class_begin(w.gen_base_type_class_name(i), w.gen_base_tl_class_name(), true)); + out.append(w.gen_class_begin(w.gen_base_type_class_name(i), w.gen_base_tl_class_name(), true, nullptr)); out.append(w.gen_get_id(w.gen_base_type_class_name(i), 0, true)); @@ -648,7 +677,8 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) { continue; } - out.append(w.gen_fetch_function_begin(parsers[j], w.gen_base_type_class_name(i), i, empty_vars, -1)); + out.append(w.gen_fetch_function_begin(parsers[j], w.gen_base_type_class_name(i), w.gen_base_type_class_name(i), i, + -1, empty_vars, -1)); out.append(w.gen_fetch_switch_begin()); for (std::size_t type = 0; type < types_n; type++) { tl_type *t = config.get_type_by_num(type); @@ -668,7 +698,7 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) { } } out.append(w.gen_fetch_switch_end()); - out.append(w.gen_fetch_function_end(-1, empty_vars, -1)); + out.append(w.gen_fetch_function_end(false, -1, empty_vars, -1)); } std::vector<std::string> additional_functions = w.get_additional_functions(); @@ -712,7 +742,7 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) { } { - out.append(w.gen_class_begin(w.gen_base_function_class_name(), w.gen_base_tl_class_name(), true)); + out.append(w.gen_class_begin(w.gen_base_function_class_name(), w.gen_base_tl_class_name(), true, nullptr)); out.append(w.gen_get_id(w.gen_base_function_class_name(), 0, true)); @@ -722,7 +752,8 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) { continue; } - out.append(w.gen_fetch_function_begin(parsers[j], w.gen_base_function_class_name(), 0, empty_vars, -1)); + out.append(w.gen_fetch_function_begin(parsers[j], w.gen_base_function_class_name(), + w.gen_base_function_class_name(), 0, -1, empty_vars, -1)); out.append(w.gen_fetch_switch_begin()); for (std::size_t function = 0; function < functions_n; function++) { tl_combinator *t = config.get_function_by_num(function); @@ -732,7 +763,7 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) { } } out.append(w.gen_fetch_switch_end()); - out.append(w.gen_fetch_function_end(-1, empty_vars, -1)); + out.append(w.gen_fetch_function_end(false, -1, empty_vars, -1)); } std::vector<std::string> storers = w.get_storers(); @@ -790,7 +821,7 @@ void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w) { for (std::size_t function = 0; function < functions_n; function++) { tl_combinator *t = config.get_function_by_num(function); if (!w.is_combinator_supported(t)) { - std::fprintf(stderr, "Function %s is too hard to store\n", t->name.c_str()); + // std::fprintf(stderr, "Function %s is too hard to store\n", t->name.c_str()); continue; } @@ -826,7 +857,7 @@ bool write_tl_to_file(const tl_config &config, const std::string &file_name, con tl_string_outputer out; write_tl(config, out, w); - auto old_file_contents = get_file_contents(file_name, "rb"); + std::string old_file_contents = get_file_contents(file_name, "rb"); if (!w.is_documentation_generated()) { old_file_contents = remove_documentation(old_file_contents); } diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_generate.h b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_generate.h index 3523d1c828..d8588023a1 100644 --- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_generate.h +++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_generate.h @@ -1,14 +1,14 @@ // -// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #pragma once -#include "tl_config.h" -#include "tl_outputer.h" -#include "tl_writer.h" +#include "td/tl/tl_config.h" +#include "td/tl/tl_outputer.h" +#include "td/tl/tl_writer.h" #include <string> @@ -18,6 +18,7 @@ namespace tl { void write_tl(const tl_config &config, tl_outputer &out, const TL_writer &w); tl_config read_tl_config_from_file(const std::string &file_name); + bool write_tl_to_file(const tl_config &config, const std::string &file_name, const TL_writer &w); } // namespace tl diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_outputer.cpp b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_outputer.cpp index fed4ceb818..f26a49abd0 100644 --- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_outputer.cpp +++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_outputer.cpp @@ -1,10 +1,10 @@ // -// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // -#include "tl_outputer.h" +#include "td/tl/tl_outputer.h" namespace td { namespace tl { diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_outputer.h b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_outputer.h index 47c0ab4fed..6ddd156b56 100644 --- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_outputer.h +++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_outputer.h @@ -1,5 +1,5 @@ // -// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_simple.h b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_simple.h index bf4801f1e2..1762087a12 100644 --- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_simple.h +++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_simple.h @@ -1,5 +1,5 @@ // -// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -16,24 +16,25 @@ #include <string> #include <vector> +#include <iostream> + namespace td { namespace tl { namespace simple { -// TL type is -std::string gen_cpp_name(std::string name) { - for (std::size_t i = 0; i < name.size(); i++) { - if ((name[i] < '0' || '9' < name[i]) && (name[i] < 'a' || 'z' < name[i]) && (name[i] < 'A' || 'Z' < name[i])) { - name[i] = '_'; +inline std::string gen_cpp_name(std::string name) { + for (auto &c : name) { + if ((c < '0' || '9' < c) && (c < 'a' || 'z' < c) && (c < 'A' || 'Z' < c)) { + c = '_'; } } - assert(name.size() > 0); + assert(!name.empty()); assert(name[name.size() - 1] != '_'); return name; } -std::string gen_cpp_field_name(std::string name) { - return gen_cpp_name(name) + "_"; +inline std::string gen_cpp_field_name(std::string name) { + return gen_cpp_name(name) + '_'; } struct CustomType; @@ -46,7 +47,7 @@ struct Type { // type == Vector const Type *vector_value_type{nullptr}; -}; // namespace simple +}; struct Arg { const Type *type; @@ -63,6 +64,9 @@ struct Constructor { struct CustomType { std::string name; std::vector<const Constructor *> constructors; + + mutable bool is_result_{false}; + mutable bool is_query_{false}; }; struct Function { @@ -91,6 +95,23 @@ class Schema { auto *from_function = config.get_function_by_num(function_num); functions.push_back(get_function(from_function)); } + for (auto &function : functions_) { + mark_result(function->type); + for (auto &arg : function->args) { + mark_query(arg.type); + } + } + + //for (auto custom_type : custom_types) { + //std::cerr << custom_type->name; + //if (custom_type->is_result_) { + //std::cerr << " result"; + //} + //if (custom_type->is_query_) { + //std::cerr << " query"; + //} + //std::cerr << std::endl; + //} } std::vector<const CustomType *> custom_types; @@ -107,6 +128,34 @@ class Schema { std::map<std::int32_t, Constructor *> constructor_by_id; std::map<std::int32_t, Function *> function_by_id; + void mark_result(const Type *type) { + do_mark(type, true); + } + + void mark_query(const Type *type) { + do_mark(type, false); + } + + void do_mark(const Type *type, bool is_result) { + if (type->type == Type::Vector) { + return do_mark(type->vector_value_type, is_result); + } + if (type->type != Type::Custom) { + return; + } + auto *custom = type->custom; + auto &was = is_result ? custom->is_result_ : custom->is_query_; + if (was) { + return; + } + was = true; + for (auto constructor : custom->constructors) { + for (auto &arg : constructor->args) { + do_mark(arg.type, is_result); + } + } + } + const Type *get_type(const tl_type *from_type) { auto &type = type_by_id[from_type->id]; if (!type) { @@ -142,6 +191,7 @@ class Schema { } return type; } + const CustomType *get_custom_type(const tl_type *from_type) { auto *type = get_type(from_type); assert(type->type == Type::Custom); @@ -165,6 +215,7 @@ class Schema { } return constructor; } + const Function *get_function(const tl_combinator *from) { auto &function = function_by_id[from->id]; if (!function) { @@ -182,6 +233,7 @@ class Schema { } return function; } + const Type *get_type(const tl_tree *tree) { assert(tree->get_type() == NODE_TYPE_TYPE); auto *type_tree = static_cast<const tl_tree_type *>(tree); diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_simple_parser.h b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_simple_parser.h index 9e612bf799..e5605cefe0 100644 --- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_simple_parser.h +++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_simple_parser.h @@ -1,5 +1,5 @@ // -// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -68,7 +68,7 @@ class tl_simple_parser { std::int64_t fetch_long() { check_len(sizeof(std::int64_t)); std::int64_t result; - std::memcpy(reinterpret_cast<char *>(&result), data, sizeof(std::int64_t)); + std::memcpy(&result, data, sizeof(std::int64_t)); data += sizeof(std::int64_t); return result; } diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_string_outputer.cpp b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_string_outputer.cpp index 4a72ecdccd..2981dc04c1 100644 --- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_string_outputer.cpp +++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_string_outputer.cpp @@ -1,10 +1,10 @@ // -// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // -#include "tl_string_outputer.h" +#include "td/tl/tl_string_outputer.h" namespace td { namespace tl { @@ -13,8 +13,19 @@ void tl_string_outputer::append(const std::string &str) { result += str; } -const std::string &tl_string_outputer::get_result() const { +std::string tl_string_outputer::get_result() const { +#if defined(_WIN32) + std::string fixed_result; + for (std::size_t i = 0; i < result.size(); i++) { + if (result[i] == '\n') { + fixed_result += '\r'; + } + fixed_result += result[i]; + } + return fixed_result; +#else return result; +#endif } } // namespace tl diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_string_outputer.h b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_string_outputer.h index f0936340da..b78617be09 100644 --- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_string_outputer.h +++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_string_outputer.h @@ -1,12 +1,12 @@ // -// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #pragma once -#include "tl_outputer.h" +#include "td/tl/tl_outputer.h" #include <string> @@ -19,7 +19,7 @@ class tl_string_outputer : public tl_outputer { public: virtual void append(const std::string &str); - const std::string &get_result() const; + std::string get_result() const; }; } // namespace tl diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_writer.cpp b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_writer.cpp index f1d8b2e18a..8800246ebe 100644 --- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_writer.cpp +++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_writer.cpp @@ -1,12 +1,12 @@ // -// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // -#include "tl_writer.h" +#include "td/tl/tl_writer.h" -#include "tl_core.h" +#include "td/tl/tl_core.h" #include <cassert> #include <cstdio> @@ -16,7 +16,7 @@ namespace tl { std::string TL_writer::int_to_string(int x) { char buf[15]; - std::sprintf(buf, "%d", x); + std::snprintf(buf, sizeof(buf), "%d", x); return buf; } @@ -135,6 +135,14 @@ bool TL_writer::is_documentation_generated() const { return false; } +bool TL_writer::is_default_constructor_generated(const tl_combinator *t, bool can_be_parsed, bool can_be_stored) const { + return true; +} + +bool TL_writer::is_full_constructor_generated(const tl_combinator *t, bool can_be_parsed, bool can_be_stored) const { + return true; +} + std::string TL_writer::gen_main_class_name(const tl_type *t) const { if (t->simple_constructors == 1) { for (std::size_t i = 0; i < t->constructors_num; i++) { diff --git a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_writer.h b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_writer.h index 3c3847516b..dff8958aeb 100644 --- a/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_writer.h +++ b/protocols/Telegram/tdlib/td/tdtl/td/tl/tl_writer.h @@ -1,12 +1,12 @@ // -// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #pragma once -#include "tl_core.h" +#include "td/tl/tl_core.h" #include <cstdint> #include <string> @@ -56,6 +56,8 @@ class TL_writer { virtual bool is_type_bare(const tl_type *t) const = 0; virtual bool is_combinator_supported(const tl_combinator *constructor) const; virtual bool is_documentation_generated() const; + virtual bool is_default_constructor_generated(const tl_combinator *t, bool can_be_parsed, bool can_be_stored) const; + virtual bool is_full_constructor_generated(const tl_combinator *t, bool can_be_parsed, bool can_be_stored) const; virtual int get_parser_type(const tl_combinator *t, const std::string &parser_name) const; virtual int get_storer_type(const tl_combinator *t, const std::string &storer_name) const; @@ -86,15 +88,15 @@ class TL_writer { virtual std::string gen_forward_class_declaration(const std::string &class_name, bool is_proxy) const = 0; - virtual std::string gen_class_begin(const std::string &class_name, const std::string &base_class_name, - bool is_proxy) const = 0; + virtual std::string gen_class_begin(const std::string &class_name, const std::string &base_class_name, bool is_proxy, + const tl_tree *result) const = 0; virtual std::string gen_class_end() const = 0; virtual std::string gen_class_alias(const std::string &class_name, const std::string &alias_name) const = 0; virtual std::string gen_field_definition(const std::string &class_name, const std::string &type_name, const std::string &field_name) const = 0; - virtual std::string gen_flags_definitions(const tl_combinator *t) const { + virtual std::string gen_flags_definitions(const tl_combinator *t, bool can_be_stored) const { return ""; } @@ -118,9 +120,10 @@ class TL_writer { virtual std::string gen_function_result_type(const tl_tree *result) const = 0; - virtual std::string gen_fetch_function_begin(const std::string &parser_name, const std::string &class_name, int arity, + virtual std::string gen_fetch_function_begin(const std::string &parser_name, const std::string &class_name, + const std::string &parent_class_name, int arity, int field_count, std::vector<var_description> &vars, int parser_type) const = 0; - virtual std::string gen_fetch_function_end(int field_num, const std::vector<var_description> &vars, + virtual std::string gen_fetch_function_end(bool has_parent, int field_count, const std::vector<var_description> &vars, int parser_type) const = 0; virtual std::string gen_fetch_function_result_begin(const std::string &parser_name, const std::string &class_name, @@ -138,12 +141,12 @@ class TL_writer { virtual std::string gen_fetch_switch_case(const tl_combinator *t, int arity) const = 0; virtual std::string gen_fetch_switch_end() const = 0; - virtual std::string gen_constructor_begin(int fields_num, const std::string &class_name, bool is_default) const = 0; + virtual std::string gen_constructor_begin(int field_count, const std::string &class_name, bool is_default) const = 0; virtual std::string gen_constructor_parameter(int field_num, const std::string &class_name, const arg &a, bool is_default) const = 0; virtual std::string gen_constructor_field_init(int field_num, const std::string &class_name, const arg &a, bool is_default) const = 0; - virtual std::string gen_constructor_end(const tl_combinator *t, int fields_num, bool is_default) const = 0; + virtual std::string gen_constructor_end(const tl_combinator *t, int field_count, bool is_default) const = 0; virtual std::string gen_additional_function(const std::string &function_name, const tl_combinator *t, bool is_function) const; |