cdp_avp: added README file
[sip-router] / basex.c
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
36
37 #include "basex.h"
38
39 #ifdef BASE16_LOOKUP_TABLE
40 #ifdef BASE16_LOOKUP_LARGE
41
42 unsigned char _bx_hexdig_hi[256]={
43         '0', '0', '0', '0', '0', '0', '0', '0',
44         '0', '0', '0', '0', '0', '0', '0', '0',
45         '1', '1', '1', '1', '1', '1', '1', '1',
46         '1', '1', '1', '1', '1', '1', '1', '1',
47         '2', '2', '2', '2', '2', '2', '2', '2',
48         '2', '2', '2', '2', '2', '2', '2', '2',
49         '3', '3', '3', '3', '3', '3', '3', '3',
50         '3', '3', '3', '3', '3', '3', '3', '3',
51         '4', '4', '4', '4', '4', '4', '4', '4',
52         '4', '4', '4', '4', '4', '4', '4', '4',
53         '5', '5', '5', '5', '5', '5', '5', '5',
54         '5', '5', '5', '5', '5', '5', '5', '5',
55         '6', '6', '6', '6', '6', '6', '6', '6',
56         '6', '6', '6', '6', '6', '6', '6', '6',
57         '7', '7', '7', '7', '7', '7', '7', '7',
58         '7', '7', '7', '7', '7', '7', '7', '7',
59         '8', '8', '8', '8', '8', '8', '8', '8',
60         '8', '8', '8', '8', '8', '8', '8', '8',
61         '9', '9', '9', '9', '9', '9', '9', '9',
62         '9', '9', '9', '9', '9', '9', '9', '9',
63         'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
64         'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
65         'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B',
66         'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B',
67         'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C',
68         'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C',
69         'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D',
70         'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D',
71         'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E',
72         'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E',
73         'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F',
74         'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F'
75 };
76
77 unsigned char _bx_hexdig_low[256]={
78         '0', '1', '2', '3', '4', '5', '6', '7',
79         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
80         '0', '1', '2', '3', '4', '5', '6', '7',
81         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
82         '0', '1', '2', '3', '4', '5', '6', '7',
83         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
84         '0', '1', '2', '3', '4', '5', '6', '7',
85         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
86         '0', '1', '2', '3', '4', '5', '6', '7',
87         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
88         '0', '1', '2', '3', '4', '5', '6', '7',
89         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
90         '0', '1', '2', '3', '4', '5', '6', '7',
91         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
92         '0', '1', '2', '3', '4', '5', '6', '7',
93         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
94         '0', '1', '2', '3', '4', '5', '6', '7',
95         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
96         '0', '1', '2', '3', '4', '5', '6', '7',
97         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
98         '0', '1', '2', '3', '4', '5', '6', '7',
99         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
100         '0', '1', '2', '3', '4', '5', '6', '7',
101         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
102         '0', '1', '2', '3', '4', '5', '6', '7',
103         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
104         '0', '1', '2', '3', '4', '5', '6', '7',
105         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
106         '0', '1', '2', '3', '4', '5', '6', '7',
107         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
108         '0', '1', '2', '3', '4', '5', '6', '7',
109         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
110 };
111
112 unsigned char _bx_unhexdig256[256]={
113 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
114 0xff, 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, 0xff, 0xff, 0xff, 
117 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 
118 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xff, 0xff, 
119 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 
120 0x0f, 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, 0x0a, 0x0b, 0x0c, 
123 0x0d, 0x0e, 0x0f, 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, 0xff, 0xff, 0xff, 0xff, 
133 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
134 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
135 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
136 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
137 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
138 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
139
140 #else /* BASE16_LOOKUP_LARGE */
141
142 unsigned char _bx_hexdig[16+1]="0123456789ABCDEF";
143
144 unsigned char _bx_unhexdig32[32]={
145         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 
146         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x0b, 0x0c,
147         0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
148         0xff };
149
150 #endif /*  BASE16_LOOKUP_LARGE */
151 #endif /* BASE16_LOOKUP_TABLE */
152
153 #ifdef BASE64_LOOKUP_TABLE
154
155 #ifdef BASE64_LOOKUP_LARGE
156 /* large lookup tables, 2.5 k */
157
158 unsigned char _bx_b64_first[256];
159 unsigned char _bx_b64_second[4][256];
160 unsigned char _bx_b64_third[4][256];
161 unsigned char _bx_b64_fourth[256];
162
163 unsigned char _bx_ub64[256];
164
165 #elif defined BASE64_LOOKUP_8K
166 unsigned short _bx_b64_12[4096];
167 unsigned char _bx_ub64[256];
168
169 #else /*  BASE64_LOOKUP_LARGE */
170 /* very small lookup, 65 bytes */
171
172 unsigned char _bx_b64[64+1]=
173                 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
174
175
176 unsigned char _bx_ub64[0x54+1]={
177                                               0x3e, 0xff, 0xff, 0xff, 0x3f,
178                 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d,
179                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0x02,
180                 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c,
181                 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
182                 0x17, 0x18, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1a,
183                 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
184                 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e,
185                 0x2f, 0x30, 0x31, 0x32, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff };
186
187 #endif /*  BASE64_LOOKUP_LARGE */
188
189 #endif /* BASE64_LOOKUP_TABLE */
190
191 #define b64_enc_char(c) base64_enc_char(c)
192 #define b64_dec_char(c) base64_dec_char(c)
193
194 int init_basex()
195 {
196 #ifdef BASE64_LOOKUP_TABLE
197 #if defined BASE64_LOOKUP_LARGE || defined BASE64_LOOKUP_8K
198         int r;
199 #endif
200 #ifdef BASE64_LOOKUP_LARGE
201         int i;
202         
203         /* encode tables */
204         for (r=0; r<256; r++)
205                 _bx_b64_first[r]=b64_enc_char(((unsigned char)r)>>2);
206         for(i=0; i<4; i++){
207                 for (r=0; r<256; r++)
208                         _bx_b64_second[i][r]=
209                                         b64_enc_char((unsigned char)((i<<4)|(r>>4)));
210         }
211         for(i=0; i<4; i++){
212                 for (r=0; r<256; r++)
213                         _bx_b64_third[i][r]=
214                                 b64_enc_char((unsigned char)(((r<<2)&0x3f)|i));
215         }
216         for (r=0; r<256; r++)
217                 _bx_b64_fourth[r]=b64_enc_char(((unsigned char)r&0x3f));
218         
219         /* decode */
220         for (r=0; r<256; r++)
221                 _bx_ub64[r]=b64_dec_char((unsigned char)r);
222 #elif defined BASE64_LOOKUP_8K
223         for (r=0; r< 4096; r++)
224 #if defined __IS_LITTLE_ENDIAN
225                 _bx_b64_12[r]=b64_enc_char(r>>6)|(b64_enc_char(r&0x3f)<<8);
226 #elif defined __IS_BIG_ENDIAN /* __IS_LITTLE_ENDIAN */
227                 _bx_b64_12[r]=(b64_enc_char(r>>6)<<8)|b64_enc_char(r&0x3f);
228 #else /* __IS_LITTLE_ENDIAN */
229 #error Neither __IS_LITTE_ENDIAN nor __IS_BIG_ENDIAN  defined
230 #endif
231         /* decode */
232         for (r=0; r<256; r++)
233                 _bx_ub64[r]=b64_dec_char((unsigned char)r);
234 #endif
235 #endif
236         return 0;
237 }