• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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;
34 using System.IO;
35 
36 namespace CCodeGeneration
37 {
38 	public class CGenerator
39 	{
40 		public TextWriter OutputStream { get; private set; }
41 		public string File { get; private set; }
42 		public uint IndentCount { get; private set; }
43 		public string IndentChar { get; private set; }
44 		public string NewLine { get; private set; }
45 
CGenerator(System.IO.TextWriter outputStream, string file, uint indentCount, string indentChar, string newLine)46 		public CGenerator(System.IO.TextWriter outputStream, string file, uint indentCount, string indentChar, string newLine)
47 		{
48 			this.OutputStream = outputStream;
49 			this.File     = file;
50 			this.IndentCount  = indentCount;
51 			this.IndentChar   = indentChar;
52 			this.NewLine      = newLine;
53 		}
54 
55 		public string FileName
56 		{
57 			get
58 			{
59 				if (!String.IsNullOrWhiteSpace(this.File))
60 				{
61 					return Path.GetFileName(this.File);
62 				}
63 
64 				return null;
65 			}
66 		}
67 
WriteSequence(string value, uint repetitions)68 		public void WriteSequence(string value, uint repetitions)
69 		{
70 			while (repetitions > 0)
71 			{
72 				this.OutputStream.Write(value);
73 				repetitions--;
74 			}
75 		}
76 
IndentLine(int level)77 		public void IndentLine(int level)
78 		{
79 			while (level > 0)
80 			{
81 				WriteSequence(this.IndentChar, this.IndentCount);
82 				level--;
83 			}
84 		}
85 
WriteNewLine()86 		public void WriteNewLine()
87 		{
88 			this.OutputStream.Write(this.NewLine);
89 		}
90 
WriteMultilineString(string value, int level = 0)91 		public void WriteMultilineString(string value, int level = 0)
92 		{
93 			if (String.IsNullOrEmpty(value))
94 			{
95 				return;
96 			}
97 
98 			// only \n and \r\n are recognized as linebreaks
99 			string[] lines = value.Split(new char[] { '\n' }, StringSplitOptions.None);
100 
101 			for (int l = 0; l < (lines.Length - 1); l++)
102 			{
103 				if (lines[l].EndsWith("\r"))
104 				{
105 					this.OutputStream.Write(lines[l].Substring(0, lines[l].Length-1));
106 				}
107 				else
108 				{
109 					this.OutputStream.Write(lines[l]);
110 				}
111 
112 				this.WriteNewLine();
113 				this.IndentLine(level);
114 			}
115 
116 			this.OutputStream.Write(lines[lines.Length - 1]);
117 		}
118 	}
119 }
120