X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftrans.C;h=6f1e3809f7461ba87cb56d4360c1eef60c64f004;hb=c93e9dcbc59d0b404561dbc7c373716f11fc13f1;hp=f543bbd2e6d434939187c1a3a9bfaf75b85117fd;hpb=6130fe1aa5c07d0204205bcf5dd1f86b8449fb16;p=lyx.git diff --git a/src/trans.C b/src/trans.C index f543bbd2e6..6f1e3809f7 100644 --- a/src/trans.C +++ b/src/trans.C @@ -1,25 +1,31 @@ #include #ifdef __GNUG__ -#pragma implementation "trans.h" +#pragma implementation #endif #include "LyXView.h" #include "trans.h" #include "support/filetools.h" +#include "support/lstrings.h" #include "tex-strings.h" #include "lyxlex.h" #include "debug.h" #include "trans_mgr.h" +using std::endl; + // KmodInfo KmodInfo::KmodInfo() { +#if 0 exception_list = 0; +#endif } +#if 0 // Default Trans bool DefaultTrans::init_ = false; @@ -33,26 +39,30 @@ DefaultTrans::DefaultTrans() } -string DefaultTrans::process(char c, TransManager & k) +#if 0 +string const DefaultTrans::process(char c, TransManager & k) { char dummy[2] = "?"; dummy[0] = c; return k.normalkey(c, dummy); } - +#else +string const DefaultTrans::process(char c, TransManager & k) +{ + return k.normalkey(c); +} +#endif +#endif // Trans class Trans::Trans() { - int i; - - for(i = 0; i < 256; ++i) - keymap_[i] = 0; - - for(i = 0; i < TEX_MAX_ACCENT + 1; ++i) +#if 0 + for (int i = 0; i < TEX_MAX_ACCENT + 1; ++i) kmod_list_[i] = 0; +#endif } @@ -62,12 +72,11 @@ 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; +#if 0 + keyexc p = new Keyexc; p->next = exclist; p->c = c; @@ -76,53 +85,67 @@ void Trans::InsertException(Trans::keyexc & exclist, char c, p->accent = accent; exclist = p; +#else + 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); +#endif } -void Trans::FreeException(Trans::keyexc & exclist) +void Trans::FreeException(KmodException & exclist) { - Trans::keyexc p; - - p = exclist; +#if 0 + Trans::keyexc p = exclist; while (p) { p = exclist->next; delete exclist; exclist = p; } +#else + exclist.clear(); +#endif } void Trans::FreeKeymap() { - int i; - - for(i = 0; i < 256; ++i) - if (keymap_[i]) { - delete keymap_[i]; - keymap_[i] = 0; +#if 0 + for (int i = 0; i < 256; ++i) + if (!keymap_[i].empty()) { + keymap_[i].erase(); } - for(i = 0; i < TEX_MAX_ACCENT + 1; ++i) + for (int 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; } +#else + kmod_list_.clear(); + keymap_.clear(); +#endif } -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 +154,7 @@ enum _kmaptags { }; -struct keyword_item kmapTags[K_LAST-1] = { +struct keyword_item kmapTags[K_LAST - 1] = { {"\\kcomb", KCOMB }, { "\\kmap", KMAP }, { "\\kmod", KMOD }, @@ -142,40 +165,68 @@ struct keyword_item kmapTags[K_LAST-1] = { tex_accent getkeymod(string const &); +#if 0 void Trans::AddDeadkey(tex_accent accent, string const & keys, string const & allowed) +#else +void Trans::AddDeadkey(tex_accent accent, string const & keys) +#endif { +#if 0 if (kmod_list_[accent]) { FreeException(kmod_list_[accent]->exception_list); delete kmod_list_[accent]; } - kmod_list_[accent] = new kmod_list_decl; + kmod_list_[accent] = new KmodInfo; kmod_list_[accent]->data = keys; kmod_list_[accent]->accent = accent; - if (allowed == "all") { +#else + KmodInfo tmp; + tmp.data = keys; + tmp.accent = accent; + kmod_list_[accent] = tmp; +#endif +#if 0 + if (allowed == "native") { kmod_list_[accent]->allowed= lyx_accent_table[accent].native; - } else { + } else { kmod_list_[accent]->allowed = allowed; } - - for(string::size_type i = 0; i < keys.length(); ++i) { - char * temp = - keymap_[static_cast(keys[i])] = - new char[2]; - temp[0] = 0; temp[1] = accent; + + for (string::size_type i = 0; i < keys.length(); ++i) { + string & temp = + keymap_[static_cast(keys[i])]; + if (!temp.empty()) + temp.erase(); + + // But the question remains: "Should we be allowed + // to change bindings, without unbinding first?" + // Lgb + temp += char(0); + temp += char(accent); } +#else + for (string::size_type i = 0; i < keys.length(); ++i) { + string tmp; + tmp += char(0); + tmp += char(accent); + keymap_[keys[i]] = tmp; + } +#endif +#if 0 kmod_list_[accent]->exception_list = 0; +#endif } -int Trans::Load(LyXLex & lex) +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)) @@ -187,20 +238,24 @@ int Trans::Load(LyXLex & lex) } else return -1; - string keys = lex.GetString(); + string const keys = lex.getString(); if (lex.next(true)) { - if ( lyxerr.debugging(Debug::KBMAP)) + if (lyxerr.debugging(Debug::KBMAP)) lyxerr << "accent\t`" << lex.text() << "'" << 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() @@ -208,13 +263,15 @@ int Trans::Load(LyXLex & lex) } 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)) { @@ -235,14 +292,28 @@ 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) +#if 0 + if (kmod_list_[accent_1] == 0 + || kmod_list_[accent_2] == 0) + return -1; +#else + std::map::iterator it1 = + kmod_list_.find(accent_1); + std::map::iterator it2 = + kmod_list_.find(accent_2); + if (it1 == kmod_list_.end() + || it2 == kmod_list_.end()) { return -1; + } +#endif // Find what key accent_2 is on - should // check about accent_1 also +#if 0 int key = 0; - for(; key < 256; ++key) { - if (keymap_[key] && keymap_[key][0] == 0 + for (; key < 256; ++key) { + if (!keymap_[key].empty() + && keymap_[key][0] == 0 && keymap_[key][1] == accent_2) break; } @@ -255,19 +326,40 @@ int Trans::Load(LyXLex & lex) } else return -1; - InsertException(kmod_list_[accent_1]->exception_list, + InsertException(kmod_list_[accent_1].exception_list, static_cast(key), allowed, true, accent_2); +#else + std::map::iterator it = keymap_.begin(); + std::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(); + lyxerr[Debug::KBMAP] << "allowed: " + << allowed << endl; + } else { + return -1; + } + + InsertException(kmod_list_[accent_1].exception_list, + static_cast(it->first), allowed, + true, accent_2); +#endif } break; case KMAP: { unsigned char key_from; - char * string_to; if (lyxerr.debugging(Debug::KBMAP)) lyxerr << "KMAP:\t" << lex.text() << endl; if (lex.next(true)) { - key_from= lex.text()[0]; + key_from = lex.text()[0]; if (lyxerr.debugging(Debug::KBMAP)) lyxerr << "\t`" << lex.text() << "'" << endl; @@ -275,8 +367,7 @@ int Trans::Load(LyXLex & lex) return -1; if (lex.next(true)) { - char const * t = lex.text(); - string_to = strcpy(new char[strlen(t)+1], t); + string string_to = lex.text(); keymap_[key_from] = string_to; if (lyxerr.debugging(Debug::KBMAP)) lyxerr << "\t`" << string_to << "'" @@ -289,7 +380,7 @@ 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; @@ -297,7 +388,7 @@ int Trans::Load(LyXLex & lex) if (lyxerr.debugging(Debug::KBMAP)) lyxerr << "\t`" << lex.text() << "'" << endl; - accent = getkeymod(lex.GetString()); + accent = getkeymod(lex.getString()); } else return -1; @@ -317,7 +408,8 @@ int Trans::Load(LyXLex & lex) } else return -1; - InsertException(kmod_list_[accent]->exception_list, key, str); + InsertException(kmod_list_[accent].exception_list, + key, str); break; } case LyXLex::LEX_FEOF: @@ -333,33 +425,68 @@ 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) { +#if 0 + if (kmod_list_[accent] != 0) { i = *kmod_list_[accent]; return true; } return false; +#else + std::map::const_iterator cit = kmod_list_.find(accent); + if (cit != kmod_list_.end()) { + i = cit->second; + return true; + } + return false; +#endif } -string Trans::process(char c, TransManager & k) +#if 0 +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)) ){ + string dt("?"); + string const t = Match(static_cast(c)); + + if (t.empty() && c != 0) { + dt[0] = c; + return k.normalkey(c, dt); + } else if (!t.empty() && t[0] != char(0)) { + dt = t; return k.normalkey(c, dt); } else { - return k.deadkey(c, *kmod_list_[static_cast(t[1])]); + return k.deadkey(c, + *kmod_list_[static_cast(t[1])]); } } +#else +string const Trans::process(char c, TransManager & k) +{ + 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 { +#if 0 + return k.deadkey(c, + *kmod_list_[static_cast(t[1])]); +#else + return k.deadkey(c, + kmod_list_[static_cast(t[1])]); +#endif + } +} +#endif int Trans::Load(string const & language) { - string filename = LibFileSearch("kbd", language, "kmap"); + string const filename = LibFileSearch("kbd", language, "kmap"); if (filename.empty()) return -1; @@ -367,12 +494,12 @@ int Trans::Load(string const & language) 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; } @@ -388,7 +515,8 @@ tex_accent getkeymod(string const & p) << "].name = `" << lyx_accent_table[i].name << "'" << endl; - if ( lyx_accent_table[i].name && contains(p, lyx_accent_table[i].name)) { + if (lyx_accent_table[i].name + && contains(p, lyx_accent_table[i].name)) { lyxerr[Debug::KBMAP] << "Found it!" << endl; return static_cast(i); }