77#include < cstring>
88#include < iterator>
99#include < format>
10+ #include < span>
1011#include " ecsact/runtime/common.h"
1112#include " ecsact/codegen/plugin.h"
1213
1314namespace ecsact {
1415
16+ /* *
17+ * Helper function to implement the pesky ecsact_codegen_output_filenames C API.
18+ * @example
19+ * ```cpp
20+ * auto ecsact_codegen_output_filenames( //
21+ * ecsact_package_id package_id,
22+ * char* const* out_filenames,
23+ * int32_t max_filenames,
24+ * int32_t max_filename_length,
25+ * int32_t* out_filenames_length
26+ * ) -> void {
27+ * auto package_filename =
28+ * ecsact::meta::package_file_path(package_id).filename();
29+ *
30+ * // Generate a .h and .cpp file for each package
31+ * ecsact::set_codegen_plugin_output_filenames(
32+ * {
33+ * package_filename.string() + ".h",
34+ * package_filename.string() + ".cpp",
35+ * },
36+ * out_filenames,
37+ * max_filenames,
38+ * max_filename_length,
39+ * out_filenames_length
40+ * );
41+ * }
42+ * ```
43+ */
44+ inline auto set_codegen_plugin_output_filenames (
45+ const auto & filenames,
46+ char * const * out_filenames,
47+ int32_t max_filenames,
48+ int32_t max_filename_length,
49+ int32_t * out_filenames_length
50+ ) -> void {
51+ if (out_filenames != nullptr ) {
52+ for (auto i = 0 ; max_filenames > i; ++i) {
53+ if (i >= std::size (filenames)) {
54+ break ;
55+ }
56+ auto filename = std::data (filenames) + i;
57+ strcpy_s (out_filenames[i], max_filename_length, filename->c_str ());
58+ }
59+ }
60+
61+ if (out_filenames_length != nullptr ) {
62+ *out_filenames_length = static_cast <int32_t >(std::size (filenames));
63+ }
64+ }
65+
1566/* *
1667 * Helper type to give a more C++ friendly write function
1768 * @example
@@ -28,6 +79,7 @@ namespace ecsact {
2879 */
2980struct codegen_plugin_context {
3081 const ecsact_package_id package_id;
82+ const int32_t filename_index;
3183 const ecsact_codegen_write_fn_t write_fn;
3284 const ecsact_codegen_report_fn_t report_fn;
3385 int indentation = 0 ;
@@ -42,29 +94,29 @@ struct codegen_plugin_context {
4294 int32_t str_data_len
4395 ) {
4496 if (report_fn != nullptr ) {
45- report_fn (report_type, str_data, str_data_len);
97+ report_fn (filename_index, report_type, str_data, str_data_len);
4698 }
4799 }
48100
49101 void write_ (const char * str_data, int32_t str_data_len) {
50102 assert (indentation >= 0 );
51103
52104 if (indentation <= 0 ) {
53- write_fn (str_data, str_data_len);
105+ write_fn (filename_index, str_data, str_data_len);
54106 } else {
55107 std::string_view str (str_data, str_data_len);
56108 auto indent_str = get_indent_str ();
57109 auto nl_idx = str.find (' \n ' );
58110 while (nl_idx != std::string_view::npos) {
59- write_fn (str.data (), nl_idx + 1 );
60- write_fn (indent_str.data (), indent_str.size ());
111+ write_fn (filename_index, str.data (), nl_idx + 1 );
112+ write_fn (filename_index, indent_str.data (), indent_str.size ());
61113 str =
62114 std::string_view (str.data () + nl_idx + 1 , str.size () - nl_idx - 1 );
63115 nl_idx = str.find (' \n ' );
64116 }
65117
66118 if (!str.empty ()) {
67- write_fn (str.data (), static_cast <int32_t >(str.size ()));
119+ write_fn (filename_index, str.data (), static_cast <int32_t >(str.size ()));
68120 }
69121 }
70122 }
0 commit comments