attribute-util.h (1712B)
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