cover null default val
[m6w6/ext-psi] / m4 / psi / psi_macro.m4
1 # psi_add_macro(macro)
2 # Add a pre-defined macro function to $PSI_MACROS_H.
3 psi_add_macro() {
4 PSI_MACROS="$PSI_MACROS
5 $1"
6 }
7
8 dnl PSI_MACRO(macro, decl args, action-if-true)
9 AC_DEFUN(PSI_MACRO, [
10 AC_CHECK_DECL(PSI_VAR_NAME($1)$2, [
11 macro_type="PSI_VAR_TYPE($1)"
12 macro_name="PSI_VAR_NAME($1)"
13 PSI_TYPE_INDIRECTION([$1],, macro_pointer_level, macro_array_size)
14 if test "$macro_array_size" -gt 0; then
15 macro_array="@<:@$macro_array_size@:>@"
16 macro_return="$macro_type*"
17 else
18 macro_array=""
19 macro_return="$macro_type"
20 fi
21 m4_case([$2],
22 [(void)], [
23 macro_decl="(void)"
24 macro_call="()"
25 macro_action=call
26 ],
27 [()], [
28 macro_decl="()"
29 macro_call="()"
30 macro_action=call
31 ],
32 [], [
33 macro_decl="()"
34 macro_call=""
35 macro_action=get
36 ],
37 [
38 macro_decl="$2"
39 macro_call="(m4_map_args_sep([PSI_VAR_NAME(], [)], [, ], m4_bregexp($2, [(\(.*\))], [\1])))"
40 macro_action=call
41 ]
42 )
43 ifelse(PSI_VAR_TYPE($1), [void], [
44 macro_body="$macro_name$macro_call;"
45 ], [
46 macro_body="return $macro_name$macro_call;"
47 ])
48 $3
49 psi_add_macro "$macro_return _psi_${macro_action}_$macro_name$macro_decl { $macro_body }"
50 PSI_REDIR($macro_name, _psi_${macro_action}_$macro_name)
51 ], [], PSI_INCLUDES)
52 ])
53
54 dnl PSI_EXTVAR(type var)
55 AC_DEFUN(PSI_EXTVAR, [
56 PSI_MACRO($1, [], [
57 dnl just a getter
58 PSI_DECL_ARGS($1)
59 psi_add_decl "$psi_decl_args"
60 dnl explicit getter
61 PSI_REDIR([${macro_name}_get], [_psi_get_$macro_name])
62 PSI_DECL_ARGS(PSI_VAR_TYPE_RETURN([$1]) PSI_VAR_NAME([$1])_get)
63 psi_add_decl "$psi_decl_args"
64 dnl setter
65 psi_add_macro "void _psi_set_${macro_name}($macro_type value$macro_array) { memcpy(&$macro_name, &value, sizeof($macro_type$macro_array)); }"
66 PSI_REDIR([${macro_name}_set], [_psi_set_${macro_name}])
67 PSI_DECL_ARGS([void ]PSI_VAR_NAME([$1])[_set], [($1)])
68 psi_add_decl "$psi_decl_args"
69 ])
70 ])