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