You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.4 KiB
47 lines
1.4 KiB
use crate::gen::include::HEADER;
|
|
use crate::gen::out::Content;
|
|
|
|
pub(super) fn write(out: &mut Content, needed: bool, guard: &str) {
|
|
let ifndef = format!("#ifndef {}", guard);
|
|
let define = format!("#define {}", guard);
|
|
let endif = format!("#endif // {}", guard);
|
|
|
|
let mut offset = 0;
|
|
loop {
|
|
let begin = find_line(offset, &ifndef);
|
|
let end = find_line(offset, &endif);
|
|
if let (Some(begin), Some(end)) = (begin, end) {
|
|
if !needed {
|
|
return;
|
|
}
|
|
out.next_section();
|
|
if offset == 0 {
|
|
writeln!(out, "{}", ifndef);
|
|
writeln!(out, "{}", define);
|
|
}
|
|
for line in HEADER[begin + ifndef.len()..end].trim().lines() {
|
|
if line != define && !line.trim_start().starts_with("//") {
|
|
writeln!(out, "{}", line);
|
|
}
|
|
}
|
|
offset = end + endif.len();
|
|
} else if offset == 0 {
|
|
panic!("not found in cxx.h header: {}", guard)
|
|
} else {
|
|
writeln!(out, "{}", endif);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
fn find_line(mut offset: usize, line: &str) -> Option<usize> {
|
|
loop {
|
|
offset += HEADER[offset..].find(line)?;
|
|
let rest = &HEADER[offset + line.len()..];
|
|
if rest.starts_with('\n') || rest.starts_with('\r') {
|
|
return Some(offset);
|
|
}
|
|
offset += line.len();
|
|
}
|
|
}
|