--- /dev/null
+PSI_STRUCTS=
+# add_struct(name, size, members)
+add_struct() {
+ local members="$3"
+ if test -z "$members"; then
+ members="{0}"
+ else
+ members="$members, {0}"
+ fi
+ PSI_STRUCTS="{\"$1\", $2, {$members}}, $PSI_STRUCTS"
+}
+
+AC_DEFUN(PSI_STRUCT_MEMBER, [
+ m4_define([member_name], PSI_VAR_NAME($2))
+ m4_define([member_type], PSI_TYPE_NAME($2))
+ AC_CHECK_SIZEOF(AS_TR_SH($1)[_]member_name, [], PSI_INCLUDES
+ [#define ]AS_TR_SH($1)[_]member_name (($1 *)0)->member_name
+ )
+ PSI_CHECK_OFFSETOF($1, member_name)
+ m4_define([pointer_level], m4_len(m4_bpatsubst($2, [[^*]])))
+ m4_define([array_size], m4_bregexp($2, [\[\([0-9]+\)\]], [\1]))
+ ifelse(array_size, [],
+ [m4_define([array_size], 0)],
+ [m4_define([pointer_level], m4_incr(pointer_level))]
+ )
+ m4_define([member_size], PSI_TYPE_SIZE(member_type, pointer_level, array_size))
+ if test -n "$psi_struct_members"; then
+ psi_struct_members="$psi_struct_members, "
+ fi
+ 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[}]"
+])
+
+AC_DEFUN(PSI_STRUCT, [
+ AC_CHECK_SIZEOF($1, [], PSI_INCLUDES)
+ psi_struct_members=
+ ifelse([$2],[],[],[m4_map_args_sep([PSI_STRUCT_MEMBER($1,], [)], [], $2)])
+ add_struct "$1" $AS_TR_SH([ac_cv_sizeof_]$1) "$psi_struct_members"
+])