Skip to main content

luaur_bytecode_cli/functions/
serialize_script_summary.rs

1use alloc::vec::Vec;
2use core::ffi::c_void;
3use std::ffi::CString;
4
5use luaur_code_gen::records::function_bytecode_summary::FunctionBytecodeSummary;
6
7use crate::functions::escape_filename::escape_filename;
8use crate::functions::serialize_function_summary::serialize_function_summary;
9
10pub fn serialize_script_summary(
11    file: &str,
12    script_summary: &Vec<FunctionBytecodeSummary>,
13    fp: *mut c_void,
14) {
15    // C++ passes `escaped.c_str()`; build a NUL-terminated copy for the `%s`.
16    let escaped = CString::new(escape_filename(file).replace('\0', "")).unwrap();
17    let function_count = script_summary.len();
18
19    unsafe {
20        fprintf(
21            fp,
22            b"    \"%s\": [\n\0".as_ptr() as *const core::ffi::c_char,
23            escaped.as_ptr(),
24        );
25    }
26
27    for (i, summary) in script_summary.iter().enumerate() {
28        serialize_function_summary(summary, fp);
29        unsafe {
30            if i == function_count - 1 {
31                fprintf(fp, b"\n\0".as_ptr() as *const core::ffi::c_char);
32            } else {
33                fprintf(fp, b",\n\0".as_ptr() as *const core::ffi::c_char);
34            }
35        }
36    }
37
38    unsafe {
39        fprintf(fp, b"    ]\0".as_ptr() as *const core::ffi::c_char);
40    }
41}
42
43extern "C" {
44    fn fprintf(stream: *mut c_void, format: *const core::ffi::c_char, ...) -> core::ffi::c_int;
45}