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