X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fspellchecker.C;h=609aa93502e7406cf83ca63ca8df60e15f60a9ec;hb=c90c5e6386ce69c34c99b3594d6fa452e6a13161;hp=3a36462599f9be0e5f4dd915470833dcaa56f594;hpb=a826cf25b505954920ee6ef72ab0f4b94107fb79;p=lyx.git diff --git a/src/spellchecker.C b/src/spellchecker.C index 3a36462599..609aa93502 100644 --- a/src/spellchecker.C +++ b/src/spellchecker.C @@ -40,7 +40,10 @@ #ifdef HAVE_SYS_SELECT_H # ifdef HAVE_STRINGS_H // is needed at least on AIX because FD_ZERO uses bzero(). -# include + // BUT we cannot include both string.h and strings.h on Irix 6.5 :( +# ifdef _AIX +# include +# endif # endif #include #endif @@ -58,19 +61,19 @@ #include "lyx_gui_misc.h" #include "debug.h" #include "support/lstrings.h" +#include "language.h" #include "encoding.h" - -//#define USE_PSPELL 1 +#include "support/lstrings.h" #ifdef USE_PSPELL - -#include - +# include #endif using std::reverse; using std::endl; +namespace { + // Spellchecker status enum { ISP_OK = 1, @@ -81,19 +84,20 @@ enum { ISP_IGNORE }; -static bool RunSpellChecker(BufferView * bv); +bool RunSpellChecker(BufferView * bv); #ifndef USE_PSPELL -static FILE * in, * out; /* streams to communicate with ispell */ +FILE * in; +FILE * out; /* streams to communicate with ispell */ pid_t isp_pid = -1; // pid for the `ispell' process. Also used (RO) in // lyx_cb.C // the true spell checker program being used enum ActualSpellChecker {ASC_ISPELL, ASC_ASPELL}; -static ActualSpellChecker actual_spell_checker; +ActualSpellChecker actual_spell_checker; -static int isp_fd; +int isp_fd; #else @@ -101,13 +105,15 @@ PspellManager * sc; #endif -static FD_form_spell_options *fd_form_spell_options = 0; +} // namespace anon + + +// Non-static so that it can be redrawn if the xforms colors are re-mapped +FD_form_spell_options *fd_form_spell_options = 0; FD_form_spell_check *fd_form_spell_check = 0; -//void sigchldhandler(int sig); void sigchldhandler(pid_t pid, int *status); -//extern void sigchldchecker(int sig); extern void sigchldchecker(pid_t pid, int *status); #ifndef USE_PSPELL @@ -275,18 +281,19 @@ void SpellCheckerOptions() fl_raise_form(fd_form_spell_options->form_spell_options); } else { fl_show_form(fd_form_spell_options->form_spell_options, - FL_PLACE_MOUSE, FL_FULLBORDER, + FL_PLACE_MOUSE | FL_FREE_SIZE, FL_TRANSIENT, _("Spellchecker Options")); } } +namespace { + #ifndef USE_PSPELL /***** Spellchecker *****/ // Could also use a clean up. (Asger Alstrup) -static void init_spell_checker(BufferParams const & params, string const & lang) { static char o_buf[BUFSIZ]; // jc: it could be smaller @@ -296,7 +303,7 @@ void init_spell_checker(BufferParams const & params, string const & lang) isp_pid = -1; - if(pipe(pipein) == -1 || pipe(pipeout) == -1) { + if (pipe(pipein) == -1 || pipe(pipeout) == -1) { lyxerr << "LyX: Can't create pipe for spellchecker!" << endl; goto END; } @@ -319,13 +326,13 @@ void init_spell_checker(BufferParams const & params, string const & lang) isp_pid = fork(); - if(isp_pid == -1) { + if (isp_pid == -1) { lyxerr << "LyX: Can't create child process for spellchecker!" << endl; goto END; } - if(isp_pid == 0) { + if (isp_pid == 0) { /* child process */ dup2(pipein[0], STDIN_FILENO); dup2(pipeout[1], STDOUT_FILENO); @@ -390,7 +397,7 @@ void init_spell_checker(BufferParams const & params, string const & lang) if (lyxrc.isp_use_input_encoding && params.inputenc != "default") { string enc = (params.inputenc == "auto") - ? params.language_info->encoding()->LatexName() + ? params.language->encoding()->LatexName() : params.inputenc; string::size_type n = enc.length(); tmp = new char[3]; @@ -478,35 +485,34 @@ void init_spell_checker(BufferParams const & params, string const & lang) } } -static + bool sc_still_alive() { return isp_pid != -1; } -static + void sc_clean_up_after_error() { - fclose(out); + ::fclose(out); } + // Send word to ispell and get reply -static -isp_result * sc_check_word(char *word) +isp_result * sc_check_word(string const & word) { //Please rewrite to use string. - isp_result *result; - char buf[1024]; - fputs(word, out); - fputc('\n', out); + ::fputs(word.c_str(), out); + ::fputc('\n', out); - fgets(buf, 1024, in); + char buf[1024]; + ::fgets(buf, 1024, in); /* I think we have to check if ispell is still alive here because the signal-handler could have disabled blocking on the fd */ - if (isp_pid == -1) return 0; + if (!sc_still_alive()) return 0; - result = new isp_result; + isp_result * result = new isp_result; switch (*buf) { case '*': // Word found @@ -546,7 +552,7 @@ isp_result * sc_check_word(char *word) } -static inline +inline void close_spell_checker() { // Note: If you decide to optimize this out when it is not @@ -561,31 +567,32 @@ void close_spell_checker() } -static inline -void sc_insert_word(char const *word) +inline +void sc_insert_word(string const & word) { - fputc('*', out); // Insert word in personal dictionary - fputs(word, out); - fputc('\n', out); + ::fputc('*', out); // Insert word in personal dictionary + ::fputs(word.c_str(), out); + ::fputc('\n', out); } -static inline -void sc_accept_word(char const *word) +inline +void sc_accept_word(string const & word) { - fputc('@', out); // Accept in this session - fputs(word, out); - fputc('\n', out); + ::fputc('@', out); // Accept in this session + ::fputs(word.c_str(), out); + ::fputc('\n', out); } -static inline -void sc_store_replacement(char const *mis, string const & cor) { - if(actual_spell_checker == ASC_ASPELL) { - fputs("$$ra ", out); - fputs(mis, out); - fputc(',', out); - fputs(cor.c_str(), out); - fputc('\n', out); + +inline +void sc_store_replacement(string const & mis, string const & cor) { + if (actual_spell_checker == ASC_ASPELL) { + ::fputs("$$ra ", out); + ::fputs(mis.c_str(), out); + ::fputc(',', out); + ::fputs(cor.c_str(), out); + ::fputc('\n', out); } } @@ -593,10 +600,12 @@ void sc_store_replacement(char const *mis, string const & cor) { PspellCanHaveError * spell_error_object; -static void init_spell_checker(BufferParams const &, string const & lang) { PspellConfig * config = new_pspell_config(); + string code; + split(lang, code, '_'); + config->replace("language-tag", code.c_str()); spell_error_object = new_pspell_manager(config); if (pspell_error_number(spell_error_object) != 0) { spell_error = pspell_error_message(spell_error_object); @@ -607,12 +616,12 @@ void init_spell_checker(BufferParams const &, string const & lang) } } -static + bool sc_still_alive() { return true; } -static + void sc_clean_up_after_error() { delete_pspell_can_have_error(spell_error_object); @@ -620,59 +629,62 @@ void sc_clean_up_after_error() -// Send word to ispell and get reply -static -isp_result * sc_check_word(char *word) +// Send word to pspell and get reply +isp_result * sc_check_word(string const & word) { isp_result * result = new isp_result; - int word_ok = pspell_manager_check(sc, word); - assert(word_ok != -1); +#warning Why isnt word_ok a bool? (Lgb) + int word_ok = pspell_manager_check(sc, word.c_str()); + Assert(word_ok != -1); if (word_ok) { - result->flag = ISP_OK; - } else { - - const PspellWordList * sugs = pspell_manager_suggest(sc, word); - assert(sugs != 0); + PspellWordList const * sugs = + pspell_manager_suggest(sc, word.c_str()); + Assert(sugs != 0); result->els = pspell_word_list_elements(sugs); if (pspell_word_list_empty(sugs)) result->flag = ISP_UNKNOWN; else result->flag = ISP_MISSED; - } return result; } -static inline +inline void close_spell_checker() { pspell_manager_save_all_word_lists(sc); } -static inline -void sc_insert_word(char const *word) + +inline +void sc_insert_word(string const & word) { - pspell_manager_add_to_personal(sc, word); + pspell_manager_add_to_personal(sc, word.c_str()); } -static inline -void sc_accept_word(char const *word) +inline +void sc_accept_word(string const & word) { - pspell_manager_add_to_session(sc, word); + pspell_manager_add_to_session(sc, word.c_str()); } -static inline -void sc_store_replacement(char const *mis, string const & cor) { - pspell_manager_store_replacement(sc, mis, cor.c_str()); + +inline +void sc_store_replacement(string const & mis, string const & cor) +{ + pspell_manager_store_replacement(sc, mis.c_str(), cor.c_str()); } #endif +} // namespace anon + + void ShowSpellChecker(BufferView * bv) { FL_OBJECT * obj; @@ -701,7 +713,7 @@ void ShowSpellChecker(BufferView * bv) fl_raise_form(fd_form_spell_check->form_spell_check); } else { fl_show_form(fd_form_spell_check->form_spell_check, - FL_PLACE_MOUSE, FL_FULLBORDER, + FL_PLACE_MOUSE | FL_FREE_SIZE, FL_TRANSIENT, _("Spellchecker")); } fl_deactivate_object(fd_form_spell_check->slider); @@ -722,12 +734,12 @@ void ShowSpellChecker(BufferView * bv) fl_set_object_lcol(fd_form_spell_check->input, FL_INACTIVE); fl_set_object_lcol(fd_form_spell_check->browser, FL_INACTIVE); - while (true){ + while (true) { obj = fl_do_forms(); - if (obj == fd_form_spell_check->options){ + if (obj == fd_form_spell_check->options) { SpellCheckerOptions(); } - if (obj == fd_form_spell_check->start){ + if (obj == fd_form_spell_check->start) { // activate insert, accept, and stop fl_activate_object(fd_form_spell_check->insert); fl_activate_object(fd_form_spell_check->accept); @@ -788,16 +800,35 @@ void ShowSpellChecker(BufferView * bv) } -// Perform an ispell session -static +// Perform a spell session +namespace { + bool RunSpellChecker(BufferView * bv) { isp_result * result; int newvalue; FL_OBJECT * obj; - string tmp = (lyxrc.isp_use_alt_lang) ? lyxrc.isp_alt_lang : bv->buffer()->GetLanguage(); - bool rtl = tmp == "hebrew" || tmp == "arabic"; +#ifndef NEW_INSETS + // Open all floats + bv->allFloats(1, 0); + bv->allFloats(1, 1); +#endif + +#ifdef USE_PSPELL + string tmp = (lyxrc.isp_use_alt_lang) ? + lyxrc.isp_alt_lang : bv->buffer()->params.language->code(); +#else + string tmp = (lyxrc.isp_use_alt_lang) ? + lyxrc.isp_alt_lang : bv->buffer()->params.language->lang(); +#endif + bool rtl = false; + if (lyxrc.isp_use_alt_lang) { + Language const * lang = languages.getLanguage(tmp); + if (lang) + rtl = lang->RightToLeft(); + } else + rtl = bv->buffer()->params.language->RightToLeft(); int oldval = 0; /* used for updating slider only when needed */ float newval = 0.0; @@ -814,13 +845,13 @@ bool RunSpellChecker(BufferView * bv) unsigned int word_count = 0; while (true) { - char * word = bv->nextWord(newval); - if (word == 0) break; + string const word = bv->nextWord(newval); + if (word.empty()) break; ++word_count; // Update slider if and only if value has changed newvalue = int(100.0*newval); - if(newvalue!= oldval) { + if (newvalue!= oldval) { oldval = newvalue; fl_set_slider_value(fd_form_spell_check->slider, oldval); } @@ -828,12 +859,10 @@ bool RunSpellChecker(BufferView * bv) if (word_count%1000 == 0) { obj = fl_check_forms(); if (obj == fd_form_spell_check->stop) { - delete[] word; close_spell_checker(); return true; } if (obj == fd_form_spell_check->done) { - delete[] word; close_spell_checker(); return false; } @@ -842,7 +871,6 @@ bool RunSpellChecker(BufferView * bv) result = sc_check_word(word); if (!sc_still_alive()) { delete result; - delete[] word; break; } @@ -856,8 +884,8 @@ bool RunSpellChecker(BufferView * bv) reverse(tmp.begin(),tmp.end()); fl_set_object_label(fd_form_spell_check->text, tmp.c_str()); } else - fl_set_object_label(fd_form_spell_check->text, word); - fl_set_input(fd_form_spell_check->input, word); + fl_set_object_label(fd_form_spell_check->text, word.c_str()); + fl_set_input(fd_form_spell_check->input, word.c_str()); fl_clear_browser(fd_form_spell_check->browser); const char * w; while ((w = result->next_miss()) != 0) { @@ -913,14 +941,12 @@ bool RunSpellChecker(BufferView * bv) } if (obj == fd_form_spell_check->stop) { delete result; - delete[] word; close_spell_checker(); return true; } if (obj == fd_form_spell_check->done) { delete result; - delete[] word; close_spell_checker(); return false; } @@ -928,11 +954,10 @@ bool RunSpellChecker(BufferView * bv) } default: delete result; - delete[] word; } } - if(sc_still_alive()) { + if (sc_still_alive()) { close_spell_checker(); string word_msg(tostr(word_count)); if (word_count != 1) { @@ -951,11 +976,14 @@ bool RunSpellChecker(BufferView * bv) } } +} // namespace anon -#ifndef USE_PSPELL - +#ifdef WITH_WARNINGS +#warning should go somewhere more sensible +#endif void sigchldhandler(pid_t pid, int * status) -{ +{ +#ifndef USE_PSPELL if (isp_pid > 0) if (pid == isp_pid) { isp_pid= -1; @@ -963,14 +991,8 @@ void sigchldhandler(pid_t pid, int * status) to nonblocking so we can continue */ } +#endif sigchldchecker(pid, status); } -#else -void sigchldhandler(pid_t, int *) -{ - // do nothing -} - -#endif