X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetListingsParams.cpp;h=f37566138f86635502bf162ccba3290dc709a0b1;hb=239b9919ffe28338d789e6dc9122228f77ab77a7;hp=473341e52a3983777af22bc3e7913ea0bc1a9774;hpb=072ed23ffcd4a4a883f3521d0295d7555d40fecc;p=lyx.git diff --git a/src/insets/InsetListingsParams.cpp b/src/insets/InsetListingsParams.cpp index 473341e52a..f37566138f 100644 --- a/src/insets/InsetListingsParams.cpp +++ b/src/insets/InsetListingsParams.cpp @@ -18,7 +18,6 @@ #include "support/convert.h" #include "support/gettext.h" -#include "support/lassert.h" #include "support/lstrings.h" #include "support/textutils.h" @@ -36,8 +35,9 @@ enum param_type { TRUEFALSE, // accept 'true' or 'false' INTEGER, // accept an integer LENGTH, // accept a latex length + SKIP, // accept a skip or a length ONEOF, // accept one of a few values - SUBSETOF, // accept a string composed of given characters + SUBSETOF // accept a string composed of given characters }; @@ -94,6 +94,9 @@ private: }; +char const * allowed_skips = "\\smallskipamount,\\medskipamount,\\bigskipamount"; + + docstring ListingsParam::validate(string const & par) const { bool unclosed = false; @@ -164,6 +167,20 @@ docstring ListingsParam::validate(string const & par) const return _("Unbalanced braces!"); return docstring(); + case SKIP: + if (par2.empty() && !onoff_) { + if (!hint_.empty()) + return hint_; + else + return bformat(_("Please specify a LaTeX length expression or a skip amount (%1$s)"), + from_ascii(subst(allowed_skips, ",", ", "))); + } + if (!isValidLength(par2) && tokenPos(allowed_skips, ',', par2) == -1) + return _("Not a valid LaTeX length expression or skip amount."); + if (unclosed) + return _("Unbalanced braces!"); + return docstring(); + case ONEOF: { if (par2.empty() && !onoff_) { if (!hint_.empty()) @@ -206,6 +223,8 @@ docstring ListingsParam::validate(string const & par) const return bformat(_("Try one of %1$s."), from_utf8(info_)); else return bformat(_("I guess you mean %1$s."), from_utf8(matching_names)); + // this stifles a warning but upsets coverity + // coverity[UNREACHABLE] return docstring(); } case SUBSETOF: @@ -297,11 +316,11 @@ ParValidator::ParValidator() all_params_["floatplacement"] = ListingsParam("tbp", false, SUBSETOF, "tbp", empty_hint); all_params_["aboveskip"] = - ListingsParam("\\medskipamount", false, LENGTH, "", empty_hint); + ListingsParam("\\medskipamount", false, SKIP, "", empty_hint); all_params_["belowskip"] = - ListingsParam("\\medskipamount", false, LENGTH, "", empty_hint); + ListingsParam("\\medskipamount", false, SKIP, "", empty_hint); all_params_["lineskip"] = - ListingsParam("", false, LENGTH, "", empty_hint); + ListingsParam("", false, SKIP, "", empty_hint); all_params_["boxpos"] = ListingsParam("", false, SUBSETOF, "bct", empty_hint); all_params_["print"] = @@ -424,9 +443,9 @@ ParValidator::ParValidator() all_params_["captionpos"] = ListingsParam("", false, SUBSETOF, "tb", empty_hint); all_params_["abovecaptionskip"] = - ListingsParam("", false, LENGTH, "", empty_hint); + ListingsParam("", false, SKIP, "", empty_hint); all_params_["belowcaptionskip"] = - ListingsParam("", false, LENGTH, "", empty_hint); + ListingsParam("", false, SKIP, "", empty_hint); all_params_["linewidth"] = ListingsParam("", false, LENGTH, "", empty_hint); all_params_["xleftmargin"] = @@ -437,6 +456,8 @@ ParValidator::ParValidator() ListingsParam("", false, TRUEFALSE, "", empty_hint); all_params_["breaklines"] = ListingsParam("", false, TRUEFALSE, "", empty_hint); + all_params_["breakatwhitespace"] = + ListingsParam("", false, TRUEFALSE, "", empty_hint); all_params_["prebreak"] = ListingsParam("", false, ALL, "", empty_hint); all_params_["postbreak"] = @@ -499,11 +520,9 @@ ParValidator::ParValidator() ListingsParam("", false, ALL, "", empty_hint); all_params_["escapeinside"] = ListingsParam("", false, ALL, "", empty_hint); - all_params_["escepeinside"] = + all_params_["escapebegin"] = ListingsParam("", false, ALL, "", empty_hint); - all_params_["escepebegin"] = - ListingsParam("", false, ALL, "", empty_hint); - all_params_["escepeend"] = + all_params_["escapeend"] = ListingsParam("", false, ALL, "", empty_hint); all_params_["fancyvrb"] = ListingsParam("", false, TRUEFALSE, "", empty_hint); @@ -668,6 +687,8 @@ docstring ParValidator::validate(string const & name, return bformat(_("Parameters starting with '%1$s': %2$s"), from_utf8(name), from_utf8(matching_names)); } + // this stifles a warning but upsets coverity + // coverity[UNREACHABLE] return docstring(); } @@ -715,7 +736,7 @@ void InsetListingsParams::write(ostream & os) const void InsetListingsParams::read(Lexer & lex) { lex >> inline_; - int s = Inset::Collapsed; + int s = InsetCollapsable::Collapsed; lex >> s; status_ = static_cast(s); string par; @@ -727,11 +748,11 @@ void InsetListingsParams::read(Lexer & lex) string InsetListingsParams::params(string const & sep) const { string par; - for (map::const_iterator it = params_.begin(); - it != params_.end(); ++it) { + keyValuePair::const_iterator it = params_.begin(); + for (; it != params_.end(); ++it) { if (!par.empty()) par += sep; - // key=value,key=value1 is stored in params_ as key=value,key_=value1. + // key=value,key=value1 is stored in params_ as key=value,key_=value1. if (it->second.empty()) par += rtrim(it->first, "_"); else @@ -741,6 +762,28 @@ string InsetListingsParams::params(string const & sep) const } +bool InsetListingsParams::hasParam(string const & key) const +{ + keyValuePair::const_iterator it = params_.begin(); + for (; it != params_.end(); ++it) { + if (it->first == key) + return true; + } + return false; +} + + +string InsetListingsParams::getValue(string const & key) const +{ + keyValuePair::const_iterator it = params_.begin(); + for (; it != params_.end(); ++it) { + if (it->first == key) + return it->second; + } + return string(); +} + + void InsetListingsParams::addParam(string const & key, string const & value, bool replace) { @@ -749,32 +792,32 @@ void InsetListingsParams::addParam(string const & key, // duplicate parameters! string keyname = key; - if (!replace && params_.find(key) != params_.end()) + if (!replace && hasParam(key)) // key=value,key=value1 is allowed in listings // use key_, key__, key___ etc to avoid name conflict - while (params_.find(keyname += '_') != params_.end()) { } + while (hasParam(keyname += '_')) { } // check onoff flag // onoff parameter with value false if (!par_validator) - par_validator = new ParValidator(); + par_validator = new ParValidator; if (par_validator->onoff(key) && (value == "false" || value == "{false}")) - params_[keyname] = string(); + params_.push_back(make_pair(keyname, string())); // if the parameter is surrounded with {}, good else if (prefixIs(value, "{") && suffixIs(value, "}")) - params_[keyname] = value; + params_.push_back(make_pair(keyname, value)); // otherwise, check if {} is needed. Add {} to all values with // non-ascii/number characters, just to be safe else { bool has_special_char = false; for (size_t i = 0; i < value.size(); ++i) - if (!isAlphaASCII(value[i]) && !isDigit(value[i])) { + if (!isAlnumASCII(value[i])) { has_special_char = true; break; } if (has_special_char) - params_[keyname] = "{" + value + "}"; + params_.push_back(make_pair(keyname, "{" + value + "}")); else - params_[keyname] = value; + params_.push_back(make_pair(keyname, value)); } } @@ -863,15 +906,13 @@ void InsetListingsParams::fromEncodedString(string const & in) bool InsetListingsParams::isFloat() const { - return params_.find("float") != params_.end(); + return hasParam("float"); } string InsetListingsParams::getParamValue(string const & param) const { - // is this parameter defined? - map::const_iterator it = params_.find(param); - string par = (it == params_.end()) ? string() : it->second; + string par = getValue(param); if (prefixIs(par, "{") && suffixIs(par, "}")) return par.substr(1, par.size() - 2); else @@ -883,10 +924,12 @@ docstring InsetListingsParams::validate() const { docstring msg; if (!par_validator) - par_validator = new ParValidator(); - for (map::const_iterator it = params_.begin(); - it != params_.end(); ++it) { - msg = par_validator->validate(it->first, it->second); + par_validator = new ParValidator; + // return msg for first key=value pair which is incomplete or has an error + keyValuePair::const_iterator it = params_.begin(); + for (; it != params_.end(); ++it) { + // key trimmed + msg = par_validator->validate(rtrim(it->first, "_"), it->second); if (!msg.empty()) return msg; }