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