2
0

basex.c 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. /*
  2. * $Id$
  3. *
  4. * convert/decode to/from ascii using various bases
  5. *
  6. * Copyright (C) 2008 iptelorg GmbH
  7. *
  8. * Permission to use, copy, modify, and distribute this software for any
  9. * purpose with or without fee is hereby granted, provided that the above
  10. * copyright notice and this permission notice appear in all copies.
  11. *
  12. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  13. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  14. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  15. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  16. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  17. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  18. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  19. */
  20. /*
  21. * Defines:
  22. * BASE64_LOOKUP_TABLE - use small lookup tables for conversions (faster
  23. * in general)
  24. *
  25. * History:
  26. * --------
  27. * 2008-06-11 created by andrei
  28. */
  29. /*!
  30. * \file
  31. * \brief SIP-router core :: convert/decode to/from ascii using various bases
  32. * \ingroup core
  33. * Module: \ref core
  34. */
  35. #include "basex.h"
  36. #ifdef BASE16_LOOKUP_TABLE
  37. #ifdef BASE16_LOOKUP_LARGE
  38. unsigned char _bx_hexdig_hi[256]={
  39. '0', '0', '0', '0', '0', '0', '0', '0',
  40. '0', '0', '0', '0', '0', '0', '0', '0',
  41. '1', '1', '1', '1', '1', '1', '1', '1',
  42. '1', '1', '1', '1', '1', '1', '1', '1',
  43. '2', '2', '2', '2', '2', '2', '2', '2',
  44. '2', '2', '2', '2', '2', '2', '2', '2',
  45. '3', '3', '3', '3', '3', '3', '3', '3',
  46. '3', '3', '3', '3', '3', '3', '3', '3',
  47. '4', '4', '4', '4', '4', '4', '4', '4',
  48. '4', '4', '4', '4', '4', '4', '4', '4',
  49. '5', '5', '5', '5', '5', '5', '5', '5',
  50. '5', '5', '5', '5', '5', '5', '5', '5',
  51. '6', '6', '6', '6', '6', '6', '6', '6',
  52. '6', '6', '6', '6', '6', '6', '6', '6',
  53. '7', '7', '7', '7', '7', '7', '7', '7',
  54. '7', '7', '7', '7', '7', '7', '7', '7',
  55. '8', '8', '8', '8', '8', '8', '8', '8',
  56. '8', '8', '8', '8', '8', '8', '8', '8',
  57. '9', '9', '9', '9', '9', '9', '9', '9',
  58. '9', '9', '9', '9', '9', '9', '9', '9',
  59. 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
  60. 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
  61. 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B',
  62. 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B',
  63. 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C',
  64. 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C',
  65. 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D',
  66. 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D',
  67. 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E',
  68. 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E',
  69. 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F',
  70. 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F'
  71. };
  72. unsigned char _bx_hexdig_low[256]={
  73. '0', '1', '2', '3', '4', '5', '6', '7',
  74. '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
  75. '0', '1', '2', '3', '4', '5', '6', '7',
  76. '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
  77. '0', '1', '2', '3', '4', '5', '6', '7',
  78. '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
  79. '0', '1', '2', '3', '4', '5', '6', '7',
  80. '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
  81. '0', '1', '2', '3', '4', '5', '6', '7',
  82. '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
  83. '0', '1', '2', '3', '4', '5', '6', '7',
  84. '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
  85. '0', '1', '2', '3', '4', '5', '6', '7',
  86. '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
  87. '0', '1', '2', '3', '4', '5', '6', '7',
  88. '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
  89. '0', '1', '2', '3', '4', '5', '6', '7',
  90. '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
  91. '0', '1', '2', '3', '4', '5', '6', '7',
  92. '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
  93. '0', '1', '2', '3', '4', '5', '6', '7',
  94. '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
  95. '0', '1', '2', '3', '4', '5', '6', '7',
  96. '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
  97. '0', '1', '2', '3', '4', '5', '6', '7',
  98. '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
  99. '0', '1', '2', '3', '4', '5', '6', '7',
  100. '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
  101. '0', '1', '2', '3', '4', '5', '6', '7',
  102. '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
  103. '0', '1', '2', '3', '4', '5', '6', '7',
  104. '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
  105. };
  106. unsigned char _bx_unhexdig256[256]={
  107. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  108. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  109. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  110. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  111. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01,
  112. 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xff, 0xff,
  113. 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
  114. 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  115. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  116. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x0b, 0x0c,
  117. 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  118. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  119. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  120. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  121. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  122. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  123. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  124. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  125. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  126. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  127. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  128. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  129. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  130. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  131. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  132. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
  133. #else /* BASE16_LOOKUP_LARGE */
  134. unsigned char _bx_hexdig[16+1]="0123456789ABCDEF";
  135. unsigned char _bx_unhexdig32[32]={
  136. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
  137. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x0b, 0x0c,
  138. 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  139. 0xff };
  140. #endif /* BASE16_LOOKUP_LARGE */
  141. #endif /* BASE16_LOOKUP_TABLE */
  142. #ifdef BASE64_LOOKUP_TABLE
  143. #ifdef BASE64_LOOKUP_LARGE
  144. /* large lookup tables, 2.5 k */
  145. unsigned char _bx_b64_first[256];
  146. unsigned char _bx_b64_second[4][256];
  147. unsigned char _bx_b64_third[4][256];
  148. unsigned char _bx_b64_fourth[256];
  149. unsigned char _bx_ub64[256];
  150. #elif defined BASE64_LOOKUP_8K
  151. unsigned short _bx_b64_12[4096];
  152. unsigned char _bx_ub64[256];
  153. #else /* BASE64_LOOKUP_LARGE */
  154. /* very small lookup, 65 bytes */
  155. unsigned char _bx_b64[64+1]=
  156. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  157. unsigned char _bx_ub64[0x54+1]={
  158. 0x3e, 0xff, 0xff, 0xff, 0x3f,
  159. 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d,
  160. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0x02,
  161. 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c,
  162. 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
  163. 0x17, 0x18, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1a,
  164. 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
  165. 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e,
  166. 0x2f, 0x30, 0x31, 0x32, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff };
  167. #endif /* BASE64_LOOKUP_LARGE */
  168. #endif /* BASE64_LOOKUP_TABLE */
  169. #define b64_enc_char(c) base64_enc_char(c)
  170. #define b64_dec_char(c) base64_dec_char(c)
  171. int init_basex()
  172. {
  173. #ifdef BASE64_LOOKUP_TABLE
  174. #if defined BASE64_LOOKUP_LARGE || defined BASE64_LOOKUP_8K
  175. int r;
  176. #endif
  177. #ifdef BASE64_LOOKUP_LARGE
  178. int i;
  179. /* encode tables */
  180. for (r=0; r<256; r++)
  181. _bx_b64_first[r]=b64_enc_char(((unsigned char)r)>>2);
  182. for(i=0; i<4; i++){
  183. for (r=0; r<256; r++)
  184. _bx_b64_second[i][r]=
  185. b64_enc_char((unsigned char)((i<<4)|(r>>4)));
  186. }
  187. for(i=0; i<4; i++){
  188. for (r=0; r<256; r++)
  189. _bx_b64_third[i][r]=
  190. b64_enc_char((unsigned char)(((r<<2)&0x3f)|i));
  191. }
  192. for (r=0; r<256; r++)
  193. _bx_b64_fourth[r]=b64_enc_char(((unsigned char)r&0x3f));
  194. /* decode */
  195. for (r=0; r<256; r++)
  196. _bx_ub64[r]=b64_dec_char((unsigned char)r);
  197. #elif defined BASE64_LOOKUP_8K
  198. for (r=0; r< 4096; r++)
  199. #if defined __IS_LITTLE_ENDIAN
  200. _bx_b64_12[r]=b64_enc_char(r>>6)|(b64_enc_char(r&0x3f)<<8);
  201. #elif defined __IS_BIG_ENDIAN /* __IS_LITTLE_ENDIAN */
  202. _bx_b64_12[r]=(b64_enc_char(r>>6)<<8)|b64_enc_char(r&0x3f);
  203. #else /* __IS_LITTLE_ENDIAN */
  204. #error Neither __IS_LITTE_ENDIAN nor __IS_BIG_ENDIAN defined
  205. #endif
  206. /* decode */
  207. for (r=0; r<256; r++)
  208. _bx_ub64[r]=b64_dec_char((unsigned char)r);
  209. #endif
  210. #endif
  211. return 0;
  212. }