1extern void abort (void);
2
3typedef struct foo_t
4{
5  unsigned int blksz;
6  unsigned int bf_cnt;
7} foo_t;
8
9#define _RNDUP(x, unit)  ((((x) + (unit) - 1) / (unit)) * (unit))
10#define _RNDDOWN(x, unit)  ((x) - ((x)%(unit)))
11
12long long
13foo (foo_t *const pxp,  long long offset, unsigned int extent)
14{
15  long long blkoffset = _RNDDOWN(offset, (long long )pxp->blksz);
16  unsigned int diff = (unsigned int)(offset - blkoffset);
17  unsigned int blkextent = _RNDUP(diff + extent, pxp->blksz);
18
19  if (pxp->blksz < blkextent)
20    return -1LL;
21
22  if (pxp->bf_cnt > pxp->blksz)
23    pxp->bf_cnt = pxp->blksz;
24
25  return blkoffset;
26}
27
28int
29main ()
30{
31  foo_t x;
32  long long xx;
33
34  x.blksz = 8192;
35  x.bf_cnt = 0;
36  xx = foo (&x, 0, 4096);
37  if (xx != 0LL)
38    abort ();
39  return 0;
40}
41