X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=m4%2Fpsi_struct.m4;h=fcee59c3d08e18bb0a61b91b36883ee2a8e88a8e;hb=3fe5a4c7cf3e810dcfd79475a1a3aedbe8282378;hp=f0d273e9750189b8eeacdc5e03dd1adae4744a2f;hpb=b4508f6b917660970f887894a6aaed6c220a2c72;p=m6w6%2Fext-psi diff --git a/m4/psi_struct.m4 b/m4/psi_struct.m4 index f0d273e..fcee59c 100644 --- a/m4/psi_struct.m4 +++ b/m4/psi_struct.m4 @@ -1,30 +1,36 @@ +# psi_add_struct(struct members) +# Add a pre-defined struct to $PSI_STRUCTS. +psi_add_struct() { + cat >>$PSI_STRUCTS <<<" $1, {0}, " +} + +dnl PSI_STRUCT_MEMBER(struct name, decl member) +dnl INTERNAL: build $psi_struct_members AC_DEFUN(PSI_STRUCT_MEMBER, [ m4_define([member_name], PSI_VAR_NAME($2)) m4_define([member_type], PSI_VAR_TYPE($2)) - AC_CHECK_SIZEOF(AS_TR_SH($1)[_]member_name, [], PSI_INCLUDES + PSI_CHECK_SIZEOF(AS_TR_SH($1)[_]member_name, [#define ]AS_TR_SH($1)[_]member_name (($1 *)0)->member_name ) - if test -n "$AS_TR_SH([ac_cv_sizeof_$1][_]member_name)" \ - && test "$AS_TR_SH([ac_cv_sizeof_$1][_]member_name)" -gt 0; then + if PSI_SH_TEST_SIZEOF($1 member_name); then 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)) - 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[}]" + PSI_TYPE_INDIRECTION($2, [$AS_TR_SH([ac_cv_sizeof_]$1[_]member_name)], pl, as) + 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[}]" fi ]) +dnl PSI_STRUCT(struct name, struct members) +dnl Check a struct and its members and add a pre-defined struct and possibly a +dnl pre-defined type for this struct. +dnl Calls PSI_CHECK_SIZEOF for the struct and each member. +dnl Calls PSI_CHECK_OFFSETOF and PSI_TYPE_INDIRECTON for each member. AC_DEFUN(PSI_STRUCT, [ - AC_CHECK_SIZEOF($1, [], PSI_INCLUDES) + PSI_CHECK_SIZEOF($1) psi_struct_name=m4_bregexp([$1], [^\(struct \)?\(\w+\)], [\2]) psi_struct_members="{PSI_T_STRUCT, \"struct\", \"$psi_struct_name\", 0, $AS_TR_SH([ac_cv_sizeof_]$1), 0, 0}" - ifelse([$2],,,[m4_map_args_sep([PSI_STRUCT_MEMBER($1,], [)], [], $2)]) - PSI_STRUCTS="$psi_struct_members, {0}, $PSI_STRUCTS" + ifelse([$2],,,[m4_map_args_sep([PSI_STRUCT_MEMBER($1, m4_normalize(], [))], [], $2)]) + psi_add_struct "$psi_struct_members" if test "$1" = "$psi_struct_name"; then - PSI_TYPES="{PSI_T_STRUCT, \"$1\", \"$1\"}, $PSI_TYPES" + psi_add_type "{PSI_T_STRUCT, \"$1\", \"$1\"}" fi ])