133d722a9Sopenharmony_ciuse crate::gen::include::HEADER;
233d722a9Sopenharmony_ciuse crate::gen::out::Content;
333d722a9Sopenharmony_ci
433d722a9Sopenharmony_cipub(super) fn write(out: &mut Content, needed: bool, guard: &str) {
533d722a9Sopenharmony_ci    let ifndef = format!("#ifndef {}", guard);
633d722a9Sopenharmony_ci    let define = format!("#define {}", guard);
733d722a9Sopenharmony_ci    let endif = format!("#endif // {}", guard);
833d722a9Sopenharmony_ci
933d722a9Sopenharmony_ci    let mut offset = 0;
1033d722a9Sopenharmony_ci    loop {
1133d722a9Sopenharmony_ci        let begin = find_line(offset, &ifndef);
1233d722a9Sopenharmony_ci        let end = find_line(offset, &endif);
1333d722a9Sopenharmony_ci        if let (Some(begin), Some(end)) = (begin, end) {
1433d722a9Sopenharmony_ci            if !needed {
1533d722a9Sopenharmony_ci                return;
1633d722a9Sopenharmony_ci            }
1733d722a9Sopenharmony_ci            out.next_section();
1833d722a9Sopenharmony_ci            if offset == 0 {
1933d722a9Sopenharmony_ci                writeln!(out, "{}", ifndef);
2033d722a9Sopenharmony_ci                writeln!(out, "{}", define);
2133d722a9Sopenharmony_ci            }
2233d722a9Sopenharmony_ci            for line in HEADER[begin + ifndef.len()..end].trim().lines() {
2333d722a9Sopenharmony_ci                if line != define && !line.trim_start().starts_with("//") {
2433d722a9Sopenharmony_ci                    writeln!(out, "{}", line);
2533d722a9Sopenharmony_ci                }
2633d722a9Sopenharmony_ci            }
2733d722a9Sopenharmony_ci            offset = end + endif.len();
2833d722a9Sopenharmony_ci        } else if offset == 0 {
2933d722a9Sopenharmony_ci            panic!("not found in cxx.h header: {}", guard)
3033d722a9Sopenharmony_ci        } else {
3133d722a9Sopenharmony_ci            writeln!(out, "{}", endif);
3233d722a9Sopenharmony_ci            return;
3333d722a9Sopenharmony_ci        }
3433d722a9Sopenharmony_ci    }
3533d722a9Sopenharmony_ci}
3633d722a9Sopenharmony_ci
3733d722a9Sopenharmony_cifn find_line(mut offset: usize, line: &str) -> Option<usize> {
3833d722a9Sopenharmony_ci    loop {
3933d722a9Sopenharmony_ci        offset += HEADER[offset..].find(line)?;
4033d722a9Sopenharmony_ci        let rest = &HEADER[offset + line.len()..];
4133d722a9Sopenharmony_ci        if rest.starts_with('\n') || rest.starts_with('\r') {
4233d722a9Sopenharmony_ci            return Some(offset);
4333d722a9Sopenharmony_ci        }
4433d722a9Sopenharmony_ci        offset += line.len();
4533d722a9Sopenharmony_ci    }
4633d722a9Sopenharmony_ci}
47