X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fidentifier.cc;h=8419dd36073386b9d0bc300d31c7f11bf32a0ab0;hb=194ef0e7e19c7a7c0836b6bd3ed2788a56220d2f;hp=9829e40a42101ec67d3ab8fd1bdd10ab62631311;hpb=04f01c7e890bd4f1b358378e5911fb7c117c3802;p=lilypond.git diff --git a/lily/identifier.cc b/lily/identifier.cc index 9829e40a42..8419dd3607 100644 --- a/lily/identifier.cc +++ b/lily/identifier.cc @@ -3,107 +3,186 @@ source file of the GNU LilyPond music typesetter - (c) 1997 Han-Wen Nienhuys + (c) 1997--1999 Han-Wen Nienhuys */ #include - +#include "midi-def.hh" +#include "paper-def.hh" +#include "score.hh" #include "identifier.hh" #include "my-lily-lexer.hh" #include "debug.hh" -#include "input-register.hh" -#include "input-score.hh" -#include "symtable.hh" -#include "input-staff.hh" -#include "input-music.hh" -#include "lookup.hh" -#include "script-def.hh" #include "request.hh" -#include "input-register.hh" +#include "translator.hh" +#include "notename-table.hh" + + + +Identifier::Identifier (int code) +{ + token_code_i_ = code; + accessed_b_ = 0; + init_b_ = 0; +} + + + +Identifier::Identifier (Identifier const&s) + : Input (s) +{ + token_code_i_ = s.token_code_i_; + accessed_b_ = s.accessed_b_; + init_b_ = s.init_b_; +} Identifier::~Identifier() { - if (!accessed_b_ && !init_b_) - warning("Variable not used"); } + void -Identifier::error(String expect) +Identifier::error (String expect) const { - String e("Wrong identifier type: "); - e += String(classname()) + "(expected " + expect + ")"; - ::error(e); + String e (_("Wrong identifier type: ")); + e += _f ("%s expected", expect); + ::error (e); } -Identifier::Identifier(String n, int code) - : name_str_(n) +String +Identifier::str () const { - token_code_i_ = code; - data = 0; - accessed_b_ = 0; - init_b_ = 0; + return do_str (); } +String +Identifier::do_str () const +{ + return ""; +} + +void +Identifier::print () const +{ + DOUT << "identifier "; + do_print (); +} void -Identifier::print()const +Identifier::do_print () const { - mtor << "identifier \'" << name_str_ << "\'="; - do_print(); } /* ugh. */ -#define DEFAULT_PRINT(Class, Content_type, accessor) \ +#define DEFAULT_PRINT(Class) \ void \ -Class::do_print() const { \ - ((Class*)this)->accessor(false)->print(); \ -} \ -class Class - -DEFAULT_PRINT(Script_id, Script_def, script); -DEFAULT_PRINT(Lookup_id, Lookup, lookup); -DEFAULT_PRINT(Symtables_id, Symtables, symtables); -DEFAULT_PRINT(Staff_id, Input_staff, staff); -DEFAULT_PRINT(M_chord_id, Music_general_chord, mchord); -DEFAULT_PRINT(M_voice_id, Music_voice, mvoice); -DEFAULT_PRINT(Request_id, Request, request); -DEFAULT_PRINT(Score_id, Input_score, score); -DEFAULT_PRINT(Input_regs_id, Input_register, iregs); +Class ## _identifier::do_print () const { \ + Class *cl = ((Class ## _identifier *)this)->access_content_ ## Class(false);\ + cl->print (); \ +} -void -Real_id::do_print() const -{ - Identifier::print(); - mtor << *((Real_id*)this)->real(false)<< "\n"; + + +DEFAULT_PRINT(Translator); +DEFAULT_PRINT(Music); +DEFAULT_PRINT(Request); +DEFAULT_PRINT(Score); +DEFAULT_PRINT(Midi_def); +DEFAULT_PRINT(Paper_def); + +/* ugh. */ +#define DUMMY_STR(Class) \ +String \ +Class ## _identifier::do_str () const { \ + return String (#Class); \ } -#define implement_id_class(Idclass, Class, accessor) \ -char const * Idclass::classname() const\ + +DUMMY_STR(Notename_table); +DUMMY_STR(Translator); +DUMMY_STR(Music); +DUMMY_STR(Request); +DUMMY_STR(Score); +DUMMY_STR(Midi_def); +DUMMY_STR(Paper_def); +DUMMY_STR(Duration); + +#define STRING_PRINT(Class) \ +void \ +Class ## _identifier::do_print () const\ {\ - return #Class;\ + DOUT << do_str () << '\n';\ }\ + + +STRING_PRINT(Duration); +STRING_PRINT(Real); +STRING_PRINT(int); +STRING_PRINT(String); +STRING_PRINT(Notename_table); + +#define DEFAULT_STR(Class) \ +String \ +Class ## _identifier::do_str () const\ +{\ + return to_str (*data_p_);\ +} + +DEFAULT_STR(int); +DEFAULT_STR(Real); +DEFAULT_STR(String); + + +/* + fucking C++ blows me. + */ + +#define DEFAULT_ACCESSOR(Class)\ Class*\ -Idclass::accessor(bool copy) {\ - if (copy){ \ - accessed_b_ = true;\ - return new Class(* (Class*) data);\ - }else\ - return (Class*) data;\ - }\ -Idclass::~Idclass() { delete accessor(false); }\ -Idclass::Idclass(String s, Class*st, int code):Identifier(s,code) { data = st; }\ - - -implement_id_class(Real_id, Real, real); -implement_id_class(Script_id, Script_def, script); -implement_id_class(Lookup_id, Lookup, lookup); -implement_id_class(Symtables_id, Symtables, symtables); -implement_id_class(Staff_id, Input_staff, staff); -implement_id_class(M_chord_id, Music_general_chord, mchord); -implement_id_class(M_voice_id, Music_voice, mvoice); -implement_id_class(Score_id, Input_score, score); -implement_id_class(Request_id, Request, request); -implement_id_class(Input_regs_id, Input_register, iregs); - -Identifier::Identifier(Identifier const&) -{ - assert(false); +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(Class)\ +Class*\ +Class ## _identifier::access_content_ ## Class (bool copy_b) const{\ + ((Class ## _identifier*)this)->accessed_b_ = true;\ + return copy_b ? (Class*)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(Duration); +IMPLEMENT_ID_CLASS(Translator); +IMPLEMENT_ID_CLASS(int); +IMPLEMENT_ID_CLASS(Real); +IMPLEMENT_ID_CLASS(String); +IMPLEMENT_ID_CLASS(Music); +IMPLEMENT_ID_CLASS(Score); +IMPLEMENT_ID_CLASS(Request); +IMPLEMENT_ID_CLASS(Midi_def); +IMPLEMENT_ID_CLASS(Paper_def); +IMPLEMENT_ID_CLASS(Notename_table); +VIRTUAL_ACCESSOR(Music); +VIRTUAL_ACCESSOR(Request); +VIRTUAL_ACCESSOR(Translator); +DEFAULT_ACCESSOR(Notename_table); +DEFAULT_ACCESSOR(Duration); +DEFAULT_ACCESSOR(int); +DEFAULT_ACCESSOR(Real); +DEFAULT_ACCESSOR(String); +DEFAULT_ACCESSOR(Score); +DEFAULT_ACCESSOR(Midi_def); +DEFAULT_ACCESSOR(Paper_def); +