1use crate::gen::include::HEADER;
2use crate::gen::out::Content;
3
4pub(super) fn write(out: &mut Content, needed: bool, guard: &str) {
5 let ifndef = ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("#ifndef {0}", guard))
})format!("#ifndef {}", guard);
6 let define = ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("#define {0}", guard))
})format!("#define {}", guard);
7 let endif = ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("#endif // {0}", guard))
})format!("#endif // {}", guard);
8
9 let mut offset = 0;
10 loop {
11 let begin = find_line(offset, &ifndef);
12 let end = find_line(offset, &endif);
13 if let (Some(begin), Some(end)) = (begin, end) {
14 if !needed {
15 return;
16 }
17 out.next_section();
18 if offset == 0 {
19 out.write_fmt(format_args!("{0}\n", ifndef));writeln!(out, "{}", ifndef);
20 out.write_fmt(format_args!("{0}\n", define));writeln!(out, "{}", define);
21 }
22 for line in HEADER[begin + ifndef.len()..end].trim().lines() {
23 if line != define && !line.trim_start().starts_with("//") {
24 out.write_fmt(format_args!("{0}\n", line));writeln!(out, "{}", line);
25 }
26 }
27 offset = end + endif.len();
28 } else if offset == 0 {
29 {
::core::panicking::panic_fmt(format_args!("not found in cxx.h header: {0}",
guard));
}panic!("not found in cxx.h header: {}", guard)
30 } else {
31 out.write_fmt(format_args!("{0}\n", endif));writeln!(out, "{}", endif);
32 return;
33 }
34 }
35}
36
37fn find_line(mut offset: usize, line: &str) -> Option<usize> {
38 loop {
39 offset += HEADER[offset..].find(line)?;
40 let rest = &HEADER[offset + line.len()..];
41 if rest.starts_with('\n') || rest.starts_with('\r') {
42 return Some(offset);
43 }
44 offset += line.len();
45 }
46}