File indexing completed on 2025-05-11 08:24:21
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 #ifdef HAVE_CONFIG_H
0029 #include "config.h"
0030 #endif
0031
0032 #include <rtems/recorddump.h>
0033
0034 #include <limits.h>
0035 #include <string.h>
0036
0037 #include <rtems/base64.h>
0038
0039 typedef struct {
0040 IO_Put_char put_char;
0041 void *arg;
0042 int out;
0043 size_t index;
0044 char buf[ 57 ];
0045 } dump_context;
0046
0047 static void put_char( int c, void *arg )
0048 {
0049 dump_context *ctx;
0050
0051 ctx = arg;
0052
0053 ( *ctx->put_char )( c, ctx->arg );
0054 ++ctx->out;
0055
0056 if ( ctx->out >= 76 ) {
0057 ctx->out = 0;
0058 ( *ctx->put_char )( '\n', ctx->arg );
0059 }
0060 }
0061
0062 static void chunk( void *arg, const void *data, size_t length )
0063 {
0064 dump_context *ctx;
0065 size_t index;
0066 const char *in;
0067 const void *end;
0068
0069 ctx = arg;
0070 index = ctx->index;
0071 in = data;
0072 end = in + length;
0073
0074 while ( in != end ) {
0075 ctx->buf[ index ] = *in;
0076 ++in;
0077
0078 if ( index == RTEMS_ARRAY_SIZE( ctx->buf ) - 1 ) {
0079 index = 0;
0080 _Base64_Encode(
0081 put_char,
0082 ctx,
0083 ctx->buf,
0084 sizeof( ctx->buf ),
0085 NULL,
0086 INT_MAX
0087 );
0088 } else {
0089 ++index;
0090 }
0091 }
0092
0093 ctx->index = index;
0094 }
0095
0096 static void flush( dump_context *ctx )
0097 {
0098 _Base64_Encode( put_char, ctx, ctx->buf, ctx->index, NULL, INT_MAX );
0099 }
0100
0101 void rtems_record_dump_base64( IO_Put_char put_char, void *arg )
0102 {
0103 dump_context ctx;
0104
0105 memset( &ctx, 0, sizeof( ctx ) );
0106 ctx.put_char = put_char;
0107 ctx.arg = arg;
0108
0109 rtems_record_dump( chunk, &ctx );
0110 flush( &ctx );
0111 }