xref: /plan9/sys/src/libc/port/u16.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1*9a747e4fSDavid du Colombier #include <u.h>
2*9a747e4fSDavid du Colombier #include <libc.h>
3*9a747e4fSDavid du Colombier static char t16e[] = "0123456789ABCDEF";
4*9a747e4fSDavid du Colombier 
5*9a747e4fSDavid du Colombier int
dec16(uchar * out,int lim,char * in,int n)6*9a747e4fSDavid du Colombier dec16(uchar *out, int lim, char *in, int n)
7*9a747e4fSDavid du Colombier {
8*9a747e4fSDavid du Colombier 	int c, w = 0, i = 0;
9*9a747e4fSDavid du Colombier 	uchar *start = out;
10*9a747e4fSDavid du Colombier 	uchar *eout = out + lim;
11*9a747e4fSDavid du Colombier 
12*9a747e4fSDavid du Colombier 	while(n-- > 0){
13*9a747e4fSDavid du Colombier 		c = *in++;
14*9a747e4fSDavid du Colombier 		if('0' <= c && c <= '9')
15*9a747e4fSDavid du Colombier 			c = c - '0';
16*9a747e4fSDavid du Colombier 		else if('a' <= c && c <= 'z')
17*9a747e4fSDavid du Colombier 			c = c - 'a' + 10;
18*9a747e4fSDavid du Colombier 		else if('A' <= c && c <= 'Z')
19*9a747e4fSDavid du Colombier 			c = c - 'A' + 10;
20*9a747e4fSDavid du Colombier 		else
21*9a747e4fSDavid du Colombier 			continue;
22*9a747e4fSDavid du Colombier 		w = (w<<4) + c;
23*9a747e4fSDavid du Colombier 		i++;
24*9a747e4fSDavid du Colombier 		if(i == 2){
25*9a747e4fSDavid du Colombier 			if(out + 1 > eout)
26*9a747e4fSDavid du Colombier 				goto exhausted;
27*9a747e4fSDavid du Colombier 			*out++ = w;
28*9a747e4fSDavid du Colombier 			w = 0;
29*9a747e4fSDavid du Colombier 			i = 0;
30*9a747e4fSDavid du Colombier 		}
31*9a747e4fSDavid du Colombier 	}
32*9a747e4fSDavid du Colombier exhausted:
33*9a747e4fSDavid du Colombier 	return out - start;
34*9a747e4fSDavid du Colombier }
35*9a747e4fSDavid du Colombier 
36*9a747e4fSDavid du Colombier int
enc16(char * out,int lim,uchar * in,int n)37*9a747e4fSDavid du Colombier enc16(char *out, int lim, uchar *in, int n)
38*9a747e4fSDavid du Colombier {
39*9a747e4fSDavid du Colombier 	uint c;
40*9a747e4fSDavid du Colombier 	char *eout = out + lim;
41*9a747e4fSDavid du Colombier 	char *start = out;
42*9a747e4fSDavid du Colombier 
43*9a747e4fSDavid du Colombier 	while(n-- > 0){
44*9a747e4fSDavid du Colombier 		c = *in++;
45*9a747e4fSDavid du Colombier 		if(out + 2 >= eout)
46*9a747e4fSDavid du Colombier 			goto exhausted;
47*9a747e4fSDavid du Colombier 		*out++ = t16e[c>>4];
48*9a747e4fSDavid du Colombier 		*out++ = t16e[c&0xf];
49*9a747e4fSDavid du Colombier 	}
50*9a747e4fSDavid du Colombier exhausted:
51*9a747e4fSDavid du Colombier 	*out = 0;
52*9a747e4fSDavid du Colombier 	return out - start;
53*9a747e4fSDavid du Colombier }
54