• Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Data Structures
  • Files
  • Directories
  • File List
  • Globals

basex.c

Go to the documentation of this file.
00001 /*
00002  * $Id$
00003  *
00004  * convert/decode to/from ascii using various bases
00005  *
00006  * Copyright (C) 2008 iptelorg GmbH
00007  *
00008  * Permission to use, copy, modify, and distribute this software for any
00009  * purpose with or without fee is hereby granted, provided that the above
00010  * copyright notice and this permission notice appear in all copies.
00011  *
00012  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
00013  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
00014  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
00015  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
00016  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
00017  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
00018  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
00019  */
00020 /*
00021  * Defines:
00022  *  BASE64_LOOKUP_TABLE - use small lookup tables for conversions (faster
00023  *                         in general)
00024  *
00025  * History:
00026  * --------
00027  *  2008-06-11  created by andrei
00028  */
00037 #include "basex.h"
00038 
00039 #ifdef BASE16_LOOKUP_TABLE
00040 #ifdef BASE16_LOOKUP_LARGE
00041 
00042 unsigned char _bx_hexdig_hi[256]={
00043         '0', '0', '0', '0', '0', '0', '0', '0',
00044         '0', '0', '0', '0', '0', '0', '0', '0',
00045         '1', '1', '1', '1', '1', '1', '1', '1',
00046         '1', '1', '1', '1', '1', '1', '1', '1',
00047         '2', '2', '2', '2', '2', '2', '2', '2',
00048         '2', '2', '2', '2', '2', '2', '2', '2',
00049         '3', '3', '3', '3', '3', '3', '3', '3',
00050         '3', '3', '3', '3', '3', '3', '3', '3',
00051         '4', '4', '4', '4', '4', '4', '4', '4',
00052         '4', '4', '4', '4', '4', '4', '4', '4',
00053         '5', '5', '5', '5', '5', '5', '5', '5',
00054         '5', '5', '5', '5', '5', '5', '5', '5',
00055         '6', '6', '6', '6', '6', '6', '6', '6',
00056         '6', '6', '6', '6', '6', '6', '6', '6',
00057         '7', '7', '7', '7', '7', '7', '7', '7',
00058         '7', '7', '7', '7', '7', '7', '7', '7',
00059         '8', '8', '8', '8', '8', '8', '8', '8',
00060         '8', '8', '8', '8', '8', '8', '8', '8',
00061         '9', '9', '9', '9', '9', '9', '9', '9',
00062         '9', '9', '9', '9', '9', '9', '9', '9',
00063         'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
00064         'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
00065         'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B',
00066         'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B',
00067         'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C',
00068         'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C',
00069         'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D',
00070         'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D',
00071         'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E',
00072         'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E',
00073         'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F',
00074         'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F'
00075 };
00076 
00077 unsigned char _bx_hexdig_low[256]={
00078         '0', '1', '2', '3', '4', '5', '6', '7',
00079         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00080         '0', '1', '2', '3', '4', '5', '6', '7',
00081         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00082         '0', '1', '2', '3', '4', '5', '6', '7',
00083         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00084         '0', '1', '2', '3', '4', '5', '6', '7',
00085         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00086         '0', '1', '2', '3', '4', '5', '6', '7',
00087         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00088         '0', '1', '2', '3', '4', '5', '6', '7',
00089         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00090         '0', '1', '2', '3', '4', '5', '6', '7',
00091         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00092         '0', '1', '2', '3', '4', '5', '6', '7',
00093         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00094         '0', '1', '2', '3', '4', '5', '6', '7',
00095         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00096         '0', '1', '2', '3', '4', '5', '6', '7',
00097         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00098         '0', '1', '2', '3', '4', '5', '6', '7',
00099         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00100         '0', '1', '2', '3', '4', '5', '6', '7',
00101         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00102         '0', '1', '2', '3', '4', '5', '6', '7',
00103         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00104         '0', '1', '2', '3', '4', '5', '6', '7',
00105         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00106         '0', '1', '2', '3', '4', '5', '6', '7',
00107         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00108         '0', '1', '2', '3', '4', '5', '6', '7',
00109         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
00110 };
00111 
00112 unsigned char _bx_unhexdig256[256]={
00113 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00114 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00115 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00116 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00117 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 
00118 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xff, 0xff, 
00119 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 
00120 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00121 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00122 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x0b, 0x0c, 
00123 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00124 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00125 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00126 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00127 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00128 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00129 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00130 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00131 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00132 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00133 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00134 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00135 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00136 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00137 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00138 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
00139 
00140 #else /* BASE16_LOOKUP_LARGE */
00141 
00142 unsigned char _bx_hexdig[16+1]="0123456789ABCDEF";
00143 
00144 unsigned char _bx_unhexdig32[32]={
00145         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 
00146         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x0b, 0x0c,
00147         0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
00148         0xff };
00149 
00150 #endif /*  BASE16_LOOKUP_LARGE */
00151 #endif /* BASE16_LOOKUP_TABLE */
00152 
00153 #ifdef BASE64_LOOKUP_TABLE
00154 
00155 #ifdef BASE64_LOOKUP_LARGE
00156 /* large lookup tables, 2.5 k */
00157 
00158 unsigned char _bx_b64_first[256];
00159 unsigned char _bx_b64_second[4][256];
00160 unsigned char _bx_b64_third[4][256];
00161 unsigned char _bx_b64_fourth[256];
00162 
00163 unsigned char _bx_ub64[256];
00164 
00165 #elif defined BASE64_LOOKUP_8K
00166 unsigned short _bx_b64_12[4096];
00167 unsigned char _bx_ub64[256];
00168 
00169 #else /*  BASE64_LOOKUP_LARGE */
00170 /* very small lookup, 65 bytes */
00171 
00172 unsigned char _bx_b64[64+1]=
00173                 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
00174 
00175 
00176 unsigned char _bx_ub64[0x54+1]={
00177                                               0x3e, 0xff, 0xff, 0xff, 0x3f,
00178                 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d,
00179                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0x02,
00180                 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c,
00181                 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
00182                 0x17, 0x18, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1a,
00183                 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
00184                 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e,
00185                 0x2f, 0x30, 0x31, 0x32, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff };
00186 
00187 #endif /*  BASE64_LOOKUP_LARGE */
00188 
00189 #endif /* BASE64_LOOKUP_TABLE */
00190 
00191 #define b64_enc_char(c) base64_enc_char(c)
00192 #define b64_dec_char(c) base64_dec_char(c)
00193 
00194 int init_basex()
00195 {
00196 #ifdef BASE64_LOOKUP_TABLE
00197 #if defined BASE64_LOOKUP_LARGE || defined BASE64_LOOKUP_8K
00198         int r;
00199 #endif
00200 #ifdef BASE64_LOOKUP_LARGE
00201         int i;
00202         
00203         /* encode tables */
00204         for (r=0; r<256; r++)
00205                 _bx_b64_first[r]=b64_enc_char(((unsigned char)r)>>2);
00206         for(i=0; i<4; i++){
00207                 for (r=0; r<256; r++)
00208                         _bx_b64_second[i][r]=
00209                                         b64_enc_char((unsigned char)((i<<4)|(r>>4)));
00210         }
00211         for(i=0; i<4; i++){
00212                 for (r=0; r<256; r++)
00213                         _bx_b64_third[i][r]=
00214                                 b64_enc_char((unsigned char)(((r<<2)&0x3f)|i));
00215         }
00216         for (r=0; r<256; r++)
00217                 _bx_b64_fourth[r]=b64_enc_char(((unsigned char)r&0x3f));
00218         
00219         /* decode */
00220         for (r=0; r<256; r++)
00221                 _bx_ub64[r]=b64_dec_char((unsigned char)r);
00222 #elif defined BASE64_LOOKUP_8K
00223         for (r=0; r< 4096; r++)
00224 #if defined __IS_LITTLE_ENDIAN
00225                 _bx_b64_12[r]=b64_enc_char(r>>6)|(b64_enc_char(r&0x3f)<<8);
00226 #elif defined __IS_BIG_ENDIAN /* __IS_LITTLE_ENDIAN */
00227                 _bx_b64_12[r]=(b64_enc_char(r>>6)<<8)|b64_enc_char(r&0x3f);
00228 #else /* __IS_LITTLE_ENDIAN */
00229 #error Neither __IS_LITTE_ENDIAN nor __IS_BIG_ENDIAN  defined
00230 #endif
00231         /* decode */
00232         for (r=0; r<256; r++)
00233                 _bx_ub64[r]=b64_dec_char((unsigned char)r);
00234 #endif
00235 #endif
00236         return 0;
00237 }

Generated on Tue May 22 2012 13:10:02 for SIP Router by  doxygen 1.7.1