7
7
#include < cstring>
8
8
#include < iterator>
9
9
#include < format>
10
+ #include < span>
10
11
#include " ecsact/runtime/common.h"
11
12
#include " ecsact/codegen/plugin.h"
12
13
13
14
namespace ecsact {
14
15
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
+
15
66
/* *
16
67
* Helper type to give a more C++ friendly write function
17
68
* @example
@@ -28,6 +79,7 @@ namespace ecsact {
28
79
*/
29
80
struct codegen_plugin_context {
30
81
const ecsact_package_id package_id;
82
+ const int32_t filename_index;
31
83
const ecsact_codegen_write_fn_t write_fn;
32
84
const ecsact_codegen_report_fn_t report_fn;
33
85
int indentation = 0 ;
@@ -42,29 +94,29 @@ struct codegen_plugin_context {
42
94
int32_t str_data_len
43
95
) {
44
96
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);
46
98
}
47
99
}
48
100
49
101
void write_ (const char * str_data, int32_t str_data_len) {
50
102
assert (indentation >= 0 );
51
103
52
104
if (indentation <= 0 ) {
53
- write_fn (str_data, str_data_len);
105
+ write_fn (filename_index, str_data, str_data_len);
54
106
} else {
55
107
std::string_view str (str_data, str_data_len);
56
108
auto indent_str = get_indent_str ();
57
109
auto nl_idx = str.find (' \n ' );
58
110
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 ());
61
113
str =
62
114
std::string_view (str.data () + nl_idx + 1 , str.size () - nl_idx - 1 );
63
115
nl_idx = str.find (' \n ' );
64
116
}
65
117
66
118
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 ()));
68
120
}
69
121
}
70
122
}
0 commit comments