u32.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include <lib9.h>
  2. int
  3. dec32(uchar *dest, int ndest, char *src, int nsrc)
  4. {
  5. char *s, *tab;
  6. uchar *start;
  7. int i, u[8];
  8. if(ndest+1 < (5*nsrc+7)/8)
  9. return -1;
  10. start = dest;
  11. tab = "23456789abcdefghijkmnpqrstuvwxyz";
  12. while(nsrc>=8){
  13. for(i=0; i<8; i++){
  14. s = strchr(tab,(int)src[i]);
  15. u[i] = s ? s-tab : 0;
  16. }
  17. *dest++ = (u[0]<<3) | (0x7 & (u[1]>>2));
  18. *dest++ = ((0x3 & u[1])<<6) | (u[2]<<1) | (0x1 & (u[3]>>4));
  19. *dest++ = ((0xf & u[3])<<4) | (0xf & (u[4]>>1));
  20. *dest++ = ((0x1 & u[4])<<7) | (u[5]<<2) | (0x3 & (u[6]>>3));
  21. *dest++ = ((0x7 & u[6])<<5) | u[7];
  22. src += 8;
  23. nsrc -= 8;
  24. }
  25. if(nsrc > 0){
  26. if(nsrc == 1 || nsrc == 3 || nsrc == 6)
  27. return -1;
  28. for(i=0; i<nsrc; i++){
  29. s = strchr(tab,(int)src[i]);
  30. u[i] = s ? s-tab : 0;
  31. }
  32. *dest++ = (u[0]<<3) | (0x7 & (u[1]>>2));
  33. if(nsrc == 2)
  34. goto out;
  35. *dest++ = ((0x3 & u[1])<<6) | (u[2]<<1) | (0x1 & (u[3]>>4));
  36. if(nsrc == 4)
  37. goto out;
  38. *dest++ = ((0xf & u[3])<<4) | (0xf & (u[4]>>1));
  39. if(nsrc == 5)
  40. goto out;
  41. *dest++ = ((0x1 & u[4])<<7) | (u[5]<<2) | (0x3 & (u[6]>>3));
  42. }
  43. out:
  44. return dest-start;
  45. }
  46. int
  47. enc32(char *dest, int ndest, uchar *src, int nsrc)
  48. {
  49. char *tab, *start;
  50. int j;
  51. if(ndest <= (8*nsrc+4)/5 )
  52. return -1;
  53. start = dest;
  54. tab = "23456789abcdefghijkmnpqrstuvwxyz";
  55. while(nsrc>=5){
  56. j = (0x1f & (src[0]>>3));
  57. *dest++ = tab[j];
  58. j = (0x1c & (src[0]<<2)) | (0x03 & (src[1]>>6));
  59. *dest++ = tab[j];
  60. j = (0x1f & (src[1]>>1));
  61. *dest++ = tab[j];
  62. j = (0x10 & (src[1]<<4)) | (0x0f & (src[2]>>4));
  63. *dest++ = tab[j];
  64. j = (0x1e & (src[2]<<1)) | (0x01 & (src[3]>>7));
  65. *dest++ = tab[j];
  66. j = (0x1f & (src[3]>>2));
  67. *dest++ = tab[j];
  68. j = (0x18 & (src[3]<<3)) | (0x07 & (src[4]>>5));
  69. *dest++ = tab[j];
  70. j = (0x1f & (src[4]));
  71. *dest++ = tab[j];
  72. src += 5;
  73. nsrc -= 5;
  74. }
  75. if(nsrc){
  76. j = (0x1f & (src[0]>>3));
  77. *dest++ = tab[j];
  78. j = (0x1c & (src[0]<<2));
  79. if(nsrc == 1)
  80. goto out;
  81. j |= (0x03 & (src[1]>>6));
  82. *dest++ = tab[j];
  83. j = (0x1f & (src[1]>>1));
  84. if(nsrc == 2)
  85. goto out;
  86. *dest++ = tab[j];
  87. j = (0x10 & (src[1]<<4));
  88. if(nsrc == 3)
  89. goto out;
  90. j |= (0x0f & (src[2]>>4));
  91. *dest++ = tab[j];
  92. j = (0x1e & (src[2]<<1));
  93. if(nsrc == 4)
  94. goto out;
  95. j |= (0x01 & (src[3]>>7));
  96. *dest++ = tab[j];
  97. j = (0x1f & (src[3]>>2));
  98. *dest++ = tab[j];
  99. j = (0x18 & (src[3]<<3));
  100. out:
  101. *dest++ = tab[j];
  102. }
  103. *dest = 0;
  104. return dest-start;
  105. }