configure: generate less files, and do that in build dir
[m6w6/ext-psi] / m4 / psi / psi_composite.m4
1 # psi_add_composite(composite members)
2 # Add a pre-defined composite (struct or union)
3 psi_add_composite() {
4 PSI_COMPOSITES="$PSI_COMPOSITES
5 $1, {0},"
6 }
7
8 dnl PSI_COMPOSITE_MEMBER(composite name, decl member)
9 dnl INTERNAL: build $psi_composite_members
10 AC_DEFUN(PSI_COMPOSITE_MEMBER, [
11 m4_define([member_name], PSI_VAR_NAME($2))
12 m4_define([member_type], PSI_VAR_TYPE($2))
13 PSI_CHECK_SIZEOF(AS_TR_SH($1)[_]member_name,
14 [#define ]AS_TR_SH($1)[_]member_name (($1 *)0)->member_name
15 )
16 if PSI_SH_TEST_SIZEOF($1 member_name); then
17 PSI_CHECK_OFFSETOF($1, member_name)
18 PSI_TYPE_INDIRECTION($2, [PSI_SH_SIZEOF([$1 member_name])], pl, as)
19
20 psi_member_sizeof=PSI_SH_SIZEOF($1 member_name)
21 psi_member_offsetof=PSI_SH_OFFSETOF($1 member_name)
22
23 if test $pl -gt 0 && test $as -eq 0; then
24 check_size=PSI_SH_SIZEOF(void *)
25 elif test $pl -eq 1 && test $as -gt 0; then
26 check_size=`expr PSI_SH_SIZEOF(member_type) \* $as`
27 else
28 check_size=PSI_SH_SIZEOF(member_type)
29 fi
30 if test $psi_member_sizeof != "$check_size"; then
31 psi_member_basic_type=PSI_SH_BASIC_TYPE(member_type)
32 psi_member_type_pair="`psi_type_pair $psi_member_basic_type $psi_member_sizeof`"
33 psi_composite_members="$psi_composite_members, {$psi_member_type_pair, \"[]member_name[]\", $psi_member_offsetof, $psi_member_sizeof, $pl, $as}"
34 AC_MSG_WARN(pre-defined size $check_size of $2 in $1 does not match computed size $psi_member_sizeof; adjusting to $psi_member_type_pair)
35 else
36 psi_composite_members="[$psi_composite_members, {]PSI_TYPE_PAIR(member_type)[, \"]member_name[\", $psi_member_offsetof, $psi_member_sizeof, $pl, $as}]"
37 fi
38 fi
39 ])
40
41 dnl PSI_STRUCT(struct name, struct members)
42 dnl Check a struct and its members and add a pre-defined struct and possibly a
43 dnl pre-defined type for this struct.
44 dnl Calls PSI_CHECK_SIZEOF and PSI_CHECK_ALIGNOF for the struct.
45 dnl Calls PSI_CHECK_SIZEOF, PSI_CHECK_OFFSETOF and PSI_TYPE_INDIRECTON for each member.
46 AC_DEFUN(PSI_STRUCT, [
47 PSI_CHECK_SIZEOF($1)
48 if PSI_SH_TEST_SIZEOF($1); then
49 PSI_CHECK_ALIGNOF($1)
50 psi_composite_name=m4_bregexp([$1], [^\(struct \)?\(\w+\)], [\2])
51 psi_composite_members="{PSI_T_STRUCT, \"struct\", \"$psi_composite_name\", PSI_SH_ALIGNOF($1), PSI_SH_SIZEOF($1), 0, 0}"
52 ifelse([$2],,,[m4_map_args_sep([PSI_COMPOSITE_MEMBER($1, m4_normalize(], [))], [], $2)])
53 psi_add_composite "$psi_composite_members"
54 if test "$1" = "$psi_composite_name"; then
55 psi_add_type "{PSI_T_STRUCT, \"$1\", \"$1\"}"
56 fi
57 fi
58 ])
59
60 dnl PSI_UNION(union name, union/struct members)
61 dnl Check a union and its members and add a pre-defined union and possibly a
62 dnl pre-defined type for this union.
63 dnl Calls PSI_CHECK_SIZEOF for the union and each member.
64 dnl Calls PSI_CHECK_OFFSETOF and PSI_TYPE_INDIRECTON for each member.
65 AC_DEFUN(PSI_UNION, [
66 PSI_CHECK_SIZEOF($1)
67 if PSI_SH_TEST_SIZEOF($1); then
68 PSI_CHECK_ALIGNOF($1)
69 psi_composite_name=m4_bregexp([$1], [^\(union \)?\(\w+\)], [\2])
70 psi_composite_members="{PSI_T_UNION, \"union\", \"$psi_composite_name\", PSI_SH_ALIGNOF($1), PSI_SH_SIZEOF($1), 0, 0}"
71 ifelse([$2],,,[m4_map_args_sep([PSI_COMPOSITE_MEMBER($1, m4_normalize(], [))], [], $2)])
72 psi_add_composite "$psi_composite_members"
73 if test "$1" = "$psi_composite_name"; then
74 psi_add_type "{PSI_T_UNION, \"$1\", \"$1\"}"
75 fi
76 fi
77 ])