2 object-key-undumper.cc -- implement Object_key_undumper
4 source file of the GNU LilyPond music typesetter
6 (c) 2004--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
10 #include "object-key-undumper.hh"
12 #include "ly-smobs.icc"
14 IMPLEMENT_SMOBS(Object_key_undumper);
15 IMPLEMENT_DEFAULT_EQUAL_P(Object_key_undumper);
18 Object_key_undumper::mark_smob (SCM smob)
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++)
24 scm_gc_mark ((*i).second->self_scm ());
31 Object_key_undumper::print_smob (SCM s, SCM port, scm_print_state*)
34 scm_puts ("#<Object_key_undumper>", port);
39 Object_key_undumper::Object_key_undumper ()
46 Object_key_undumper::parse_contents (SCM contents)
48 for (SCM s = contents; scm_is_pair (s); s = scm_cdr (s))
50 SCM entry = scm_car (s);
51 if (scm_car (entry) != ly_symbol2scm ("define-key"))
55 int number = scm_to_int (scm_cadr (entry));
56 SCM skey = scm_caddr (entry);
58 SCM new_key = SCM_EOL;
60 for (SCM t = skey; scm_is_pair (t); t = scm_cdr (t))
62 SCM item = scm_car (t);
63 if (scm_is_pair (item)
64 && scm_car (item) == ly_symbol2scm ("key"))
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);
72 *tail = scm_cons (item, SCM_EOL);
74 tail = SCM_CDRLOC(*tail);
77 Object_key *k = Object_key::undump (new_key);
79 scm_gc_unprotect_object (k->self_scm());
85 Object_key_undumper::get_key (int idx)
87 Int_to_key_map::const_iterator i (keys_.find (idx));
88 assert (i != keys_.end());
93 Object_key_undumper::~Object_key_undumper()