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');