1d6f0c4207f6ea910316d3dbf27e06bccdf5af91
[m6w6/ext-psi] / config.psi_struct.m4
1 PSI_STRUCTS=
2 # add_struct(name, size, members)
3 add_struct() {
4 local members="$3"
5 if test -z "$members"; then
6 members="{0}"
7 else
8 members="$members, {0}"
9 fi
10 PSI_STRUCTS="{\"$1\", $2, {$members}}, $PSI_STRUCTS"
11 }
12
13 AC_DEFUN(PSI_STRUCT_MEMBER, [
14 m4_define([member_name], PSI_VAR_NAME($2))
15 m4_define([member_type], PSI_TYPE_NAME($2))
16 AC_CHECK_SIZEOF(AS_TR_SH($1)[_]member_name, [], PSI_INCLUDES
17 [#define ]AS_TR_SH($1)[_]member_name (($1 *)0)->member_name
18 )
19 PSI_CHECK_OFFSETOF($1, member_name)
20 m4_define([pointer_level], m4_len(m4_bpatsubst($2, [[^*]])))
21 m4_define([array_size], m4_bregexp($2, [\[\([0-9]+\)\]], [\1]))
22 ifelse(array_size, [],
23 [m4_define([array_size], 0)],
24 [m4_define([pointer_level], m4_incr(pointer_level))]
25 )
26 m4_define([member_size], PSI_TYPE_SIZE(member_type, pointer_level, array_size))
27 if test -n "$psi_struct_members"; then
28 psi_struct_members="$psi_struct_members, "
29 fi
30 psi_struct_members="[$psi_struct_members{]PSI_TYPE_PAIR(member_type)[, \"]member_name[\", $]AS_TR_SH([ac_cv_offsetof_]$1[_]member_name)[, ]member_size, pointer_level, array_size[}]"
31 ])
32
33 AC_DEFUN(PSI_STRUCT, [
34 AC_CHECK_SIZEOF($1, [], PSI_INCLUDES)
35 psi_struct_members=
36 ifelse([$2],[],[],[m4_map_args_sep([PSI_STRUCT_MEMBER($1,], [)], [], $2)])
37 add_struct "$1" $AS_TR_SH([ac_cv_sizeof_]$1) "$psi_struct_members"
38 ])