Main Page | Modules | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals | Related Pages

basex.c

Go to the documentation of this file.
00001 /*
00002  * $Id: basex.c,v 1.1 2008/07/01 20:33:20 andrei Exp $
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  */
00029 
00030 #include "basex.h"
00031 
00032 #ifdef BASE16_LOOKUP_TABLE
00033 #ifdef BASE16_LOOKUP_LARGE
00034 
00035 unsigned char _bx_hexdig_hi[256]={
00036         '0', '0', '0', '0', '0', '0', '0', '0',
00037         '0', '0', '0', '0', '0', '0', '0', '0',
00038         '1', '1', '1', '1', '1', '1', '1', '1',
00039         '1', '1', '1', '1', '1', '1', '1', '1',
00040         '2', '2', '2', '2', '2', '2', '2', '2',
00041         '2', '2', '2', '2', '2', '2', '2', '2',
00042         '3', '3', '3', '3', '3', '3', '3', '3',
00043         '3', '3', '3', '3', '3', '3', '3', '3',
00044         '4', '4', '4', '4', '4', '4', '4', '4',
00045         '4', '4', '4', '4', '4', '4', '4', '4',
00046         '5', '5', '5', '5', '5', '5', '5', '5',
00047         '5', '5', '5', '5', '5', '5', '5', '5',
00048         '6', '6', '6', '6', '6', '6', '6', '6',
00049         '6', '6', '6', '6', '6', '6', '6', '6',
00050         '7', '7', '7', '7', '7', '7', '7', '7',
00051         '7', '7', '7', '7', '7', '7', '7', '7',
00052         '8', '8', '8', '8', '8', '8', '8', '8',
00053         '8', '8', '8', '8', '8', '8', '8', '8',
00054         '9', '9', '9', '9', '9', '9', '9', '9',
00055         '9', '9', '9', '9', '9', '9', '9', '9',
00056         'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
00057         'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
00058         'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B',
00059         'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B',
00060         'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C',
00061         'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C',
00062         'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D',
00063         'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D',
00064         'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E',
00065         'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E',
00066         'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F',
00067         'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F'
00068 };
00069 
00070 unsigned char _bx_hexdig_low[256]={
00071         '0', '1', '2', '3', '4', '5', '6', '7',
00072         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00073         '0', '1', '2', '3', '4', '5', '6', '7',
00074         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00075         '0', '1', '2', '3', '4', '5', '6', '7',
00076         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00077         '0', '1', '2', '3', '4', '5', '6', '7',
00078         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00079         '0', '1', '2', '3', '4', '5', '6', '7',
00080         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00081         '0', '1', '2', '3', '4', '5', '6', '7',
00082         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00083         '0', '1', '2', '3', '4', '5', '6', '7',
00084         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00085         '0', '1', '2', '3', '4', '5', '6', '7',
00086         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00087         '0', '1', '2', '3', '4', '5', '6', '7',
00088         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00089         '0', '1', '2', '3', '4', '5', '6', '7',
00090         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00091         '0', '1', '2', '3', '4', '5', '6', '7',
00092         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00093         '0', '1', '2', '3', '4', '5', '6', '7',
00094         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00095         '0', '1', '2', '3', '4', '5', '6', '7',
00096         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00097         '0', '1', '2', '3', '4', '5', '6', '7',
00098         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00099         '0', '1', '2', '3', '4', '5', '6', '7',
00100         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
00101         '0', '1', '2', '3', '4', '5', '6', '7',
00102         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
00103 };
00104 
00105 unsigned char _bx_unhexdig256[256]={
00106 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00107 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00108 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00109 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00110 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 
00111 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xff, 0xff, 
00112 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 
00113 0x0f, 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, 0x0a, 0x0b, 0x0c, 
00116 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00117 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00118 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00119 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
00120 0xff, 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, 0xff, 0xff, 0xff, 
00123 0xff, 0xff, 0xff, 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 };
00132 
00133 #else /* BASE16_LOOKUP_LARGE */
00134 
00135 unsigned char _bx_hexdig[16+1]="0123456789ABCDEF";
00136 
00137 unsigned char _bx_unhexdig32[32]={
00138         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 
00139         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x0b, 0x0c,
00140         0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
00141         0xff };
00142 
00143 #endif /*  BASE16_LOOKUP_LARGE */
00144 #endif /* BASE16_LOOKUP_TABLE */
00145 
00146 #ifdef BASE64_LOOKUP_TABLE
00147 
00148 #ifdef BASE64_LOOKUP_LARGE
00149 /* large lookup tables, 2.5 k */
00150 
00151 unsigned char _bx_b64_first[256];
00152 unsigned char _bx_b64_second[4][256];
00153 unsigned char _bx_b64_third[4][256];
00154 unsigned char _bx_b64_fourth[256];
00155 
00156 unsigned char _bx_ub64[256];
00157 
00158 #elif defined BASE64_LOOKUP_8K
00159 unsigned short _bx_b64_12[4096];
00160 unsigned char _bx_ub64[256];
00161 
00162 #else /*  BASE64_LOOKUP_LARGE */
00163 /* very small lookup, 65 bytes */
00164 
00165 unsigned char _bx_b64[64+1]=
00166                 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
00167 
00168 
00169 unsigned char _bx_ub64[0x54+1]={
00170                                               0x3e, 0xff, 0xff, 0xff, 0x3f,
00171                 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d,
00172                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0x02,
00173                 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c,
00174                 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
00175                 0x17, 0x18, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1a,
00176                 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
00177                 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e,
00178                 0x2f, 0x30, 0x31, 0x32, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff };
00179 
00180 #endif /*  BASE64_LOOKUP_LARGE */
00181 
00182 #endif /* BASE64_LOOKUP_TABLE */
00183 
00184 #define b64_enc_char(c) base64_enc_char(c)
00185 #define b64_dec_char(c) base64_dec_char(c)
00186 
00187 int init_basex()
00188 {
00189 #ifdef BASE64_LOOKUP_TABLE
00190 #if defined BASE64_LOOKUP_LARGE || defined BASE64_LOOKUP_8K
00191         int r;
00192 #endif
00193 #ifdef BASE64_LOOKUP_LARGE
00194         int i;
00195         
00196         /* encode tables */
00197         for (r=0; r<256; r++)
00198                 _bx_b64_first[r]=b64_enc_char(((unsigned char)r)>>2);
00199         for(i=0; i<4; i++){
00200                 for (r=0; r<256; r++)
00201                         _bx_b64_second[i][r]=
00202                                         b64_enc_char((unsigned char)((i<<4)|(r>>4)));
00203         }
00204         for(i=0; i<4; i++){
00205                 for (r=0; r<256; r++)
00206                         _bx_b64_third[i][r]=
00207                                 b64_enc_char((unsigned char)(((r<<2)&0x3f)|i));
00208         }
00209         for (r=0; r<256; r++)
00210                 _bx_b64_fourth[r]=b64_enc_char(((unsigned char)r&0x3f));
00211         
00212         /* decode */
00213         for (r=0; r<256; r++)
00214                 _bx_ub64[r]=b64_dec_char((unsigned char)r);
00215 #elif defined BASE64_LOOKUP_8K
00216         for (r=0; r< 4096; r++)
00217 #if defined __IS_LITTLE_ENDIAN
00218                 _bx_b64_12[r]=b64_enc_char(r>>6)|(b64_enc_char(r&0x3f)<<8);
00219 #elif defined __IS_BIG_ENDIAN /* __IS_LITTLE_ENDIAN */
00220                 _bx_b64_12[r]=(b64_enc_char(r>>6)<<8)|b64_enc_char(r&0x3f);
00221 #else /* __IS_LITTLE_ENDIAN */
00222 #error Neither __IS_LITTE_ENDIAN nor __IS_BIG_ENDIAN  defined
00223 #endif
00224         /* decode */
00225         for (r=0; r<256; r++)
00226                 _bx_ub64[r]=b64_dec_char((unsigned char)r);
00227 #endif
00228 #endif
00229         return 0;
00230 }

Generated on Thu Sep 9 04:15:40 2010 for SIPExpressRouter by  doxygen 1.3.9.1