Preserve meaning of block boundaries
diff --git a/gen/src/out.rs b/gen/src/out.rs
index 6ba44aa..606a586 100644
--- a/gen/src/out.rs
+++ b/gen/src/out.rs
@@ -1,3 +1,4 @@
+use crate::gen::block::Block;
 use crate::gen::builtin::Builtins;
 use crate::gen::include::Includes;
 use crate::gen::Opt;
@@ -18,7 +19,7 @@
 pub struct Content {
     bytes: String,
     section_pending: bool,
-    blocks_pending: Vec<String>,
+    blocks_pending: Vec<Block>,
 }
 
 impl<'a> OutFile<'a> {
@@ -38,11 +39,11 @@
         self.content.get_mut().next_section();
     }
 
-    pub fn begin_block(&mut self, block: &str) {
+    pub fn begin_block(&mut self, block: Block) {
         self.content.get_mut().begin_block(block);
     }
 
-    pub fn end_block(&mut self, block: &str) {
+    pub fn end_block(&mut self, block: Block) {
         self.content.get_mut().end_block(block);
     }
 
@@ -95,15 +96,13 @@
         self.section_pending = true;
     }
 
-    pub fn begin_block(&mut self, block: &str) {
-        self.blocks_pending.push(block.to_owned());
+    pub fn begin_block(&mut self, block: Block) {
+        self.blocks_pending.push(block);
     }
 
-    pub fn end_block(&mut self, block: &str) {
+    pub fn end_block(&mut self, block: Block) {
         if self.blocks_pending.pop().is_none() {
-            self.bytes.push_str("} // ");
-            self.bytes.push_str(block);
-            self.bytes.push('\n');
+            Block::write_end(&block, &mut self.bytes);
             self.section_pending = true;
         }
     }
@@ -119,8 +118,7 @@
                     self.bytes.push('\n');
                 }
                 for block in self.blocks_pending.drain(..) {
-                    self.bytes.push_str(&block);
-                    self.bytes.push_str(" {\n");
+                    Block::write_begin(&block, &mut self.bytes);
                 }
                 self.section_pending = false;
             } else if self.section_pending {