/* -*-c-*-
*
- * $Id: mptypes.c,v 1.4 2000/10/08 12:05:24 mdw Exp $
+ * $Id$
*
* Generate `mptypes.h' header file for current architecture
*
* MA 02111-1307, USA.
*/
-/*----- Revision history --------------------------------------------------*
- *
- * $Log: mptypes.c,v $
- * Revision 1.4 2000/10/08 12:05:24 mdw
- * Make later versions of GCC shut up about @long long@.
- *
- * Revision 1.3 1999/12/10 23:29:48 mdw
- * Change header file guard names.
- *
- * Revision 1.2 1999/11/13 01:54:32 mdw
- * Format source code properly ;-). Attach suffixes to the `max'
- * constants.
- *
- */
-
/*----- Header files ------------------------------------------------------*/
#define _GNU_SOURCE
+#include "config.h"
+
#include <stdio.h>
#include <limits.h>
#if __STDC_VERSION__ >= 199900l
# include <stdint.h>
+# include <inttypes.h>
#endif
/*----- Data types --------------------------------------------------------*/
/* --- Choose the largest integer type --- */
-#if defined(UINTMAX_MAX)
+#if defined(UINTMAX_MAX) && defined(PRIuMAX)
typedef uintmax_t umax;
# define P_UMAX PRIuMAX
#elif defined(ULLONG_MAX)
- __extension__ typedef unsigned long long umax;
-# define P_UMAX "%llu"
+ EXT typedef unsigned long long umax;
+# define P_UMAX "llu"
#else
typedef unsigned long umax;
-# define P_UMAX "%lu"
+# define P_UMAX "lu"
#endif
/* --- Table of interesting types --- *
itype *i;
itype *largest, *mpw, *mpd;
const static char *extstr = "CATACOMB_MPTYPES_EXTENSION ";
+ unsigned p2;
/* --- Find the bitcounts --- */
* which is twice as big as that one.
*/
+#if defined(FORCE_MPW_CUSSID)
+ largest = mpd = &tytab[3];
+ mpw = &tytab[2];
+ mpw->bits = 19; mpw->max = 0x7ffff;
+ mpd->bits = 38; mpd->max = 0x3fffffffffll;
+#elif defined(FORCE_MPW_SHORT)
+ largest = mpd = &tytab[2];
+ mpw = &tytab[1];
+ mpw->bits = 16; mpw->max = 0xffff;
+ mpd->bits = 32; mpd->max = 0xffffffff;
+#else
largest = tytab;
for (i = tytab; i->name; i++) {
if (i->bits > largest->bits)
d.bits = w.bits * 2; d.max = ~(~((umax)0) << d.bits);
mpw = &w; mpd = &d;
}
+#endif
+ for (p2 = 1; (p2 << 1) < mpw->bits; p2 <<= 1);
/* --- Output time --- */
printf("\
%stypedef %s mpw;\n\
#define MPW_BITS %u\n\
-#define MPW_MAX %s" P_UMAX "%s\n\
+#define MPW_P2 %u\n\
+#define MPW_MAX %s%" P_UMAX "%s\n\
\n\
%stypedef %s mpd;\n\
#define MPD_BITS %u\n\
-#define MPD_MAX %s" P_UMAX "%s\n\
+#define MPD_MAX %s%" P_UMAX "%s\n\
\n\
#endif\n\
",
mpw->flags & f_ext ? extstr : "", mpw->name,
- mpw->bits,
+ mpw->bits, p2,
mpw->flags & f_ext ? extstr : "", mpw->max, mpw->suff,
mpd->flags & f_ext ? extstr : "", mpd->name,
mpd->bits,