1 /* 2 * Copyright (c) 2001-2004 Swedish Institute of Computer Science. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without modification, 6 * are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright notice, 11 * this list of conditions and the following disclaimer in the documentation 12 * and/or other materials provided with the distribution. 13 * 3. The name of the author may not be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 19 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 20 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 21 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 24 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 25 * OF SUCH DAMAGE. 26 * 27 * This file is part of the lwIP TCP/IP stack. 28 * 29 * Author: Martin Hentschel <info@cl-soft.de> 30 * 31 */ 32 33 using System.Collections.Generic; 34 using System; 35 36 namespace CCodeGeneration 37 { 38 public class CodeContainerBase: CodeElement 39 { 40 private readonly List<CodeElement> declarations = new List<CodeElement>(); 41 private readonly List<CodeElement> innerElements = new List<CodeElement>(); 42 private bool increaseLevel = true; 43 44 public List<CodeElement> Declarations 45 { 46 get { return this.declarations; } 47 } 48 49 public List<CodeElement> InnerElements 50 { 51 get { return this.innerElements; } 52 } 53 54 protected bool IncreaseLevel 55 { 56 get { return this.increaseLevel; } 57 set { this.increaseLevel = value; } 58 } 59 AddElements(IList<CodeElement> elements, params CodeElement[] spacerElements)60 public void AddElements(IList<CodeElement> elements, params CodeElement[] spacerElements) 61 { 62 if (elements != null) 63 { 64 if ((spacerElements == null) || (spacerElements.Length == 0)) 65 { 66 this.innerElements.AddRange(elements); 67 } 68 else 69 { 70 bool spacerAdded = false; 71 72 foreach (CodeElement element in elements) 73 { 74 this.innerElements.Add(element); 75 this.innerElements.AddRange(spacerElements); 76 spacerAdded = true; 77 } 78 79 if (spacerAdded) 80 { 81 // remove last spacer again 82 this.innerElements.RemoveRange(this.innerElements.Count - spacerElements.Length, spacerElements.Length); 83 } 84 } 85 } 86 } 87 AddElement(CodeElement element)88 public CodeElement AddElement(CodeElement element) 89 { 90 if (element != null) 91 { 92 this.innerElements.Add(element); 93 } 94 95 return element; 96 } 97 AddCode(string code)98 public Code AddCode(string code) 99 { 100 return this.AddElement(new Code(code)) as Code; 101 } 102 AddCodeFormat(string codeFormat, params object[] args)103 public Code AddCodeFormat(string codeFormat, params object[] args) 104 { 105 return this.AddElement(new Code(String.Format(codeFormat, args))) as Code; 106 } 107 AddDeclaration(CodeElement declaration)108 public CodeElement AddDeclaration(CodeElement declaration) 109 { 110 if (declaration != null) 111 { 112 this.declarations.Add(declaration); 113 } 114 115 return declaration; 116 } 117 GenerateCode(int level, CGenerator generator)118 public override void GenerateCode(int level, CGenerator generator) 119 { 120 if (this.increaseLevel) 121 level++; 122 123 if (this.declarations.Count > 0) 124 { 125 foreach (CodeElement element in this.declarations) 126 { 127 element.GenerateCode(level, generator); 128 } 129 130 EmptyLine.SingleLine.GenerateCode(level, generator); 131 } 132 133 foreach (CodeElement element in this.innerElements) 134 { 135 element.GenerateCode(level, generator); 136 } 137 } 138 } 139 } 140