?RCS: $Id: alignbytes.U 167 2013-05-08 17:58:00Z rmanfredi $ ?RCS: ?RCS: Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi ?RCS: ?RCS: You may redistribute only under the terms of the Artistic License, ?RCS: as specified in the README file that comes with the distribution. ?RCS: You may reuse parts of this distribution only within the terms of ?RCS: that same Artistic License; a copy of which may be found at the root ?RCS: of the source tree for dist 4.0. ?RCS: ?RCS: $Log: alignbytes.U,v $ ?RCS: Revision 3.0.1.2 1994/10/29 16:02:28 ram ?RCS: patch36: added ?F: line for metalint file checking ?RCS: ?RCS: Revision 3.0.1.1 1994/05/06 14:25:20 ram ?RCS: patch23: avoid ALIGNBYTES, since it conflicts on NetBSD ?RCS: ?RCS: Revision 3.0 1993/08/18 12:05:23 ram ?RCS: Baseline for dist 3.0 netwide release. ?RCS: ?MAKE:alignbytes: Assert Myread Trylink cat i_inttypes i_limits i_math ?MAKE: -pick add $@ %< ?S:alignbytes: ?S: This variable holds the number of bytes required to align an ?S: arbitrary standard type. Usual values are 2, 4 and 8. ?S:. ?X: This used to be called ALIGNBYTES, but that conflicts with ?X: in NetBSD. ?C:MEM_ALIGNBYTES (ALIGNBYTES): ?C: This symbol contains the number of bytes required to align a ?C: double. Usual values are 2, 4 and 8. ?C:. ?H:#define MEM_ALIGNBYTES $alignbytes /**/ ?H:. ?T:alignment result : check for alignment requirements echo " " case "$alignbytes" in '') echo "Checking alignment constraints..." >&4 for alignment in 8 4 2 1 16 32 error do $cat >try.c < #endif #$i_limits I_LIMITS #ifdef I_LIMITS #include #endif #$i_math I_MATH #ifdef I_MATH #include #endif union u { void *void_ptr; void (*func_ptr)(void); char c; short s; int i; long l; float f; double d; #ifdef LLONG_MAX long long ll; #else #warning "LLONG_MAX undefined" #endif #if defined(HUGE_VALL) long double ld; #else #warning "HUGE_VALL undefined" #endif #ifdef UINT32_MAX uint32_t u32; #else #warning "UINT32_MAX undefined" #endif #ifdef UINT16_MAX uint16_t u16; #else #warning "UINT32_MAX undefined" #endif #ifdef UINT64_MAX uint64_t u64; #else #warning "UINT64_MAX undefined" #endif #ifdef UINTMAX_MAX uintmax_t m; #else #warning "UINTMAX_MAX undefined" #endif #ifdef UINTPTR_MAX uintptr_t up; #else #warning "UINTPTR_MAX undefined" #endif }; struct s { char a; union u b; }; #include "static_assert.h" int main(void) { STATIC_ASSERT($alignment == ((sizeof (struct s) - (sizeof (union u))))); return 0; } EOCP result='' set result eval $trylink case "$result" in "$define") break;; esac done case "$alignment" in error) dflt='8' echo "(I can't seem to compile the test program...)" >&4 ;; *) dflt=$alignment ;; esac ;; *) dflt="$alignbytes" ;; esac rp="What is the maximum alignment in bytes required for a standard type?" . ./myread alignbytes="$ans"