d26a888774a5a7a2c094ecfeb58a92521620a6d4
[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 m4_case([$2],
15 [(void)], [
16 macro_decl="(void)"
17 macro_call="()"
18 macro_action=call
19 ],
20 [()], [
21 macro_decl="()"
22 macro_call="()"
23 macro_action=call
24 ],
25 [], [
26 macro_decl="()"
27 macro_call=""
28 macro_action=get
29 ],
30 [
31 macro_decl="$2"
32 macro_call="(m4_map_args_sep([PSI_VAR_NAME(], [)], [, ], m4_bregexp($2, [(\(.*\))], [\1])))"
33 macro_action=call
34 ]
35 )
36 ifelse(PSI_VAR_TYPE($1), [void], [
37 macro_body="$macro_name$macro_call;"
38 ], [
39 macro_body="return $macro_name$macro_call;"
40 ])
41 $3
42 psi_add_macro "$macro_type _psi_${macro_action}_$macro_name$macro_decl { $macro_body }"
43 PSI_REDIR($macro_name, _psi_${macro_action}_$macro_name)
44 ], [], PSI_INCLUDES)
45 ])
46
47 dnl PSI_EXTVAR(type var)
48 AC_DEFUN(PSI_EXTVAR, [
49 dnl just a getter
50 PSI_MACRO($1, [], [
51 PSI_DECL_ARGS($1)
52 psi_add_decl "$psi_decl_args"
53 dnl explicit getter & setter
54 PSI_REDIR([${macro_name}_get], [_psi_get_$macro_name])
55 PSI_DECL_ARGS($1_get)
56 psi_add_decl "$psi_decl_args"
57 psi_add_macro "void _psi_set_${macro_name}($macro_type value) { memcpy(&$macro_name, &value, sizeof(value)); }"
58 PSI_REDIR([${macro_name}_set], [_psi_set_${macro_name}])
59 PSI_DECL_ARGS([void PSI_VAR_NAME($1)_set], [(PSI_VAR_TYPE($1) _v)])
60 psi_add_decl "$psi_decl_args"
61 ])
62 ])