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