~ubuntu-branches/ubuntu/raring/findutils/raring

« back to all changes in this revision

Viewing changes to gnulib/lib/intprops.h

  • Committer: Bazaar Package Importer
  • Author(s): Andreas Metzler
  • Date: 2005-07-04 11:37:37 UTC
  • mto: (11.1.1 lenny) (1.1.10 upstream)
  • mto: This revision was merged to the branch mainline in revision 4.
  • Revision ID: james.westby@ubuntu.com-20050704113737-oxfumqxsqgfz5gay
Tags: upstream-4.2.22
ImportĀ upstreamĀ versionĀ 4.2.22

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* intprops.h -- properties of integer types
 
2
 
 
3
   Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 
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; either version 2, or (at your option)
 
8
   any later version.
 
9
 
 
10
   This program is distributed in the hope that it will be useful,
 
11
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
13
   GNU General Public License for more details.
 
14
 
 
15
   You should have received a copy of the GNU General Public License
 
16
   along with this program; if not, write to the Free Software Foundation,
 
17
   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
 
18
 
 
19
/* Written by Paul Eggert.  */
 
20
 
 
21
#include <limits.h>
 
22
 
 
23
/* The extra casts in the following macros work around compiler bugs,
 
24
   e.g., in Cray C 5.0.3.0.  */
 
25
 
 
26
/* True if the arithmetic type T is an integer type.  bool counts as
 
27
   an integer.  */
 
28
#define TYPE_IS_INTEGER(t) ((t) 1.5 == 1)
 
29
 
 
30
/* True if negative values of the signed integer type T use two's
 
31
   complement, ones' complement, or signed magnitude representation,
 
32
   respectively.  Much GNU code assumes two's complement, but some
 
33
   people like to be portable to all possible C hosts.  */
 
34
#define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1)
 
35
#define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0)
 
36
#define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1)
 
37
 
 
38
/* True if the arithmetic type T is signed.  */
 
39
#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
 
40
 
 
41
/* The maximum and minimum values for the integer type T.  These
 
42
   macros have undefined behavior if T is signed and has padding bits.
 
43
   If this is a problem for you, please let us know how to fix it for
 
44
   your host.  */
 
45
#define TYPE_MINIMUM(t) \
 
46
  ((t) (! TYPE_SIGNED (t) \
 
47
        ? (t) 0 \
 
48
        : TYPE_SIGNED_MAGNITUDE (t) \
 
49
        ? ~ (t) 0 \
 
50
        : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)))
 
51
#define TYPE_MAXIMUM(t) \
 
52
  ((t) (! TYPE_SIGNED (t) \
 
53
        ? (t) -1 \
 
54
        : ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))))
 
55
 
 
56
/* Bound on length of the string representing an integer type or expression T.
 
57
   Subtract 1 for the sign bit if t is signed; log10 (2.0) < 146/485;
 
58
   add 1 for integer division truncation; add 1 more for a minus sign
 
59
   if needed.  */
 
60
#define INT_STRLEN_BOUND(t) \
 
61
  ((sizeof (t) * CHAR_BIT - 1) * 146 / 485 + 2)
 
62
 
 
63
/* Bound on buffer size needed to represent an integer type or expression T,
 
64
   including the terminating null.  */
 
65
#define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1)