X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fidentifier.cc;h=28e450ac496c99cd4a8c2a41d15ec4736ce94552;hb=8da6cef580cce3365b219f6aca429b434cb60fcf;hp=ff75e9331158187935a11bc3247b966dc74b42e0;hpb=1a66290a98e7de8d6d41485b5b71a9f7e1fe35c7;p=lilypond.git diff --git a/lily/identifier.cc b/lily/identifier.cc index ff75e93311..28e450ac49 100644 --- a/lily/identifier.cc +++ b/lily/identifier.cc @@ -3,129 +3,134 @@ source file of the GNU LilyPond music typesetter - (c) 1997 Han-Wen Nienhuys + (c) 1997--2000 Han-Wen Nienhuys */ + +/* + JUNKTHIS! + */ #include -#include "midi-def.hh" -#include "paper-def.hh" + +#include "music-output-def.hh" #include "score.hh" #include "identifier.hh" #include "my-lily-lexer.hh" #include "debug.hh" -#include "symtable.hh" -#include "lookup.hh" -#include "script-def.hh" -#include "request.hh" -#include "input-translator.hh" +#include "ly-smobs.icc" -IMPLEMENT_IS_TYPE_B(Identifier); +IMPLEMENT_UNSMOB(Identifier, identifier); +IMPLEMENT_SMOBS(Identifier); +IMPLEMENT_DEFAULT_EQUAL_P(Identifier); -Identifier::~Identifier() +Identifier::Identifier (int code) { - if (!accessed_b_ && !init_b_) - warning ("Variable not used"); + token_code_i_ = code; + accessed_b_ = 0; + smobify_self (); } -void -Identifier::error (String expect) + +Identifier::Identifier (Identifier const&s) + : Input (s) { - String e ("Wrong identifier type: "); - e += String (name()) + "(expected " + expect + ")"; - ::error (e); + smobify_self (); + token_code_i_ = s.token_code_i_; + accessed_b_ = s.accessed_b_; } -Identifier::Identifier ( int code) +Identifier::~Identifier() { - token_code_i_ = code; - accessed_b_ = 0; - init_b_ = 0; } void -Identifier::print()const +Identifier::error (String expect) const { - DOUT << "identifier "; - do_print(); + ::error (_f ("wrong identifier type, expected: `%s'", expect)); } -/* ugh. */ -#define DEFAULT_PRINT(Class, Content_type, accessor) \ -void \ -Class::do_print() const { \ - ((Class*)this)->accessor()->print(); \ -} \ -class Class - - -DEFAULT_PRINT(Script_id, General_script_def, script); -DEFAULT_PRINT(Lookup_id, Lookup, lookup); -DEFAULT_PRINT(Input_translator_id, Input_trans, input_translator); -DEFAULT_PRINT(Symtables_id, Symtables, symtables); -DEFAULT_PRINT(Music_id,Music , music); -DEFAULT_PRINT(Request_id, Request, request); -DEFAULT_PRINT(Score_id, Score, score); -DEFAULT_PRINT(Midi_def_id,Midi_def, mididef); -DEFAULT_PRINT(Paper_def_id,Paper_def, paperdef); - -void -Real_id::do_print() const +String +Identifier::str () const { - DOUT << *data_p_<< "\n"; + return do_str (); } -void -Int_id::do_print() const +String +Identifier::do_str () const { - DOUT << *data_p_<< "\n"; + return ""; +} + + +/* ugh. */ +#define DUMMY_STR(Class) \ +String \ +Class ## _identifier::do_str () const { \ + return String (#Class); \ } +DUMMY_STR(Score); +DUMMY_STR(Music_output_def); -#define DEFAULT_ACCESSOR(Idclass, Class, accessor)\ + +#define DEFAULT_STR(Class) \ +String \ +Class ## _identifier::do_str () const\ +{\ + return to_str (*data_p_);\ +} + + + +/* + fucking C++ blows me. + */ + +#define DEFAULT_ACCESSOR(Class)\ Class*\ -Idclass::accessor () {\ - accessed_b_ = true;\ - return new Class (*data_p_);\ +Class ## _identifier::access_content_ ## Class (bool copy_b) const {\ + ((Class ## _identifier*)this)->accessed_b_ = true;\ + return copy_b ? new Class (*data_p_) : data_p_;\ } -#define VIRTUAL_ACCESSOR(Idclass, Class, accessor)\ +#define VIRTUAL_ACCESSOR(Class)\ Class*\ -Idclass::accessor () {\ - accessed_b_ = true;\ - return (Class*)data_p_->clone();\ +Class ## _identifier::access_content_ ## Class (bool copy_b) const{\ + ((Class ## _identifier*)this)->accessed_b_ = true;\ + return copy_b ? dynamic_cast (data_p_->clone()) : data_p_;\ +} + +#define IMPLEMENT_ID_CLASS(Class) \ + Class ## _identifier::~Class ## _identifier() { delete data_p_; }\ + Class ## _identifier::Class ## _identifier (Class*st, int code) \ + :Identifier (code)\ + {\ + data_p_ = st;\ + }\ +Class ## _identifier::Class ## _identifier (Class ## _identifier const &s) \ + : Identifier (s)\ +{\ + data_p_ = s.access_content_ ## Class (true);\ +} + + +IMPLEMENT_ID_CLASS(Score); +IMPLEMENT_ID_CLASS(Music_output_def); +VIRTUAL_ACCESSOR(Music_output_def); +DEFAULT_ACCESSOR(Score); + + +int +Identifier::print_smob (SCM s, SCM p, scm_print_state*) +{ + return 1; } -#define IMPLEMENT_ID_CLASS(Idclass, Class, accessor) \ - IMPLEMENT_IS_TYPE_B1(Idclass,Identifier)\ - Idclass::~Idclass() { delete data_p_; }\ - Idclass::Idclass (Class*st, int code):Identifier (code) { data_p_ = st; }\ - - -IMPLEMENT_ID_CLASS(Input_translator_id, Input_translator, input_translator); -IMPLEMENT_ID_CLASS(Int_id, int, intid); -IMPLEMENT_ID_CLASS(Real_id, Real, real); -IMPLEMENT_ID_CLASS(Script_id, General_script_def, script); -IMPLEMENT_ID_CLASS(Lookup_id, Lookup, lookup); -IMPLEMENT_ID_CLASS(Symtables_id, Symtables, symtables); -IMPLEMENT_ID_CLASS(Music_id, Music, music); -IMPLEMENT_ID_CLASS(Score_id, Score, score); -IMPLEMENT_ID_CLASS(Request_id, Request, request); -IMPLEMENT_ID_CLASS(Midi_def_id, Midi_def, mididef); -IMPLEMENT_ID_CLASS(Paper_def_id, Paper_def, paperdef); - -Identifier::Identifier (Identifier const&) +SCM +Identifier::mark_smob (SCM s) { - assert (false); + return SCM_EOL; } -DEFAULT_ACCESSOR(Input_translator_id,Input_translator, input_translator); -DEFAULT_ACCESSOR(Int_id, int, intid); -DEFAULT_ACCESSOR(Real_id, Real, real); -VIRTUAL_ACCESSOR(Script_id, General_script_def, script); -DEFAULT_ACCESSOR(Lookup_id, Lookup, lookup); -DEFAULT_ACCESSOR(Symtables_id, Symtables, symtables); -VIRTUAL_ACCESSOR(Music_id, Music, music); -DEFAULT_ACCESSOR(Score_id, Score, score); -VIRTUAL_ACCESSOR(Request_id, Request, request); -DEFAULT_ACCESSOR(Midi_def_id, Midi_def, mididef); -DEFAULT_ACCESSOR(Paper_def_id, Paper_def, paperdef); + +