| #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; |
| } |