File: preproc.h

package info (click to toggle)
fsvs 1.2.7-1
  • links: PTS, VCS
  • area: main
  • in suites: buster, stretch
  • size: 2,964 kB
  • ctags: 1,464
  • sloc: ansic: 16,650; sh: 5,885; perl: 783; makefile: 338; python: 90
file content (53 lines) | stat: -rw-r--r-- 1,851 bytes parent folder | download | duplicates (6)
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
/************************************************************************
 * Copyright (C) 2009 Philipp Marek.
 *
 * This program is free software;  you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3 as
 * published by the Free Software Foundation.
 ************************************************************************/
#ifndef __PREPROC_H__
#define __PREPROC_H__

/** \file
 * Preprocessor macros for global use.
 * */

#include <fcntl.h>
#include <sys/stat.h>


/** Macros for counting the bits set.
* The interested party is referred to "<i>Numerical Recipes</i>".
* @{ */
#define _BITCOUNTx(x, m, s) ( ((x) & m) + (((x) & (m << s)) >> s) )
#define _BITCOUNT6(x) (_BITCOUNTx(          (x), 0x5555555555555555ULL,  1))
#define _BITCOUNT5(x) (_BITCOUNTx(_BITCOUNT6(x), 0x3333333333333333ULL,  2))
#define _BITCOUNT4(x) (_BITCOUNTx(_BITCOUNT5(x), 0x0f0f0f0f0f0f0f0fULL,  4))
#define _BITCOUNT3(x) (_BITCOUNTx(_BITCOUNT4(x), 0x00ff00ff00ff00ffULL,  8))
#define _BITCOUNT2(x) (_BITCOUNTx(_BITCOUNT3(x), 0x0000ffff0000ffffULL, 16))
#define _BITCOUNT1(x) (_BITCOUNTx(_BITCOUNT2(x), 0x00000000ffffffffULL, 32))
#define _BITCOUNT(x) ( (int)_BITCOUNT1(x) )
/** @} */


/** How many bits a \c mode_t must be shifted to get the packed 
 * representation.
 * */
#define MODE_T_SHIFT_BITS (_BITCOUNT(S_IFMT ^ (S_IFMT-1)) -1)

/** The number of bits needed for storage. */
#define PACKED_MODE_T_NEEDED_BITS (_BITCOUNT(S_IFMT))


/** How to convert from \c mode_t to the packed representation (in struct 
 * \ref estat) and back.
 * @{ */
#define MODE_T_to_PACKED(mode) ((mode) >> MODE_T_SHIFT_BITS)
#define PACKED_to_MODE_T(p) ((p) << MODE_T_SHIFT_BITS)
/** @} */
/** Simplification for testing packed modes.
 * Used with S_ISDIR etc. */
#define TEST_PACKED(test, val) test(PACKED_to_MODE_T(val))


#endif