IMPLEMENT_SIMPLE_SMOBS(CL) \
SCM \
CL::smobify_self () \
+{ \
+ SCM s = unprotected_smobify_self ();\
+ scm_protect_object (s);\
+ return s;\
+}\
+SCM \
+CL::unprotected_smobify_self () \
{ \
/* \
This is local. We don't assign to self_scm_ directly, to assure \
SCM_SETCDR (s, SCM_PACK(this)); \
self_scm_ = s; \
scm_done_malloc(sizeof(CL)); \
- scm_protect_object (s); \
return s; \
}
#include "string.hh"
#include "lily-proto.hh"
+#include "lily-guile.hh"
#include "virtual-methods.hh"
/**
Global_translator *get_global_translator_p ();
Translator_group *get_group_translator_p (String type) const;
String get_default_output () const;
- void assign_translator (Translator_group*);
- Translator * find_translator_l (String) const;
+ void assign_translator (SCM transdef);
+ SCM find_translator_l (SCM name) const;
};
#endif // Music_output_DEF_HH
DECLARE_SIMPLE_SMOBS(CL,dammy) \
protected:\
virtual ~CL();\
+ SCM unprotected_smobify_self ();\
private: \
SCM smobify_self (); \
SCM self_scm_; \
--- /dev/null
+/*
+ translator-def.hh -- declare Translator_def
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+
+ */
+
+#ifndef TRANSLATOR_DEF_HH
+#define TRANSLATOR_DEF_HH
+
+#include "lily-proto.hh"
+#include "smobs.hh"
+#include "input.hh"
+
+struct Translator_def : public Input
+{
+ SCM consists_name_list_;
+ SCM end_consists_name_list_;
+ SCM accepts_name_list_;
+ SCM property_ops_;
+ SCM type_name_;
+ SCM translator_group_type_;
+
+ SCM modify_definition (SCM, SCM, bool);
+
+ void set_acceptor (SCM accepts, bool add);
+ void add_element (SCM name);
+ void remove_element (SCM name);
+ void add_last_element (SCM name);
+
+ void add_push_property (SCM,SCM,SCM);
+ void add_pop_property (SCM,SCM);
+ void add_property_assign (SCM, SCM);
+ Link_array<Translator_def> path_to_acceptable_translator (SCM type_str, Music_output_def* odef) const;
+ Translator_group * instantiate (Music_output_def*);
+
+ static SCM make_scm () ;
+ static void apply_pushpop_property (Translator_group*, SCM syms, SCM eprop, SCM val);
+
+ SCM clone_scm ()const;
+ DECLARE_SMOBS(Translator_def,foo);
+private:
+
+ Translator_def ();
+ Translator_def (Translator_def const&);
+
+
+};
+
+Translator_def* unsmob_translator_def (SCM);
+
+
+#endif /* TRANSLATOR_DEF_HH */
+
class Scheme_hash_table;
-/*
- should make a struct out of this, and move SCM list stuff in here.
- */
-struct Translator_group_initializer {
- static SCM modify_definition (SCM, SCM, bool);
-
- static void set_acceptor (Translator*,SCM accepts, bool add);
- static void add_element (Translator*,SCM name);
- static void remove_element (Translator*,SCM name);
- static void add_last_element (Translator*,SCM name);
- static void apply_pushpop_property (Translator*trans, SCM syms, SCM eprop, SCM val);
- static void add_push_property (Translator*, SCM,SCM,SCM);
- static void add_pop_property (Translator*, SCM,SCM);
-
-};
/** Make some kind of Elements from Requests. Elements are made by
hierarchically grouped Translators
/*
ugh: bubbled up from Translator_group.
*/
- SCM consists_name_list_;
- SCM end_consists_name_list_;
- SCM accepts_name_list_;
SCM simple_trans_list_;
SCM trans_group_list_;
+ SCM definition_;
+
SCM properties_scm_;
- SCM property_pushes_;
DECLARE_SMOBS(Translator, dummy);
-
public:
/*
UGH. Clean this up.
#include "identifier.hh"
#include "version.hh"
#include "mudela-version.hh"
-#include "translator-group.hh"
+#include "translator-def.hh"
+
void strip_trailing_white (String&);
void strip_leading_white (String&);
} else if (gh_number_p (sid)) {
yylval.scm = sid;
return NUMBER_IDENTIFIER;
- } else if (Translator* tr = unsmob_translator (sid)) {
+ } else if (Translator_def* tr = unsmob_translator_def (sid)) {
yylval.scm = sid;
return TRANSLATOR_IDENTIFIER;
} else if (Music * mus =unsmob_music (sid)) {
#include "debug.hh"
#include "music-output-def.hh"
#include "global-translator.hh"
-
+#include "translator-def.hh"
#include "identifier.hh"
#include "main.hh"
#include "lily-guile.hh"
}
void
-Music_output_def::assign_translator (Translator_group*tp)
+Music_output_def::assign_translator (SCM transdef)
{
- String s =tp->type_str_;
- if (s.empty_b ())
- {
- tp->warning (_("Interpretation context with empty type"));
- }
-
- SCM tr = tp->self_scm ();
- scm_unprotect_object (tr);
- translator_p_dict_p_->set (s, tr);
+ Translator_def *tp = unsmob_translator_def (transdef);
+ assert (tp);
+
+ String s = ly_scm2string (tp->type_name_);
+ translator_p_dict_p_->set (s, transdef);
}
-Translator*
-Music_output_def::find_translator_l (String name) const
+SCM
+Music_output_def::find_translator_l (SCM name) const
{
- if (translator_p_dict_p_->elem_b (name))
- return unsmob_translator (translator_p_dict_p_->scm_elem (name));
-
- map<String, Translator*>::const_iterator ki
- =global_translator_dict_p->find (name);
-
- if (ki != global_translator_dict_p->end ())
- return (*ki).second ;
+ String s = ly_scm2string (name);
+ if (translator_p_dict_p_->elem_b (s))
+ return translator_p_dict_p_->scm_elem (s);
- return 0;
+ return SCM_EOL;
}
Global_translator *
Music_output_def::get_global_translator_p ()
{
- Translator * t = find_translator_l ("Score");
+ Translator_def * t = unsmob_translator_def (find_translator_l (gh_str02scm ("Score")));
if (!t)
error (_f ("can't find `%s' context", "Score"));
- t = t->clone ();
- t->output_def_l_ = this;
- Global_translator *g = dynamic_cast <Global_translator *> (t);
- t->add_processing ();
+ Translator_group * tg = t->instantiate (this);
+
+ tg->add_processing ();
- return g;
+ return dynamic_cast <Global_translator *> (tg);
}
void
if (safe_global_b || !scope_p_->elem_b ("output"))
return "";
SCM s = scope_p_->scm_elem ("output");
-
-
return gh_string_p (s) ? ly_scm2string (s) : String ("");
}
*/
#include <iostream.h>
+#include "translator-def.hh"
#include "lily-guile.hh"
#include "translation-property.hh"
#include "lookup.hh"
#include "musical-request.hh"
#include "my-lily-parser.hh"
#include "context-specced-music.hh"
-#include "translator-group.hh"
#include "score.hh"
#include "music-list.hh"
#include "change-translator.hh"
SCM scm;
Tempo_req *tempo;
- Translator_group* trans;
int i;
}
%{
%token PENALTY
%token PROPERTY
%token PUSHPROPERTY POPPROPERTY
+%token PUSH POP
%token PT_T
%token RELATIVE
%token REMOVE
%type <scm> string bare_number number_expression
%type <score> score_block score_body
-%type <trans> translator_spec_block translator_spec_body
+%type <scm> translator_spec_block translator_spec_body
%type <tempo> tempo_request
%type <scm> notenames_body notenames_block chordmodifiers_block
%type <scm> script_abbreviation
$$ = (new Music_output_def_identifier ($1, MUSIC_OUTPUT_DEF_IDENTIFIER))->self_scm();
}
| translator_spec_block {
- $$ = $1->self_scm ();
- scm_unprotect_object ($$);
+ $$ = $1;
}
| Music {
$$ = $1->self_scm ();
translator_spec_body:
TRANSLATOR_IDENTIFIER {
- SCM trs = $1;
- Translator*tr = unsmob_translator (trs);
- $$ = dynamic_cast<Translator_group*> (tr->clone ());
- $$-> set_spot (THIS->here_input ());
+ $$ = unsmob_translator_def ($1)->clone_scm ();
+ unsmob_translator_def ($$)-> set_spot (THIS->here_input ());
}
| TYPE STRING semicolon {
- Translator* t = get_translator_l (ly_scm2string ($2));
- Translator_group * tg = dynamic_cast<Translator_group*> (t);
-
- if (!tg)
- THIS->parser_error (_("Need a translator group for a context"));
-
- tg = dynamic_cast<Translator_group*> (t->clone ());
- tg->set_spot (THIS->here_input ());
- $$ = tg;
+ $$ = Translator_def::make_scm ();
+ Translator_def*td = unsmob_translator_def ($$);
+ td->translator_group_type_ = $2;
+ td->set_spot (THIS->here_input ());
}
| translator_spec_body STRING '=' embedded_scm {
- Translator_group* tg = $$;
- tg->set_property (ly_scm2string ($2), $4);
+ unsmob_translator_def ($$)->add_property_assign ($2, $4);
+ }
+ | translator_spec_body STRING PUSH embedded_scm '=' embedded_scm {
+ unsmob_translator_def ($$)
+ ->add_push_property (scm_string_to_symbol ($2), $4, $6);
+ }
+ | translator_spec_body STRING POP embedded_scm {
+ unsmob_translator_def($$)->add_pop_property (
+ scm_string_to_symbol ($2), $4);
}
| translator_spec_body STRING '=' identifier_init semicolon {
SCM v = gh_int2scm (0);
THIS->parser_error (_("Wrong type for property value"));
/* ugh*/
- Translator_group* tg = dynamic_cast<Translator_group*> ($$);
-
- tg->set_property (ly_scm2string ($2), v);
- }
- | translator_spec_body PUSHPROPERTY
- embedded_scm embedded_scm embedded_scm {
- Translator_group_initializer::add_push_property ($$, $3, $4, $5);
- }
- | translator_spec_body POPPROPERTY
- embedded_scm embedded_scm {
- Translator_group_initializer::add_pop_property ($$, $3, $4);
+ unsmob_translator_def($$)->add_property_assign ($2, v);
}
| translator_spec_body NAME STRING semicolon {
- $$->type_str_ = ly_scm2string ($3);
+ unsmob_translator_def ($$)->type_name_ = $3;
}
| translator_spec_body CONSISTS STRING semicolon {
- Translator_group_initializer::add_element ($$, $3);
+ unsmob_translator_def ($$)->add_element ($3);
}
| translator_spec_body CONSISTSEND STRING semicolon {
- Translator_group_initializer::add_last_element ($$, $3);
+ unsmob_translator_def ($$)->add_last_element ( $3);
}
| translator_spec_body ACCEPTS STRING semicolon {
- Translator_group_initializer::set_acceptor ($$, $3,true);
+ unsmob_translator_def ($$)->set_acceptor ($3,true);
}
| translator_spec_body DENIES STRING semicolon {
- Translator_group_initializer::set_acceptor ($$, $3,false);
+ unsmob_translator_def ($$)->set_acceptor ($3,false);
}
| translator_spec_body REMOVE STRING semicolon {
- Translator_group_initializer::remove_element ($$, $3);
+ unsmob_translator_def ($$)->remove_element ($3);
}
;
}
| music_output_def_body translator_spec_block {
- $$-> assign_translator ($2);
+ $$->assign_translator ($2);
}
| music_output_def_body tempo_request semicolon {
/*
}
| MUSIC_IDENTIFIER { $$ = unsmob_music ($1)->clone (); }
| property_def
- | PUSHPROPERTY embedded_scm embedded_scm embedded_scm {
+/* | PUSHPROPERTY embedded_scm embedded_scm embedded_scm {
$$ = new Push_translation_property;
$$->set_mus_property ("symbols", $2);
$$->set_mus_property ("element-property", $3);
$$->set_mus_property ("element-value", $4);
}
- | POPPROPERTY embedded_scm embedded_scm {
+ | POPPROPERTY embedded_scm embedded_scm {
$$ = new Pop_translation_property;
$$->set_mus_property ("symbols", $2);
$$->set_mus_property ("element-property", $3);
}
+*/
| translator_change
| Simple_music '*' bare_unsigned '/' bare_unsigned {
$$ = $1;
csm-> translator_type_str_ = ly_scm2string ($2);
}
+ | PROPERTY STRING '.' STRING PUSH embedded_scm '=' embedded_scm {
+ Push_translation_property *t = new Push_translation_property;
+
+ t->set_mus_property ("symbols", scm_string_to_symbol ($4));
+ t->set_mus_property ("element-property", $6);
+ t->set_mus_property ("element-value", $8);
+ Context_specced_music *csm = new Context_specced_music (t);
+ $$ = csm;
+ $$->set_spot (THIS->here_input ());
+
+ csm-> translator_type_str_ = ly_scm2string ($2);
+ }
+ | PROPERTY STRING POP embedded_scm {
+ $$ = new Pop_translation_property;
+ $$->set_mus_property ("symbols", scm_string_to_symbol ($2));
+ $$->set_mus_property ("element-property", $4);
+ }
;
scalar:
#include "property-iterator.hh"
#include "translation-property.hh"
+#include "translator-def.hh"
#include "translator-group.hh"
/**
SCM eprop = music_l_->get_mus_property ("element-property");
SCM val = music_l_->get_mus_property ("element-value");
- Translator_group_initializer::apply_pushpop_property (report_to_l (), syms,eprop, val);
+ Translator_def::apply_pushpop_property (report_to_l (), syms, eprop, val);
Music_iterator::do_process_and_next (m);
}
{
SCM syms = music_l_->get_mus_property ("symbols");
SCM eprop = music_l_->get_mus_property ("element-property");
- Translator_group_initializer::apply_pushpop_property (report_to_l (), syms, eprop, SCM_UNDEFINED);
+ Translator_def::apply_pushpop_property (report_to_l (), syms, eprop, SCM_UNDEFINED);
Music_iterator::do_process_and_next (m);
}
void
Staff_symbol_engraver::do_creation_processing()
{
- span_p_ = new Spanner (get_property ("staffSymbolBasicProperties"));
+ span_p_ = new Spanner (get_property ("basicStaffSymbolProperties"));
span_p_->set_bound(LEFT, unsmob_element (get_property ("currentCommandColumn")));
{
if (global_translator_dict_p->elem_b (s))
{
-// return (*global_translator_dict_p)[s];
Translator* t = (*global_translator_dict_p)[s];
return t;
}
#include "moment.hh"
#include "scm-hash.hh"
#include "killing-cons.tcc"
+#include "translator-def.hh"
Translator_group::Translator_group (Translator_group const&s)
: Translator(s)
return r;
}
-Link_array<Translator_group>
-Translator_group::path_to_acceptable_translator (String type, Music_output_def* odef) const
-{
- Link_array<Translator_group> accepted_arr;
- for (SCM s = accepts_name_list_; gh_pair_p (s); s = gh_cdr (s))
- {
-
- Translator *t = odef->find_translator_l (ly_scm2string (gh_car (s)));
- if (!t || !dynamic_cast <Translator_group *> (t))
- continue;
- accepted_arr.push (dynamic_cast <Translator_group *> (t));
- }
- for (int i=0; i < accepted_arr.size (); i++)
- if (accepted_arr[i]->type_str_ == type)
- {
- Link_array<Translator_group> retval;
- retval.push (accepted_arr[i]);
- return retval;
- }
-
- Link_array<Translator_group> best_result;
- int best_depth= INT_MAX;
- for (int i=0; i < accepted_arr.size (); i++)
- {
- Translator_group * g = accepted_arr[i];
-
- Link_array<Translator_group> result
- = g->path_to_acceptable_translator (type, odef);
- if (result.size () && result.size () < best_depth)
- {
- result.insert (g,0);
- best_result = result;
- }
- }
-
- return best_result;
-}
Translator_group*
Translator_group::find_create_translator_l (String n, String id)
if (existing)
return existing;
- Link_array<Translator_group> path
- = path_to_acceptable_translator (n, output_def_l ());
+ Link_array<Translator_def> path
+ = unsmob_translator_def (definition_)->path_to_acceptable_translator (gh_str02scm (n.ch_C()), output_def_l ());
if (path.size ())
{
// start at 1. The first one (index 0) will be us.
for (int i=0; i < path.size (); i++)
{
- Translator_group * new_group = dynamic_cast<Translator_group*>(path[i]->clone ());
+ Translator_group * new_group = path[i]->instantiate (output_def_l_);
current->add_group_translator (new_group);
current = new_group;
Translator_group::terminate_translator (Translator*r_l)
{
r_l->removal_processing();
- Translator * trans_p =remove_translator_p (r_l);
/*
- forget trans_p, GC does the rest.
+ Return value ignored. GC does the rest.
*/
+ remove_translator_p (r_l);
}
bool
Translator_group::is_bottom_translator_b () const
{
- return accepts_name_list_ == SCM_EOL;
+ return unsmob_translator_def (definition_)->accepts_name_list_ == SCM_EOL;
}
-
-
Translator_group*
Translator_group::get_default_interpreter()
{
- if (gh_pair_p (accepts_name_list_))
+ if (!is_bottom_translator_b ())
{
- String str = ly_scm2string (gh_car (accepts_name_list_));
- Translator*t = output_def_l ()->find_translator_l (str);
+ SCM nm = unsmob_translator_def (definition_)->accepts_name_list_;
+ SCM st = output_def_l ()->find_translator_l (gh_car (nm));
+
+ Translator_def *t = unsmob_translator_def (st);
if (!t)
{
- warning (_f ("can't find or create: `%s'", str));
- t = this;
+ warning (_f ("can't find or create: `%s'", ly_scm2string (nm).ch_C()));
+ t = unsmob_translator_def (this->definition_);
}
- Translator_group * g= dynamic_cast <Translator_group*>(t->clone ());
- add_group_translator (g);
+ Translator_group *tg = t->instantiate (output_def_l_);
+ add_group_translator (tg);
- if (!g->is_bottom_translator_b ())
- return g->get_default_interpreter ();
+ if (!tg->is_bottom_translator_b ())
+ return tg->get_default_interpreter ();
else
- return g;
+ return tg;
}
return this;
}
#endif
}
-static SCM
-trans_list (SCM namelist, Music_output_def *mdef)
-{
- SCM l = SCM_EOL;
- for (SCM s = namelist; gh_pair_p (s) ; s = gh_cdr (s))
- {
- Translator * t = mdef->find_translator_l (ly_scm2string (gh_car (s)));
- if (!t)
- warning (_f ("can't find: `%s'", s));
- else
- {
- Translator * tr = t->clone ();
- SCM str = tr->self_scm ();
- l = gh_cons (str, l);
- scm_unprotect_object (str);
- }
- }
- return l;
-}
-
-
void
Translator_group::do_add_processing ()
{
- assert (simple_trans_list_== SCM_EOL);
-
- SCM correct_order = scm_reverse (property_pushes_); // pity of the mem.
- for (SCM s = correct_order; gh_pair_p (s); s = gh_cdr (s))
- {
- SCM entry = gh_car (s);
- SCM val = gh_cddr (entry);
- val = gh_pair_p (val) ? gh_car (val) : SCM_UNDEFINED;
-
- Translator_group_initializer::apply_pushpop_property (this, gh_car (entry),
- gh_cadr (entry),
- val);
- }
-
- SCM l1 = trans_list (consists_name_list_, output_def_l ());
- SCM l2 =trans_list (end_consists_name_list_, output_def_l ());
- l1 = scm_reverse_x (l1, l2);
-
- simple_trans_list_ = l1;
- for (SCM s = l1; gh_pair_p (s) ; s = gh_cdr (s))
+ for (SCM s = simple_trans_list_; gh_pair_p (s) ; s = gh_cdr (s))
{
Translator * t = unsmob_translator (gh_car (s));
-
- t->daddy_trans_l_ = this;
- t->output_def_l_ = output_def_l_;
t->add_processing ();
}
-
-
}
/*
simple_trans_list_ = SCM_EOL;
trans_group_list_ = SCM_EOL;
properties_scm_ = SCM_EOL;
- accepts_name_list_ = SCM_EOL;
- consists_name_list_ = SCM_EOL;
- end_consists_name_list_ = SCM_EOL;
- property_pushes_ = SCM_EOL;
+ definition_ = SCM_EOL;
daddy_trans_l_ =0;
}
: Input (s)
{
init ();
-
- consists_name_list_ = scm_list_copy (s.consists_name_list_);
- end_consists_name_list_ = scm_list_copy (s.end_consists_name_list_);
- accepts_name_list_ = scm_list_copy (s.accepts_name_list_);
- property_pushes_ = scm_list_copy (s.property_pushes_);
-
output_def_l_ = s.output_def_l_;
type_str_ = s.type_str_;
Translator::mark_smob (SCM sm)
{
Translator * me = (Translator*) SCM_CELL_WORD_1(sm);
- scm_gc_mark (me->consists_name_list_);
- scm_gc_mark (me->accepts_name_list_);
- scm_gc_mark (me->end_consists_name_list_);
scm_gc_mark (me->simple_trans_list_);
scm_gc_mark (me->trans_group_list_);
- scm_gc_mark (me->property_pushes_);
+ scm_gc_mark (me->definition_);
+ scm_gc_mark (me->properties_scm_);
+
return me->properties_scm_;
}
\consists "Separating_line_group_engraver";
\name RhythmicStaff;
- \pushproperty #'basicVoltaSpannerProperties #'minimum-space #15 % urg, in \pt
- \pushproperty #'basicVoltaSpannerProperties #'padding #5 % urg, in \pt
+ basicVoltaSpannerProperties \push #'minimum-space = #15 % urg, in \pt
+ basicVoltaSpannerProperties \push #'padding = #5 % urg, in \pt
\consists "Property_engraver";
- \pushproperty #'basicStemProperties #'style #"grace"
- \pushproperty #'basicStemProperties #'flag-style #"grace"
- \pushproperty #'basicStemProperties #'stem-length #6.0
- \pushproperty #'basicStemProperties #'direction #1
- \pushproperty #'(basicNoteHeadProperties basicStemProperties basicBeamProperties basicTextScriptProperties basicSlurProperties basicLocalKeyProperties) #'font-size #-1
-
+ basicStemProperties \push #'style = #"grace"
+ basicStemProperties \push #'flag-style = #"grace"
+ basicStemProperties \push #'stem-length = #6.0
+ basicStemProperties \push #'direction = #1
+
+ basicNoteHeadProperties \push #'font-size = #-1
+ basicStemProperties \push #'font-size = #-1
+ basicBeamProperties \push #'font-size = #-1
+ basicTextScriptProperties \push #'font-size = #-1
+ basicSlurProperties \push #'font-size = #-1
+ basicLocalKeyProperties \push #'font-size = #-1
+
weAreGraceContext = ##t
graceAccidentalSpace= 1.5 * \staffspace;
};
(visibility-lambda . ,begin-of-line-visible)
(name . "stanza number")
)
- staffSymbolBasicProperties = #`(
+ basicStaffSymbolProperties = #`(
(interfaces . (staff-symbol-interface ))
(molecule-callback . ,Staff_symbol::brew_molecule)
(staff-space . 1.0)
\name Staff;
\accepts Voice;
- \accepts VoiceOne; % ugh.
- \accepts VoiceTwo;
- \accepts VoiceThree;
- \accepts VoiceFour;
-
\consists "Key_performer";
\consists "Time_signature_performer";
\consists "Tempo_performer";