Tagging module util-vserver - util-vserver-0.30.215-6
[util-vserver.git] / src / attribute-util.h
1 // $Id$    --*- c -*--
2
3 // Copyright (C) 2007-2008 Daniel Hokka Zakrisson
4 //  
5 // This program is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation; version 2 of the License.
8 //  
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //  
14 // You should have received a copy of the GNU General Public License
15 // along with this program; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17
18 #ifndef _ATTRIBUTE_UTIL_H
19 #define _ATTRIBUTE_UTIL_H
20
21 static inline int
22 ffsull(unsigned long long word)
23 {
24   int bit;
25   for (bit = 0; bit < 64; bit++) {
26     if (word & (1ULL << bit))
27       break;
28   }
29   if (bit == 64)
30     bit = 0;
31   return bit;
32 }
33
34 #define print_bitfield(fd, type, name, var)     \
35   do {                                          \
36   int first;                                    \
37   WRITE_MSG(fd, name ":\n");                    \
38   first = 1;                                    \
39   while (1) {                                   \
40     char const *i;                              \
41     i = vc_lo ## type ## 2text(var);            \
42     if (!i)                                     \
43       break;                                    \
44     if (!first)                                 \
45       WRITE_MSG(fd, ",");                       \
46     else                                        \
47       first = 0;                                \
48     WRITE_STR(fd, i);                           \
49   }                                             \
50   while (*(var)) {                              \
51     int bit = ffsull(*(var));                   \
52     if (!bit)                                   \
53       break;                                    \
54     if (!first)                                 \
55       WRITE_MSG(fd, ",");                       \
56     else                                        \
57       first = 0;                                \
58     WRITE_MSG(fd, "^");                         \
59     WRITE_INT(fd, bit);                         \
60     *(var) &= ~(1ULL << bit);                   \
61   }                                             \
62   WRITE_MSG(fd, "\n");                          \
63   } while (0)
64
65 #endif