xref: /freebsd-src/contrib/bearssl/src/codec/pemdec.c (revision 2aaf9152a852aba9eb2036b95f4948ee77988826)
1*0957b409SSimon J. Gerraty /* Automatically generated code; do not modify directly. */
2*0957b409SSimon J. Gerraty 
3*0957b409SSimon J. Gerraty #include <stddef.h>
4*0957b409SSimon J. Gerraty #include <stdint.h>
5*0957b409SSimon J. Gerraty 
6*0957b409SSimon J. Gerraty typedef struct {
7*0957b409SSimon J. Gerraty 	uint32_t *dp;
8*0957b409SSimon J. Gerraty 	uint32_t *rp;
9*0957b409SSimon J. Gerraty 	const unsigned char *ip;
10*0957b409SSimon J. Gerraty } t0_context;
11*0957b409SSimon J. Gerraty 
12*0957b409SSimon J. Gerraty static uint32_t
t0_parse7E_unsigned(const unsigned char ** p)13*0957b409SSimon J. Gerraty t0_parse7E_unsigned(const unsigned char **p)
14*0957b409SSimon J. Gerraty {
15*0957b409SSimon J. Gerraty 	uint32_t x;
16*0957b409SSimon J. Gerraty 
17*0957b409SSimon J. Gerraty 	x = 0;
18*0957b409SSimon J. Gerraty 	for (;;) {
19*0957b409SSimon J. Gerraty 		unsigned y;
20*0957b409SSimon J. Gerraty 
21*0957b409SSimon J. Gerraty 		y = *(*p) ++;
22*0957b409SSimon J. Gerraty 		x = (x << 7) | (uint32_t)(y & 0x7F);
23*0957b409SSimon J. Gerraty 		if (y < 0x80) {
24*0957b409SSimon J. Gerraty 			return x;
25*0957b409SSimon J. Gerraty 		}
26*0957b409SSimon J. Gerraty 	}
27*0957b409SSimon J. Gerraty }
28*0957b409SSimon J. Gerraty 
29*0957b409SSimon J. Gerraty static int32_t
t0_parse7E_signed(const unsigned char ** p)30*0957b409SSimon J. Gerraty t0_parse7E_signed(const unsigned char **p)
31*0957b409SSimon J. Gerraty {
32*0957b409SSimon J. Gerraty 	int neg;
33*0957b409SSimon J. Gerraty 	uint32_t x;
34*0957b409SSimon J. Gerraty 
35*0957b409SSimon J. Gerraty 	neg = ((**p) >> 6) & 1;
36*0957b409SSimon J. Gerraty 	x = (uint32_t)-neg;
37*0957b409SSimon J. Gerraty 	for (;;) {
38*0957b409SSimon J. Gerraty 		unsigned y;
39*0957b409SSimon J. Gerraty 
40*0957b409SSimon J. Gerraty 		y = *(*p) ++;
41*0957b409SSimon J. Gerraty 		x = (x << 7) | (uint32_t)(y & 0x7F);
42*0957b409SSimon J. Gerraty 		if (y < 0x80) {
43*0957b409SSimon J. Gerraty 			if (neg) {
44*0957b409SSimon J. Gerraty 				return -(int32_t)~x - 1;
45*0957b409SSimon J. Gerraty 			} else {
46*0957b409SSimon J. Gerraty 				return (int32_t)x;
47*0957b409SSimon J. Gerraty 			}
48*0957b409SSimon J. Gerraty 		}
49*0957b409SSimon J. Gerraty 	}
50*0957b409SSimon J. Gerraty }
51*0957b409SSimon J. Gerraty 
52*0957b409SSimon J. Gerraty #define T0_VBYTE(x, n)   (unsigned char)((((uint32_t)(x) >> (n)) & 0x7F) | 0x80)
53*0957b409SSimon J. Gerraty #define T0_FBYTE(x, n)   (unsigned char)(((uint32_t)(x) >> (n)) & 0x7F)
54*0957b409SSimon J. Gerraty #define T0_SBYTE(x)      (unsigned char)((((uint32_t)(x) >> 28) + 0xF8) ^ 0xF8)
55*0957b409SSimon J. Gerraty #define T0_INT1(x)       T0_FBYTE(x, 0)
56*0957b409SSimon J. Gerraty #define T0_INT2(x)       T0_VBYTE(x, 7), T0_FBYTE(x, 0)
57*0957b409SSimon J. Gerraty #define T0_INT3(x)       T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
58*0957b409SSimon J. Gerraty #define T0_INT4(x)       T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
59*0957b409SSimon J. Gerraty #define T0_INT5(x)       T0_SBYTE(x), T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
60*0957b409SSimon J. Gerraty 
61*0957b409SSimon J. Gerraty /* static const unsigned char t0_datablock[]; */
62*0957b409SSimon J. Gerraty 
63*0957b409SSimon J. Gerraty 
64*0957b409SSimon J. Gerraty void br_pem_decoder_init_main(void *t0ctx);
65*0957b409SSimon J. Gerraty 
66*0957b409SSimon J. Gerraty void br_pem_decoder_run(void *t0ctx);
67*0957b409SSimon J. Gerraty 
68*0957b409SSimon J. Gerraty 
69*0957b409SSimon J. Gerraty 
70*0957b409SSimon J. Gerraty #include "inner.h"
71*0957b409SSimon J. Gerraty 
72*0957b409SSimon J. Gerraty #define CTX   ((br_pem_decoder_context *)(void *)((unsigned char *)t0ctx - offsetof(br_pem_decoder_context, cpu)))
73*0957b409SSimon J. Gerraty 
74*0957b409SSimon J. Gerraty /* see bearssl_pem.h */
75*0957b409SSimon J. Gerraty void
br_pem_decoder_init(br_pem_decoder_context * ctx)76*0957b409SSimon J. Gerraty br_pem_decoder_init(br_pem_decoder_context *ctx)
77*0957b409SSimon J. Gerraty {
78*0957b409SSimon J. Gerraty 	memset(ctx, 0, sizeof *ctx);
79*0957b409SSimon J. Gerraty 	ctx->cpu.dp = &ctx->dp_stack[0];
80*0957b409SSimon J. Gerraty 	ctx->cpu.rp = &ctx->rp_stack[0];
81*0957b409SSimon J. Gerraty 	br_pem_decoder_init_main(&ctx->cpu);
82*0957b409SSimon J. Gerraty 	br_pem_decoder_run(&ctx->cpu);
83*0957b409SSimon J. Gerraty }
84*0957b409SSimon J. Gerraty 
85*0957b409SSimon J. Gerraty /* see bearssl_pem.h */
86*0957b409SSimon J. Gerraty size_t
br_pem_decoder_push(br_pem_decoder_context * ctx,const void * data,size_t len)87*0957b409SSimon J. Gerraty br_pem_decoder_push(br_pem_decoder_context *ctx,
88*0957b409SSimon J. Gerraty 	const void *data, size_t len)
89*0957b409SSimon J. Gerraty {
90*0957b409SSimon J. Gerraty 	if (ctx->event) {
91*0957b409SSimon J. Gerraty 		return 0;
92*0957b409SSimon J. Gerraty 	}
93*0957b409SSimon J. Gerraty 	ctx->hbuf = data;
94*0957b409SSimon J. Gerraty 	ctx->hlen = len;
95*0957b409SSimon J. Gerraty 	br_pem_decoder_run(&ctx->cpu);
96*0957b409SSimon J. Gerraty 	return len - ctx->hlen;
97*0957b409SSimon J. Gerraty }
98*0957b409SSimon J. Gerraty 
99*0957b409SSimon J. Gerraty /* see bearssl_pem.h */
100*0957b409SSimon J. Gerraty int
br_pem_decoder_event(br_pem_decoder_context * ctx)101*0957b409SSimon J. Gerraty br_pem_decoder_event(br_pem_decoder_context *ctx)
102*0957b409SSimon J. Gerraty {
103*0957b409SSimon J. Gerraty 	int event;
104*0957b409SSimon J. Gerraty 
105*0957b409SSimon J. Gerraty 	event = ctx->event;
106*0957b409SSimon J. Gerraty 	ctx->event = 0;
107*0957b409SSimon J. Gerraty 	return event;
108*0957b409SSimon J. Gerraty }
109*0957b409SSimon J. Gerraty 
110*0957b409SSimon J. Gerraty 
111*0957b409SSimon J. Gerraty 
112*0957b409SSimon J. Gerraty static const unsigned char t0_datablock[] = {
113*0957b409SSimon J. Gerraty 	0x00, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20,
114*0957b409SSimon J. Gerraty 	0x00, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x00
115*0957b409SSimon J. Gerraty };
116*0957b409SSimon J. Gerraty 
117*0957b409SSimon J. Gerraty static const unsigned char t0_codeblock[] = {
118*0957b409SSimon J. Gerraty 	0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x01, 0x01, 0x07, 0x00, 0x00, 0x01,
119*0957b409SSimon J. Gerraty 	0x01, 0x08, 0x00, 0x00, 0x13, 0x13, 0x00, 0x00, 0x01,
120*0957b409SSimon J. Gerraty 	T0_INT2(offsetof(br_pem_decoder_context, event)), 0x00, 0x00, 0x01,
121*0957b409SSimon J. Gerraty 	T0_INT2(offsetof(br_pem_decoder_context, name)), 0x00, 0x00, 0x05,
122*0957b409SSimon J. Gerraty 	0x14, 0x2C, 0x14, 0x01, 0x0A, 0x0D, 0x06, 0x03, 0x13, 0x04, 0x76, 0x01,
123*0957b409SSimon J. Gerraty 	0x2D, 0x0C, 0x06, 0x05, 0x2E, 0x01, 0x03, 0x2D, 0x00, 0x01, 0x0D, 0x27,
124*0957b409SSimon J. Gerraty 	0x05, 0x04, 0x01, 0x03, 0x2D, 0x00, 0x15, 0x2E, 0x01, 0x02, 0x2D, 0x00,
125*0957b409SSimon J. Gerraty 	0x01, 0x01, 0x7F, 0x03, 0x00, 0x25, 0x01, 0x00, 0x18, 0x0D, 0x06, 0x03,
126*0957b409SSimon J. Gerraty 	0x13, 0x04, 0x3C, 0x01, 0x7F, 0x18, 0x0D, 0x06, 0x13, 0x13, 0x02, 0x00,
127*0957b409SSimon J. Gerraty 	0x05, 0x06, 0x2E, 0x01, 0x03, 0x2D, 0x04, 0x03, 0x01, 0x7F, 0x23, 0x01,
128*0957b409SSimon J. Gerraty 	0x00, 0x00, 0x04, 0x23, 0x01, 0x01, 0x18, 0x0D, 0x06, 0x09, 0x13, 0x01,
129*0957b409SSimon J. Gerraty 	0x00, 0x23, 0x01, 0x00, 0x00, 0x04, 0x14, 0x01, 0x02, 0x18, 0x0D, 0x06,
130*0957b409SSimon J. Gerraty 	0x06, 0x13, 0x01, 0x7F, 0x00, 0x04, 0x08, 0x13, 0x01, 0x03, 0x2D, 0x01,
131*0957b409SSimon J. Gerraty 	0x00, 0x00, 0x13, 0x01, 0x00, 0x03, 0x00, 0x04, 0xFF, 0x33, 0x01, 0x2C,
132*0957b409SSimon J. Gerraty 	0x14, 0x01, 0x2D, 0x0D, 0x06, 0x04, 0x13, 0x01, 0x7F, 0x00, 0x14, 0x31,
133*0957b409SSimon J. Gerraty 	0x06, 0x02, 0x13, 0x29, 0x14, 0x01, 0x0A, 0x0D, 0x06, 0x04, 0x13, 0x01,
134*0957b409SSimon J. Gerraty 	0x02, 0x00, 0x16, 0x14, 0x1D, 0x06, 0x05, 0x13, 0x2E, 0x01, 0x03, 0x00,
135*0957b409SSimon J. Gerraty 	0x03, 0x00, 0x29, 0x14, 0x01, 0x0A, 0x0D, 0x06, 0x04, 0x13, 0x01, 0x03,
136*0957b409SSimon J. Gerraty 	0x00, 0x16, 0x14, 0x1D, 0x06, 0x05, 0x13, 0x2E, 0x01, 0x03, 0x00, 0x02,
137*0957b409SSimon J. Gerraty 	0x00, 0x01, 0x06, 0x0A, 0x07, 0x03, 0x00, 0x29, 0x14, 0x01, 0x0A, 0x0D,
138*0957b409SSimon J. Gerraty 	0x06, 0x04, 0x13, 0x01, 0x03, 0x00, 0x14, 0x01, 0x3D, 0x0D, 0x06, 0x2E,
139*0957b409SSimon J. Gerraty 	0x13, 0x29, 0x14, 0x01, 0x0A, 0x0D, 0x06, 0x04, 0x13, 0x01, 0x03, 0x00,
140*0957b409SSimon J. Gerraty 	0x2F, 0x05, 0x04, 0x13, 0x01, 0x03, 0x00, 0x01, 0x3D, 0x0C, 0x06, 0x03,
141*0957b409SSimon J. Gerraty 	0x01, 0x03, 0x00, 0x02, 0x00, 0x01, 0x0F, 0x10, 0x06, 0x03, 0x01, 0x03,
142*0957b409SSimon J. Gerraty 	0x00, 0x02, 0x00, 0x01, 0x04, 0x0F, 0x1C, 0x01, 0x01, 0x00, 0x16, 0x14,
143*0957b409SSimon J. Gerraty 	0x1D, 0x06, 0x05, 0x13, 0x2E, 0x01, 0x03, 0x00, 0x02, 0x00, 0x01, 0x06,
144*0957b409SSimon J. Gerraty 	0x0A, 0x07, 0x03, 0x00, 0x29, 0x14, 0x01, 0x0A, 0x0D, 0x06, 0x04, 0x13,
145*0957b409SSimon J. Gerraty 	0x01, 0x03, 0x00, 0x14, 0x01, 0x3D, 0x0D, 0x06, 0x20, 0x13, 0x2F, 0x05,
146*0957b409SSimon J. Gerraty 	0x03, 0x01, 0x03, 0x00, 0x02, 0x00, 0x01, 0x03, 0x10, 0x06, 0x03, 0x01,
147*0957b409SSimon J. Gerraty 	0x03, 0x00, 0x02, 0x00, 0x01, 0x0A, 0x0F, 0x1C, 0x02, 0x00, 0x01, 0x02,
148*0957b409SSimon J. Gerraty 	0x0F, 0x1C, 0x01, 0x01, 0x00, 0x16, 0x14, 0x1D, 0x06, 0x05, 0x13, 0x2E,
149*0957b409SSimon J. Gerraty 	0x01, 0x03, 0x00, 0x02, 0x00, 0x01, 0x06, 0x0A, 0x07, 0x03, 0x00, 0x02,
150*0957b409SSimon J. Gerraty 	0x00, 0x01, 0x10, 0x0F, 0x1C, 0x02, 0x00, 0x01, 0x08, 0x0F, 0x1C, 0x02,
151*0957b409SSimon J. Gerraty 	0x00, 0x1C, 0x01, 0x00, 0x00, 0x00, 0x28, 0x01, 0x01, 0x2D, 0x24, 0x06,
152*0957b409SSimon J. Gerraty 	0x02, 0x04, 0x7B, 0x04, 0x75, 0x00, 0x14, 0x12, 0x2A, 0x14, 0x05, 0x04,
153*0957b409SSimon J. Gerraty 	0x20, 0x01, 0x7F, 0x00, 0x2C, 0x2A, 0x14, 0x01, 0x0A, 0x0D, 0x06, 0x05,
154*0957b409SSimon J. Gerraty 	0x13, 0x20, 0x01, 0x00, 0x00, 0x0D, 0x05, 0x05, 0x13, 0x2E, 0x01, 0x00,
155*0957b409SSimon J. Gerraty 	0x00, 0x1E, 0x04, 0x5E, 0x00, 0x01, 0x01, 0x27, 0x06, 0x0B, 0x22, 0x01,
156*0957b409SSimon J. Gerraty 	0x80, 0x7F, 0x2B, 0x14, 0x06, 0x02, 0x30, 0x00, 0x13, 0x04, 0x6E, 0x00,
157*0957b409SSimon J. Gerraty 	0x2C, 0x14, 0x31, 0x05, 0x01, 0x00, 0x13, 0x04, 0x77, 0x00, 0x14, 0x14,
158*0957b409SSimon J. Gerraty 	0x01, 0x80, 0x61, 0x0E, 0x1B, 0x01, 0x80, 0x7A, 0x0B, 0x10, 0x06, 0x03,
159*0957b409SSimon J. Gerraty 	0x01, 0x20, 0x08, 0x00, 0x01, 0x14, 0x03, 0x00, 0x1B, 0x18, 0x05, 0x05,
160*0957b409SSimon J. Gerraty 	0x20, 0x2E, 0x01, 0x00, 0x00, 0x2C, 0x14, 0x01, 0x0A, 0x0D, 0x06, 0x06,
161*0957b409SSimon J. Gerraty 	0x20, 0x02, 0x00, 0x1B, 0x08, 0x00, 0x14, 0x01, 0x0D, 0x0D, 0x06, 0x03,
162*0957b409SSimon J. Gerraty 	0x13, 0x04, 0x03, 0x2A, 0x18, 0x1A, 0x1E, 0x1B, 0x1F, 0x1B, 0x04, 0x59,
163*0957b409SSimon J. Gerraty 	0x00, 0x19, 0x14, 0x1D, 0x05, 0x01, 0x00, 0x13, 0x11, 0x04, 0x76, 0x00,
164*0957b409SSimon J. Gerraty 	0x21, 0x1A, 0x11, 0x00, 0x00, 0x2C, 0x01, 0x0A, 0x0C, 0x06, 0x02, 0x04,
165*0957b409SSimon J. Gerraty 	0x78, 0x00, 0x01, 0x01, 0x7F, 0x03, 0x00, 0x2C, 0x14, 0x01, 0x0A, 0x0C,
166*0957b409SSimon J. Gerraty 	0x06, 0x09, 0x31, 0x05, 0x04, 0x01, 0x00, 0x03, 0x00, 0x04, 0x70, 0x13,
167*0957b409SSimon J. Gerraty 	0x02, 0x00, 0x00, 0x00, 0x14, 0x06, 0x14, 0x1F, 0x14, 0x22, 0x07, 0x17,
168*0957b409SSimon J. Gerraty 	0x01, 0x2D, 0x0C, 0x06, 0x08, 0x22, 0x07, 0x1E, 0x01, 0x00, 0x1B, 0x1A,
169*0957b409SSimon J. Gerraty 	0x00, 0x04, 0x69, 0x22, 0x1A, 0x00, 0x00, 0x14, 0x01, 0x0A, 0x0C, 0x1B,
170*0957b409SSimon J. Gerraty 	0x01, 0x20, 0x0B, 0x10, 0x00
171*0957b409SSimon J. Gerraty };
172*0957b409SSimon J. Gerraty 
173*0957b409SSimon J. Gerraty static const uint16_t t0_caddr[] = {
174*0957b409SSimon J. Gerraty 	0,
175*0957b409SSimon J. Gerraty 	5,
176*0957b409SSimon J. Gerraty 	10,
177*0957b409SSimon J. Gerraty 	15,
178*0957b409SSimon J. Gerraty 	19,
179*0957b409SSimon J. Gerraty 	24,
180*0957b409SSimon J. Gerraty 	29,
181*0957b409SSimon J. Gerraty 	67,
182*0957b409SSimon J. Gerraty 	149,
183*0957b409SSimon J. Gerraty 	384,
184*0957b409SSimon J. Gerraty 	396,
185*0957b409SSimon J. Gerraty 	431,
186*0957b409SSimon J. Gerraty 	450,
187*0957b409SSimon J. Gerraty 	460,
188*0957b409SSimon J. Gerraty 	479,
189*0957b409SSimon J. Gerraty 	523,
190*0957b409SSimon J. Gerraty 	534,
191*0957b409SSimon J. Gerraty 	539,
192*0957b409SSimon J. Gerraty 	549,
193*0957b409SSimon J. Gerraty 	574,
194*0957b409SSimon J. Gerraty 	601
195*0957b409SSimon J. Gerraty };
196*0957b409SSimon J. Gerraty 
197*0957b409SSimon J. Gerraty #define T0_INTERPRETED   29
198*0957b409SSimon J. Gerraty 
199*0957b409SSimon J. Gerraty #define T0_ENTER(ip, rp, slot)   do { \
200*0957b409SSimon J. Gerraty 		const unsigned char *t0_newip; \
201*0957b409SSimon J. Gerraty 		uint32_t t0_lnum; \
202*0957b409SSimon J. Gerraty 		t0_newip = &t0_codeblock[t0_caddr[(slot) - T0_INTERPRETED]]; \
203*0957b409SSimon J. Gerraty 		t0_lnum = t0_parse7E_unsigned(&t0_newip); \
204*0957b409SSimon J. Gerraty 		(rp) += t0_lnum; \
205*0957b409SSimon J. Gerraty 		*((rp) ++) = (uint32_t)((ip) - &t0_codeblock[0]) + (t0_lnum << 16); \
206*0957b409SSimon J. Gerraty 		(ip) = t0_newip; \
207*0957b409SSimon J. Gerraty 	} while (0)
208*0957b409SSimon J. Gerraty 
209*0957b409SSimon J. Gerraty #define T0_DEFENTRY(name, slot) \
210*0957b409SSimon J. Gerraty void \
211*0957b409SSimon J. Gerraty name(void *ctx) \
212*0957b409SSimon J. Gerraty { \
213*0957b409SSimon J. Gerraty 	t0_context *t0ctx = ctx; \
214*0957b409SSimon J. Gerraty 	t0ctx->ip = &t0_codeblock[0]; \
215*0957b409SSimon J. Gerraty 	T0_ENTER(t0ctx->ip, t0ctx->rp, slot); \
216*0957b409SSimon J. Gerraty }
217*0957b409SSimon J. Gerraty 
218*0957b409SSimon J. Gerraty T0_DEFENTRY(br_pem_decoder_init_main, 38)
219*0957b409SSimon J. Gerraty 
220*0957b409SSimon J. Gerraty #define T0_NEXT(t0ipp)   (*(*(t0ipp)) ++)
221*0957b409SSimon J. Gerraty 
222*0957b409SSimon J. Gerraty void
br_pem_decoder_run(void * t0ctx)223*0957b409SSimon J. Gerraty br_pem_decoder_run(void *t0ctx)
224*0957b409SSimon J. Gerraty {
225*0957b409SSimon J. Gerraty 	uint32_t *dp, *rp;
226*0957b409SSimon J. Gerraty 	const unsigned char *ip;
227*0957b409SSimon J. Gerraty 
228*0957b409SSimon J. Gerraty #define T0_LOCAL(x)    (*(rp - 2 - (x)))
229*0957b409SSimon J. Gerraty #define T0_POP()       (*-- dp)
230*0957b409SSimon J. Gerraty #define T0_POPi()      (*(int32_t *)(-- dp))
231*0957b409SSimon J. Gerraty #define T0_PEEK(x)     (*(dp - 1 - (x)))
232*0957b409SSimon J. Gerraty #define T0_PEEKi(x)    (*(int32_t *)(dp - 1 - (x)))
233*0957b409SSimon J. Gerraty #define T0_PUSH(v)     do { *dp = (v); dp ++; } while (0)
234*0957b409SSimon J. Gerraty #define T0_PUSHi(v)    do { *(int32_t *)dp = (v); dp ++; } while (0)
235*0957b409SSimon J. Gerraty #define T0_RPOP()      (*-- rp)
236*0957b409SSimon J. Gerraty #define T0_RPOPi()     (*(int32_t *)(-- rp))
237*0957b409SSimon J. Gerraty #define T0_RPUSH(v)    do { *rp = (v); rp ++; } while (0)
238*0957b409SSimon J. Gerraty #define T0_RPUSHi(v)   do { *(int32_t *)rp = (v); rp ++; } while (0)
239*0957b409SSimon J. Gerraty #define T0_ROLL(x)     do { \
240*0957b409SSimon J. Gerraty 	size_t t0len = (size_t)(x); \
241*0957b409SSimon J. Gerraty 	uint32_t t0tmp = *(dp - 1 - t0len); \
242*0957b409SSimon J. Gerraty 	memmove(dp - t0len - 1, dp - t0len, t0len * sizeof *dp); \
243*0957b409SSimon J. Gerraty 	*(dp - 1) = t0tmp; \
244*0957b409SSimon J. Gerraty } while (0)
245*0957b409SSimon J. Gerraty #define T0_SWAP()      do { \
246*0957b409SSimon J. Gerraty 	uint32_t t0tmp = *(dp - 2); \
247*0957b409SSimon J. Gerraty 	*(dp - 2) = *(dp - 1); \
248*0957b409SSimon J. Gerraty 	*(dp - 1) = t0tmp; \
249*0957b409SSimon J. Gerraty } while (0)
250*0957b409SSimon J. Gerraty #define T0_ROT()       do { \
251*0957b409SSimon J. Gerraty 	uint32_t t0tmp = *(dp - 3); \
252*0957b409SSimon J. Gerraty 	*(dp - 3) = *(dp - 2); \
253*0957b409SSimon J. Gerraty 	*(dp - 2) = *(dp - 1); \
254*0957b409SSimon J. Gerraty 	*(dp - 1) = t0tmp; \
255*0957b409SSimon J. Gerraty } while (0)
256*0957b409SSimon J. Gerraty #define T0_NROT()       do { \
257*0957b409SSimon J. Gerraty 	uint32_t t0tmp = *(dp - 1); \
258*0957b409SSimon J. Gerraty 	*(dp - 1) = *(dp - 2); \
259*0957b409SSimon J. Gerraty 	*(dp - 2) = *(dp - 3); \
260*0957b409SSimon J. Gerraty 	*(dp - 3) = t0tmp; \
261*0957b409SSimon J. Gerraty } while (0)
262*0957b409SSimon J. Gerraty #define T0_PICK(x)      do { \
263*0957b409SSimon J. Gerraty 	uint32_t t0depth = (x); \
264*0957b409SSimon J. Gerraty 	T0_PUSH(T0_PEEK(t0depth)); \
265*0957b409SSimon J. Gerraty } while (0)
266*0957b409SSimon J. Gerraty #define T0_CO()         do { \
267*0957b409SSimon J. Gerraty 	goto t0_exit; \
268*0957b409SSimon J. Gerraty } while (0)
269*0957b409SSimon J. Gerraty #define T0_RET()        goto t0_next
270*0957b409SSimon J. Gerraty 
271*0957b409SSimon J. Gerraty 	dp = ((t0_context *)t0ctx)->dp;
272*0957b409SSimon J. Gerraty 	rp = ((t0_context *)t0ctx)->rp;
273*0957b409SSimon J. Gerraty 	ip = ((t0_context *)t0ctx)->ip;
274*0957b409SSimon J. Gerraty 	goto t0_next;
275*0957b409SSimon J. Gerraty 	for (;;) {
276*0957b409SSimon J. Gerraty 		uint32_t t0x;
277*0957b409SSimon J. Gerraty 
278*0957b409SSimon J. Gerraty 	t0_next:
279*0957b409SSimon J. Gerraty 		t0x = T0_NEXT(&ip);
280*0957b409SSimon J. Gerraty 		if (t0x < T0_INTERPRETED) {
281*0957b409SSimon J. Gerraty 			switch (t0x) {
282*0957b409SSimon J. Gerraty 				int32_t t0off;
283*0957b409SSimon J. Gerraty 
284*0957b409SSimon J. Gerraty 			case 0: /* ret */
285*0957b409SSimon J. Gerraty 				t0x = T0_RPOP();
286*0957b409SSimon J. Gerraty 				rp -= (t0x >> 16);
287*0957b409SSimon J. Gerraty 				t0x &= 0xFFFF;
288*0957b409SSimon J. Gerraty 				if (t0x == 0) {
289*0957b409SSimon J. Gerraty 					ip = NULL;
290*0957b409SSimon J. Gerraty 					goto t0_exit;
291*0957b409SSimon J. Gerraty 				}
292*0957b409SSimon J. Gerraty 				ip = &t0_codeblock[t0x];
293*0957b409SSimon J. Gerraty 				break;
294*0957b409SSimon J. Gerraty 			case 1: /* literal constant */
295*0957b409SSimon J. Gerraty 				T0_PUSHi(t0_parse7E_signed(&ip));
296*0957b409SSimon J. Gerraty 				break;
297*0957b409SSimon J. Gerraty 			case 2: /* read local */
298*0957b409SSimon J. Gerraty 				T0_PUSH(T0_LOCAL(t0_parse7E_unsigned(&ip)));
299*0957b409SSimon J. Gerraty 				break;
300*0957b409SSimon J. Gerraty 			case 3: /* write local */
301*0957b409SSimon J. Gerraty 				T0_LOCAL(t0_parse7E_unsigned(&ip)) = T0_POP();
302*0957b409SSimon J. Gerraty 				break;
303*0957b409SSimon J. Gerraty 			case 4: /* jump */
304*0957b409SSimon J. Gerraty 				t0off = t0_parse7E_signed(&ip);
305*0957b409SSimon J. Gerraty 				ip += t0off;
306*0957b409SSimon J. Gerraty 				break;
307*0957b409SSimon J. Gerraty 			case 5: /* jump if */
308*0957b409SSimon J. Gerraty 				t0off = t0_parse7E_signed(&ip);
309*0957b409SSimon J. Gerraty 				if (T0_POP()) {
310*0957b409SSimon J. Gerraty 					ip += t0off;
311*0957b409SSimon J. Gerraty 				}
312*0957b409SSimon J. Gerraty 				break;
313*0957b409SSimon J. Gerraty 			case 6: /* jump if not */
314*0957b409SSimon J. Gerraty 				t0off = t0_parse7E_signed(&ip);
315*0957b409SSimon J. Gerraty 				if (!T0_POP()) {
316*0957b409SSimon J. Gerraty 					ip += t0off;
317*0957b409SSimon J. Gerraty 				}
318*0957b409SSimon J. Gerraty 				break;
319*0957b409SSimon J. Gerraty 			case 7: {
320*0957b409SSimon J. Gerraty 				/* + */
321*0957b409SSimon J. Gerraty 
322*0957b409SSimon J. Gerraty 	uint32_t b = T0_POP();
323*0957b409SSimon J. Gerraty 	uint32_t a = T0_POP();
324*0957b409SSimon J. Gerraty 	T0_PUSH(a + b);
325*0957b409SSimon J. Gerraty 
326*0957b409SSimon J. Gerraty 				}
327*0957b409SSimon J. Gerraty 				break;
328*0957b409SSimon J. Gerraty 			case 8: {
329*0957b409SSimon J. Gerraty 				/* - */
330*0957b409SSimon J. Gerraty 
331*0957b409SSimon J. Gerraty 	uint32_t b = T0_POP();
332*0957b409SSimon J. Gerraty 	uint32_t a = T0_POP();
333*0957b409SSimon J. Gerraty 	T0_PUSH(a - b);
334*0957b409SSimon J. Gerraty 
335*0957b409SSimon J. Gerraty 				}
336*0957b409SSimon J. Gerraty 				break;
337*0957b409SSimon J. Gerraty 			case 9: {
338*0957b409SSimon J. Gerraty 				/* < */
339*0957b409SSimon J. Gerraty 
340*0957b409SSimon J. Gerraty 	int32_t b = T0_POPi();
341*0957b409SSimon J. Gerraty 	int32_t a = T0_POPi();
342*0957b409SSimon J. Gerraty 	T0_PUSH(-(uint32_t)(a < b));
343*0957b409SSimon J. Gerraty 
344*0957b409SSimon J. Gerraty 				}
345*0957b409SSimon J. Gerraty 				break;
346*0957b409SSimon J. Gerraty 			case 10: {
347*0957b409SSimon J. Gerraty 				/* << */
348*0957b409SSimon J. Gerraty 
349*0957b409SSimon J. Gerraty 	int c = (int)T0_POPi();
350*0957b409SSimon J. Gerraty 	uint32_t x = T0_POP();
351*0957b409SSimon J. Gerraty 	T0_PUSH(x << c);
352*0957b409SSimon J. Gerraty 
353*0957b409SSimon J. Gerraty 				}
354*0957b409SSimon J. Gerraty 				break;
355*0957b409SSimon J. Gerraty 			case 11: {
356*0957b409SSimon J. Gerraty 				/* <= */
357*0957b409SSimon J. Gerraty 
358*0957b409SSimon J. Gerraty 	int32_t b = T0_POPi();
359*0957b409SSimon J. Gerraty 	int32_t a = T0_POPi();
360*0957b409SSimon J. Gerraty 	T0_PUSH(-(uint32_t)(a <= b));
361*0957b409SSimon J. Gerraty 
362*0957b409SSimon J. Gerraty 				}
363*0957b409SSimon J. Gerraty 				break;
364*0957b409SSimon J. Gerraty 			case 12: {
365*0957b409SSimon J. Gerraty 				/* <> */
366*0957b409SSimon J. Gerraty 
367*0957b409SSimon J. Gerraty 	uint32_t b = T0_POP();
368*0957b409SSimon J. Gerraty 	uint32_t a = T0_POP();
369*0957b409SSimon J. Gerraty 	T0_PUSH(-(uint32_t)(a != b));
370*0957b409SSimon J. Gerraty 
371*0957b409SSimon J. Gerraty 				}
372*0957b409SSimon J. Gerraty 				break;
373*0957b409SSimon J. Gerraty 			case 13: {
374*0957b409SSimon J. Gerraty 				/* = */
375*0957b409SSimon J. Gerraty 
376*0957b409SSimon J. Gerraty 	uint32_t b = T0_POP();
377*0957b409SSimon J. Gerraty 	uint32_t a = T0_POP();
378*0957b409SSimon J. Gerraty 	T0_PUSH(-(uint32_t)(a == b));
379*0957b409SSimon J. Gerraty 
380*0957b409SSimon J. Gerraty 				}
381*0957b409SSimon J. Gerraty 				break;
382*0957b409SSimon J. Gerraty 			case 14: {
383*0957b409SSimon J. Gerraty 				/* >= */
384*0957b409SSimon J. Gerraty 
385*0957b409SSimon J. Gerraty 	int32_t b = T0_POPi();
386*0957b409SSimon J. Gerraty 	int32_t a = T0_POPi();
387*0957b409SSimon J. Gerraty 	T0_PUSH(-(uint32_t)(a >= b));
388*0957b409SSimon J. Gerraty 
389*0957b409SSimon J. Gerraty 				}
390*0957b409SSimon J. Gerraty 				break;
391*0957b409SSimon J. Gerraty 			case 15: {
392*0957b409SSimon J. Gerraty 				/* >> */
393*0957b409SSimon J. Gerraty 
394*0957b409SSimon J. Gerraty 	int c = (int)T0_POPi();
395*0957b409SSimon J. Gerraty 	int32_t x = T0_POPi();
396*0957b409SSimon J. Gerraty 	T0_PUSHi(x >> c);
397*0957b409SSimon J. Gerraty 
398*0957b409SSimon J. Gerraty 				}
399*0957b409SSimon J. Gerraty 				break;
400*0957b409SSimon J. Gerraty 			case 16: {
401*0957b409SSimon J. Gerraty 				/* and */
402*0957b409SSimon J. Gerraty 
403*0957b409SSimon J. Gerraty 	uint32_t b = T0_POP();
404*0957b409SSimon J. Gerraty 	uint32_t a = T0_POP();
405*0957b409SSimon J. Gerraty 	T0_PUSH(a & b);
406*0957b409SSimon J. Gerraty 
407*0957b409SSimon J. Gerraty 				}
408*0957b409SSimon J. Gerraty 				break;
409*0957b409SSimon J. Gerraty 			case 17: {
410*0957b409SSimon J. Gerraty 				/* co */
411*0957b409SSimon J. Gerraty  T0_CO();
412*0957b409SSimon J. Gerraty 				}
413*0957b409SSimon J. Gerraty 				break;
414*0957b409SSimon J. Gerraty 			case 18: {
415*0957b409SSimon J. Gerraty 				/* data-get8 */
416*0957b409SSimon J. Gerraty 
417*0957b409SSimon J. Gerraty 	size_t addr = T0_POP();
418*0957b409SSimon J. Gerraty 	T0_PUSH(t0_datablock[addr]);
419*0957b409SSimon J. Gerraty 
420*0957b409SSimon J. Gerraty 				}
421*0957b409SSimon J. Gerraty 				break;
422*0957b409SSimon J. Gerraty 			case 19: {
423*0957b409SSimon J. Gerraty 				/* drop */
424*0957b409SSimon J. Gerraty  (void)T0_POP();
425*0957b409SSimon J. Gerraty 				}
426*0957b409SSimon J. Gerraty 				break;
427*0957b409SSimon J. Gerraty 			case 20: {
428*0957b409SSimon J. Gerraty 				/* dup */
429*0957b409SSimon J. Gerraty  T0_PUSH(T0_PEEK(0));
430*0957b409SSimon J. Gerraty 				}
431*0957b409SSimon J. Gerraty 				break;
432*0957b409SSimon J. Gerraty 			case 21: {
433*0957b409SSimon J. Gerraty 				/* flush-buf */
434*0957b409SSimon J. Gerraty 
435*0957b409SSimon J. Gerraty 	if (CTX->ptr > 0) {
436*0957b409SSimon J. Gerraty 		if (CTX->dest) {
437*0957b409SSimon J. Gerraty 			CTX->dest(CTX->dest_ctx, CTX->buf, CTX->ptr);
438*0957b409SSimon J. Gerraty 		}
439*0957b409SSimon J. Gerraty 		CTX->ptr = 0;
440*0957b409SSimon J. Gerraty 	}
441*0957b409SSimon J. Gerraty 
442*0957b409SSimon J. Gerraty 				}
443*0957b409SSimon J. Gerraty 				break;
444*0957b409SSimon J. Gerraty 			case 22: {
445*0957b409SSimon J. Gerraty 				/* from-base64 */
446*0957b409SSimon J. Gerraty 
447*0957b409SSimon J. Gerraty 	uint32_t c = T0_POP();
448*0957b409SSimon J. Gerraty 	uint32_t p, q, r, z;
449*0957b409SSimon J. Gerraty 	p = c - 0x41;
450*0957b409SSimon J. Gerraty 	q = c - 0x61;
451*0957b409SSimon J. Gerraty 	r = c - 0x30;
452*0957b409SSimon J. Gerraty 
453*0957b409SSimon J. Gerraty 	z = ((p + 2) & -LT(p, 26))
454*0957b409SSimon J. Gerraty 		| ((q + 28) & -LT(q, 26))
455*0957b409SSimon J. Gerraty 		| ((r + 54) & -LT(r, 10))
456*0957b409SSimon J. Gerraty 		| (64 & -EQ(c, 0x2B))
457*0957b409SSimon J. Gerraty 		| (65 & -EQ(c, 0x2F))
458*0957b409SSimon J. Gerraty 		| EQ(c, 0x3D);
459*0957b409SSimon J. Gerraty 	T0_PUSHi((int32_t)z - 2);
460*0957b409SSimon J. Gerraty 
461*0957b409SSimon J. Gerraty 				}
462*0957b409SSimon J. Gerraty 				break;
463*0957b409SSimon J. Gerraty 			case 23: {
464*0957b409SSimon J. Gerraty 				/* get8 */
465*0957b409SSimon J. Gerraty 
466*0957b409SSimon J. Gerraty 	size_t addr = T0_POP();
467*0957b409SSimon J. Gerraty 	T0_PUSH(*((unsigned char *)CTX + addr));
468*0957b409SSimon J. Gerraty 
469*0957b409SSimon J. Gerraty 				}
470*0957b409SSimon J. Gerraty 				break;
471*0957b409SSimon J. Gerraty 			case 24: {
472*0957b409SSimon J. Gerraty 				/* over */
473*0957b409SSimon J. Gerraty  T0_PUSH(T0_PEEK(1));
474*0957b409SSimon J. Gerraty 				}
475*0957b409SSimon J. Gerraty 				break;
476*0957b409SSimon J. Gerraty 			case 25: {
477*0957b409SSimon J. Gerraty 				/* read8-native */
478*0957b409SSimon J. Gerraty 
479*0957b409SSimon J. Gerraty 	if (CTX->hlen > 0) {
480*0957b409SSimon J. Gerraty 		T0_PUSH(*CTX->hbuf ++);
481*0957b409SSimon J. Gerraty 		CTX->hlen --;
482*0957b409SSimon J. Gerraty 	} else {
483*0957b409SSimon J. Gerraty 		T0_PUSHi(-1);
484*0957b409SSimon J. Gerraty 	}
485*0957b409SSimon J. Gerraty 
486*0957b409SSimon J. Gerraty 				}
487*0957b409SSimon J. Gerraty 				break;
488*0957b409SSimon J. Gerraty 			case 26: {
489*0957b409SSimon J. Gerraty 				/* set8 */
490*0957b409SSimon J. Gerraty 
491*0957b409SSimon J. Gerraty 	size_t addr = T0_POP();
492*0957b409SSimon J. Gerraty 	unsigned x = T0_POP();
493*0957b409SSimon J. Gerraty 	*((unsigned char *)CTX + addr) = x;
494*0957b409SSimon J. Gerraty 
495*0957b409SSimon J. Gerraty 				}
496*0957b409SSimon J. Gerraty 				break;
497*0957b409SSimon J. Gerraty 			case 27: {
498*0957b409SSimon J. Gerraty 				/* swap */
499*0957b409SSimon J. Gerraty  T0_SWAP();
500*0957b409SSimon J. Gerraty 				}
501*0957b409SSimon J. Gerraty 				break;
502*0957b409SSimon J. Gerraty 			case 28: {
503*0957b409SSimon J. Gerraty 				/* write8 */
504*0957b409SSimon J. Gerraty 
505*0957b409SSimon J. Gerraty 	unsigned char x = (unsigned char)T0_POP();
506*0957b409SSimon J. Gerraty 	CTX->buf[CTX->ptr ++] = x;
507*0957b409SSimon J. Gerraty 	if (CTX->ptr == sizeof CTX->buf) {
508*0957b409SSimon J. Gerraty 		if (CTX->dest) {
509*0957b409SSimon J. Gerraty 			CTX->dest(CTX->dest_ctx, CTX->buf, sizeof CTX->buf);
510*0957b409SSimon J. Gerraty 		}
511*0957b409SSimon J. Gerraty 		CTX->ptr = 0;
512*0957b409SSimon J. Gerraty 	}
513*0957b409SSimon J. Gerraty 
514*0957b409SSimon J. Gerraty 				}
515*0957b409SSimon J. Gerraty 				break;
516*0957b409SSimon J. Gerraty 			}
517*0957b409SSimon J. Gerraty 
518*0957b409SSimon J. Gerraty 		} else {
519*0957b409SSimon J. Gerraty 			T0_ENTER(ip, rp, t0x);
520*0957b409SSimon J. Gerraty 		}
521*0957b409SSimon J. Gerraty 	}
522*0957b409SSimon J. Gerraty t0_exit:
523*0957b409SSimon J. Gerraty 	((t0_context *)t0ctx)->dp = dp;
524*0957b409SSimon J. Gerraty 	((t0_context *)t0ctx)->rp = rp;
525*0957b409SSimon J. Gerraty 	((t0_context *)t0ctx)->ip = ip;
526*0957b409SSimon J. Gerraty }
527