Support nested blocks in C++ emitter
diff --git a/gen/out.rs b/gen/out.rs
index d6735be..8d7499b 100644
--- a/gen/out.rs
+++ b/gen/out.rs
@@ -5,8 +5,8 @@
pub header: bool,
content: Vec<u8>,
section_pending: bool,
- block: &'static str,
- block_pending: bool,
+ blocks: Vec<&'static str>,
+ blocks_pending: usize,
}
impl OutFile {
@@ -16,8 +16,8 @@
header,
content: Vec::new(),
section_pending: false,
- block: "",
- block_pending: false,
+ blocks: Vec::new(),
+ blocks_pending: 0,
}
}
@@ -27,18 +27,18 @@
}
pub fn begin_block(&mut self, block: &'static str) {
- self.block = block;
- self.block_pending = true;
+ self.blocks.push(block);
+ self.blocks_pending += 1;
}
pub fn end_block(&mut self) {
- if self.block_pending {
- self.block_pending = false;
+ if self.blocks_pending > 0 {
+ self.blocks_pending -= 1;
} else {
self.content.extend_from_slice(b"} // ");
- self.content.extend_from_slice(self.block.as_bytes());
+ self.content
+ .extend_from_slice(self.blocks.pop().unwrap().as_bytes());
self.content.push(b'\n');
- self.block = "";
self.section_pending = true;
}
}
@@ -51,11 +51,13 @@
impl Write for OutFile {
fn write_str(&mut self, s: &str) -> fmt::Result {
if !s.is_empty() {
- if self.block_pending {
+ if self.blocks_pending > 0 {
self.content.push(b'\n');
- self.content.extend_from_slice(self.block.as_bytes());
- self.content.extend_from_slice(b" {\n");
- self.block_pending = false;
+ for block in &self.blocks[self.blocks.len() - self.blocks_pending..] {
+ self.content.extend_from_slice(block.as_bytes());
+ self.content.extend_from_slice(b" {\n");
+ }
+ self.blocks_pending = 0;
self.section_pending = false;
} else if self.section_pending {
self.content.push(b'\n');