X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fispell.C;h=ab7dfcb89cac694017d7e8c1f1b041f91fa76e28;hb=35204f8f33d7400a5fefeffea533fb4cb4097211;hp=07db2583e74a30b79750309a245707b9daf9c14c;hpb=47c34c3afa59b030a4578c82fea46d926e0c0c66;p=lyx.git diff --git a/src/ispell.C b/src/ispell.C index 07db2583e7..ab7dfcb89c 100644 --- a/src/ispell.C +++ b/src/ispell.C @@ -1,49 +1,65 @@ /** * \file ispell.C - * Copyright 2002 the LyX Team - * Read the file COPYING + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. * * \author unknown - * \author John Levon + * \author Angus Leeming + * \author John Levon + * + * Full author contact details are available in file CREDITS. */ #include -#include "LString.h" -#include "lyxrc.h" -#include "language.h" +#include "ispell.h" + +#include "bufferparams.h" #include "debug.h" #include "encoding.h" -#include "ispell.h" -#include "WordLangTuple.h" #include "gettext.h" +#include "language.h" +#include "lyxrc.h" +#include "WordLangTuple.h" #include "support/forkedcall.h" -#include "support/lstrings.h" -#include +// HP-UX 11.x doesn't have this header +#ifdef HAVE_SYS_SELECT_H +# include +#endif +#ifdef HAVE_SYS_TIME_H +# include +#endif + + +namespace lyx { + +using boost::shared_ptr; #ifndef CXX_GLOBAL_CSTD using std::strcpy; using std::strlen; using std::strpbrk; -using std::strstr; #endif using std::endl; using std::max; +using std::string; + namespace { -class LaunchIspell : public ForkedProcess { +class LaunchIspell : public support::ForkedProcess { + typedef support::ForkedProcess ForkedProcess; public: /// LaunchIspell(BufferParams const & p, string const & l, int * in, int * out, int * err) : params(p), lang(l), pipein(in), pipeout(out), pipeerr(err) {} /// - virtual ForkedProcess * clone() const { - return new LaunchIspell(*this); + virtual shared_ptr clone() const { + return shared_ptr(new LaunchIspell(*this)); } /// int start(); @@ -62,8 +78,8 @@ private: int LaunchIspell::start() { - command_ = "ispell"; - return runNonBlocking(); + command_ = lyxrc.isp_command; + return run(DontWait); } @@ -145,9 +161,9 @@ int LaunchIspell::generateChild() if (lyxrc.isp_use_input_encoding && params.inputenc != "default") { string enc = (params.inputenc == "auto") - ? params.language->encoding()->LatexName() + ? params.language->encoding()->latexName() : params.inputenc; - string::size_type n = enc.length(); + size_t const n = enc.length(); tmp = new char[3]; string("-T").copy(tmp, 2); tmp[2] = '\0'; @@ -182,7 +198,7 @@ ISpell::ISpell(BufferParams const & params, string const & lang) // static due to the setvbuf. Ugly. static char o_buf[BUFSIZ]; - + // We need to throw an exception not do this pipein[0] = pipein[1] = pipeout[0] = pipeout[1] = pipeerr[0] = pipeerr[1] = -1; @@ -231,7 +247,7 @@ ISpell::ISpell(BufferParams const & params, string const & lang) child_.reset(li); if (li->start() == -1) { error_ = _("Could not create an ispell process.\nYou may not have " - " the right languages installed."); + "the right languages installed."); child_.reset(0); return; } @@ -249,11 +265,11 @@ ISpell::ISpell(BufferParams const & params, string const & lang) } /* must have read something from stderr */ - error_ = buf; + error_ =from_utf8(buf); } else { // select returned error - error_ = _("The spell process returned an error.\nPerhaps " - "it has been configured wrongly ?"); + error_ = _("The ispell process returned an error.\nPerhaps " + "it has been configured wrongly ?"); } close(pipein[0]); @@ -361,19 +377,19 @@ enum ISpell::Result ISpell::check(WordLangTuple const & word) bool error = select(err_read); if (error) { - error_ = _("Could not communicate with the spell-checker program"); - return UNKNOWN; + error_ = _("Could not communicate with the ispell spellchecker process."); + return UNKNOWN_WORD; } if (err_read) { - error_ = buf; - return UNKNOWN; + error_ = from_utf8(buf); + return UNKNOWN_WORD; } // I think we have to check if ispell is still alive here because // the signal-handler could have disabled blocking on the fd if (!alive()) - return UNKNOWN; + return UNKNOWN_WORD; switch (*buf) { case '*': @@ -383,18 +399,18 @@ enum ISpell::Result ISpell::check(WordLangTuple const & word) res = ROOT; break; case '-': - res = COMPOUNDWORD; + res = COMPOUND_WORD; break; case '\n': - res = IGNORE; + res = IGNORED_WORD; break; case '#': // Not found, no near misses and guesses - res = UNKNOWN; + res = UNKNOWN_WORD; break; case '?': // Not found, and no near misses, but guesses (guesses are ignored) case '&': // Not found, but we have near misses { - res = MISSED; + res = SUGGESTED_WORDS; char * p = strpbrk(buf, ":"); str = new char[strlen(p) + 1]; e = str; @@ -402,11 +418,11 @@ enum ISpell::Result ISpell::check(WordLangTuple const & word) break; } default: // This shouldn't happen, but you know Murphy - res = UNKNOWN; + res = UNKNOWN_WORD; } *buf = 0; - if (res != IGNORE) { + if (res != IGNORED_WORD) { /* wait for ispell to finish */ while (*buf!= '\n') fgets(buf, 255, in); @@ -431,7 +447,10 @@ void ISpell::accept(WordLangTuple const & word) } -string const ISpell::error() +docstring const ISpell::error() { return error_; } + + +} // namespace lyx