1 /*
2 * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
3 * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
4 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
5 * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
6 * Copyright (c) 2005-2021 Dmitry V. Levin <ldv@strace.io>
7 * All rights reserved.
8 *
9 * SPDX-License-Identifier: GPL-2.0-or-later
10 */
11
12 #include "tests.h"
13 #include "xlat.h"
14 #include <stdio.h>
15
16 int
17 printflags(const struct xlat *xlat, unsigned long long flags,
18 const char *const dflt)
19 {
20 if (flags == 0 && xlat->data->val == 0 && xlat->data->str) {
21 fputs(xlat->data->str, stdout);
22 return 1;
23 }
24
25 int n;
26 size_t i = 0;
27 char sep = 0;
28 const struct xlat_data *xd = xlat->data;
29 for (n = 0; i < xlat->size; xd++, i++) {
30 if (!xd->str)
31 continue;
32
33 if (xd->val && (flags & xd->val) == xd->val) {
34 if (sep)
35 putc(sep, stdout);
36 else
37 sep = '|';
38 fputs(xd->str, stdout);
39 flags &= ~xd->val;
40 n++;
41 }
42 }
43
44 if (n) {
45 if (flags) {
46 if (sep)
47 putc(sep, stdout);
48 printf("%#llx", flags);
49 n++;
50 }
51 } else {
52 if (flags) {
53 printf("%#llx", flags);
54 if (dflt)
55 printf(" /* %s */", dflt);
56 } else {
57 if (dflt)
58 putc('0', stdout);
59 }
60 }
61
62 return n;
63 }