flush
[m6w6/ext-psi] / m4 / psi_struct.m4
1 AC_DEFUN(PSI_STRUCT_MEMBER, [
2 m4_define([member_name], PSI_VAR_NAME($2))
3 m4_define([member_type], PSI_VAR_TYPE($2))
4 AC_CHECK_SIZEOF(AS_TR_SH($1)[_]member_name, [], PSI_INCLUDES
5 [#define ]AS_TR_SH($1)[_]member_name (($1 *)0)->member_name
6 )
7 if test -n "$AS_TR_SH([ac_cv_sizeof_$1][_]member_name)" \
8 && test "$AS_TR_SH([ac_cv_sizeof_$1][_]member_name)" -gt 0; then
9 PSI_CHECK_OFFSETOF($1, member_name)
10 PSI_TYPE_INDIRECTION($2, [$AS_TR_SH([ac_cv_sizeof_]$1[_]member_name)], pl, as)
11 psi_struct_members="[$psi_struct_members, {]PSI_TYPE_PAIR(member_type)[, \"]member_name[\", $]AS_TR_SH([ac_cv_offsetof_]$1[_]member_name)[, $]AS_TR_SH([ac_cv_sizeof_]$1[_]member_name), $pl, $as[}]"
12 fi
13 ])
14
15 AC_DEFUN(PSI_STRUCT, [
16 AC_CHECK_SIZEOF($1, [], PSI_INCLUDES)
17 psi_struct_name=m4_bregexp([$1], [^\(struct \)?\(\w+\)], [\2])
18 psi_struct_members="{PSI_T_STRUCT, \"struct\", \"$psi_struct_name\", 0, $AS_TR_SH([ac_cv_sizeof_]$1), 0, 0}"
19 ifelse([$2],,,[m4_map_args_sep([PSI_STRUCT_MEMBER($1, m4_normalize(], [))], [], $2)])
20 PSI_STRUCTS="$psi_struct_members, {0}, $PSI_STRUCTS"
21 if test "$1" = "$psi_struct_name"; then
22 PSI_TYPES="{PSI_T_STRUCT, \"$1\", \"$1\"}, $PSI_TYPES"
23 fi
24 ])