3 * $Id: mptypes.c,v 1.3 1999/12/10 23:29:48 mdw Exp $
5 * Generate `mptypes.h' header file for current architecture
7 * (c) 1999 Straylight/Edgeware
10 /*----- Licensing notice --------------------------------------------------*
12 * This file is part of Catacomb.
14 * Catacomb is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU Library General Public License as
16 * published by the Free Software Foundation; either version 2 of the
17 * License, or (at your option) any later version.
19 * Catacomb is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU Library General Public License for more details.
24 * You should have received a copy of the GNU Library General Public
25 * License along with Catacomb; if not, write to the Free
26 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
30 /*----- Revision history --------------------------------------------------*
33 * Revision 1.3 1999/12/10 23:29:48 mdw
34 * Change header file guard names.
36 * Revision 1.2 1999/11/13 01:54:32 mdw
37 * Format source code properly ;-). Attach suffixes to the `max'
42 /*----- Header files ------------------------------------------------------*/
47 #if __STDC_VERSION__ >= 199900l
51 /*----- Data types --------------------------------------------------------*/
53 /* --- Hack for GCC --- *
55 * WG14 in their infinite wisdom decided not to use the GCC constant name.
58 #if defined(ULONG_LONG_MAX) && !defined(ULLONG_MAX)
59 # define ULLONG_MAX ULONG_LONG_MAX
62 /* --- Choose the largest integer type --- */
64 #if defined(UINTMAX_MAX)
65 typedef uintmax_t umax
;
66 # define P_UMAX PRIuMAX
67 #elif defined(ULLONG_MAX)
68 typedef unsigned long long umax
;
69 # define P_UMAX "%llu"
71 typedef unsigned long umax
;
75 /* --- Table of interesting types --- *
77 * These are in preference order.
91 { "unsigned int", "u", UINT_MAX
, 0 },
92 { "unsigned short", "u", USHRT_MAX
, 0 },
93 { "unsigned long", "ul", ULONG_MAX
, 0 },
95 { "unsigned long long", "ull", ULLONG_MAX
, 0 },
98 { "uintmax_t", "u", UINTMAX_MAX
, f_stdint
},
103 typedef struct itype itype
;
105 /*----- Main code ---------------------------------------------------------*/
107 int main(int argc
, char *argv
[])
110 itype
*largest
, *mpw
, *mpd
;
112 /* --- Find the bitcounts --- */
114 for (i
= tytab
; i
->name
; i
++) {
117 for (bits
= 0; u
; bits
++)
122 /* --- Now try to find the interesting types --- *
124 * The first thing to do is to find the largest type. Then I find the
125 * `best' type which is less than half that size, and then the `best' type
126 * which is twice as big as that one.
130 for (i
= tytab
; i
->name
; i
++) {
131 if (i
->bits
> largest
->bits
)
134 for (mpw
= 0, i
= tytab
; i
->name
; i
++) {
135 if (i
->bits
* 2 <= largest
->bits
&& (!mpw
|| i
->bits
> mpw
->bits
))
140 for (mpd
= 0, i
= tytab
; i
->name
; i
++) {
141 if (i
->bits
>= mpw
->bits
* 2 && (!mpd
|| i
->bits
< mpd
->bits
))
147 w
.bits
/= 2; w
.max
= ~(~((umax
)0) << w
.bits
);
148 d
.bits
= w
.bits
* 2; d
.max
= ~(~((umax
)0) << d
.bits
);
152 /* --- Output time --- */
157 * mptypes.h [generated]\n\
160 #ifndef CATACOMB_MPTYPES_H\n\
161 #define CATACOMB_MPTYPES_H\n\
163 if ((mpd
->flags
| mpw
->flags
) & f_stdint
) {
165 #if __STDC_VERSION__ >= 199900l\n\
166 # include <stdint.h>\n\
172 #define MPW_BITS %u\n\
173 #define MPW_MAX " P_UMAX
"%s\n\
176 #define MPD_BITS %u\n\
177 #define MPD_MAX " P_UMAX
"%s\n\
181 mpw
->name
, mpw
->bits
, mpw
->max
, mpw
->suff
,
182 mpd
->name
, mpd
->bits
, mpd
->max
, mpd
->suff
);
186 /*----- That's all, folks -------------------------------------------------*/