|  | #include <lib9.h> | 
|  | static char t16e[] = "0123456789ABCDEF"; | 
|  |  | 
|  | int | 
|  | dec16(uchar *out, int lim, char *in, int n) | 
|  | { | 
|  | int c, w = 0, i = 0; | 
|  | uchar *start = out; | 
|  | uchar *eout = out + lim; | 
|  |  | 
|  | while(n-- > 0){ | 
|  | c = *in++; | 
|  | if('0' <= c && c <= '9') | 
|  | c = c - '0'; | 
|  | else if('a' <= c && c <= 'z') | 
|  | c = c - 'a' + 10; | 
|  | else if('A' <= c && c <= 'Z') | 
|  | c = c - 'A' + 10; | 
|  | else | 
|  | continue; | 
|  | w = (w<<4) + c; | 
|  | i++; | 
|  | if(i == 2){ | 
|  | if(out + 1 > eout) | 
|  | goto exhausted; | 
|  | *out++ = w; | 
|  | w = 0; | 
|  | i = 0; | 
|  | } | 
|  | } | 
|  | exhausted: | 
|  | return out - start; | 
|  | } | 
|  |  | 
|  | int | 
|  | enc16(char *out, int lim, uchar *in, int n) | 
|  | { | 
|  | uint c; | 
|  | char *eout = out + lim; | 
|  | char *start = out; | 
|  |  | 
|  | while(n-- > 0){ | 
|  | c = *in++; | 
|  | if(out + 2 >= eout) | 
|  | goto exhausted; | 
|  | *out++ = t16e[c>>4]; | 
|  | *out++ = t16e[c&0xf]; | 
|  | } | 
|  | exhausted: | 
|  | *out = 0; | 
|  | return out - start; | 
|  | } |