1 /* $Id
2  * scwm_guile.h
3  *
4  * Guile-interface help inspired by SCWM.
5  *
6  * Based on scwm.h:
7  * Copyright (C) 1997-1999, Maciej Stachowiak and Greg J. Badros
8  */
9 
10 
11 #ifndef SCWM_GUILE_H__
12 #define SCWM_GUILE_H__
13 
14 #include "arg_unused.h"
15 #include <guile/gh.h>
16 #include "validate.h"
17 #include <xsnarf.h>
18 
19 #ifndef False
20 #define False 0
21 #endif
22 #ifndef True
23 #define True (!False)
24 #endif
25 
26 
27 #define SCWM_MAKE_HOOK(args) scm_permanent_object(scm_make_hook(scm_long2num(args)))
28 
29 SCM scwm_handle_error (void *handler_data, SCM tag, SCM throw_args);
30 SCM scwm_safe_apply_message_only (SCM proc, SCM args);
31 
32 /* Individual callbacks. */
33 
34 SCM scwm_safe_apply (SCM proc, SCM args);
35 SCM scwm_safe_call0 (SCM thunk);
36 SCM scwm_safe_call1 (SCM proc, SCM arg);
37 SCM scwm_safe_call2 (SCM proc, SCM arg1, SCM arg2);
38 SCM scwm_safe_call3 (SCM proc, SCM arg1, SCM arg2, SCM arg3);
39 SCM scwm_safe_call4 (SCM proc, SCM arg1, SCM arg2, SCM arg3, SCM arg4);
40 SCM scwm_safe_call5 (SCM proc, SCM arg1, SCM arg2, SCM arg3, SCM arg4, SCM arg5);
41 
42 SCM safe_load (SCM fname);
43 SCM scwm_safe_load (char *filename);
44 SCM scwm_safe_eval_str (char *string);
45 
46 /* Hooks. */
47 
48 SCM call0_hooks (SCM hook);
49 SCM call1_hooks (SCM hook_type, SCM arg);
50 SCM call2_hooks (SCM hook_type, SCM arg1, SCM arg2);
51 SCM call3_hooks (SCM hook_type, SCM arg1, SCM arg2, SCM arg3);
52 SCM call4_hooks (SCM hook_type, SCM arg1, SCM arg2, SCM arg3, SCM arg4);
53 SCM call5_hooks (SCM hook_type, SCM arg1, SCM arg2, SCM arg3, SCM arg4, SCM arg5);
54 SCM call6_hooks (SCM hook_type, SCM arg1, SCM arg2, SCM arg3, SCM arg4, SCM arg5, SCM arg6);
55 SCM call7_hooks (SCM hook_type, SCM arg1, SCM arg2, SCM arg3, SCM arg4, SCM arg5, SCM arg6, SCM arg7);
56 
57 SCM scwm_run_hook(SCM hook, SCM args);
58 SCM scwm_run_hook_message_only(SCM hook, SCM args);
59 
60 SCM scm_empty_hook_p(SCM hook);
61 
62 
63 /* new-style SMOBs -- this gives smobs names, too */
64 #define MAKE_SMOBFUNS(T) /* nothing */
65 #define REGISTER_SCWMSMOBFUNS(T) \
66  do { \
67     scm_tc16_scwm_ ## T = scm_make_smob_type_mfpe( #T, 0, &(mark_ ##T), &(free_ ## T), &(print_ ## T), NULL); \
68   } while (0)
69 
70 
71 #ifndef SCWM_EXTRACT_COMMENTS
72 /* do not define this macro if we are extracting comments since
73    the macro name is used as a lexical cue to the extractor */
74 
75 /* SCWM_VAR_INIT, SCWM_VAR still require a variable declaration */
76 
77 #define SCWM_VAR_INIT(cvar, name, val) \
78   do { pscm_ ## cvar = SCM_CDRLOC( \
79       scm_sysintern(name, val) ); } while (0)
80 
81 #define SCWM_VAR(cvar, name) \
82   do { pscm_ ## cvar = SCM_CDRLOC( \
83       scm_sysintern0(name) ); } while (0)
84 
85 
86 /* GJB:FIXME:: Note that cvar is ignored for now */
87 #define SCWM_VAR_READ_ONLY(cvar, name,val) \
88   do { scm_sysintern(name,val); \
89      } while (0)
90 
91 
92 #endif /* !SCWM_EXTRACT_COMMENTS */
93 
94 
95 /* Check if the scm variable is undefined or #f -- these cases
96    correspond to places where we want to use a default value
97    either because the args were omitted, or #f was used to skip
98    the argument to get to an argument that the client wanted to
99    specify.
100    Intentionally not named SCM_UNSET, since that would imply
101    it's part of guile */
102 #define UNSET_SCM(x) (((x) == SCM_UNDEFINED) || ((x) == SCM_BOOL_F))
103 
104 #define GC_MARK_SCM_IF_SET(scm) do { if (scm && !UNSET_SCM((scm))) \
105      { scm_gc_mark((scm)); } } while (0)
106 
107 /* a NEWSMOB variation that hides the tc16 part */
108 /*#define SGT_NEWCELL_SMOB(ANSWER,ID,PSMOB)	\
109    do { \
110      SCM_NEWCELL((ANSWER)); \
111      SCM_SETCAR((ANSWER),(scm_tc16_scwm_ ## ID)); \
112      SCM_SETCDR((ANSWER),(SCM) (PSMOB)); \
113    } while (0)
114 */
115 
116 #define SGT_NEWCELL_SMOB(ANSWER,ID,PSMOB)	\
117    do { \
118      SCM_NEWSMOB(ANSWER, (scm_tc16_scwm_ ## ID), (SCM) (PSMOB)); \
119    } while (0)
120 
121 #define DEREF_IF_SYMBOL(x) do { if (gh_symbol_p((x))) { \
122                                    (x) = scm_symbol_binding(SCM_BOOL_F,(x)); \
123                                 } } while (0)
124 
125 #define DYNAMIC_PROCEDURE_P(x) (gh_procedure_p((x)) || \
126 				(gh_symbol_p((x)) && \
127 				 gh_procedure_p(scm_symbol_binding(SCM_BOOL_F,(x)))))
128 
129 #define PROCEDURE_OR_SYMBOL_P(x) (gh_procedure_p((x)) || gh_symbol_p((x)))
130 
131 #define RESTP_SCM 1
132 
133 
134 #define scwm_ptr2scm(p) gh_long2scm((long)(p))
135 
136 #define SCM_BOOL_FromBool(x) ((x)? SCM_BOOL_T: SCM_BOOL_F)
137 
138 
139 
140 #define PackedBool(x) unsigned short x:1
141 
142 #endif /*  SCWM_GUILE_H__ */
143 
144 /* Global variables */
145 
146 /* Local Variables: */
147 /* tab-width: 8 */
148 /* c-basic-offset: 2 */
149 /* End: */
150 /* vim:ts=8:sw=2:sta
151  */
152 
153