]> git.donarmstrong.com Git - lilypond.git/blob - lily/cxx-function-smob.cc
2002-07-13 Han-Wen <hanwen@cs.uu.nl>
[lilypond.git] / lily / cxx-function-smob.cc
1 /*   
2   grob-callback.cc --  implement Callback smob.
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 2000--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   
8  */
9
10 #include "cxx-function-smob.hh"
11 #include "ly-smobs.icc"
12
13 static scm_t_bits callback_tag;
14
15 static
16 SCM mark_smob (SCM)
17 {
18   return SCM_EOL;
19 }
20
21 static int
22 print_smob (SCM, SCM port, scm_print_state *)
23 {
24   scm_puts ("#<encapsulated C++ function>", port);
25   return 1;
26 }
27
28 static size_t
29 free_smob (SCM)
30 {
31   return 0;
32 }
33
34 LY_DEFINE(cxx_function_type_p, "c++-function?", 1, 0, 0, (SCM x),
35           "Is this an encapsulated C++ function ?")
36 {
37   return (SCM_CELL_TYPE (x)) == callback_tag ? SCM_BOOL_T : SCM_BOOL_F; 
38 }
39
40 void init_cxx_function_smobs ()
41 {
42   callback_tag = scm_make_smob_type ("callback", 0);
43   scm_set_smob_mark (callback_tag, mark_smob);
44   scm_set_smob_free (callback_tag, free_smob);
45   scm_set_smob_print (callback_tag, print_smob);
46   scm_set_smob_equalp (callback_tag, 0);
47 }
48
49 SCM
50 smobify_cxx_function (Cxx_function cb)
51 {
52   SCM z;
53   SCM_NEWSMOB(z,callback_tag, cb) ;
54   return z;
55 }
56
57
58 Cxx_function
59 unsmob_cxx_function (SCM x)
60 {
61   
62   if (SCM_NIMP (x) && SCM_CELL_TYPE (x) == callback_tag)
63     return (Cxx_function) SCM_CELL_WORD_1 (x);
64   else
65     return 0;
66 }
67