(root)/
strace-6.5/
tests-mx32/
printflags.c
       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  }