1//  Copyright (c) 2017 Couchbase, Inc.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// 		http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package vellum
16
17const maxCommon = 1<<6 - 1
18
19func encodeCommon(in byte) byte {
20	val := byte((int(commonInputs[in]) + 1) % 256)
21	if val > maxCommon {
22		return 0
23	}
24	return val
25}
26
27func decodeCommon(in byte) byte {
28	return commonInputsInv[in-1]
29}
30
31var commonInputs = []byte{
32	84,  // '\x00'
33	85,  // '\x01'
34	86,  // '\x02'
35	87,  // '\x03'
36	88,  // '\x04'
37	89,  // '\x05'
38	90,  // '\x06'
39	91,  // '\x07'
40	92,  // '\x08'
41	93,  // '\t'
42	94,  // '\n'
43	95,  // '\x0b'
44	96,  // '\x0c'
45	97,  // '\r'
46	98,  // '\x0e'
47	99,  // '\x0f'
48	100, // '\x10'
49	101, // '\x11'
50	102, // '\x12'
51	103, // '\x13'
52	104, // '\x14'
53	105, // '\x15'
54	106, // '\x16'
55	107, // '\x17'
56	108, // '\x18'
57	109, // '\x19'
58	110, // '\x1a'
59	111, // '\x1b'
60	112, // '\x1c'
61	113, // '\x1d'
62	114, // '\x1e'
63	115, // '\x1f'
64	116, // ' '
65	80,  // '!'
66	117, // '"'
67	118, // '#'
68	79,  // '$'
69	39,  // '%'
70	30,  // '&'
71	81,  // "'"
72	75,  // '('
73	74,  // ')'
74	82,  // '*'
75	57,  // '+'
76	66,  // ','
77	16,  // '-'
78	12,  // '.'
79	2,   // '/'
80	19,  // '0'
81	20,  // '1'
82	21,  // '2'
83	27,  // '3'
84	32,  // '4'
85	29,  // '5'
86	35,  // '6'
87	36,  // '7'
88	37,  // '8'
89	34,  // '9'
90	24,  // ':'
91	73,  // ';'
92	119, // '<'
93	23,  // '='
94	120, // '>'
95	40,  // '?'
96	83,  // '@'
97	44,  // 'A'
98	48,  // 'B'
99	42,  // 'C'
100	43,  // 'D'
101	49,  // 'E'
102	46,  // 'F'
103	62,  // 'G'
104	61,  // 'H'
105	47,  // 'I'
106	69,  // 'J'
107	68,  // 'K'
108	58,  // 'L'
109	56,  // 'M'
110	55,  // 'N'
111	59,  // 'O'
112	51,  // 'P'
113	72,  // 'Q'
114	54,  // 'R'
115	45,  // 'S'
116	52,  // 'T'
117	64,  // 'U'
118	65,  // 'V'
119	63,  // 'W'
120	71,  // 'X'
121	67,  // 'Y'
122	70,  // 'Z'
123	77,  // '['
124	121, // '\\'
125	78,  // ']'
126	122, // '^'
127	31,  // '_'
128	123, // '`'
129	4,   // 'a'
130	25,  // 'b'
131	9,   // 'c'
132	17,  // 'd'
133	1,   // 'e'
134	26,  // 'f'
135	22,  // 'g'
136	13,  // 'h'
137	7,   // 'i'
138	50,  // 'j'
139	38,  // 'k'
140	14,  // 'l'
141	15,  // 'm'
142	10,  // 'n'
143	3,   // 'o'
144	8,   // 'p'
145	60,  // 'q'
146	6,   // 'r'
147	5,   // 's'
148	0,   // 't'
149	18,  // 'u'
150	33,  // 'v'
151	11,  // 'w'
152	41,  // 'x'
153	28,  // 'y'
154	53,  // 'z'
155	124, // '{'
156	125, // '|'
157	126, // '}'
158	76,  // '~'
159	127, // '\x7f'
160	128, // '\x80'
161	129, // '\x81'
162	130, // '\x82'
163	131, // '\x83'
164	132, // '\x84'
165	133, // '\x85'
166	134, // '\x86'
167	135, // '\x87'
168	136, // '\x88'
169	137, // '\x89'
170	138, // '\x8a'
171	139, // '\x8b'
172	140, // '\x8c'
173	141, // '\x8d'
174	142, // '\x8e'
175	143, // '\x8f'
176	144, // '\x90'
177	145, // '\x91'
178	146, // '\x92'
179	147, // '\x93'
180	148, // '\x94'
181	149, // '\x95'
182	150, // '\x96'
183	151, // '\x97'
184	152, // '\x98'
185	153, // '\x99'
186	154, // '\x9a'
187	155, // '\x9b'
188	156, // '\x9c'
189	157, // '\x9d'
190	158, // '\x9e'
191	159, // '\x9f'
192	160, // '\xa0'
193	161, // '¡'
194	162, // '¢'
195	163, // '£'
196	164, // '¤'
197	165, // '¥'
198	166, // '¦'
199	167, // '§'
200	168, // '¨'
201	169, // '©'
202	170, // 'ª'
203	171, // '«'
204	172, // '¬'
205	173, // '\xad'
206	174, // '®'
207	175, // '¯'
208	176, // '°'
209	177, // '±'
210	178, // '²'
211	179, // '³'
212	180, // '´'
213	181, // 'µ'
214	182, // '¶'
215	183, // '·'
216	184, // '¸'
217	185, // '¹'
218	186, // 'º'
219	187, // '»'
220	188, // '¼'
221	189, // '½'
222	190, // '¾'
223	191, // '¿'
224	192, // 'À'
225	193, // 'Á'
226	194, // 'Â'
227	195, // 'Ã'
228	196, // 'Ä'
229	197, // 'Å'
230	198, // 'Æ'
231	199, // 'Ç'
232	200, // 'È'
233	201, // 'É'
234	202, // 'Ê'
235	203, // 'Ë'
236	204, // 'Ì'
237	205, // 'Í'
238	206, // 'Î'
239	207, // 'Ï'
240	208, // 'Ð'
241	209, // 'Ñ'
242	210, // 'Ò'
243	211, // 'Ó'
244	212, // 'Ô'
245	213, // 'Õ'
246	214, // 'Ö'
247	215, // '×'
248	216, // 'Ø'
249	217, // 'Ù'
250	218, // 'Ú'
251	219, // 'Û'
252	220, // 'Ü'
253	221, // 'Ý'
254	222, // 'Þ'
255	223, // 'ß'
256	224, // 'à'
257	225, // 'á'
258	226, // 'â'
259	227, // 'ã'
260	228, // 'ä'
261	229, // 'å'
262	230, // 'æ'
263	231, // 'ç'
264	232, // 'è'
265	233, // 'é'
266	234, // 'ê'
267	235, // 'ë'
268	236, // 'ì'
269	237, // 'í'
270	238, // 'î'
271	239, // 'ï'
272	240, // 'ð'
273	241, // 'ñ'
274	242, // 'ò'
275	243, // 'ó'
276	244, // 'ô'
277	245, // 'õ'
278	246, // 'ö'
279	247, // '÷'
280	248, // 'ø'
281	249, // 'ù'
282	250, // 'ú'
283	251, // 'û'
284	252, // 'ü'
285	253, // 'ý'
286	254, // 'þ'
287	255, // 'ÿ'
288}
289
290var commonInputsInv = []byte{
291	't',
292	'e',
293	'/',
294	'o',
295	'a',
296	's',
297	'r',
298	'i',
299	'p',
300	'c',
301	'n',
302	'w',
303	'.',
304	'h',
305	'l',
306	'm',
307	'-',
308	'd',
309	'u',
310	'0',
311	'1',
312	'2',
313	'g',
314	'=',
315	':',
316	'b',
317	'f',
318	'3',
319	'y',
320	'5',
321	'&',
322	'_',
323	'4',
324	'v',
325	'9',
326	'6',
327	'7',
328	'8',
329	'k',
330	'%',
331	'?',
332	'x',
333	'C',
334	'D',
335	'A',
336	'S',
337	'F',
338	'I',
339	'B',
340	'E',
341	'j',
342	'P',
343	'T',
344	'z',
345	'R',
346	'N',
347	'M',
348	'+',
349	'L',
350	'O',
351	'q',
352	'H',
353	'G',
354	'W',
355	'U',
356	'V',
357	',',
358	'Y',
359	'K',
360	'J',
361	'Z',
362	'X',
363	'Q',
364	';',
365	')',
366	'(',
367	'~',
368	'[',
369	']',
370	'$',
371	'!',
372	'\'',
373	'*',
374	'@',
375	'\x00',
376	'\x01',
377	'\x02',
378	'\x03',
379	'\x04',
380	'\x05',
381	'\x06',
382	'\x07',
383	'\x08',
384	'\t',
385	'\n',
386	'\x0b',
387	'\x0c',
388	'\r',
389	'\x0e',
390	'\x0f',
391	'\x10',
392	'\x11',
393	'\x12',
394	'\x13',
395	'\x14',
396	'\x15',
397	'\x16',
398	'\x17',
399	'\x18',
400	'\x19',
401	'\x1a',
402	'\x1b',
403	'\x1c',
404	'\x1d',
405	'\x1e',
406	'\x1f',
407	' ',
408	'"',
409	'#',
410	'<',
411	'>',
412	'\\',
413	'^',
414	'`',
415	'{',
416	'|',
417	'}',
418	'\x7f',
419	'\x80',
420	'\x81',
421	'\x82',
422	'\x83',
423	'\x84',
424	'\x85',
425	'\x86',
426	'\x87',
427	'\x88',
428	'\x89',
429	'\x8a',
430	'\x8b',
431	'\x8c',
432	'\x8d',
433	'\x8e',
434	'\x8f',
435	'\x90',
436	'\x91',
437	'\x92',
438	'\x93',
439	'\x94',
440	'\x95',
441	'\x96',
442	'\x97',
443	'\x98',
444	'\x99',
445	'\x9a',
446	'\x9b',
447	'\x9c',
448	'\x9d',
449	'\x9e',
450	'\x9f',
451	'\xa0',
452	'\xa1',
453	'\xa2',
454	'\xa3',
455	'\xa4',
456	'\xa5',
457	'\xa6',
458	'\xa7',
459	'\xa8',
460	'\xa9',
461	'\xaa',
462	'\xab',
463	'\xac',
464	'\xad',
465	'\xae',
466	'\xaf',
467	'\xb0',
468	'\xb1',
469	'\xb2',
470	'\xb3',
471	'\xb4',
472	'\xb5',
473	'\xb6',
474	'\xb7',
475	'\xb8',
476	'\xb9',
477	'\xba',
478	'\xbb',
479	'\xbc',
480	'\xbd',
481	'\xbe',
482	'\xbf',
483	'\xc0',
484	'\xc1',
485	'\xc2',
486	'\xc3',
487	'\xc4',
488	'\xc5',
489	'\xc6',
490	'\xc7',
491	'\xc8',
492	'\xc9',
493	'\xca',
494	'\xcb',
495	'\xcc',
496	'\xcd',
497	'\xce',
498	'\xcf',
499	'\xd0',
500	'\xd1',
501	'\xd2',
502	'\xd3',
503	'\xd4',
504	'\xd5',
505	'\xd6',
506	'\xd7',
507	'\xd8',
508	'\xd9',
509	'\xda',
510	'\xdb',
511	'\xdc',
512	'\xdd',
513	'\xde',
514	'\xdf',
515	'\xe0',
516	'\xe1',
517	'\xe2',
518	'\xe3',
519	'\xe4',
520	'\xe5',
521	'\xe6',
522	'\xe7',
523	'\xe8',
524	'\xe9',
525	'\xea',
526	'\xeb',
527	'\xec',
528	'\xed',
529	'\xee',
530	'\xef',
531	'\xf0',
532	'\xf1',
533	'\xf2',
534	'\xf3',
535	'\xf4',
536	'\xf5',
537	'\xf6',
538	'\xf7',
539	'\xf8',
540	'\xf9',
541	'\xfa',
542	'\xfb',
543	'\xfc',
544	'\xfd',
545	'\xfe',
546	'\xff',
547}
548