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