]> git.donarmstrong.com Git - lilypond.git/blob - lily/chained-callback.cc
* lily/rest-collision.cc (force_shift_callback_rest): change to
[lilypond.git] / lily / chained-callback.cc
1 /*
2   chained-callback.cc -- chained callbacks.
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
7
8 */
9
10 #include "lily-guile.hh"
11
12 static scm_t_bits chain_tag;
13
14 bool
15 is_callback_chain (SCM s)
16 {
17   return (SCM_NIMP (s) && SCM_CELL_TYPE (s) == chain_tag);
18 }
19
20 SCM
21 callback_chain_extract_procedures (SCM chain_smob)
22 {
23   assert (is_callback_chain (chain_smob));
24   return (SCM) SCM_CELL_WORD_1(chain_smob);
25 }
26
27 LY_DEFINE(ly_callback_chain_p, "ly:callback-chain?",
28           1,0,0, (SCM chain),
29           "Type predicate.")
30 {
31   return scm_from_bool (is_callback_chain (chain));
32 }
33
34 LY_DEFINE(ly_make_callback_chain, "ly:make-callback-chain",
35           0, 0, 1, (SCM procedures),
36           "Make a grob callback chain. @var{procedures} should be a "
37           "list of procedures taking 2 arguments.")
38 {
39   SCM z;
40
41   for (SCM s = procedures;
42        scm_is_pair (s); s = scm_cdr (s))
43     {
44       SCM proc = scm_car (s);
45       if (!ly_is_procedure (proc))
46         {
47           scm_misc_error ("Must be a procedure: ~a",
48                           "ly:make-callback-chain",
49                           proc);
50         }
51
52       if (procedure_arity (proc) != 2)
53         {
54           scm_misc_error ("Procedure should take 2 arguments: ~a",
55                           "ly:make-callback-chain",
56                           proc);
57         }
58     }
59   
60   SCM_NEWSMOB(z, chain_tag, procedures);
61   return z;
62 }
63  
64 int
65 print_callback_chain (SCM s, SCM port, scm_print_state *)
66 {
67   scm_puts ("#<callback-chain ", port);
68   scm_display (scm_cdr (s), port);
69   scm_puts (" >", port);
70   return 1;
71 }
72
73
74 void init_chained_callback ()
75 {
76   chain_tag = scm_make_smob_type ("callback-chain", 0);
77   scm_set_smob_mark (chain_tag, scm_markcdr);
78   scm_set_smob_print (chain_tag, print_callback_chain);
79 };
80
81
82
83 ADD_SCM_INIT_FUNC(chain, init_chained_callback);