xref: /freebsd/contrib/bearssl/T0/ConstData.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.Collections.Generic;
27*0957b409SSimon J. Gerraty using System.Text;
28*0957b409SSimon J. Gerraty 
29*0957b409SSimon J. Gerraty class ConstData {
30*0957b409SSimon J. Gerraty 
31*0957b409SSimon J. Gerraty 	internal long ID { get; private set; }
32*0957b409SSimon J. Gerraty 	internal int Address { get; set; }
33*0957b409SSimon J. Gerraty 	internal int Length {
34*0957b409SSimon J. Gerraty 		get {
35*0957b409SSimon J. Gerraty 			return len;
36*0957b409SSimon J. Gerraty 		}
37*0957b409SSimon J. Gerraty 	}
38*0957b409SSimon J. Gerraty 
39*0957b409SSimon J. Gerraty 	byte[] buf;
40*0957b409SSimon J. Gerraty 	int len;
41*0957b409SSimon J. Gerraty 
ConstData(T0Comp ctx)42*0957b409SSimon J. Gerraty 	internal ConstData(T0Comp ctx)
43*0957b409SSimon J. Gerraty 	{
44*0957b409SSimon J. Gerraty 		ID = ctx.NextBlobID();
45*0957b409SSimon J. Gerraty 		buf = new byte[4];
46*0957b409SSimon J. Gerraty 		len = 0;
47*0957b409SSimon J. Gerraty 	}
48*0957b409SSimon J. Gerraty 
Expand(int elen)49*0957b409SSimon J. Gerraty 	void Expand(int elen)
50*0957b409SSimon J. Gerraty 	{
51*0957b409SSimon J. Gerraty 		int tlen = len + elen;
52*0957b409SSimon J. Gerraty 		if (tlen > buf.Length) {
53*0957b409SSimon J. Gerraty 			int nlen = Math.Max(buf.Length << 1, tlen);
54*0957b409SSimon J. Gerraty 			byte[] nbuf = new byte[nlen];
55*0957b409SSimon J. Gerraty 			Array.Copy(buf, 0, nbuf, 0, len);
56*0957b409SSimon J. Gerraty 			buf = nbuf;
57*0957b409SSimon J. Gerraty 		}
58*0957b409SSimon J. Gerraty 	}
59*0957b409SSimon J. Gerraty 
Add8(byte b)60*0957b409SSimon J. Gerraty 	internal void Add8(byte b)
61*0957b409SSimon J. Gerraty 	{
62*0957b409SSimon J. Gerraty 		Expand(1);
63*0957b409SSimon J. Gerraty 		buf[len ++] = b;
64*0957b409SSimon J. Gerraty 	}
65*0957b409SSimon J. Gerraty 
Add16(int x)66*0957b409SSimon J. Gerraty 	internal void Add16(int x)
67*0957b409SSimon J. Gerraty 	{
68*0957b409SSimon J. Gerraty 		Expand(2);
69*0957b409SSimon J. Gerraty 		buf[len ++] = (byte)(x >> 8);
70*0957b409SSimon J. Gerraty 		buf[len ++] = (byte)x;
71*0957b409SSimon J. Gerraty 	}
72*0957b409SSimon J. Gerraty 
Add24(int x)73*0957b409SSimon J. Gerraty 	internal void Add24(int x)
74*0957b409SSimon J. Gerraty 	{
75*0957b409SSimon J. Gerraty 		Expand(3);
76*0957b409SSimon J. Gerraty 		buf[len ++] = (byte)(x >> 16);
77*0957b409SSimon J. Gerraty 		buf[len ++] = (byte)(x >> 8);
78*0957b409SSimon J. Gerraty 		buf[len ++] = (byte)x;
79*0957b409SSimon J. Gerraty 	}
80*0957b409SSimon J. Gerraty 
Add32(int x)81*0957b409SSimon J. Gerraty 	internal void Add32(int x)
82*0957b409SSimon J. Gerraty 	{
83*0957b409SSimon J. Gerraty 		Expand(4);
84*0957b409SSimon J. Gerraty 		buf[len ++] = (byte)(x >> 24);
85*0957b409SSimon J. Gerraty 		buf[len ++] = (byte)(x >> 16);
86*0957b409SSimon J. Gerraty 		buf[len ++] = (byte)(x >> 8);
87*0957b409SSimon J. Gerraty 		buf[len ++] = (byte)x;
88*0957b409SSimon J. Gerraty 	}
89*0957b409SSimon J. Gerraty 
AddString(string s)90*0957b409SSimon J. Gerraty 	internal void AddString(string s)
91*0957b409SSimon J. Gerraty 	{
92*0957b409SSimon J. Gerraty 		byte[] sd = Encoding.UTF8.GetBytes(s);
93*0957b409SSimon J. Gerraty 		Expand(sd.Length + 1);
94*0957b409SSimon J. Gerraty 		Array.Copy(sd, 0, buf, len, sd.Length);
95*0957b409SSimon J. Gerraty 		buf[len + sd.Length] = 0;
96*0957b409SSimon J. Gerraty 		len += sd.Length + 1;
97*0957b409SSimon J. Gerraty 	}
98*0957b409SSimon J. Gerraty 
CheckIndex(int off, int dlen)99*0957b409SSimon J. Gerraty 	void CheckIndex(int off, int dlen)
100*0957b409SSimon J. Gerraty 	{
101*0957b409SSimon J. Gerraty 		if (off < 0 || off > (len - dlen)) {
102*0957b409SSimon J. Gerraty 			throw new IndexOutOfRangeException();
103*0957b409SSimon J. Gerraty 		}
104*0957b409SSimon J. Gerraty 	}
105*0957b409SSimon J. Gerraty 
Set8(int off, byte v)106*0957b409SSimon J. Gerraty 	internal void Set8(int off, byte v)
107*0957b409SSimon J. Gerraty 	{
108*0957b409SSimon J. Gerraty 		CheckIndex(off, 1);
109*0957b409SSimon J. Gerraty 		buf[off] = v;
110*0957b409SSimon J. Gerraty 	}
111*0957b409SSimon J. Gerraty 
Read8(int off)112*0957b409SSimon J. Gerraty 	internal byte Read8(int off)
113*0957b409SSimon J. Gerraty 	{
114*0957b409SSimon J. Gerraty 		CheckIndex(off, 1);
115*0957b409SSimon J. Gerraty 		return buf[off];
116*0957b409SSimon J. Gerraty 	}
117*0957b409SSimon J. Gerraty 
Read16(int off)118*0957b409SSimon J. Gerraty 	internal int Read16(int off)
119*0957b409SSimon J. Gerraty 	{
120*0957b409SSimon J. Gerraty 		CheckIndex(off, 2);
121*0957b409SSimon J. Gerraty 		return (buf[off] << 8) | buf[off + 1];
122*0957b409SSimon J. Gerraty 	}
123*0957b409SSimon J. Gerraty 
Read24(int off)124*0957b409SSimon J. Gerraty 	internal int Read24(int off)
125*0957b409SSimon J. Gerraty 	{
126*0957b409SSimon J. Gerraty 		CheckIndex(off, 3);
127*0957b409SSimon J. Gerraty 		return (buf[off] << 16) | (buf[off + 1] << 8) | buf[off + 2];
128*0957b409SSimon J. Gerraty 	}
129*0957b409SSimon J. Gerraty 
Read32(int off)130*0957b409SSimon J. Gerraty 	internal int Read32(int off)
131*0957b409SSimon J. Gerraty 	{
132*0957b409SSimon J. Gerraty 		CheckIndex(off, 4);
133*0957b409SSimon J. Gerraty 		return (buf[off] << 24) | (buf[off + 1] << 16)
134*0957b409SSimon J. Gerraty 			| (buf[off + 2] << 8) | buf[off + 3];
135*0957b409SSimon J. Gerraty 	}
136*0957b409SSimon J. Gerraty 
ToString(int off)137*0957b409SSimon J. Gerraty 	internal string ToString(int off)
138*0957b409SSimon J. Gerraty 	{
139*0957b409SSimon J. Gerraty 		StringBuilder sb = new StringBuilder();
140*0957b409SSimon J. Gerraty 		for (;;) {
141*0957b409SSimon J. Gerraty 			int x = DecodeUTF8(ref off);
142*0957b409SSimon J. Gerraty 			if (x == 0) {
143*0957b409SSimon J. Gerraty 				return sb.ToString();
144*0957b409SSimon J. Gerraty 			}
145*0957b409SSimon J. Gerraty 			if (x < 0x10000) {
146*0957b409SSimon J. Gerraty 				sb.Append((char)x);
147*0957b409SSimon J. Gerraty 			} else {
148*0957b409SSimon J. Gerraty 				x -= 0x10000;
149*0957b409SSimon J. Gerraty 				sb.Append((char)(0xD800 + (x >> 10)));
150*0957b409SSimon J. Gerraty 				sb.Append((char)(0xDC00 + (x & 0x3FF)));
151*0957b409SSimon J. Gerraty 			}
152*0957b409SSimon J. Gerraty 		}
153*0957b409SSimon J. Gerraty 	}
154*0957b409SSimon J. Gerraty 
DecodeUTF8(ref int off)155*0957b409SSimon J. Gerraty 	int DecodeUTF8(ref int off)
156*0957b409SSimon J. Gerraty 	{
157*0957b409SSimon J. Gerraty 		if (off >= len) {
158*0957b409SSimon J. Gerraty 			throw new IndexOutOfRangeException();
159*0957b409SSimon J. Gerraty 		}
160*0957b409SSimon J. Gerraty 		int x = buf[off ++];
161*0957b409SSimon J. Gerraty 		if (x < 0xC0 || x > 0xF7) {
162*0957b409SSimon J. Gerraty 			return x;
163*0957b409SSimon J. Gerraty 		}
164*0957b409SSimon J. Gerraty 		int elen, acc;
165*0957b409SSimon J. Gerraty 		if (x >= 0xF0) {
166*0957b409SSimon J. Gerraty 			elen = 3;
167*0957b409SSimon J. Gerraty 			acc = x & 0x07;
168*0957b409SSimon J. Gerraty 		} else if (x >= 0xE0) {
169*0957b409SSimon J. Gerraty 			elen = 2;
170*0957b409SSimon J. Gerraty 			acc = x & 0x0F;
171*0957b409SSimon J. Gerraty 		} else {
172*0957b409SSimon J. Gerraty 			elen = 1;
173*0957b409SSimon J. Gerraty 			acc = x & 0x1F;
174*0957b409SSimon J. Gerraty 		}
175*0957b409SSimon J. Gerraty 		if (off + elen > len) {
176*0957b409SSimon J. Gerraty 			return x;
177*0957b409SSimon J. Gerraty 		}
178*0957b409SSimon J. Gerraty 		for (int i = 0; i < elen; i ++) {
179*0957b409SSimon J. Gerraty 			int y = buf[off + i];
180*0957b409SSimon J. Gerraty 			if (y < 0x80 || y >= 0xC0) {
181*0957b409SSimon J. Gerraty 				return x;
182*0957b409SSimon J. Gerraty 			}
183*0957b409SSimon J. Gerraty 			acc = (acc << 6) + (y & 0x3F);
184*0957b409SSimon J. Gerraty 		}
185*0957b409SSimon J. Gerraty 		if (acc > 0x10FFFF) {
186*0957b409SSimon J. Gerraty 			return x;
187*0957b409SSimon J. Gerraty 		}
188*0957b409SSimon J. Gerraty 		off += elen;
189*0957b409SSimon J. Gerraty 		return acc;
190*0957b409SSimon J. Gerraty 	}
191*0957b409SSimon J. Gerraty 
Encode(BlobWriter bw)192*0957b409SSimon J. Gerraty 	internal void Encode(BlobWriter bw)
193*0957b409SSimon J. Gerraty 	{
194*0957b409SSimon J. Gerraty 		for (int i = 0; i < len; i ++) {
195*0957b409SSimon J. Gerraty 			bw.Append(buf[i]);
196*0957b409SSimon J. Gerraty 		}
197*0957b409SSimon J. Gerraty 	}
198*0957b409SSimon J. Gerraty }
199