59b3c10563
This prevents an overflow reported by @hexcoder- in https://github.com/davidgiven/ack/issues/56 lang/cem/cpp.ansi/LLlex.c used a plain 1 << ... and caused an overflow on machines where sizeof(int) < sizeof(long). Using 1L << ... would work for now but might fail later if arith became long long. C doesn't specify whether negative integers use 2's complement or some other format. Therefore, (arith) 1 << ... has an undefined value. It should still work because the value is some integer where the sign bit is set and all other bits are clear. (unsigned arith) 1 << ... would also get the sign bit, but casting it from unsigned back to signed would make the same undefined value. (arith) -1 << ... would assume 2's complement.
23 lines
740 B
C
23 lines
740 B
C
/*
|
|
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
|
*/
|
|
/* $Id$ */
|
|
/* COMPILER ARITHMETIC */
|
|
|
|
/* Normally the compiler does its internal arithmetics in longs
|
|
native to the source machine, which is always good for local
|
|
compilations, and generally OK too for cross compilations
|
|
downwards and sidewards. For upwards cross compilation and
|
|
to save storage on small machines, SPECIAL_ARITHMETICS will
|
|
be handy.
|
|
*/
|
|
|
|
/* All preprocessor arithmetic should be done in longs.
|
|
*/
|
|
#define arith long /* dummy */
|
|
|
|
#define arith_size (sizeof(arith))
|
|
#define arith_sign ((arith) 1 << (arith_size * 8 - 1))
|
|
#define max_arith (~arith_sign)
|