mischiefinitial commitbd439e57 years agoHistory
570 lines · 8.3 KB · C
RawDownload
#include <u.h>#include <libc.h> #include "cbor.h"#include "cborimpl.h" #define OPSIZE(base, op) (1<<(-((base) - (op)))) static cbor *dec_tab(cbor_coder *d); uchar*cbor_take(cbor_coder *d, long want){	uchar *p; 	if(d->e - d->p < want)		return nil; 	p = d->p;	d->p += want;	return p;} static cbor*dec_size(cbor_coder *d, int n, cbor *(*decf)(cbor_coder*, u64int)){	int i;	u64int len;	uchar *p; 	p = cbor_take(d, n);	if(p == nil)		return nil; 	len = 0; 	switch(n){	case 1: case 2: case 4: case 8:		for(i = 0; i < n; i++)			len |= (u64int)p[i] << (n-1-i)*8;		break;	default:		return nil;	} 	return decf(d, len);} static cbor*dec_u_common(cbor_coder *d, u64int len){	return cbor_make_uint(d->alloc, len);} static cbor*dec_ulit(cbor_coder *d){	return dec_u_common(d, d->p[-1]);} static cbor*dec_u(cbor_coder *d){	return dec_size(d, OPSIZE(0x18, d->p[-1]), dec_u_common);} static cbor*dec_s_common(cbor_coder *d, u64int v){	return cbor_make_sint(d->alloc, ~v);} static cbor*dec_slit(cbor_coder *d){	return dec_s_common(d, d->p[-1] - 0x20);} static cbor*dec_s(cbor_coder *d){	return dec_size(d, OPSIZE(0x38, d->p[-1]), dec_s_common);} static cbor*dec_b_common(cbor_coder *d, u64int len){	uchar *p; 	p = cbor_take(d, len);	if(p == nil)		return nil; 	return cbor_make_byte(d->alloc, p, len);} static cbor*dec_blit(cbor_coder *d){	return dec_b_common(d, d->p[-1] - 0x40);} static cbor*dec_b(cbor_coder *d){	return dec_size(d, OPSIZE(0x58, d->p[-1]), dec_b_common);} static cbor*dec_string_common(cbor_coder *d, u64int len){	uchar *p; 	p = cbor_take(d, len);	if(p == nil)		return nil; 	return cbor_make_string(d->alloc, (char*)p, len);} static cbor*dec_stringlit(cbor_coder *d){	return dec_string_common(d, d->p[-1] - 0x60);} static cbor*dec_string(cbor_coder *d){	return dec_size(d, OPSIZE(0x78, d->p[-1]), dec_string_common);} static cbor*dec_a_common(cbor_coder *d, u64int len){	u64int i; 	cbor *c, *e; 	c = cbor_make_array(d->alloc, len);	if(c == nil)		return nil; 	for(i = 0; i < len; i++){		e = dec_tab(d);		if(e == nil)			goto fail; 		c->array[i] = e;	} 	return c; fail:	cbor_free(d->alloc, c); 	return nil;} static cbor*dec_alit(cbor_coder *d){	return dec_a_common(d, d->p[-1] - 0x80);} static cbor*dec_a(cbor_coder *d){	return dec_size(d, OPSIZE(0x98, d->p[-1]), dec_a_common);} static cbor*dec_m_common(cbor_coder *d, u64int len){	u64int i; 	cbor *c, *e, *k, *v; 	c = cbor_make_map(d->alloc, len);	if(c == nil)		return nil; 	for(i = 0; i < len; i++){		k = dec_tab(d);		if(k == nil)			goto fail; 		v = dec_tab(d);		if(v == nil){			cbor_free(d->alloc, k);			goto fail;		} 		e = cbor_make_map_element(d->alloc, k, v);		if(e == nil){			cbor_free(d->alloc, k);			cbor_free(d->alloc, v);			goto fail;		} 		c->array[i] = e;	} 	return c; fail:	cbor_free(d->alloc, c); 	return nil;} static cbor*dec_mlit(cbor_coder *d){	return dec_m_common(d, d->p[-1] - 0xa0);} static cbor*dec_m(cbor_coder *d){	return dec_size(d, OPSIZE(0xb8, d->p[-1]), dec_m_common);} static cbor*dec_t_common(cbor_coder *d, u64int tag){	cbor *c, *e; 	e = dec_tab(d);	if(e == nil)		return nil; 	c = cbor_make_tag(d->alloc, tag, e);	if(c == nil){		cbor_free(d->alloc, e);		return nil;	} 	return c;} static cbor*dec_tlit(cbor_coder *d){	return dec_t_common(d, d->p[-1] - 0xc0);} static cbor*dec_t(cbor_coder *d){	return dec_size(d, OPSIZE(0xd8, d->p[-1]), dec_t_common);} static cbor*dec_null(cbor_coder *d){	return cbor_make_null(d->alloc);} static cbor*dec_half_v(cbor_coder *d, u64int v){	int exp, mant;	double dub; 	exp = (v>>10) & 0x1f;	mant = v & 0x3ff; 	if(exp == 0)		dub = ldexp(mant, -24);	else if(exp != 31)		dub = ldexp(mant + 1024, exp - 25);	else		dub = mant == 0 ? Inf(0) : NaN(); 	return cbor_make_double(d->alloc, (v & 0x8000) ? -dub : dub);} static cbor*dec_half(cbor_coder *d){	return dec_size(d, 2, dec_half_v);} static cbor*dec_f_v(cbor_coder *d, u64int v){	float f;	u32int fv; 	fv = (u32int)v;	memcpy(&f, &fv, 4); 	return cbor_make_float(d->alloc, f);} static cbor*dec_f(cbor_coder *d){	return dec_size(d, 4, dec_f_v);} static cbor*dec_d_v(cbor_coder *d, u64int v){	double dub; 	memcpy(&dub, &v, 8); 	return cbor_make_double(d->alloc, dub);} static cbor*dec_d(cbor_coder *d){	return dec_size(d, 8, dec_d_v);} static cbor *(*decfuns[256])(cbor_coder *d) = {/* major type 0 */[0x00]	dec_ulit,[0x01]	dec_ulit,[0x02]	dec_ulit,[0x03]	dec_ulit,[0x04]	dec_ulit,[0x05]	dec_ulit,[0x06]	dec_ulit,[0x07]	dec_ulit,[0x08]	dec_ulit,[0x09]	dec_ulit,[0x0a]	dec_ulit,[0x0b]	dec_ulit,[0x0c]	dec_ulit,[0x0d]	dec_ulit,[0x0e]	dec_ulit,[0x0f]	dec_ulit,[0x10]	dec_ulit,[0x11]	dec_ulit,[0x12]	dec_ulit,[0x13]	dec_ulit,[0x14]	dec_ulit,[0x15]	dec_ulit,[0x16]	dec_ulit,[0x17]	dec_ulit,[0x18]	dec_u,[0x19]	dec_u,[0x1a]	dec_u,[0x1b]	dec_u, /* major type 1 */[0x20]	dec_slit,[0x21]	dec_slit,[0x22]	dec_slit,[0x23]	dec_slit,[0x24]	dec_slit,[0x25]	dec_slit,[0x26]	dec_slit,[0x27]	dec_slit,[0x28]	dec_slit,[0x29]	dec_slit,[0x2a]	dec_slit,[0x2b]	dec_slit,[0x2c]	dec_slit,[0x2d]	dec_slit,[0x2e]	dec_slit,[0x2f]	dec_slit,[0x30]	dec_slit,[0x31]	dec_slit,[0x32]	dec_slit,[0x33]	dec_slit,[0x34]	dec_slit,[0x35]	dec_slit,[0x36]	dec_slit,[0x37]	dec_slit,[0x38]	dec_s,[0x39]	dec_s,[0x3a]	dec_s,[0x3b]	dec_s, /* major type 2 */[0x40]	dec_blit,[0x41]	dec_blit,[0x42]	dec_blit,[0x43]	dec_blit,[0x44]	dec_blit,[0x45]	dec_blit,[0x46]	dec_blit,[0x47]	dec_blit,[0x48]	dec_blit,[0x49]	dec_blit,[0x4a]	dec_blit,[0x4b]	dec_blit,[0x4c]	dec_blit,[0x4d]	dec_blit,[0x4e]	dec_blit,[0x4f]	dec_blit,[0x50]	dec_blit,[0x51]	dec_blit,[0x52]	dec_blit,[0x53]	dec_blit,[0x54]	dec_blit,[0x55]	dec_blit,[0x56]	dec_blit,[0x57]	dec_blit,[0x58]	dec_b,[0x59]	dec_b,[0x5a]	dec_b,[0x5b]	dec_b, /* major type 3 */[0x60]	dec_stringlit,[0x61]	dec_stringlit,[0x62]	dec_stringlit,[0x63]	dec_stringlit,[0x64]	dec_stringlit,[0x65]	dec_stringlit,[0x66]	dec_stringlit,[0x67]	dec_stringlit,[0x68]	dec_stringlit,[0x69]	dec_stringlit,[0x6a]	dec_stringlit,[0x6b]	dec_stringlit,[0x6c]	dec_stringlit,[0x6d]	dec_stringlit,[0x6e]	dec_stringlit,[0x6f]	dec_stringlit,[0x70]	dec_stringlit,[0x71]	dec_stringlit,[0x72]	dec_stringlit,[0x73]	dec_stringlit,[0x74]	dec_stringlit,[0x75]	dec_stringlit,[0x76]	dec_stringlit,[0x77]	dec_stringlit,[0x78]	dec_string,[0x79]	dec_string,[0x7a]	dec_string,[0x7b]	dec_string, /* major type 4 */[0x80]	dec_alit,[0x81]	dec_alit,[0x82]	dec_alit,[0x83]	dec_alit,[0x84]	dec_alit,[0x85]	dec_alit,[0x86]	dec_alit,[0x87]	dec_alit,[0x88]	dec_alit,[0x89]	dec_alit,[0x8a]	dec_alit,[0x8b]	dec_alit,[0x8c]	dec_alit,[0x8d]	dec_alit,[0x8e]	dec_alit,[0x8f]	dec_alit,[0x90]	dec_alit,[0x91]	dec_alit,[0x92]	dec_alit,[0x93]	dec_alit,[0x94]	dec_alit,[0x95]	dec_alit,[0x96]	dec_alit,[0x97]	dec_alit,[0x98]	dec_a,[0x99]	dec_a,[0x9a]	dec_a,[0x9b]	dec_a, /* major type 5 */[0xa0]	dec_mlit,[0xa1]	dec_mlit,[0xa2]	dec_mlit,[0xa3]	dec_mlit,[0xa4]	dec_mlit,[0xa5]	dec_mlit,[0xa6]	dec_mlit,[0xa7]	dec_mlit,[0xa8]	dec_mlit,[0xa9]	dec_mlit,[0xaa]	dec_mlit,[0xab]	dec_mlit,[0xac]	dec_mlit,[0xad]	dec_mlit,[0xae]	dec_mlit,[0xaf]	dec_mlit,[0xb0]	dec_mlit,[0xb1]	dec_mlit,[0xb2]	dec_mlit,[0xb3]	dec_mlit,[0xb4]	dec_mlit,[0xb5]	dec_mlit,[0xb6]	dec_mlit,[0xb7]	dec_mlit,[0xb8]	dec_m,[0xb9]	dec_m,[0xba]	dec_m,[0xbb]	dec_m, /* major type 6 */

Lines 1–500 of 570.