serial.h

00001 #ifndef CTL_SERIAL_H
00002 #define CTL_SERIAL_H
00003 /****************************************************************************
00004 
00005 Serial data handler functions
00006 
00007 ****************************************************************************/
00008 
00009 #if !(defined(SERIAL_LITTLE_ENDIAN) || defined(SERIAL_BIG_ENDIAN) || defined(SERIAL_NATIVE))
00010 /* Let's be 'big-endian' by default, if nothing's set up */
00011 /* Mostly because the serial stream is slightly easier to read that way. */
00012 #define SERIAL_BIG_ENDIAN
00013 #endif
00014 
00022 typedef struct ctl_serial
00023 {
00024     const uint8*    begin;  
00025     uint8*          curr;   
00026     const uint8*    end;    
00027     void*           buff;   
00028 } ctl_serial;
00029 
00030 /* Exceptions for serial operations are notified through a callback */
00031 typedef void (*ctl_serial_exception)( const ctl_serial* serial, const char* reason );
00032 #ifndef SERIAL_C
00033 extern const ctl_serial_exception ctl_serial_except;
00034 #endif
00035 ctl_serial_exception ctl_serial_setexception( ctl_serial_exception except );
00036 void serial_log( const ctl_serial* serial, unsigned mask, const char* fmt, ... );
00037 
00045 #define ctl_serial_auto( label, begin, end )        ctl_serial label = { begin, curr, end, NULL }
00046 
00054 #define ctl_serial_init( serial, _begin, _end ) { (serial)->begin = (serial)->curr = (uint8*)(_begin); (serial)->end = (uint8*)(_end); (serial)->buff = NULL; }
00055 
00062 #define ctl_serial_alloc( serial, size )\
00063     {\
00064         ctl_serial* tser = (serial);\
00065         size_t tsize = (size);\
00066         ctl_malloc(tser->buff,tsize);\
00067         tser->begin = tser->curr = (uint8*)tser->buff;\
00068         tser->end = tser->begin + tsize;\
00069     }
00070 
00076 #define ctl_serial_free( serial )               ctl_free( (serial)->buff )
00077 
00078 void ctl_serial_copy( ctl_serial* dst, const ctl_serial* src );
00079 void ctl_serial_deref( ctl_serial* serial );
00080 
00086 #define ctl_serial_total( serial )                      ( (serial)->end - (serial)->begin )
00087 
00092 #define ctl_serial_remain( serial )                     ( (serial)->end - (serial)->curr )
00093 
00098 #define ctl_serial_consumed( serial )                   ( (serial)->curr - (serial)->begin )
00099 
00104 #define ctl_serial_rewind( serial )                     ( (serial)->curr = (uint8*)(serial)->begin )
00105 
00112 #define ctl_serial_auto_vector( label, vec )            ctl_serial label = { (vec)->array, (vec)->array, (vec)->array+(vec)->count }
00113 
00119 #define ctl_serial_init_vector( serial, vec, _except )  { (serial)->begin = (serial)->curr = (vec)->array; (vec)->array+(vec)->count; (serial)->except = (_except); }
00120 
00127 #define ctl_serial_size_size( size )    uint16_serial_size(size)
00128 
00135 #define ctl_serial_size_size_size( size )   (ctl_serial_size_size(size) + (size))
00136 
00137 void ctl_serial_writesize( size_t size, ctl_serial* serial );
00138 size_t ctl_serial_peeksize( const ctl_serial* serial );
00139 size_t ctl_serial_readsize( ctl_serial* serial );
00140 
00141 /*
00142  * Copy serial data around
00143  */
00144 size_t ctl_serial_calc_size( const ctl_serial* serial );
00145 void ctl_serial_write_serial( ctl_serial* dst, const ctl_serial* src );
00146 bool ctl_serial_read_serial( ctl_serial* dst, ctl_serial* src );
00147 bool ctl_serial_peek_serial( ctl_serial* dst, const ctl_serial* src );
00148 
00149 #define bool_serial_size( p )       1
00150 #define bool_serial_write( pdata, serial )      { uint8 tmp = (uint8)*(pdata); uint8_serial_write( &tmp, (serial) ); }
00151 #define bool_serial_read( pdata, serial )       { uint8 btmp; uint8_serial_read( &btmp, (serial) ); *(pdata) = (bool)(0 != btmp); }
00152 #define bool_serial_peek( pdata, serial )       { uint8 btmp; uint8_serial_peek( &btmp, (serial) ); *(pdata) = (bool)(0 != btmp); }
00153 size_t bool_serial_sizearray( const bool* array, size_t count);
00154 void bool_serial_writearray( const bool* array, size_t count, ctl_serial* serial );
00155 void bool_serial_readarray( bool* array, size_t count, ctl_serial* serial );
00156 
00157 #define int8_serial_size( p )       1
00158 #define int8_serial_read( pdata, serial )                   uint8_serial_read( ppCastPtr(uint8*)(pdata), (serial) )
00159 #define int8_serial_peek( pdata, serial )                   uint8_serial_peek( ppCastPtr(uint8*)(pdata), (serial) )
00160 #define int8_serial_write( pdata, serial )                  uint8_serial_write(  ppCastPtr(uint8*)(pdata),  (serial) )
00161 #define int8_serial_sizearray( array, count )               uint8_serial_sizearray( ppCastPtr(const uint8*)(array), (count) )
00162 #define int8_serial_writearray( array, count, serial )      uint8_serial_writearray( ppCastPtr(const uint8*)(array),   (count), (serial) )
00163 #define int8_serial_readarray( array, count, serial )       uint8_serial_readarray(  ppCastPtr(uint8*)(array),  (count), (serial) )
00164 
00165 #define uint8_serial_size( p )      1
00166 void uint8_serial_read( uint8* pdata, ctl_serial* serial );
00167 void uint8_serial_peek( uint8* pdata, const ctl_serial* serial );
00168 void uint8_serial_write( const uint8* pdata, ctl_serial* serial );
00169 size_t uint8_serial_sizearray( const uint8* array, size_t count);
00170 void uint8_serial_writearray( const uint8* array, size_t count, ctl_serial* serial );
00171 void uint8_serial_readarray( uint8* array, size_t count, ctl_serial* serial );
00172 
00173 #define int16_serial_size( p )      2
00174 #define int16_serial_read( pdata, serial )                  uint16_serial_read( ppCastPtr(uint16*)(pdata), (serial) )
00175 #define int16_serial_peek( pdata, serial )                  uint16_serial_peek( ppCastPtr(uint16*)(pdata), (serial) )
00176 #define int16_serial_write( pdata, serial )                 uint16_serial_write( ppCastPtr(uint16*)(pdata), (serial) )
00177 #define int16_serial_sizearray( array, count )              uint16_serial_sizearray( ppCastPtr(const uint16*)(array), (count) )
00178 #define int16_serial_writearray( array, count, serial )     uint16_serial_writearray( ppCastPtr(const uint16*)(array), (count), (serial) )
00179 #define int16_serial_readarray( array, count, serial )      uint16_serial_readarray( ppCastPtr(uint16*)(array), (count), (serial) )
00180 
00181 #define uint16_serial_size( p )     2
00182 void uint16_serial_read(uint16* pdata, ctl_serial* serial );
00183 void uint16_serial_peek(uint16* pdata, const ctl_serial* serial );
00184 void uint16_serial_write(const uint16* pdata, ctl_serial* serial );
00185 size_t uint16_serial_sizearray(const uint16* array, size_t count);
00186 void uint16_serial_writearray(const uint16* array, size_t count, ctl_serial* serial );
00187 void uint16_serial_readarray(uint16* array, size_t count, ctl_serial* serial );
00188 
00189 #define int32_serial_size( p )      4
00190 #define int32_serial_read( pdata, serial )                  uint32_serial_read( ppCastPtr(uint32*)(pdata), (serial) )
00191 #define int32_serial_peek( pdata, serial )                  uint32_serial_peek( ppCastPtr(uint32*)(pdata), (serial) )
00192 #define int32_serial_write( pdata, serial )                 uint32_serial_write( ppCastPtr(uint32*)(pdata), (serial) )
00193 #define int32_serial_sizearray( array, count )              uint32_serial_sizearray( ppCastPtr(const uint32*)(array), (count) )
00194 #define int32_serial_writearray( array, count, serial )     uint32_serial_writearray( ppCastPtr(const uint32*)(array), (count), (serial) )
00195 #define int32_serial_readarray( array, count, serial )      uint32_serial_readarray( ppCastPtr(uint32*)(array), (count), (serial) )
00196 
00197 #define uint32_serial_size( p )     4
00198 void uint32_serial_read(uint32* pdata, ctl_serial* serial );
00199 void uint32_serial_peek(uint32* pdata, ctl_serial* serial );
00200 void uint32_serial_write(const uint32* pdata, ctl_serial* serial );
00201 size_t uint32_serial_sizearray(const uint32* array, size_t count);
00202 void uint32_serial_writearray(const uint32* array, size_t count, ctl_serial* serial );
00203 void uint32_serial_readarray(uint32* array, size_t count, ctl_serial* serial );
00204 
00205 #define int64_serial_size( p )      8
00206 #define int64_serial_write( pdata, serial )                 uint64_serial_write( ppCastPtr(uint64*)(pdata), (serial) )
00207 #define int64_serial_read( pdata, serial )                  uint64_serial_read( ppCastPtr(uint64*)(pdata), (serial) )
00208 #define int64_serial_peek( pdata, serial )                  uint64_serial_peek( ppCastPtr(uint64*)(pdata), (serial) )
00209 #define int64_serial_sizearray( array, count )              uint64_serial_sizearray( ppCastPtr(const uint64*)(array), (count) )
00210 #define int64_serial_writearray( array, count, serial )     uint64_serial_writearray( ppCastPtr(const uint64*)(array), (count), (serial) )
00211 #define int64_serial_readarray( array, count, serial )      uint64_serial_readarray( ppCastPtr(uint64*)(array), (count), (serial) )
00212 
00213 #define uint64_serial_size( p )     8
00214 void uint64_serial_write(const uint64* pdata, ctl_serial* serial );
00215 void uint64_serial_read(uint64* pdata, ctl_serial* serial );
00216 void uint64_serial_peek(uint64* pdata, ctl_serial* serial );
00217 size_t uint64_serial_sizearray(const uint64* array, size_t count);
00218 void uint64_serial_writearray(const uint64* array, size_t count, ctl_serial* serial );
00219 void uint64_serial_readarray(uint64* array, size_t count, ctl_serial* serial );
00220 
00221 #define float32_serial_size( p )    4
00222 #define float32_serial_write( pdata, serial )               uint32_serial_write( ppCastPtr(uint32*)(pdata), (serial) )
00223 #define float32_serial_read( pdata, serial )                uint32_serial_read( ppCastPtr(uint32*)(pdata), (serial) )
00224 #define float32_serial_peek( pdata, serial )                uint32_serial_peek( ppCastPtr(uint32*)(pdata), (serial) )
00225 #define float32_serial_sizearray( array, count )            uint32_serial_sizearray( ppCastPtr(const uint32*)(array), (count) )
00226 #define float32_serial_writearray( array, count, serial )   uint32_serial_writearray( ppCastPtr(const uint32*)(array), (count), (serial) )
00227 #define float32_serial_readarray( array, count, serial )    uint32_serial_readarray( ppCastPtr(uint32*)(array), (count), (serial) )
00228 
00229 #define float64_serial_size( p )    8
00230 #define float64_serial_write( pdata, serial )               uint64_serial_write( ppCastPtr(uint64*)(pdata), (serial) )
00231 #define float64_serial_read( pdata, serial )                uint64_serial_read( ppCastPtr(uint64*)(pdata), (serial) )
00232 #define float64_serial_peek( pdata, serial )                uint64_serial_peek( ppCastPtr(uint64*)(pdata), (serial) )
00233 #define float64_serial_sizearray( array, count )            uint64_serial_sizearray( ppCastPtr(const uint64*)(array), (count) )
00234 #define float64_serial_writearray( array, count, serial )   uint64_serial_writearray( ppCastPtr(const uint64*)(array), (count), (serial) )
00235 #define float64_serial_readarray( array, count, serial )    uint64_serial_readarray( ppCastPtr(uint64*)(array), (count), (serial) )
00236 
00237 
00238 /* Generate sizers */
00239 size_t char_serial_size_string( const char* sz, size_t szmax );
00240 size_t wchar_t_serial_size_string( const wchar_t* sz, size_t szmax );
00241 #define char_serial_size_gstring( str )     char_serial_size_string( (str)->begin, ctl_gstring_size(char,(str)) )
00242 #define wchar_t_serial_size_gstring( str )  wchar_t_serial_size_string( (str)->begin, ctl_gstring_size(wchar_t,(str)) )
00243 #define char_serial_size_fstring( str )     char_serial_size_string( (str)->begin, ctl_fstring_size(char,(str)) )
00244 #define wchar_t_serial_size_fstring( str )  wchar_t_serial_size_string( (str)->begin, ctl_fstring_size(wchar_t,(str)) )
00245 #define char_serial_size_cstring( str )     char_serial_size_string( (str)->begin, ctl_cstring_size(char,(str)) )
00246 #define wchar_t_serial_size_cstring( str )  wchar_t_serial_size_string( (str)->begin, ctl_cstring_size(wchar_t,(str)) )
00247 
00251 void char_serial_write_string( const char* sz, size_t szmax, ctl_serial* serial );
00252 void wchar_t_serial_write_string( const wchar_t* sz, size_t szmax, ctl_serial* serial );
00253 #define char_serial_write_gstring( str, serial )    char_serial_write_string( (str)->begin, ctl_gstring_size(char,(str) ), (serial) )
00254 #define wchar_t_serial_write_gstring( str, serial ) wchar_t_serial_write_string( (str)->begin, ctl_gstring_size(wchar_t,(str) ), (serial) )
00255 #define char_serial_write_fstring( str, serial )    char_serial_write_string( (str)->begin, ctl_fstring_size(char,(str) ), (serial) )
00256 #define wchar_t_serial_write_fstring( str, serial ) wchar_t_serial_write_string( (str)->begin, ctl_fstring_size(wchar_t,(str) ), (serial) )
00257 #define char_serial_write_sconst( str, serial )     char_serial_write_string( (str)->begin, ctl_sconst_size(char,(str) ), (serial) )
00258 #define wchar_t_serial_write_sconst( str, serial )  wchar_t_serial_write_string( (str)->begin, ctl_sconst_size(wchar_t,(str) ), (serial) )
00259 
00260 /* Generate readers */
00261 void char_serial_read_string( char* sz, size_t szmax, ctl_serial* serial );
00262 void wchar_t_serial_read_string( wchar_t* sz, size_t szmax, ctl_serial* serial );
00263 void char_serial_read_gstring( ctl_gstring(char)* str, ctl_serial* serial );
00264 void wchar_t_serial_read_gstring( ctl_gstring(wchar_t)* str, ctl_serial* serial );
00265 void char_serial_read_fstring( ctl_gstring(char)* str, ctl_serial* serial );
00266 void wchar_t_serial_read_fstring( ctl_gstring(wchar_t)* str, ctl_serial* serial );
00267 /* Special reader: String resides in serial data */
00268 void char_serial_peek_sconst( ctl_sconst( char )* str, ctl_serial* serial );
00269 void wchar_t_serial_peek_sconst( ctl_sconst( wchar_t )* str, ctl_serial* serial );
00270 void char_serial_read_sconst( ctl_sconst( char )* str, ctl_serial* serial );
00271 void wchar_t_serial_read_sconst( ctl_sconst( wchar_t )* str, ctl_serial* serial );
00272 
00273 
00274 #endif /* CTL_SERIAL_H */

Generated on Fri Jan 2 15:28:34 2009 for Squat by  doxygen 1.5.6