summaryrefslogtreecommitdiffstats
path: root/cpukit/libcsupport/src/assoc32tostring.c
blob: 3fac2923609ee0ec2fcba2c749e28466caaa9186 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/*
 * Copyright (c) 2016 embedded brains GmbH.
 *
 * The license and distribution terms for this file may be
 * found in the file LICENSE in this distribution or at
 * http://www.rtems.org/license/LICENSE.
 */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <rtems/assoc.h>

#include <stdbool.h>
#include <string.h>

static size_t space( size_t buffer_size, size_t len )
{
  if ( len < buffer_size ) {
    return buffer_size - len;
  } else {
    return 0;
  }
}

size_t rtems_assoc_32_to_string(
  uint32_t                   value,
  char                      *buffer,
  size_t                     buffer_size,
  const rtems_assoc_32_pair *pairs,
  size_t                     pair_count,
  const char                *separator,
  const char                *fallback
)
{
  size_t len;
  size_t i;

  len = 0;

  for ( i = 0; i < pair_count ; ++i ) {
    const rtems_assoc_32_pair *p;

    p = &pairs[ i ];

    if ( ( value & p->bits ) != 0 ) {
      if ( len > 0 ) {
        len += strlcpy( &buffer[ len ], separator, space( buffer_size, len ) );
      }

      len += strlcpy( &buffer[ len ], p->name, space( buffer_size, len ) );
    }
  }

  if ( len == 0 ) {
    len += strlcpy( buffer, fallback, buffer_size );
  }

  return len;
}