use core::ffi::c_void;
use std::ffi::CString;
use luaur_code_gen::records::function_bytecode_summary::FunctionBytecodeSummary;
pub fn serialize_function_summary(summary: &FunctionBytecodeSummary, fp: *mut c_void) {
let nesting_limit = summary.get_nesting_limit();
let op_limit = summary.get_op_limit();
let source = CString::new(summary.get_source().replace('\0', "")).unwrap();
let name = CString::new(summary.get_name().replace('\0', "")).unwrap();
unsafe {
fprintf(fp, c" {\n".as_ptr());
fprintf(
fp,
c" \"source\": \"%s\",\n".as_ptr(),
source.as_ptr(),
);
fprintf(
fp,
c" \"name\": \"%s\",\n".as_ptr(),
name.as_ptr(),
);
fprintf(
fp,
c" \"line\": %d,\n".as_ptr(),
summary.get_line(),
);
fprintf(
fp,
c" \"nestingLimit\": %u,\n".as_ptr(),
nesting_limit,
);
fprintf(fp, c" \"counts\": [".as_ptr());
for nesting in 0..=nesting_limit {
fprintf(fp, c"\n [".as_ptr());
for i in 0..op_limit {
let count = summary.get_count(nesting, i as u8);
fprintf(fp, c"%d".as_ptr(), count);
if i < op_limit - 1 {
fprintf(fp, c", ".as_ptr());
}
}
fprintf(fp, c"]".as_ptr());
if nesting < nesting_limit {
fprintf(fp, c",".as_ptr());
}
}
fprintf(fp, c"\n ]".as_ptr());
fprintf(fp, c"\n }".as_ptr());
}
}
extern "C" {
fn fprintf(stream: *mut c_void, format: *const core::ffi::c_char, ...) -> core::ffi::c_int;
}