u16.c 808 B

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