xref: /freebsd/contrib/bearssl/T0/BlobWriter.cs (revision 2aaf9152a852aba9eb2036b95f4948ee77988826)
1*0957b409SSimon J. Gerraty /*
2*0957b409SSimon J. Gerraty  * Copyright (c) 2016 Thomas Pornin <pornin@bolet.org>
3*0957b409SSimon J. Gerraty  *
4*0957b409SSimon J. Gerraty  * Permission is hereby granted, free of charge, to any person obtaining
5*0957b409SSimon J. Gerraty  * a copy of this software and associated documentation files (the
6*0957b409SSimon J. Gerraty  * "Software"), to deal in the Software without restriction, including
7*0957b409SSimon J. Gerraty  * without limitation the rights to use, copy, modify, merge, publish,
8*0957b409SSimon J. Gerraty  * distribute, sublicense, and/or sell copies of the Software, and to
9*0957b409SSimon J. Gerraty  * permit persons to whom the Software is furnished to do so, subject to
10*0957b409SSimon J. Gerraty  * the following conditions:
11*0957b409SSimon J. Gerraty  *
12*0957b409SSimon J. Gerraty  * The above copyright notice and this permission notice shall be
13*0957b409SSimon J. Gerraty  * included in all copies or substantial portions of the Software.
14*0957b409SSimon J. Gerraty  *
15*0957b409SSimon J. Gerraty  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16*0957b409SSimon J. Gerraty  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17*0957b409SSimon J. Gerraty  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18*0957b409SSimon J. Gerraty  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19*0957b409SSimon J. Gerraty  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20*0957b409SSimon J. Gerraty  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21*0957b409SSimon J. Gerraty  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22*0957b409SSimon J. Gerraty  * SOFTWARE.
23*0957b409SSimon J. Gerraty  */
24*0957b409SSimon J. Gerraty 
25*0957b409SSimon J. Gerraty using System;
26*0957b409SSimon J. Gerraty using System.IO;
27*0957b409SSimon J. Gerraty using System.Text;
28*0957b409SSimon J. Gerraty 
29*0957b409SSimon J. Gerraty /*
30*0957b409SSimon J. Gerraty  * A simple class for writing out bytes as hexadecimal constants or
31*0957b409SSimon J. Gerraty  * explicit expressions for the initializer of a C array of 'unsigned
32*0957b409SSimon J. Gerraty  * char'. It starts every line with a given number of tabs, and aims at
33*0957b409SSimon J. Gerraty  * keeping lines below a given threshold (each indentation tab counts as
34*0957b409SSimon J. Gerraty  * 8 characters). An explicit newline is inserted before the first
35*0957b409SSimon J. Gerraty  * element, and commas are used as separators.
36*0957b409SSimon J. Gerraty  */
37*0957b409SSimon J. Gerraty 
38*0957b409SSimon J. Gerraty class BlobWriter {
39*0957b409SSimon J. Gerraty 
40*0957b409SSimon J. Gerraty 	TextWriter w;
41*0957b409SSimon J. Gerraty 	int maxLineLen;
42*0957b409SSimon J. Gerraty 	int indent;
43*0957b409SSimon J. Gerraty 	int lineLen;
44*0957b409SSimon J. Gerraty 
45*0957b409SSimon J. Gerraty 	/*
46*0957b409SSimon J. Gerraty 	 * Create a new instance. 'maxLineLen' is in characters, and
47*0957b409SSimon J. Gerraty 	 * 'indent' is the number of tab characters at the start of
48*0957b409SSimon J. Gerraty 	 * each line.
49*0957b409SSimon J. Gerraty 	 */
BlobWriter(TextWriter w, int maxLineLen, int indent)50*0957b409SSimon J. Gerraty 	internal BlobWriter(TextWriter w, int maxLineLen, int indent)
51*0957b409SSimon J. Gerraty 	{
52*0957b409SSimon J. Gerraty 		this.w = w;
53*0957b409SSimon J. Gerraty 		this.maxLineLen = maxLineLen;
54*0957b409SSimon J. Gerraty 		this.indent = indent;
55*0957b409SSimon J. Gerraty 		lineLen = -1;
56*0957b409SSimon J. Gerraty 	}
57*0957b409SSimon J. Gerraty 
DoNL()58*0957b409SSimon J. Gerraty 	void DoNL()
59*0957b409SSimon J. Gerraty 	{
60*0957b409SSimon J. Gerraty 		w.WriteLine();
61*0957b409SSimon J. Gerraty 		for (int i = 0; i < indent; i ++) {
62*0957b409SSimon J. Gerraty 			w.Write('\t');
63*0957b409SSimon J. Gerraty 		}
64*0957b409SSimon J. Gerraty 		lineLen = (indent << 3);
65*0957b409SSimon J. Gerraty 	}
66*0957b409SSimon J. Gerraty 
67*0957b409SSimon J. Gerraty 	/*
68*0957b409SSimon J. Gerraty 	 * Append a new byte value; it will be converted to an hexadecimal
69*0957b409SSimon J. Gerraty 	 * constant in the output.
70*0957b409SSimon J. Gerraty 	 */
Append(byte b)71*0957b409SSimon J. Gerraty 	internal void Append(byte b)
72*0957b409SSimon J. Gerraty 	{
73*0957b409SSimon J. Gerraty 		if (lineLen < 0) {
74*0957b409SSimon J. Gerraty 			DoNL();
75*0957b409SSimon J. Gerraty 		} else {
76*0957b409SSimon J. Gerraty 			w.Write(',');
77*0957b409SSimon J. Gerraty 			lineLen ++;
78*0957b409SSimon J. Gerraty 			if ((lineLen + 5) > maxLineLen) {
79*0957b409SSimon J. Gerraty 				DoNL();
80*0957b409SSimon J. Gerraty 			} else {
81*0957b409SSimon J. Gerraty 				w.Write(' ');
82*0957b409SSimon J. Gerraty 				lineLen ++;
83*0957b409SSimon J. Gerraty 			}
84*0957b409SSimon J. Gerraty 		}
85*0957b409SSimon J. Gerraty 		w.Write("0x{0:X2}", b);
86*0957b409SSimon J. Gerraty 		lineLen += 4;
87*0957b409SSimon J. Gerraty 	}
88*0957b409SSimon J. Gerraty 
89*0957b409SSimon J. Gerraty 	/*
90*0957b409SSimon J. Gerraty 	 * Append a C expression, which will be used as is. The expression
91*0957b409SSimon J. Gerraty 	 * may resolve to several bytes if it uses internal commas. The
92*0957b409SSimon J. Gerraty 	 * writer will try to honour the expected line length, but it
93*0957b409SSimon J. Gerraty 	 * won't insert a newline character inside the expression.
94*0957b409SSimon J. Gerraty 	 */
Append(string expr)95*0957b409SSimon J. Gerraty 	internal void Append(string expr)
96*0957b409SSimon J. Gerraty 	{
97*0957b409SSimon J. Gerraty 		if (lineLen < 0) {
98*0957b409SSimon J. Gerraty 			DoNL();
99*0957b409SSimon J. Gerraty 		} else {
100*0957b409SSimon J. Gerraty 			w.Write(',');
101*0957b409SSimon J. Gerraty 			lineLen ++;
102*0957b409SSimon J. Gerraty 			if ((lineLen + 1 + expr.Length) > maxLineLen) {
103*0957b409SSimon J. Gerraty 				DoNL();
104*0957b409SSimon J. Gerraty 			} else {
105*0957b409SSimon J. Gerraty 				w.Write(' ');
106*0957b409SSimon J. Gerraty 				lineLen ++;
107*0957b409SSimon J. Gerraty 			}
108*0957b409SSimon J. Gerraty 		}
109*0957b409SSimon J. Gerraty 		w.Write("{0}", expr);
110*0957b409SSimon J. Gerraty 		lineLen += expr.Length;
111*0957b409SSimon J. Gerraty 	}
112*0957b409SSimon J. Gerraty }
113