Synesis Software STLSoft - ... Robust, Lightweight, Cross-platform, Template Software ...

b64/b64.h

Go to the documentation of this file.
00001 /* /////////////////////////////////////////////////////////////////////////////
00002  * File:        b64/b64.h
00003  *
00004  * Purpose:     Header file for the b64 library
00005  *
00006  * Created:     18th October 2004
00007  * Updated:     24th August 2008
00008  *
00009  * Thanks:      To Adam McLaurin, for ideas regarding the b64_decode2() and
00010  *              b64_encode2().
00011  *
00012  * Home:        http://synesis.com.au/software/
00013  *
00014  * Copyright (c) 2004-2008, Matthew Wilson and Synesis Software
00015  * All rights reserved.
00016  *
00017  * Redistribution and use in source and binary forms, with or without
00018  * modification, are permitted provided that the following conditions are met:
00019  *
00020  * - Redistributions of source code must retain the above copyright notice, this
00021  *   list of conditions and the following disclaimer.
00022  * - Redistributions in binary form must reproduce the above copyright notice,
00023  *   this list of conditions and the following disclaimer in the documentation
00024  *   and/or other materials provided with the distribution.
00025  * - Neither the name(s) of Matthew Wilson and Synesis Software nor the names of
00026  *   any contributors may be used to endorse or promote products derived from
00027  *   this software without specific prior written permission.
00028  *
00029  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00030  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00031  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00032  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00033  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00034  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00035  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00036  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00037  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00038  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00039  * POSSIBILITY OF SUCH DAMAGE.
00040  *
00041  * ////////////////////////////////////////////////////////////////////////// */
00042 
00043 
00049 #ifndef B64_INCL_B64_H_B64
00050 #define B64_INCL_B64_H_B64
00051 
00052 /* /////////////////////////////////////////////////////////////////////////////
00053  * Version information
00054  */
00055 
00056 #ifndef B64_DOCUMENTATION_SKIP_SECTION
00057 # define B64_VER_B64_H_B64_MAJOR    1
00058 # define B64_VER_B64_H_B64_MINOR    5
00059 # define B64_VER_B64_H_B64_REVISION 4
00060 # define B64_VER_B64_H_B64_EDIT     28
00061 #endif /* !B64_DOCUMENTATION_SKIP_SECTION */
00062 
00079 #ifndef B64_DOCUMENTATION_SKIP_SECTION
00080 # define B64_VER_1_0_1      0x01000100
00081 # define B64_VER_1_0_2      0x01000200
00082 # define B64_VER_1_0_3      0x01000300
00083 # define B64_VER_1_1_1      0x01010100
00084 # define B64_VER_1_1_2      0x01010200
00085 # define B64_VER_1_1_3      0x01010300
00086 # define B64_VER_1_2_1      0x01020100
00087 # define B64_VER_1_2_2      0x01020200
00088 # define B64_VER_1_2_3      0x01020300
00089 # define B64_VER_1_2_4      0x01020400
00090 # define B64_VER_1_2_5      0x01020500
00091 # define B64_VER_1_2_6      0x01020600
00092 # define B64_VER_1_2_7      0x01020700
00093 # define B64_VER_1_3_1      0x010301ff
00094 # define B64_VER_1_3_2      0x010302ff
00095 # define B64_VER_1_3_3      0x010303ff
00096 # define B64_VER_1_3_4      0x010304ff
00097 
00098 # define B64_VER            B64_VER_1_3_4
00099 #else /* ? B64_DOCUMENTATION_SKIP_SECTION */
00100 # define B64_VER            0x010304ff
00101 #endif /* !B64_DOCUMENTATION_SKIP_SECTION */
00102 
00103 #define B64_VER_MAJOR       1
00104 #define B64_VER_MINOR       3
00105 #define B64_VER_REVISION    4
00106 
00107 /* /////////////////////////////////////////////////////////////////////////////
00108  * Includes
00109  */
00110 
00111 #include <stddef.h>
00112 
00113 /* /////////////////////////////////////////////////////////////////////////////
00114  * Namespace
00115  */
00116 
00117 #if !defined(B64_NO_NAMESPACE) && \
00118     !defined(__cplusplus)
00119 # define B64_NO_NAMESPACE
00120 #endif /* !B64_NO_NAMESPACE && !__cplusplus */
00121 
00122 #ifdef B64_NAMESPACE
00123 # undef B64_NAMESPACE
00124 #endif /* B64_NAMESPACE */
00125 
00126 #ifdef B64_NAMESPACE_QUALIFIER
00127 # undef B64_NAMESPACE_QUALIFIER
00128 #endif /* B64_NAMESPACE_QUALIFIER */
00129 
00130 
00131 #ifndef B64_NO_NAMESPACE
00132 
00133 # ifdef B64_CUSTOM_NAMESPACE
00134 #  define B64_NAMESPACE     B64_CUSTOM_NAMESPACE
00135 # else /* ? B64_CUSTOM_NAMESPACE */
00136 #  define B64_NAMESPACE     b64
00137 # endif /* B64_CUSTOM_NAMESPACE */
00138 
00139 # if defined(B64_CUSTOM_NAMESPACE) && \
00140      defined(B64_CUSTOM_NAMESPACE_QUALIFIER)
00141 #  define B64_NAMESPACE_QUALIFIER       B64_CUSTOM_NAMESPACE_QUALIFIER
00142 # else /* B64_CUSTOM_NAMESPACE && B64_CUSTOM_NAMESPACE_QUALIFIER */
00143 #  define B64_NAMESPACE_QUALIFIER       ::B64_NAMESPACE
00144 # endif /* B64_CUSTOM_NAMESPACE && B64_CUSTOM_NAMESPACE_QUALIFIER */
00145 
00146 
00155 namespace B64_NAMESPACE
00156 {
00157 #endif /* !B64_NO_NAMESPACE */
00158 
00159 /* /////////////////////////////////////////////////////////////////////////////
00160  * Enumerations
00161  */
00162 
00165 enum B64_RC
00166 {
00167         B64_RC_OK                   =   0   
00168     ,   B64_RC_INSUFFICIENT_BUFFER  =   1   
00169     ,   B64_RC_TRUNCATED_INPUT      =   2   
00170     ,   B64_RC_DATA_ERROR           =   3   
00171 #ifndef B64_DOCUMENTATION_SKIP_SECTION
00172     ,   B64_max_RC_value
00173 #endif /* !B64_DOCUMENTATION_SKIP_SECTION */
00174 };
00175 
00176 #ifndef __cplusplus
00177 typedef enum B64_RC B64_RC;
00178 #endif /* !__cplusplus */
00179 
00182 enum B64_FLAGS
00183 {
00184         B64_F_LINE_LEN_USE_PARAM    =   0x0000  
00185     ,   B64_F_LINE_LEN_INFINITE     =   0x0001  
00186     ,   B64_F_LINE_LEN_64           =   0x0002  
00187     ,   B64_F_LINE_LEN_76           =   0x0003  
00188     ,   B64_F_LINE_LEN_MASK         =   0x000f  
00189     ,   B64_F_STOP_ON_NOTHING       =   0x0000  
00190     ,   B64_F_STOP_ON_UNKNOWN_CHAR  =   0x0100  
00191     ,   B64_F_STOP_ON_UNEXPECTED_WS =   0x0200  
00192     ,   B64_F_STOP_ON_BAD_CHAR      =   0x0300  
00193 };
00194 
00195 #ifndef __cplusplus
00196 typedef enum B64_FLAGS  B64_FLAGS;
00197 #endif /* !__cplusplus */
00198 
00199 /* /////////////////////////////////////////////////////////////////////////////
00200  * Functions
00201  */
00202 
00203 #ifdef __cplusplus
00204 extern "C" {
00205 #endif /* __cplusplus */
00206 
00230 size_t b64_encode(void const *src, size_t srcSize, char *dest, size_t destLen);
00231 
00260 size_t b64_encode2( void const  *src
00261                 ,   size_t      srcSize
00262                 ,   char        *dest
00263                 ,   size_t      destLen
00264                 ,   unsigned    flags
00265                 ,   int         lineLen /* = 0 */
00266                 ,   B64_RC      *rc     /* = NULL */);
00267 
00301 size_t b64_decode(char const *src, size_t srcLen, void *dest, size_t destSize);
00302 
00343 size_t b64_decode2( char const  *src
00344                 ,   size_t      srcLen
00345                 ,   void        *dest
00346                 ,   size_t      destSize
00347                 ,   unsigned    flags
00348                 ,   char const  **badChar   /* = NULL */
00349                 ,   B64_RC      *rc         /* = NULL */);
00350 
00351 
00356 char const *b64_getErrorString(B64_RC code);
00357 
00364 size_t b64_getErrorStringLength(B64_RC code);
00365 
00366 
00367 #ifdef __cplusplus
00368 } /* extern "C" */
00369 #endif /* __cplusplus */
00370 
00371 /* /////////////////////////////////////////////////////////////////////////////
00372  * Namespace
00373  */
00374 
00375 #ifndef B64_NO_NAMESPACE
00376 } /* namespace B64_NAMESPACE */
00377 
00378 # ifndef B64_DOCUMENTATION_SKIP_SECTION
00379 
00380 namespace stlsoft
00381 {
00382 
00383     inline char const *c_str_data_a( B64_NAMESPACE_QUALIFIER::B64_RC code)
00384     {
00385         return B64_NAMESPACE_QUALIFIER::b64_getErrorString(code);
00386     }
00387     inline char const *c_str_data( B64_NAMESPACE_QUALIFIER::B64_RC code)
00388     {
00389         return B64_NAMESPACE_QUALIFIER::b64_getErrorString(code);
00390     }
00391 
00392     inline size_t c_str_len_a( B64_NAMESPACE_QUALIFIER::B64_RC code)
00393     {
00394         return B64_NAMESPACE_QUALIFIER::b64_getErrorStringLength(code);
00395     }
00396     inline size_t c_str_len( B64_NAMESPACE_QUALIFIER::B64_RC code)
00397     {
00398         return B64_NAMESPACE_QUALIFIER::b64_getErrorStringLength(code);
00399     }
00400 
00401     inline char const *c_str_ptr_a( B64_NAMESPACE_QUALIFIER::B64_RC code)
00402     {
00403         return B64_NAMESPACE_QUALIFIER::b64_getErrorString(code);
00404     }
00405     inline char const *c_str_ptr( B64_NAMESPACE_QUALIFIER::B64_RC code)
00406     {
00407         return B64_NAMESPACE_QUALIFIER::b64_getErrorString(code);
00408     }
00409 
00410 } /* namespace stlsoft */
00411 
00412 # endif /* !B64_DOCUMENTATION_SKIP_SECTION */
00413 
00414 #endif /* !B64_NO_NAMESPACE */
00415 
00416 /* ////////////////////////////////////////////////////////////////////////// */
00417 
00418 #endif /* B64_INCL_B64_H_B64 */
00419 
00420 /* ////////////////////////////////////////////////////////////////////////// */

b64 Library documentation Synesis Software Pty Ltd, 2004-2007