u16.c 823 B

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