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