]> git.donarmstrong.com Git - lilypond.git/blob - lily/object-key-undumper.cc
* lily/parser.yy (assignment_id): allow LYRICS_STRING as
[lilypond.git] / lily / object-key-undumper.cc
1 /*
2   object-key-undumper.cc --  implement Object_key_undumper
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2004--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
7
8 */
9
10 #include "object-key-undumper.hh"
11
12 #include "ly-smobs.icc"
13
14 IMPLEMENT_SMOBS(Object_key_undumper);
15 IMPLEMENT_DEFAULT_EQUAL_P(Object_key_undumper);
16
17 SCM
18 Object_key_undumper::mark_smob (SCM smob)
19 {
20   Object_key_undumper * undumper = (Object_key_undumper*) SCM_CELL_WORD_1(smob);
21   for (Int_to_key_map::const_iterator i (undumper->keys_.begin());
22        i != undumper->keys_.end(); i++)
23     {
24       scm_gc_mark ((*i).second->self_scm ());
25     }
26
27   return SCM_BOOL_F;
28 }
29
30 int
31 Object_key_undumper::print_smob (SCM s, SCM port, scm_print_state*)
32 {
33   (void) s; 
34   scm_puts ("#<Object_key_undumper>", port);
35   return 1;
36 }
37
38
39 Object_key_undumper::Object_key_undumper ()
40 {
41   smobify_self();
42 }
43
44
45 void
46 Object_key_undumper::parse_contents (SCM contents)
47 {
48   for (SCM s = contents; scm_is_pair (s); s = scm_cdr (s))
49     {
50       SCM entry = scm_car (s);
51       if (scm_car (entry) != ly_symbol2scm ("define-key"))
52         continue;
53
54       
55       int number = scm_to_int (scm_cadr (entry));
56       SCM skey = scm_caddr (entry);
57
58       SCM new_key = SCM_EOL;
59       SCM *tail = &new_key;
60       for (SCM t = skey; scm_is_pair (t); t = scm_cdr (t))
61         {
62           SCM item = scm_car (t);
63           if (scm_is_pair (item)
64               && scm_car (item) == ly_symbol2scm ("key"))
65             {
66               int index = scm_to_int (scm_cadr (item));
67               Object_key const *key = get_key (index);
68               *tail = scm_cons (key->self_scm(), SCM_EOL);
69             }
70           else
71             {
72               *tail = scm_cons (item, SCM_EOL);
73             }
74           tail = SCM_CDRLOC(*tail);
75         }
76
77       Object_key *k = Object_key::undump (new_key);
78       keys_[number] = k;
79       scm_gc_unprotect_object (k->self_scm());
80     }
81   
82 }
83
84 Object_key const* 
85 Object_key_undumper::get_key (int idx)
86 {
87   Int_to_key_map::const_iterator i (keys_.find (idx));
88   assert (i != keys_.end());
89
90   return (*i).second;
91 }
92
93 Object_key_undumper::~Object_key_undumper()
94 {
95 }