3 * Generate `mptypes.h' header file for current architecture
5 * (c) 1999 Straylight/Edgeware
8 /*----- Licensing notice --------------------------------------------------*
10 * This file is part of Catacomb.
12 * Catacomb is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU Library General Public License as
14 * published by the Free Software Foundation; either version 2 of the
15 * License, or (at your option) any later version.
17 * Catacomb is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU Library General Public License for more details.
22 * You should have received a copy of the GNU Library General Public
23 * License along with Catacomb; if not, write to the Free
24 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
28 /*----- Header files ------------------------------------------------------*/
35 #if __STDC_VERSION__ >= 199900l
37 # include <inttypes.h>
40 /*----- Data types --------------------------------------------------------*/
42 /* --- Hack for GCC --- *
44 * WG14 in their infinite wisdom decided not to use the GCC constant name.
47 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 91)
48 # define EXT __extension__
53 #if defined(ULONG_LONG_MAX) && !defined(ULLONG_MAX)
54 # define ULLONG_MAX ULONG_LONG_MAX
57 /* --- Choose the largest integer type --- */
59 #if defined(UINTMAX_MAX) && defined(PRIuMAX)
60 typedef uintmax_t umax
;
61 # define P_UMAX PRIuMAX
62 #elif defined(ULLONG_MAX)
63 EXT
typedef unsigned long long umax
;
66 typedef unsigned long umax
;
70 /* --- Table of interesting types --- *
72 * These are in preference order.
87 { "unsigned int", "u", UINT_MAX
, 0 },
88 { "unsigned short", "u", USHRT_MAX
, 0 },
89 { "unsigned long", "ul", ULONG_MAX
, 0 },
91 { "unsigned long long", "ull", EXT ULLONG_MAX
, f_ext
},
94 { "uintmax_t", "u", UINTMAX_MAX
, f_stdint
},
99 typedef struct itype itype
;
101 /*----- Main code ---------------------------------------------------------*/
103 int main(int argc
, char *argv
[])
106 itype
*largest
, *mpw
, *mpd
;
107 const static char *extstr
= "CATACOMB_MPTYPES_EXTENSION ";
110 /* --- Find the bitcounts --- */
112 for (i
= tytab
; i
->name
; i
++) {
115 for (bits
= 0; u
; bits
++)
120 /* --- Now try to find the interesting types --- *
122 * The first thing to do is to find the largest type. Then I find the
123 * `best' type which is less than half that size, and then the `best' type
124 * which is twice as big as that one.
127 #if defined(FORCE_MPW_CUSSID)
128 largest
= mpd
= &tytab
[3];
130 mpw
->bits
= 19; mpw
->max
= 0x7ffff;
131 mpd
->bits
= 38; mpd
->max
= 0x3fffffffffll
;
132 #elif defined(FORCE_MPW_SHORT)
133 largest
= mpd
= &tytab
[2];
135 mpw
->bits
= 16; mpw
->max
= 0xffff;
136 mpd
->bits
= 32; mpd
->max
= 0xffffffff;
139 for (i
= tytab
; i
->name
; i
++) {
140 if (i
->bits
> largest
->bits
)
143 for (mpw
= 0, i
= tytab
; i
->name
; i
++) {
144 if (i
->bits
* 2 <= largest
->bits
&& (!mpw
|| i
->bits
> mpw
->bits
))
149 for (mpd
= 0, i
= tytab
; i
->name
; i
++) {
150 if (i
->bits
>= mpw
->bits
* 2 && (!mpd
|| i
->bits
< mpd
->bits
))
156 w
.bits
/= 2; w
.max
= ~(~((umax
)0) << w
.bits
);
157 d
.bits
= w
.bits
* 2; d
.max
= ~(~((umax
)0) << d
.bits
);
161 for (p2
= 1; (p2
<< 1) < mpw
->bits
; p2
<<= 1);
163 /* --- Output time --- */
168 * mptypes.h [generated]\n\
171 #ifndef CATACOMB_MPTYPES_H\n\
172 #define CATACOMB_MPTYPES_H\n\
174 if ((mpd
->flags
| mpw
->flags
) & f_stdint
) {
176 #if __STDC_VERSION__ >= 199900l\n\
177 # include <stdint.h>\n\
181 if ((mpd
->flags
| mpw
->flags
) & f_ext
) {
183 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 91)\n\
184 # define %s __extension__\n\
192 #define MPW_BITS %u\n\
194 #define MPW_MAX %s%" P_UMAX
"%s\n\
197 #define MPD_BITS %u\n\
198 #define MPD_MAX %s%" P_UMAX
"%s\n\
202 mpw
->flags
& f_ext ? extstr
: "", mpw
->name
,
204 mpw
->flags
& f_ext ? extstr
: "", mpw
->max
, mpw
->suff
,
205 mpd
->flags
& f_ext ? extstr
: "", mpd
->name
,
207 mpd
->flags
& f_ext ? extstr
: "", mpd
->max
, mpd
->suff
);
212 /*----- That's all, folks -------------------------------------------------*/