X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftrans.C;h=4e2d45c20a7e5355057fe5d54436aab07ce8ea47;hb=664eb7ff45dbb4fabc22ec0b56798031a82335b1;hp=b738b63e9e39dad2809cc992fc3f618a5f76a2f3;hpb=e8db0ccc46566f36a1711e35c3758a2e785021f1;p=lyx.git diff --git a/src/trans.C b/src/trans.C index b738b63e9e..4e2d45c20a 100644 --- a/src/trans.C +++ b/src/trans.C @@ -12,6 +12,8 @@ #include "debug.h" #include "trans_mgr.h" +using std::endl; + // KmodInfo KmodInfo::KmodInfo() @@ -33,7 +35,7 @@ DefaultTrans::DefaultTrans() } -string DefaultTrans::process(char c, TransManager & k) +string const DefaultTrans::process(char c, TransManager & k) { char dummy[2] = "?"; dummy[0] = c; @@ -46,12 +48,7 @@ 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) + for (int i = 0; i < TEX_MAX_ACCENT + 1; ++i) kmod_list_[i] = 0; } @@ -65,9 +62,7 @@ Trans::~Trans() void Trans::InsertException(Trans::keyexc & exclist, char c, string const & data, bool flag, tex_accent accent) { - keyexc p; - - p = new Keyexc; + keyexc p = new Keyexc; p->next = exclist; p->c = c; @@ -81,9 +76,7 @@ void Trans::InsertException(Trans::keyexc & exclist, char c, void Trans::FreeException(Trans::keyexc & exclist) { - Trans::keyexc p; - - p = exclist; + Trans::keyexc p = exclist; while (p) { p = exclist->next; delete exclist; @@ -94,14 +87,11 @@ void Trans::FreeException(Trans::keyexc & exclist) void Trans::FreeKeymap() { - int i; - - for(i = 0; i < 256; ++i) - if (keymap_[i]) { - delete keymap_[i]; - keymap_[i] = 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]; @@ -110,19 +100,19 @@ void Trans::FreeKeymap() } -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 +121,7 @@ enum _kmaptags { }; -struct keyword_item kmapTags[K_LAST-1] = { +struct keyword_item kmapTags[K_LAST - 1] = { {"\\kcomb", KCOMB }, { "\\kmap", KMAP }, { "\\kmod", KMOD }, @@ -154,17 +144,23 @@ void Trans::AddDeadkey(tex_accent accent, string const & keys, kmod_list_[accent] = new kmod_list_decl; kmod_list_[accent]->data = keys; kmod_list_[accent]->accent = accent; - if (allowed == "all") { + if (allowed == "native") { kmod_list_[accent]->allowed= lyx_accent_table[accent].native; } 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); } kmod_list_[accent]->exception_list = 0; } @@ -175,7 +171,7 @@ int Trans::Load(LyXLex & lex) bool error = false; while (lex.IsOK() && !error) { - switch(lex.lex()) { + switch (lex.lex()) { case KMOD: { if (lyxerr.debugging(Debug::KBMAP)) @@ -190,7 +186,7 @@ int Trans::Load(LyXLex & lex) string keys = lex.GetString(); if (lex.next(true)) { - if ( lyxerr.debugging(Debug::KBMAP)) + if (lyxerr.debugging(Debug::KBMAP)) lyxerr << "accent\t`" << lex.text() << "'" << endl; } else @@ -214,7 +210,7 @@ int Trans::Load(LyXLex & lex) break; } case KCOMB: { - char const * str; + string str; lyxerr[Debug::KBMAP] << "KCOMB:" << endl; if (lex.next(true)) { @@ -235,14 +231,16 @@ 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 (kmod_list_[accent_1] == 0 + || kmod_list_[accent_2] == 0) return -1; // Find what key accent_2 is on - should // check about accent_1 also 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; } @@ -262,12 +260,11 @@ int Trans::Load(LyXLex & lex) 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 +272,9 @@ 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(); + //char * string_to = + // strcpy(new char[strlen(t)+1], t); keymap_[key_from] = string_to; if (lyxerr.debugging(Debug::KBMAP)) lyxerr << "\t`" << string_to << "'" @@ -289,7 +287,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; @@ -317,7 +315,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,9 +332,9 @@ 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 (kmod_list_[accent] != 0) { i = *kmod_list_[accent]; return true; } @@ -343,23 +342,28 @@ bool Trans::isAccentDefined(tex_accent accent, KmodInfo & i) } -string Trans::process(char c, TransManager & k) +string const Trans::process(char c, TransManager & k) { - char dummy[2] = "?"; - char * dt = dummy; - char * t = Match(static_cast(c)); - - if ((t == 0 && (*dt = c)) || (t[0] != 0 && (dt = t)) ){ + string dummy("?"); + string dt = dummy; + 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])]); } } 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 +371,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 +392,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); }