X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftrans.C;h=3230fabf1874e2be0f8cf9103d3e9efcbd39360c;hb=b59621bc59584fb3496459a2be79acfc8476a9a1;hp=62fe8d1b2a69d170641704e69b34b62796e02e3c;hpb=1cebcbea9904d51a8e3122c23e17d0d047292394;p=lyx.git diff --git a/src/trans.C b/src/trans.C index 62fe8d1b2a..3230fabf18 100644 --- a/src/trans.C +++ b/src/trans.C @@ -1,44 +1,34 @@ -#include +/** + * \file trans.C + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author Lars Gullik Bjønnes + * \author Matthias Ettrich + * + * Full author contact details are available in file CREDITS. + */ -#ifdef __GNUG__ -#pragma implementation "trans.h" -#endif +#include -#include "LyXView.h" #include "trans.h" #include "support/filetools.h" -#include "tex-strings.h" +#include "support/lstrings.h" #include "lyxlex.h" #include "debug.h" #include "trans_mgr.h" +using lyx::support::contains; +using lyx::support::LibFileSearch; -// KmodInfo -KmodInfo::KmodInfo() -{ - exception_list = 0; -} - - -// Default Trans -bool DefaultTrans::init_ = false; +using std::endl; +using std::string; +using std::map; -DefaultTrans::DefaultTrans() -{ - if (init_ == false) { - // Do initialization - init_ = true; - } -} - - -string DefaultTrans::process(char c, TransManager & k) +// KmodInfo +KmodInfo::KmodInfo() { - char dummy[2] = "?"; - dummy[0] = c; - - return k.normalkey(c, dummy); } @@ -46,13 +36,6 @@ string DefaultTrans::process(char c, TransManager & k) Trans::Trans() { - int i; - - for(i = 0; i < 256; ++i) - keymap_[i] = 0; - - for(i = 0; i < TEX_MAX_ACCENT + 1; ++i) - kmod_list_[i] = 0; } @@ -62,67 +45,46 @@ Trans::~Trans() } -void Trans::InsertException(Trans::keyexc & exclist, char c, +void Trans::InsertException(KmodException & exclist, char c, string const & data, bool flag, tex_accent accent) { - keyexc p; - - p = new Keyexc; - p->next = exclist; - p->c = c; - - p->data = data; - p->combined = flag; - p->accent = accent; - - exclist = p; + Keyexc p; + p.c = c; + p.data = data; + p.combined = flag; + p.accent = accent; + exclist.insert(exclist.begin(), p); + // or just + // exclist.push_back(p); } -void Trans::FreeException(Trans::keyexc & exclist) +void Trans::FreeException(KmodException & exclist) { - Trans::keyexc p; - - p = exclist; - while (p) { - p = exclist->next; - delete exclist; - exclist = p; - } + exclist.clear(); } void Trans::FreeKeymap() { - int i; - - for(i = 0; i < 256; ++i) - if (keymap_[i]) { - delete keymap_[i]; - keymap_[i] = 0; - } - for(i = 0; i < TEX_MAX_ACCENT + 1; ++i) - if (kmod_list_[i]) { - FreeException(kmod_list_[i]->exception_list); - delete kmod_list_[i]; - kmod_list_[i] = 0; - } + kmod_list_.clear(); + keymap_.clear(); } -bool Trans::IsDefined() +bool Trans::IsDefined() const { return !name_.empty(); } -string const & Trans::GetName() +string const & Trans::GetName() const { return name_; } -enum _kmaptags { +enum kmaptags_ { KCOMB = 1, KMOD, KMAP, @@ -131,7 +93,7 @@ enum _kmaptags { }; -struct keyword_item kmapTags[K_LAST-1] = { +struct keyword_item kmapTags[K_LAST - 1] = { {"\\kcomb", KCOMB }, { "\\kmap", KMAP }, { "\\kmod", KMOD }, @@ -142,30 +104,19 @@ struct keyword_item kmapTags[K_LAST-1] = { tex_accent getkeymod(string const &); -void Trans::AddDeadkey(tex_accent accent, string const & keys, - string const & allowed) +void Trans::AddDeadkey(tex_accent accent, string const & keys) { - if (kmod_list_[accent]) { - FreeException(kmod_list_[accent]->exception_list); - - delete kmod_list_[accent]; - } - - kmod_list_[accent] = new kmod_list_decl; - kmod_list_[accent]->data = keys; - kmod_list_[accent]->accent = accent; - if (allowed == "all") { - kmod_list_[accent]->allowed= lyx_accent_table[accent].native; - } else { - kmod_list_[accent]->allowed = allowed; + KmodInfo tmp; + tmp.data = keys; + tmp.accent = accent; + kmod_list_[accent] = tmp; + + for (string::size_type i = 0; i < keys.length(); ++i) { + string tmp; + tmp += char(0); + tmp += char(accent); + keymap_[keys[i]] = tmp; } - - for(string::size_type i = 0; i < keys.length(); ++i) { - char * temp; - temp = keymap_[static_cast(keys[i])] = new char[2]; - temp[0] = 0; temp[1] = accent; - } - kmod_list_[accent]->exception_list = 0; } @@ -173,60 +124,66 @@ int Trans::Load(LyXLex & lex) { bool error = false; - while (lex.IsOK() && !error) { - switch(lex.lex()) { + while (lex.isOK() && !error) { + switch (lex.lex()) { case KMOD: { if (lyxerr.debugging(Debug::KBMAP)) - lyxerr << "KMOD:\t" << lex.text() << endl; + lyxerr << "KMOD:\t" << lex.getString() << endl; if (lex.next(true)) { if (lyxerr.debugging(Debug::KBMAP)) - lyxerr << "key\t`" << lex.text() - << "'" << endl; + lyxerr << "key\t`" << lex.getString() + << '\'' << endl; } else return -1; - - string keys = lex.GetString(); + + string const keys = lex.getString(); if (lex.next(true)) { - if ( lyxerr.debugging(Debug::KBMAP)) - lyxerr << "accent\t`" << lex.text() - << "'" << endl; + if (lyxerr.debugging(Debug::KBMAP)) + lyxerr << "accent\t`" << lex.getString() + << '\'' << endl; } else return -1; - tex_accent accent = getkeymod(lex.GetString()); + tex_accent accent = getkeymod(lex.getString()); if (accent == TEX_NOACCENT) return -1; +#if 1 +//#warning This code should be removed... + // But we need to fix up all the kmap files first + // so that this field is not present anymore. if (lex.next(true)) { if (lyxerr.debugging(Debug::KBMAP)) - lyxerr << "allowed\t`" << lex.text() - << "'" << endl; + lyxerr << "allowed\t`" << lex.getString() + << '\'' << endl; } else return -1; - string allowed = lex.GetString(); - - AddDeadkey(accent, keys, allowed); + /* string const allowed = lex.getString(); */ + AddDeadkey(accent, keys /*, allowed*/); +#else + AddDeadkey(accent, keys); +#endif break; - } + } case KCOMB: { - char const * str; + string str; lyxerr[Debug::KBMAP] << "KCOMB:" << endl; if (lex.next(true)) { - str= lex.text(); + str = lex.getString(); lyxerr[Debug::KBMAP] << str << endl; } else return -1; - - tex_accent accent_1= getkeymod(str); + + tex_accent accent_1 = getkeymod(str); if (accent_1 == TEX_NOACCENT) return -1; if (lex.next(true)) { - str= lex.text(); + str = lex.getString(); lyxerr[Debug::KBMAP] << str << endl; } else return -1; @@ -234,49 +191,57 @@ int Trans::Load(LyXLex & lex) tex_accent accent_2= getkeymod(str); if (accent_2 == TEX_NOACCENT) return -1; - if (kmod_list_[accent_1] == 0 || kmod_list_[accent_2] == 0) + map::iterator it1 = + kmod_list_.find(accent_1); + map::iterator it2 = + kmod_list_.find(accent_2); + if (it1 == kmod_list_.end() + || it2 == kmod_list_.end()) { return -1; + } - // Find what key accent_2 is on - should check about accent_1 also - int key; - - for(key = 0; key < 256; ++key) { - if (keymap_[key] && keymap_[key][0] == 0 - && keymap_[key][1] == accent_2) + // Find what key accent_2 is on - should + // check about accent_1 also + map::iterator it = keymap_.begin(); + map::iterator end = keymap_.end(); + for (; it != end; ++it) { + if (!it->second.empty() + && it->second[0] == 0 + && it->second[1] == accent_2) break; } string allowed; - if (lex.next()) { - allowed = lex.GetString(); + allowed = lex.getString(); lyxerr[Debug::KBMAP] << "allowed: " << allowed << endl; - } else + } else { return -1; + } - InsertException(kmod_list_[accent_1]->exception_list,(char)key, allowed, true, accent_2); + InsertException(kmod_list_[accent_1].exception_list, + static_cast(it->first), allowed, + true, accent_2); } break; case KMAP: { unsigned char key_from; - char * string_to; if (lyxerr.debugging(Debug::KBMAP)) - lyxerr << "KMAP:\t" << lex.text() << endl; + lyxerr << "KMAP:\t" << lex.getString() << endl; if (lex.next(true)) { - key_from= lex.text()[0]; + key_from = lex.getString()[0]; if (lyxerr.debugging(Debug::KBMAP)) - lyxerr << "\t`" << lex.text() << "'" + lyxerr << "\t`" << lex.getString() << '\'' << endl; } else return -1; if (lex.next(true)) { - char const * t = lex.text(); - string_to = strcpy(new char[strlen(t)+1], t); + string const string_to = lex.getString(); keymap_[key_from] = string_to; if (lyxerr.debugging(Debug::KBMAP)) - lyxerr << "\t`" << string_to << "'" + lyxerr << "\t`" << string_to << '\'' << endl; } else return -1; @@ -286,35 +251,36 @@ int Trans::Load(LyXLex & lex) case KXMOD: { tex_accent accent; char key; - char const * str; + string str; if (lyxerr.debugging(Debug::KBMAP)) - lyxerr << "KXMOD:\t" << lex.text() << endl; + lyxerr << "KXMOD:\t" << lex.getString() << endl; if (lex.next(true)) { if (lyxerr.debugging(Debug::KBMAP)) - lyxerr << "\t`" << lex.text() << "'" + lyxerr << "\t`" << lex.getString() << '\'' << endl; - accent = getkeymod(lex.GetString()); + accent = getkeymod(lex.getString()); } else return -1; if (lex.next(true)) { if (lyxerr.debugging(Debug::KBMAP)) - lyxerr << "\t`" << lex.text() << "'" + lyxerr << "\t`" << lex.getString() << '\'' << endl; - key = lex.text()[0]; + key = lex.getString()[0]; } else return -1; if (lex.next(true)) { if (lyxerr.debugging(Debug::KBMAP)) - lyxerr << "\t`" << lex.text() << "'" + lyxerr << "\t`" << lex.getString() << '\'' << endl; - str = lex.text(); + str = lex.getString(); } else return -1; - InsertException(kmod_list_[accent]->exception_list, key, str); + InsertException(kmod_list_[accent].exception_list, + key, str); break; } case LyXLex::LEX_FEOF: @@ -330,46 +296,49 @@ int Trans::Load(LyXLex & lex) } -bool Trans::isAccentDefined(tex_accent accent, KmodInfo & i) +bool Trans::isAccentDefined(tex_accent accent, KmodInfo & i) const { - if (kmod_list_[accent]!= 0) { - i = *kmod_list_[accent]; + map::const_iterator cit = kmod_list_.find(accent); + if (cit != kmod_list_.end()) { + i = cit->second; return true; } return false; } -string Trans::process(char c, TransManager & k) +string const Trans::process(char c, TransManager & k) { - char dummy[2] = "?"; - char * dt = dummy; - char * t = Match(c); - - if ((t == 0 && (*dt = c)) || (t[0] != 0 && (dt = t)) ){ - return k.normalkey(c, dt); + string const t = Match(static_cast(c)); + + if (t.empty() && c != 0) { + return k.normalkey(c); + } else if (!t.empty() && t[0] != char(0)) { + //return k.normalkey(c); + return t; } else { - return k.deadkey(c, *kmod_list_[(tex_accent)t[1]]); + return k.deadkey(c, + kmod_list_[static_cast(t[1])]); } } int Trans::Load(string const & language) { - string filename = LibFileSearch("kbd", language, "kmap"); + string const filename = LibFileSearch("kbd", language, "kmap"); if (filename.empty()) return -1; FreeKeymap(); - LyXLex lex(kmapTags, K_LAST-1); + LyXLex lex(kmapTags, K_LAST - 1); lex.setFile(filename); - - int res = Load(lex); + + int const res = Load(lex); if (res == 0) { name_ = language; } else - name_.clear(); + name_.erase(); return res; } @@ -383,11 +352,12 @@ tex_accent getkeymod(string const & p) lyxerr << "p = " << p << ", lyx_accent_table[" << i << "].name = `" << lyx_accent_table[i].name - << "'" << endl; - - if ( lyx_accent_table[i].name && contains(p, lyx_accent_table[i].name)) { + << '\'' << endl; + + if (lyx_accent_table[i].name + && contains(p, lyx_accent_table[i].name)) { lyxerr[Debug::KBMAP] << "Found it!" << endl; - return (tex_accent)i; + return static_cast(i); } } return TEX_NOACCENT;