source: rtems/cpukit/libtrace/record/record-dump-base64.c @ ab42b3e

5
Last change on this file since ab42b3e was ab42b3e, checked in by Sebastian Huber <sebastian.huber@…>, on 03/12/20 at 17:29:48

record: Add rtems_record_dump()

Add rtems_record_dump_base64() and rtems_record_dump_base64_zlib().

Add CONFIGURE_RECORD_FATAL_DUMP_BASE64 and
CONFIGURE_RECORD_FATAL_DUMP_BASE64_ZLIB configuration options.

Update #3904.

  • Property mode set to 100644
File size: 2.8 KB
Line 
1/* SPDX-License-Identifier: BSD-2-Clause */
2
3/*
4 * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 * POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#if HAVE_CONFIG_H
29#include "config.h"
30#endif
31
32#include <rtems/recorddump.h>
33#include <rtems/score/io.h>
34
35#include <limits.h>
36#include <string.h>
37
38typedef struct {
39  IO_Put_char  put_char;
40  void        *arg;
41  int          out;
42  size_t       index;
43  char         buf[ 57 ];
44} dump_context;
45
46static void put_char( int c, void *arg )
47{
48  dump_context *ctx;
49
50  ctx = arg;
51
52  ( *ctx->put_char )( c, ctx->arg );
53  ++ctx->out;
54
55  if ( ctx->out >= 76 ) {
56    ctx->out = 0;
57    ( *ctx->put_char )( '\n', ctx->arg );
58  }
59}
60
61static void chunk( void *arg, const void *data, size_t length )
62{
63  dump_context *ctx;
64  size_t        index;
65  const char   *in;
66  const void   *end;
67
68  ctx = arg;
69  index = ctx->index;
70  in = data;
71  end = in + length;
72
73  while ( in != end ) {
74    ctx->buf[ index ] = *in;
75    ++in;
76
77    if ( index == RTEMS_ARRAY_SIZE( ctx->buf ) - 1 ) {
78      index = 0;
79      _IO_Base64(
80        put_char,
81        ctx,
82        ctx->buf,
83        sizeof( ctx->buf ),
84        NULL,
85        INT_MAX
86      );
87    } else {
88      ++index;
89    }
90  }
91
92  ctx->index = index;
93}
94
95static void flush( dump_context *ctx )
96{
97  _IO_Base64( put_char, ctx, ctx->buf, ctx->index, NULL, INT_MAX );
98}
99
100void rtems_record_dump_base64( IO_Put_char put_char, void *arg )
101{
102  dump_context ctx;
103
104  memset( &ctx, 0, sizeof( ctx ) );
105  ctx.put_char = put_char;
106  ctx.arg = arg;
107
108  rtems_record_dump( chunk, &ctx );
109  flush( &ctx );
110}
Note: See TracBrowser for help on using the repository browser.